@chai-ui/react 0.7.0 → 0.8.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.
package/DESIGN.md CHANGED
@@ -153,6 +153,7 @@ Rules:
153
153
  | Request in flight | Submit becomes a stop button (`submitting` + `onAbort`) | Pass `useComposer`'s `cancel` as `onAbort`; results show "Stopped" |
154
154
  | Prompt too thin | Optimize button rewrites the prompt, then offers undo (`onEnhance`) | Run the rewrite and call `onChange` with the new text |
155
155
  | No use case picked | The prompt is a text request and gets a text reply | Set `defaultUseCase` if your app's default should be image or video |
156
+ | Create world | Two prompts, Environment (required) and Character (optional), each with its own Enhance; a frame rate menu from the models' `frameRates`; submit waits for an environment and says so | Add `"create-world"` to `attachMenuActions`, pass your world models, `character` + `onCharacterChange`, and route `engineByKind.world` to your world engine. Show the world in your own viewer. |
156
157
  | Result pending | `ResultCard` shows a spinner for `queued` / `running` | Nothing. `useComposer` sets the status. |
157
158
  | Long text answer | `ResultCard` keeps line breaks, scrolls past 400px with a visible scrollbar, and follows streaming text unless the person scrolls up | Change the height with `textMaxHeight` if needed |
158
159
  | Text streaming in | `ResultCard` renders partial text with a caret, marked `aria-busy` | Use an engine that calls `onText` (OpenRouter does, and so does the mock text engine). `useComposer` wires it. |
package/README.md CHANGED
@@ -80,9 +80,11 @@ capability beyond the default file picker. Every other control is additive:
80
80
  onAttachMenuSelect={(action) => {
81
81
  if (action === "create-image") setUseCase({ kind: "image", label: "Image" });
82
82
  }}
83
- // The Model menu lists Chai's suggested models for the use case, with the
84
- // first picked, unless you pass your own `models` (see "Suggested models").
85
- // It shows only with `onModelChange`; without it the first model still runs.
83
+ // The Model menu lists Chai's suggested models for the use case, unless
84
+ // you pass your own `models` (see "Suggested models"). Nothing is picked
85
+ // for the person: submit waits until they pick a model or turn on
86
+ // auto-select. Without `onModelChange` there's no menu, and the list's
87
+ // first model runs.
86
88
  modelId={modelId}
87
89
  onModelChange={setModelId}
88
90
  // An "Auto-select model" switch appears at the top of the model menu so
@@ -169,7 +171,10 @@ entry per use case.
169
171
 
170
172
  With `autoSelectModel` on, the trigger reads "Auto-select" and
171
173
  `useComposer` picks the model at submit: the reasoning model reads the
172
- prompt and media and chooses from that use case's `models`. Pass
174
+ prompt and media and chooses from that use case's `models`. When the end
175
+ user owns the switch (`showAutoSelectToggle`), auto-select belongs to the
176
+ use case it was turned on for: picking another use case calls
177
+ `onAutoSelectModelChange(false)`, so the new one's model is picked by hand. Pass
173
178
  `onModelChange` (or `onModelIdsChange`) to the hook too, so the trigger
174
179
  shows the pick:
175
180
 
@@ -217,8 +222,9 @@ pass none:
217
222
  | Media analysis, per media kind | `SUGGESTED_ANALYSIS_MODELS` | OpenRouter |
218
223
 
219
224
  - **Composer** offers the list for the current use case
220
- (`suggestedModels(useCase)`), with its first model picked until the person
221
- picks another. **MediaAnalyzer** offers the analysis lists.
225
+ (`suggestedModels(useCase)`). It never picks for the person: with a Model
226
+ menu, submit waits for a pick or auto-select; with no menu, the list's
227
+ first model runs. **MediaAnalyzer** offers the analysis lists.
222
228
  - **Your own list wins.** Pass `models` (or `modelsByKind`) to replace a
223
229
  list, or `[]` for no Model menu. Nothing is required.
224
230
  - **Each suggested model knows its inputs**: its aspect ratios, and for Fal
@@ -357,7 +363,7 @@ import { Composer, EditCard, EDIT_IMAGE_USE_CASE, SUGGESTED_EDIT_MODELS, useComp
357
363
 
358
364
  const editImage = useCase?.edit ? (attachments.find((a) => a.kind === "image") ?? null) : null;
359
365
  const { run, submit, edit } = useComposer({ engine: createFalEngine({ outputKind: "image" }), editImage });
360
- // Unpicked, the first suggested edit model (Flux 3 Image) runs.
366
+ // The pick decides how many regions it takes (Flux 3 Image's until one is picked).
361
367
  const model = SUGGESTED_EDIT_MODELS.find((m) => m.id === modelId) ?? SUGGESTED_EDIT_MODELS[0];
362
368
 
363
369
  {edit && <EditCard {...edit} maxRegions={model?.maxRegions} />}
@@ -1,8 +1,8 @@
1
1
  import * as React from "react";
2
- import { type ComposerAttachMenuAction } from "@chai-ui/core";
3
- import type { EditRegion, ModelOption, ParameterOption, MediaKind } from "@chai-ui/core";
2
+ import { type ComposerAttachMenuAction, type ComposerPromptField } from "@chai-ui/core";
3
+ import type { EditRegion, ModelOption, ParameterOption, OutputKind } from "@chai-ui/core";
4
4
  import type { ComposerAttachment, ComposerSubmitPayload, ComposerUseCase } from "@chai-ui/core";
5
- export { EDIT_IMAGE_USE_CASE, TEXT_USE_CASE, type ComposerAttachMenuAction, type ComposerAttachment, type ComposerSelection, type ComposerSubmitPayload, type ComposerUseCase, } from "@chai-ui/core";
5
+ export { EDIT_IMAGE_USE_CASE, TEXT_USE_CASE, type ComposerAttachMenuAction, type ComposerAttachment, type ComposerPromptField, type ComposerSelection, type ComposerSubmitPayload, type ComposerUseCase, } from "@chai-ui/core";
6
6
  export interface ComposerProps {
7
7
  /** The prompt text. Controlled — Composer owns no text state of its own. */
8
8
  value: string;
@@ -29,7 +29,7 @@ export interface ComposerProps {
29
29
  useCases?: ComposerUseCase[];
30
30
  onUseCasesChange?: (next: ComposerUseCase[]) => void;
31
31
  /** Models per use-case kind, for `multiSelectUseCases`. A kind left out gets Chai's suggested models (see `models`). */
32
- modelsByKind?: Partial<Record<MediaKind, ModelOption[]>>;
32
+ modelsByKind?: Partial<Record<OutputKind, ModelOption[]>>;
33
33
  /**
34
34
  * Builder opt-in, off by default: the end user can pick several models,
35
35
  * each producing its own result (ResultCard pages through them). Uses
@@ -41,9 +41,10 @@ export interface ComposerProps {
41
41
  onModelIdsChange?: (ids: string[]) => void;
42
42
  /**
43
43
  * Models for the current use case. Leave it out and Composer offers Chai's
44
- * suggested Fal models for the use case (`suggestedModels`), with the
45
- * first one picked until the person picks another. Pass a list to use
46
- * your own; pass `[]` for no Model menu.
44
+ * suggested Fal models for the use case (`suggestedModels`). Nothing is
45
+ * picked for the person: with a Model menu, submit waits until they pick
46
+ * a model or turn on auto-select; with no menu (no `onModelChange`), the
47
+ * list's first model runs. Pass a list to use your own; `[]` for no menu.
47
48
  */
48
49
  models?: ModelOption[];
49
50
  modelId?: string | null;
@@ -64,7 +65,7 @@ export interface ComposerProps {
64
65
  * user can interact with to change it.
65
66
  */
66
67
  showAutoSelectToggle?: boolean;
67
- /** Fires when the end user toggles the switch — only reachable when `showAutoSelectToggle` is true. */
68
+ /** Fires when the end user toggles the switch — only reachable when `showAutoSelectToggle` is true — and with `false` when the picked use case changes, since auto-select belongs to the use case it was turned on for. */
68
69
  onAutoSelectModelChange?: (value: boolean) => void;
69
70
  /**
70
71
  * Optional. The Aspect ratio menu comes from the selected models'
@@ -85,11 +86,24 @@ export interface ComposerProps {
85
86
  * runs the rewrite is still an open question at the design-doc level,
86
87
  * not just an implementation gap — see the design open question 5
87
88
  * ("Enhance model"). Receives the current prompt text so the handler is
88
- * self-contained — doesn't need its own closure over `value`.
89
+ * self-contained — doesn't need its own closure over `value`. With a
90
+ * world use case each field has its own button: `field` is "environment"
91
+ * or "character" (otherwise "prompt"), so the rewrite can fit the field,
92
+ * and the handler calls `onChange` or `onCharacterChange` to match.
89
93
  */
90
- onEnhance?: (value: string) => void;
91
- /** True while the builder's own `onEnhance` handler is running its LLM call — shows the button's active state. */
94
+ onEnhance?: (value: string, field: ComposerPromptField) => void;
95
+ /** True while the builder's own `onEnhance` handler is running its LLM call — shows the active state on the button that was clicked. */
92
96
  enhancing?: boolean;
97
+ /**
98
+ * A world's character field (Create world), shown beside the environment
99
+ * while the use case is a world. `value` is the environment. Without
100
+ * `onCharacterChange`, only the environment shows.
101
+ */
102
+ character?: string;
103
+ onCharacterChange?: (value: string) => void;
104
+ /** A world's frame rate menu, from the selected models' `ModelOption.frameRates`. */
105
+ frameRate?: number | null;
106
+ onFrameRateChange?: (value: number) => void;
93
107
  /** Fires with everything Composer tracks — see `ComposerSubmitPayload`. Also what retry calls, with the same payload, when `submitError` is set. */
94
108
  onSubmit: (payload: ComposerSubmitPayload) => void;
95
109
  /**
@@ -143,5 +157,5 @@ export interface ComposerProps {
143
157
  * `control-*` semantic tokens, restylable per instance through the
144
158
  * `--chai-composer-*` custom properties in style.css.
145
159
  */
146
- export declare function Composer({ value, onChange, placeholder, promptLabel, attachments, onAttachmentsChange, onUnsupportedFile, useCase, onClearUseCase, defaultUseCase, multiSelectUseCases, useCases, onUseCasesChange, modelsByKind, multiSelectModels, modelIds, onModelIdsChange, models, modelId, onModelChange, autoSelectModel, showAutoSelectToggle, onAutoSelectModelChange, aspectRatios, aspectRatio, onAspectRatioChange, onEnhance, enhancing, onSubmit, submitError, submitDisabled, submitting, onAbort, onAttachMenuSelect, attachMenuActions, regions, onRegionsChange, disabled, }: ComposerProps): React.JSX.Element;
160
+ export declare function Composer({ value, onChange, placeholder, promptLabel, attachments, onAttachmentsChange, onUnsupportedFile, useCase, onClearUseCase, defaultUseCase, multiSelectUseCases, useCases, onUseCasesChange, modelsByKind, multiSelectModels, modelIds, onModelIdsChange, models, modelId, onModelChange, autoSelectModel, showAutoSelectToggle, onAutoSelectModelChange, aspectRatios, aspectRatio, onAspectRatioChange, onEnhance, enhancing, character, onCharacterChange, frameRate, onFrameRateChange, onSubmit, submitError, submitDisabled, submitting, onAbort, onAttachMenuSelect, attachMenuActions, regions, onRegionsChange, disabled, }: ComposerProps): React.JSX.Element;
147
161
  //# sourceMappingURL=Composer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Composer.d.ts","sourceRoot":"","sources":["../src/Composer.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Composer.d.ts","sourceRoot":"","sources":["../src/Composer.tsx"],"names":[],"mappings":"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"}
package/dist/Composer.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { StopIcon } from "./icons.js";
3
- import { useEffect, useRef, useState } from "react";
3
+ import { useEffect, useId, useRef, useState } from "react";
4
4
  import { createComponent } from "@lit/react";
5
5
  import * as React from "react";
6
6
  import { MdFab } from "@material/web/fab/fab.js";
@@ -24,7 +24,7 @@ const MdFabElement = createComponent({
24
24
  * `control-*` semantic tokens, restylable per instance through the
25
25
  * `--chai-composer-*` custom properties in style.css.
26
26
  */
27
- export function Composer({ value, onChange, placeholder, promptLabel, attachments = [], onAttachmentsChange, onUnsupportedFile, useCase = null, onClearUseCase, defaultUseCase = TEXT_USE_CASE, multiSelectUseCases = false, useCases = [], onUseCasesChange, modelsByKind, multiSelectModels = false, modelIds = [], onModelIdsChange, models, modelId = null, onModelChange, autoSelectModel = false, showAutoSelectToggle = false, onAutoSelectModelChange, aspectRatios, aspectRatio = null, onAspectRatioChange, onEnhance, enhancing = false, onSubmit, submitError = null, submitDisabled, submitting = false, onAbort, onAttachMenuSelect, attachMenuActions, regions = [], onRegionsChange, disabled = false, }) {
27
+ export function Composer({ value, onChange, placeholder, promptLabel, attachments = [], onAttachmentsChange, onUnsupportedFile, useCase = null, onClearUseCase, defaultUseCase = TEXT_USE_CASE, multiSelectUseCases = false, useCases = [], onUseCasesChange, modelsByKind, multiSelectModels = false, modelIds = [], onModelIdsChange, models, modelId = null, onModelChange, autoSelectModel = false, showAutoSelectToggle = false, onAutoSelectModelChange, aspectRatios, aspectRatio = null, onAspectRatioChange, onEnhance, enhancing = false, character = "", onCharacterChange, frameRate = null, onFrameRateChange, onSubmit, submitError = null, submitDisabled, submitting = false, onAbort, onAttachMenuSelect, attachMenuActions, regions = [], onRegionsChange, disabled = false, }) {
28
28
  const view = composerView({
29
29
  value,
30
30
  placeholder,
@@ -43,6 +43,8 @@ export function Composer({ value, onChange, placeholder, promptLabel, attachment
43
43
  autoSelectModel,
44
44
  aspectRatios,
45
45
  aspectRatio,
46
+ character,
47
+ frameRate,
46
48
  submitError,
47
49
  submitDisabled,
48
50
  submitting,
@@ -56,6 +58,17 @@ export function Composer({ value, onChange, placeholder, promptLabel, attachment
56
58
  return onModelChange?.(id);
57
59
  onModelIdsChange?.(view.toggledModelIds(id));
58
60
  }
61
+ // Auto-select belongs to the Model menu it was turned on in: picking
62
+ // another use case turns it off, so the new one's model is picked by hand.
63
+ // Only when the end user owns the switch; a builder's setting stays.
64
+ const lastUseCaseKey = useRef(view.useCaseKey);
65
+ useEffect(() => {
66
+ if (lastUseCaseKey.current === view.useCaseKey)
67
+ return;
68
+ lastUseCaseKey.current = view.useCaseKey;
69
+ if (autoSelectModel && showAutoSelectToggle)
70
+ onAutoSelectModelChange?.(false);
71
+ }, [view.useCaseKey, autoSelectModel, showAutoSelectToggle, onAutoSelectModelChange]);
59
72
  // Auto-select chooses at submit, from the prompt (`useComposer` routes
60
73
  // with the reasoning model). Turning it on clears the current pick, so
61
74
  // the trigger reads "Auto-select" until routing fills in the real model.
@@ -69,6 +82,60 @@ export function Composer({ value, onChange, placeholder, promptLabel, attachment
69
82
  }
70
83
  wasAutoSelect.current = autoSelectModel;
71
84
  }, [autoSelectModel, multiModel, onModelChange, onModelIdsChange]);
85
+ // Which field's Enhance is running: `enhancing` is one flag for the bar.
86
+ const [enhancingField, setEnhancingField] = useState("prompt");
87
+ const enhanceField = (field) => onEnhance &&
88
+ ((current) => {
89
+ setEnhancingField(field);
90
+ onEnhance(current, field);
91
+ });
92
+ async function handleFilesSelected(fileList) {
93
+ if (!fileList || fileList.length === 0 || !onAttachmentsChange)
94
+ return;
95
+ // Edit mode works on one image: a new one replaces it, and the edit starts over.
96
+ const { attachments: next, unsupported } = await composerAttachmentsFromFiles(fileList, attachments, editing);
97
+ unsupported.forEach((name) => onUnsupportedFile?.(name));
98
+ if (next)
99
+ onAttachmentsChange(next);
100
+ }
101
+ // Only items that can work: no menu item that silently does nothing.
102
+ const menuItems = composerAttachMenuItems(attachMenuActions, {
103
+ canAddMedia: Boolean(onAttachmentsChange),
104
+ canSelect: Boolean(onAttachMenuSelect),
105
+ });
106
+ function handleRemoveAttachment(id) {
107
+ onAttachmentsChange?.(attachments.filter((a) => a.id !== id));
108
+ }
109
+ return (_jsxs("div", { className: "chai-composer", children: [attachments.length > 0 && (_jsx("div", { className: "chai-composer__thumbnails", children: attachments.map((a) => (_jsx(ComposerThumbnail, { attachment: a, onRemove: onAttachmentsChange ? () => handleRemoveAttachment(a.id) : undefined }, a.id))) })), editing && regions.length > 0 && (_jsx("ul", { className: "chai-composer__regions", "aria-label": "Edit regions", children: regions.map((r) => (_jsx("li", { children: _jsx(RegionChip, { region: r, onRemove: onRegionsChange ? () => onRegionsChange(regions.filter((x) => x.id !== r.id)) : undefined, disabled: disabled }) }, r.id))) })), view.world ? (_jsxs("div", { className: "chai-composer__world-fields", children: [_jsx(PromptField, { value: value, onChange: onChange, placeholder: view.placeholder, heading: "Environment", note: "(required)", hint: view.environmentHint, onEnhance: enhanceField("environment"), enhancing: enhancing && enhancingField === "environment", disabled: disabled }), onCharacterChange && (_jsx(PromptField, { value: character, onChange: onCharacterChange, placeholder: view.characterPlaceholder, heading: "Character", note: "(optional)", onEnhance: enhanceField("character"), enhancing: enhancing && enhancingField === "character", disabled: disabled }))] })) : (_jsx(PromptField, { value: value, onChange: onChange, placeholder: view.placeholder, label: promptLabel, onEnhance: enhanceField("prompt"), enhancing: enhancing, disabled: disabled })), submitError && (_jsxs("p", { className: "chai-composer__error", role: "alert", children: [_jsx(ErrorIcon, {}), submitError] })), _jsxs("div", { className: "chai-composer__controls", children: [_jsxs("div", { className: "chai-composer__controls-start", children: [menuItems.length > 0 && (_jsx(ComposerAttachMenu, { items: menuItems, onSelect: onAttachMenuSelect, onAddMediaFiles: handleFilesSelected, imagesOnly: editing, disabled: disabled })), view.pickedUseCases.map((u) => (_jsx(UseCaseChip, { useCase: u, onRemove: multiSelectUseCases
110
+ ? onUseCasesChange && (() => onUseCasesChange(useCases.filter((x) => x.kind !== u.kind)))
111
+ : onClearUseCase, disabled: disabled }, u.kind))), modelSections.length > 0 && view.canPickModel && (_jsx(SearchMenu, { ...(multiSelectUseCases
112
+ ? { sections: modelSections.map((s) => ({ label: s.label, options: s.options })) }
113
+ : { options: modelSections[0].options }), value: multiModel ? pickedModelIds : modelId, multiple: multiModel, toggleHeader: showAutoSelectToggle
114
+ ? {
115
+ label: "Auto-select model",
116
+ value: autoSelectModel,
117
+ onChange: (v) => onAutoSelectModelChange?.(v),
118
+ }
119
+ : undefined, triggerLabel: view.modelTriggerLabel, menuLabel: multiModel ? "Select models" : "Select model", onSelect: (opt) => toggleModel(opt.id), searchable: false, triggerVariant: "text", disabled: disabled || (autoSelectModel && !showAutoSelectToggle), panelWidth: showAutoSelectToggle ? 320 : undefined })), view.showAspectRatio && aspectOptions.length > 0 && onAspectRatioChange && (_jsx(SearchMenu, { options: aspectOptions.map((o) => ({ id: o.value, label: o.label })), value: offeredAspect, triggerLabel: view.selectedAspect?.label ?? "Aspect ratio", menuLabel: "Aspect ratio", onSelect: (opt) => onAspectRatioChange?.(opt.id), searchable: false, triggerVariant: "text", disabled: disabled })), view.frameRateOptions.length > 0 && onFrameRateChange && (_jsx(SearchMenu, { options: view.frameRateOptions.map((r) => ({ id: String(r), label: `${r}fps` })), value: view.offeredFrameRate == null ? null : String(view.offeredFrameRate), triggerLabel: view.offeredFrameRate == null ? "Frame rate" : `${view.offeredFrameRate}fps`, menuLabel: "Frame rate", onSelect: (opt) => onFrameRateChange(Number(opt.id)), searchable: false, triggerVariant: "text", disabled: disabled }))] }), _jsx(MdFabElement, { className: "chai-composer__submit", size: "small", variant: "secondary", label: "", "data-ready": showStop || !isSubmitDisabled || undefined, "data-error": Boolean(submitError) || undefined, "data-stop": showStop || undefined, ...{
120
+ ariaLabel: showStop ? "Stop" : submitError ? "Retry" : "Submit",
121
+ ariaDisabled: showStop ? "false" : submitting ? "true" : isSubmitDisabled ? "true" : "false",
122
+ }, onClick: () => {
123
+ if (showStop)
124
+ onAbort?.();
125
+ else if (!isSubmitDisabled && !submitting)
126
+ onSubmit(view.payload());
127
+ }, children: _jsx("span", { slot: "icon", children: showStop ? _jsx(StopIcon, {}) : submitError ? _jsx(RefreshIcon, {}) : _jsx(ArrowForwardIcon, {}) }) })] })] }));
128
+ }
129
+ /**
130
+ * One prompt textarea with its Enhance button: grows with wrapped text,
131
+ * reveals a rewrite as it lands, and offers undo until the text is edited
132
+ * by hand. A `heading` gives it a visible label above a filled box (a
133
+ * world's Environment and Character); without one it's the bar's plain
134
+ * prompt.
135
+ */
136
+ function PromptField({ value, onChange, placeholder, label, heading, note, hint, onEnhance, enhancing, disabled, }) {
137
+ const id = useId();
138
+ const hintId = `${id}-hint`;
72
139
  // Auto-grows with wrapped content instead of a fixed row count — a
73
140
  // static `rows` either hides wrapped lines behind a scrollbar (too
74
141
  // short) or wastes space while empty (too tall). Starts at one line
@@ -141,47 +208,26 @@ export function Composer({ value, onChange, placeholder, promptLabel, attachment
141
208
  setOriginalValue(value); // snapshot now — before the rewrite lands, for undo
142
209
  onEnhance?.(value);
143
210
  }
144
- async function handleFilesSelected(fileList) {
145
- if (!fileList || fileList.length === 0 || !onAttachmentsChange)
146
- return;
147
- // Edit mode works on one image: a new one replaces it, and the edit starts over.
148
- const { attachments: next, unsupported } = await composerAttachmentsFromFiles(fileList, attachments, editing);
149
- unsupported.forEach((name) => onUnsupportedFile?.(name));
150
- if (next)
151
- onAttachmentsChange(next);
152
- }
153
- // Only items that can work: no menu item that silently does nothing.
154
- const menuItems = composerAttachMenuItems(attachMenuActions, {
155
- canAddMedia: Boolean(onAttachmentsChange),
156
- canSelect: Boolean(onAttachMenuSelect),
157
- });
158
- function handleRemoveAttachment(id) {
159
- onAttachmentsChange?.(attachments.filter((a) => a.id !== id));
160
- }
161
- return (_jsxs("div", { className: "chai-composer", children: [attachments.length > 0 && (_jsx("div", { className: "chai-composer__thumbnails", children: attachments.map((a) => (_jsx(ComposerThumbnail, { attachment: a, onRemove: onAttachmentsChange ? () => handleRemoveAttachment(a.id) : undefined }, a.id))) })), editing && regions.length > 0 && (_jsx("ul", { className: "chai-composer__regions", "aria-label": "Edit regions", children: regions.map((r) => (_jsx("li", { children: _jsx(RegionChip, { region: r, onRemove: onRegionsChange ? () => onRegionsChange(regions.filter((x) => x.id !== r.id)) : undefined, disabled: disabled }) }, r.id))) })), _jsxs("div", { className: "chai-composer__field", children: [_jsx("textarea", { ref: textareaRef, className: `chai-composer__input chai-composer__type${animating ? " chai-composer__input--revealing" : ""}`, value: value, onChange: (e) => onChange(e.target.value), placeholder: view.placeholder, "aria-label": promptLabel ?? view.placeholder, rows: 1, disabled: disabled || animating }), animating && (_jsx("div", { className: "chai-composer__reveal chai-composer__type", "aria-hidden": "true", children: _jsx("span", { className: "chai-composer__reveal-text", children: animatingText.slice(0, revealedLength) }) })), onEnhance && (_jsx("button", { type: "button", className: `chai-composer__optimize${enhanceBusy ? " chai-composer__optimize--active" : ""}`, onClick: handleOptimizeClick, disabled: disabled || (isEnhanced ? false : !value.trim() || enhanceBusy), "aria-label": isEnhanced ? "Revert to original prompt" : "Optimize prompt", title: isEnhanced ? "Revert to original prompt" : "Optimize prompt", children: isEnhanced ? _jsx(UndoIcon, {}) : _jsx(OptimizeIcon, {}) }))] }), submitError && (_jsxs("p", { className: "chai-composer__error", role: "alert", children: [_jsx(ErrorIcon, {}), submitError] })), _jsxs("div", { className: "chai-composer__controls", children: [_jsxs("div", { className: "chai-composer__controls-start", children: [menuItems.length > 0 && (_jsx(ComposerAttachMenu, { items: menuItems, onSelect: onAttachMenuSelect, onAddMediaFiles: handleFilesSelected, imagesOnly: editing, disabled: disabled })), view.pickedUseCases.map((u) => (_jsx(UseCaseChip, { useCase: u, onRemove: multiSelectUseCases
162
- ? onUseCasesChange && (() => onUseCasesChange(useCases.filter((x) => x.kind !== u.kind)))
163
- : onClearUseCase, disabled: disabled }, u.kind))), modelSections.length > 0 && view.canPickModel && (_jsx(SearchMenu, { ...(multiSelectUseCases
164
- ? { sections: modelSections.map((s) => ({ label: s.label, options: s.options })) }
165
- : { options: modelSections[0].options }), value: multiModel ? pickedModelIds : modelId, multiple: multiModel, toggleHeader: showAutoSelectToggle
166
- ? {
167
- label: "Auto-select model",
168
- value: autoSelectModel,
169
- onChange: (v) => onAutoSelectModelChange?.(v),
170
- }
171
- : undefined, triggerLabel: view.modelTriggerLabel, menuLabel: multiModel ? "Select models" : "Select model", onSelect: (opt) => toggleModel(opt.id), searchable: false, triggerVariant: "text", disabled: disabled || (autoSelectModel && !showAutoSelectToggle), panelWidth: showAutoSelectToggle ? 320 : undefined })), view.showAspectRatio && aspectOptions.length > 0 && onAspectRatioChange && (_jsx(SearchMenu, { options: aspectOptions.map((o) => ({ id: o.value, label: o.label })), value: offeredAspect, triggerLabel: view.selectedAspect?.label ?? "Aspect ratio", menuLabel: "Aspect ratio", onSelect: (opt) => onAspectRatioChange?.(opt.id), searchable: false, triggerVariant: "text", disabled: disabled }))] }), _jsx(MdFabElement, { className: "chai-composer__submit", size: "small", variant: "secondary", label: "", "data-ready": showStop || !isSubmitDisabled || undefined, "data-error": Boolean(submitError) || undefined, "data-stop": showStop || undefined, ...{
172
- ariaLabel: showStop ? "Stop" : submitError ? "Retry" : "Submit",
173
- ariaDisabled: showStop ? "false" : submitting ? "true" : isSubmitDisabled ? "true" : "false",
174
- }, onClick: () => {
175
- if (showStop)
176
- onAbort?.();
177
- else if (!isSubmitDisabled && !submitting)
178
- onSubmit(view.payload());
179
- }, children: _jsx("span", { slot: "icon", children: showStop ? _jsx(StopIcon, {}) : submitError ? _jsx(RefreshIcon, {}) : _jsx(ArrowForwardIcon, {}) }) })] })] }));
211
+ const optimizeLabel = isEnhanced ? "Revert to original" : "Optimize";
212
+ const optimizeName = `${optimizeLabel} ${heading ? heading.toLowerCase() : "prompt"}`;
213
+ /* "Optimize prompt" / "Revert to original prompt" — see `onEnhance`'s own
214
+ doc comment on `ComposerProps` for what the rewrite itself actually
215
+ does and why Composer doesn't run it. Once a rewrite lands, this
216
+ becomes an undo affordance instead — an already-optimized prompt can't
217
+ be re-optimized — and reverts to a plain optimize button again the
218
+ moment `value` no longer matches that rewrite exactly, i.e. the person
219
+ has since edited it by hand. */
220
+ const optimize = onEnhance && (_jsx("button", { type: "button", className: `chai-composer__optimize${enhanceBusy ? " chai-composer__optimize--active" : ""}`, onClick: handleOptimizeClick, disabled: disabled || (isEnhanced ? false : !value.trim() || enhanceBusy), "aria-label": optimizeName, title: optimizeName, children: isEnhanced ? _jsx(UndoIcon, {}) : _jsx(OptimizeIcon, {}) }));
221
+ const field = (_jsxs("div", { className: `chai-composer__field${heading ? " chai-composer__field--boxed" : ""}`, children: [_jsx("textarea", { ref: textareaRef, id: id, className: `chai-composer__input chai-composer__type${animating ? " chai-composer__input--revealing" : ""}`, value: value, onChange: (e) => onChange(e.target.value), placeholder: placeholder, "aria-label": heading ? undefined : (label ?? placeholder), "aria-describedby": hint ? hintId : undefined, rows: 1, disabled: disabled || animating }), animating && (_jsx("div", { className: "chai-composer__reveal chai-composer__type", "aria-hidden": "true", children: _jsx("span", { className: "chai-composer__reveal-text", children: animatingText.slice(0, revealedLength) }) })), !heading && optimize] }));
222
+ if (!heading)
223
+ return field;
224
+ return (_jsxs("div", { className: "chai-composer__world-field", children: [_jsxs("div", { className: "chai-composer__world-field-head", children: [_jsxs("label", { htmlFor: id, className: "chai-composer__world-field-label", children: [_jsx("strong", { children: heading }), " ", note] }), optimize] }), field, hint && (_jsx("p", { id: hintId, className: "chai-composer__field-hint", children: hint }))] }));
180
225
  }
181
226
  const ATTACH_MENU_ICONS = {
182
227
  "add-media": _jsx(AttachFileIcon, {}),
183
228
  "create-image": _jsx(ImageIcon, {}),
184
229
  "create-video": _jsx(VideocamIcon, {}),
230
+ "create-world": _jsx(GlobeIcon, {}),
185
231
  "edit-media": _jsx(ContentCutIcon, {}),
186
232
  };
187
233
  /**
@@ -316,6 +362,10 @@ function UndoIcon() {
316
362
  function AttachFileIcon() {
317
363
  return (_jsx("svg", { viewBox: "0 -960 960 960", "aria-hidden": "true", children: _jsx("path", { d: "M728-326q0 103-72.18 174.5-72.17 71.5-175 71.5Q378-80 305.5-151.5T233-326v-380q0-72.5 51.5-123.25T408-880q72 0 123.5 50.75T583-706v360q0 42-30 72t-72.5 30q-42.5 0-72.5-29.67-30-29.68-30-72.33v-370h60v370q0 17 12.5 29.5t30.64 12.5q18.14 0 30-12.5T523-346v-360q0-48-33.5-81t-81.71-33q-48.21 0-81.5 33.06T293-706v380q0 78 54.97 132T481-140q77.92 0 132.46-54Q668-248 668-326v-390h60v390Z", fill: "currentColor" }) }));
318
364
  }
365
+ // Material Symbols "globe" — the attach menu's Create world.
366
+ function GlobeIcon() {
367
+ return (_jsx("svg", { viewBox: "0 -960 960 960", "aria-hidden": "true", children: _jsx("path", { d: "M480.27-80q-82.74 0-155.5-31.5Q252-143 197.5-197.5t-86-127.34Q80-397.68 80-480.5t31.5-155.66Q143-709 197.5-763t127.34-85.5Q397.68-880 480.5-880t155.66 31.5Q709-817 763-763t85.5 127Q880-563 880-480.27q0 82.74-31.5 155.5Q817-252 763-197.68q-54 54.31-127 86Q563-80 480.27-80Zm-.27-60q142.38 0 241.19-99.5T820-480v-13q-6 26-27.41 43.5Q771.19-432 742-432h-80q-33 0-56.5-23.5T582-512v-40H422v-80q0-33 23.5-56.5T502-712h40v-22q0-16 13.5-40t30.5-29q-25-8-51.36-12.5Q508.29-820 480-820q-141 0-240.5 98.81T140-480h150q66 0 113 47t47 113v40H330v105q34 17 71.7 26t78.3 9Z", fill: "currentColor" }) }));
368
+ }
319
369
  function ImageIcon() {
320
370
  return (_jsx("svg", { viewBox: "0 -960 960 960", "aria-hidden": "true", children: _jsx("path", { d: "M180-120q-24 0-42-18t-18-42v-600q0-24 18-42t42-18h600q24 0 42 18t18 42v600q0 24-18 42t-42 18H180Zm0-60h600v-600H180v600Zm56-97h489L578-473 446-302l-93-127-117 152Zm-56 97v-600 600Z", fill: "currentColor" }) }));
321
371
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Composer.js","sourceRoot":"","sources":["../src/Composer.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Composer.js","sourceRoot":"","sources":["../src/Composer.tsx"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -7,5 +7,5 @@ export * from "./useComposer.js";
7
7
  export * from "./ChaiProvider.js";
8
8
  export * from "./useMediaAnalyzer.js";
9
9
  export { createFalEngine, createOpenRouterEngine, createMockEngine, mockEngine, buildRegionEditPrompt, DEFAULT_MAX_REGIONS, PRECISE_EDIT_MODELS, ROUTING_MODEL_ID, GenerationError, DEFAULT_MEDIA_ANALYSIS_PROMPT_LENGTH, MEDIA_ANALYSIS_PROMPTS, MEDIA_ANALYSIS_PROMPT_LENGTHS, SUGGESTED_IMAGE_MODELS, SUGGESTED_TEXT_TO_VIDEO_MODELS, SUGGESTED_IMAGE_TO_VIDEO_MODELS, SUGGESTED_EDIT_MODELS, SUGGESTED_ANALYSIS_MODELS, suggestedModels, checkSuggestedModels, } from "@chai-ui/core";
10
- export type { DroppedMedia, EditRegion, Evaluation, GenerationEngine, GenerationUseCase, MediaAnalysisKind, MediaAnalysisPromptLength, MediaKind, ModelOption, ParameterOption, RegionBox, RegionFormat, Request, Result, ResultStatus, Run, SuggestedModelProblem, SuggestedModelsCheck, FalInputFormat, Usage, } from "@chai-ui/core";
10
+ export type { DroppedMedia, EditRegion, Evaluation, GenerationEngine, GenerationUseCase, MediaAnalysisKind, MediaAnalysisPromptLength, MediaKind, ModelOption, OutputKind, ParameterOption, RegionBox, RegionFormat, Request, Result, ResultStatus, Run, SuggestedModelProblem, SuggestedModelsCheck, FalInputFormat, Usage, } from "@chai-ui/core";
11
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AAItC,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,UAAU,EACV,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,oCAAoC,EACpC,sBAAsB,EACtB,6BAA6B,EAC7B,sBAAsB,EACtB,8BAA8B,EAC9B,+BAA+B,EAC/B,qBAAqB,EACrB,yBAAyB,EACzB,eAAe,EACf,oBAAoB,GACrB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,YAAY,EACZ,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,yBAAyB,EACzB,SAAS,EACT,WAAW,EACX,eAAe,EACf,SAAS,EACT,YAAY,EACZ,OAAO,EACP,MAAM,EACN,YAAY,EACZ,GAAG,EACH,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACd,KAAK,GACN,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AAItC,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,UAAU,EACV,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,oCAAoC,EACpC,sBAAsB,EACtB,6BAA6B,EAC7B,sBAAsB,EACtB,8BAA8B,EAC9B,+BAA+B,EAC/B,qBAAqB,EACrB,yBAAyB,EACzB,eAAe,EACf,oBAAoB,GACrB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,YAAY,EACZ,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,yBAAyB,EACzB,SAAS,EACT,WAAW,EACX,UAAU,EACV,eAAe,EACf,SAAS,EACT,YAAY,EACZ,OAAO,EACP,MAAM,EACN,YAAY,EACZ,GAAG,EACH,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACd,KAAK,GACN,MAAM,eAAe,CAAC"}
package/dist/style.css CHANGED
@@ -593,6 +593,75 @@
593
593
  opacity: 0.6;
594
594
  }
595
595
 
596
+ /* Create world's two prompts, side by side (stacked when narrow): each a
597
+ label and its own Enhance button above a filled box. */
598
+ .chai-composer__world-fields {
599
+ display: flex;
600
+ flex-wrap: wrap;
601
+ gap: var(--chai-space-4);
602
+ }
603
+
604
+ .chai-composer__world-field {
605
+ flex: 1 1 240px;
606
+ min-width: 0;
607
+ display: flex;
608
+ flex-direction: column;
609
+ gap: var(--chai-space-2);
610
+ }
611
+
612
+ .chai-composer__world-field-head {
613
+ display: flex;
614
+ align-items: center;
615
+ justify-content: space-between;
616
+ min-height: 24px;
617
+ }
618
+
619
+ .chai-composer__world-field-label {
620
+ font-size: var(--chai-type-size-xs);
621
+ font-weight: var(--chai-type-weight-material-medium);
622
+ line-height: var(--chai-type-leading-label-small);
623
+ letter-spacing: var(--chai-type-tracking-label-small);
624
+ color: var(--chai-color-semantic-control-text-strong);
625
+ }
626
+
627
+ .chai-composer__world-field-label strong {
628
+ font-weight: var(--chai-type-weight-semibold);
629
+ }
630
+
631
+ /* In the heading row, not over the text: no absolute position. */
632
+ .chai-composer__world-field-head .chai-composer__optimize {
633
+ position: static;
634
+ width: 24px;
635
+ }
636
+
637
+ .chai-composer__field--boxed {
638
+ min-height: 144px;
639
+ padding: var(--chai-space-3);
640
+ border-radius: var(--chai-radius-md);
641
+ background: var(--chai-color-semantic-control-field);
642
+ }
643
+
644
+ /* Smaller text than the bar's prompt, and no room kept for an Enhance button. */
645
+ .chai-composer__field--boxed .chai-composer__type {
646
+ padding-right: 0;
647
+ font-size: var(--chai-type-size-body-medium);
648
+ line-height: var(--chai-type-leading-body-medium);
649
+ letter-spacing: var(--chai-type-tracking-body-medium);
650
+ }
651
+
652
+ /* Why submit can't go yet (a world with no environment). */
653
+ .chai-composer__field-hint {
654
+ margin: 0;
655
+ font-size: var(--chai-type-size-xs);
656
+ line-height: var(--chai-type-leading-label-small);
657
+ letter-spacing: var(--chai-type-tracking-label-small);
658
+ color: var(--chai-composer-placeholder);
659
+ }
660
+
661
+ .chai-composer__field--boxed .chai-composer__reveal {
662
+ inset: var(--chai-space-3);
663
+ }
664
+
596
665
  /* The optimize/undo reveal (Composer.tsx's own doc comment on the overlay
597
666
  for the full mechanics) — the real textarea's text goes fully
598
667
  transparent so only the overlay's progressive, gradient-lit copy shows
@@ -2339,7 +2408,9 @@
2339
2408
  draw `<md-focus-ring>`. The Composer's textarea is the one control that
2340
2409
  had none — its ring goes on the whole pill, matching MD3's ring width
2341
2410
  and color so every ring in a component reads as the same system. */
2342
- .chai-composer:has(.chai-composer__input:focus-visible) {
2411
+ .chai-composer:has(.chai-composer__field:not(.chai-composer__field--boxed) .chai-composer__input:focus-visible),
2412
+ /* A world's two boxes: the ring marks the box being typed in, not the bar. */
2413
+ .chai-composer__field--boxed:has(.chai-composer__input:focus-visible) {
2343
2414
  outline: 3px solid var(--chai-color-semantic-accent);
2344
2415
  outline-offset: 2px;
2345
2416
  }
@@ -2365,6 +2436,7 @@
2365
2436
  }
2366
2437
 
2367
2438
  [data-chai-focus-ring="hidden"] .chai-composer:has(.chai-composer__input:focus-visible),
2439
+ [data-chai-focus-ring="hidden"] .chai-composer__field--boxed:has(.chai-composer__input:focus-visible),
2368
2440
  [data-chai-focus-ring="hidden"] :is(
2369
2441
  .chai-composer,
2370
2442
  .chai-media-analyzer,
@@ -11,7 +11,7 @@ export declare function useComposer(options?: UseComposerOptions): {
11
11
  runs: import("@chai-ui/core").Run[];
12
12
  submit: (payload: import("@chai-ui/core").ComposerSubmitPayload) => void;
13
13
  cancel: () => void;
14
- enhance: ((value: string) => Promise<string>) | undefined;
14
+ enhance: ((value: string, field?: import("@chai-ui/core").ComposerPromptField) => Promise<string>) | undefined;
15
15
  enhancing: boolean;
16
16
  routing: boolean;
17
17
  /** Props for an `EditCard` (spread them in), and `regions` for `Composer`. `null` when there's no `editImage`. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chai-ui/react",
3
- "version": "0.7.0",
3
+ "version": "0.8.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/core": "0.7.0",
52
- "@chai-ui/tokens": "0.7.0"
51
+ "@chai-ui/core": "0.8.0",
52
+ "@chai-ui/tokens": "0.8.0"
53
53
  },
54
54
  "devDependencies": {
55
55
  "@material-symbols/svg-400": "^0.47.5",
package/src/Composer.tsx CHANGED
@@ -1,5 +1,5 @@
1
1
  import { StopIcon } from "./icons.js";
2
- import { useEffect, useRef, useState, type ChangeEvent } from "react";
2
+ import { useEffect, useId, useRef, useState, type ChangeEvent } from "react";
3
3
  import { createComponent } from "@lit/react";
4
4
  import * as React from "react";
5
5
  import { MdFab } from "@material/web/fab/fab.js";
@@ -12,8 +12,9 @@ import {
12
12
  regionColor,
13
13
  TEXT_USE_CASE,
14
14
  type ComposerAttachMenuAction,
15
+ type ComposerPromptField,
15
16
  } from "@chai-ui/core";
16
- import type { EditRegion, ModelOption, ParameterOption, MediaKind } from "@chai-ui/core";
17
+ import type { EditRegion, ModelOption, ParameterOption, MediaKind, OutputKind } from "@chai-ui/core";
17
18
  import { SearchMenu } from "./primitives/SearchMenu.js";
18
19
  import type { ComposerAttachment, ComposerSubmitPayload, ComposerUseCase } from "@chai-ui/core";
19
20
 
@@ -22,6 +23,7 @@ export {
22
23
  TEXT_USE_CASE,
23
24
  type ComposerAttachMenuAction,
24
25
  type ComposerAttachment,
26
+ type ComposerPromptField,
25
27
  type ComposerSelection,
26
28
  type ComposerSubmitPayload,
27
29
  type ComposerUseCase,
@@ -61,7 +63,7 @@ export interface ComposerProps {
61
63
  useCases?: ComposerUseCase[];
62
64
  onUseCasesChange?: (next: ComposerUseCase[]) => void;
63
65
  /** Models per use-case kind, for `multiSelectUseCases`. A kind left out gets Chai's suggested models (see `models`). */
64
- modelsByKind?: Partial<Record<MediaKind, ModelOption[]>>;
66
+ modelsByKind?: Partial<Record<OutputKind, ModelOption[]>>;
65
67
  /**
66
68
  * Builder opt-in, off by default: the end user can pick several models,
67
69
  * each producing its own result (ResultCard pages through them). Uses
@@ -73,9 +75,10 @@ export interface ComposerProps {
73
75
  onModelIdsChange?: (ids: string[]) => void;
74
76
  /**
75
77
  * Models for the current use case. Leave it out and Composer offers Chai's
76
- * suggested Fal models for the use case (`suggestedModels`), with the
77
- * first one picked until the person picks another. Pass a list to use
78
- * your own; pass `[]` for no Model menu.
78
+ * suggested Fal models for the use case (`suggestedModels`). Nothing is
79
+ * picked for the person: with a Model menu, submit waits until they pick
80
+ * a model or turn on auto-select; with no menu (no `onModelChange`), the
81
+ * list's first model runs. Pass a list to use your own; `[]` for no menu.
79
82
  */
80
83
  models?: ModelOption[];
81
84
  modelId?: string | null;
@@ -96,7 +99,7 @@ export interface ComposerProps {
96
99
  * user can interact with to change it.
97
100
  */
98
101
  showAutoSelectToggle?: boolean;
99
- /** Fires when the end user toggles the switch — only reachable when `showAutoSelectToggle` is true. */
102
+ /** Fires when the end user toggles the switch — only reachable when `showAutoSelectToggle` is true — and with `false` when the picked use case changes, since auto-select belongs to the use case it was turned on for. */
100
103
  onAutoSelectModelChange?: (value: boolean) => void;
101
104
  /**
102
105
  * Optional. The Aspect ratio menu comes from the selected models'
@@ -117,11 +120,24 @@ export interface ComposerProps {
117
120
  * runs the rewrite is still an open question at the design-doc level,
118
121
  * not just an implementation gap — see the design open question 5
119
122
  * ("Enhance model"). Receives the current prompt text so the handler is
120
- * self-contained — doesn't need its own closure over `value`.
123
+ * self-contained — doesn't need its own closure over `value`. With a
124
+ * world use case each field has its own button: `field` is "environment"
125
+ * or "character" (otherwise "prompt"), so the rewrite can fit the field,
126
+ * and the handler calls `onChange` or `onCharacterChange` to match.
121
127
  */
122
- onEnhance?: (value: string) => void;
123
- /** True while the builder's own `onEnhance` handler is running its LLM call — shows the button's active state. */
128
+ onEnhance?: (value: string, field: ComposerPromptField) => void;
129
+ /** True while the builder's own `onEnhance` handler is running its LLM call — shows the active state on the button that was clicked. */
124
130
  enhancing?: boolean;
131
+ /**
132
+ * A world's character field (Create world), shown beside the environment
133
+ * while the use case is a world. `value` is the environment. Without
134
+ * `onCharacterChange`, only the environment shows.
135
+ */
136
+ character?: string;
137
+ onCharacterChange?: (value: string) => void;
138
+ /** A world's frame rate menu, from the selected models' `ModelOption.frameRates`. */
139
+ frameRate?: number | null;
140
+ onFrameRateChange?: (value: number) => void;
125
141
  /** Fires with everything Composer tracks — see `ComposerSubmitPayload`. Also what retry calls, with the same payload, when `submitError` is set. */
126
142
  onSubmit: (payload: ComposerSubmitPayload) => void;
127
143
  /**
@@ -205,6 +221,10 @@ export function Composer({
205
221
  onAspectRatioChange,
206
222
  onEnhance,
207
223
  enhancing = false,
224
+ character = "",
225
+ onCharacterChange,
226
+ frameRate = null,
227
+ onFrameRateChange,
208
228
  onSubmit,
209
229
  submitError = null,
210
230
  submitDisabled,
@@ -234,6 +254,8 @@ export function Composer({
234
254
  autoSelectModel,
235
255
  aspectRatios,
236
256
  aspectRatio,
257
+ character,
258
+ frameRate,
237
259
  submitError,
238
260
  submitDisabled,
239
261
  submitting,
@@ -248,6 +270,16 @@ export function Composer({
248
270
  onModelIdsChange?.(view.toggledModelIds(id));
249
271
  }
250
272
 
273
+ // Auto-select belongs to the Model menu it was turned on in: picking
274
+ // another use case turns it off, so the new one's model is picked by hand.
275
+ // Only when the end user owns the switch; a builder's setting stays.
276
+ const lastUseCaseKey = useRef(view.useCaseKey);
277
+ useEffect(() => {
278
+ if (lastUseCaseKey.current === view.useCaseKey) return;
279
+ lastUseCaseKey.current = view.useCaseKey;
280
+ if (autoSelectModel && showAutoSelectToggle) onAutoSelectModelChange?.(false);
281
+ }, [view.useCaseKey, autoSelectModel, showAutoSelectToggle, onAutoSelectModelChange]);
282
+
251
283
  // Auto-select chooses at submit, from the prompt (`useComposer` routes
252
284
  // with the reasoning model). Turning it on clears the current pick, so
253
285
  // the trigger reads "Auto-select" until routing fills in the real model.
@@ -260,79 +292,14 @@ export function Composer({
260
292
  wasAutoSelect.current = autoSelectModel;
261
293
  }, [autoSelectModel, multiModel, onModelChange, onModelIdsChange]);
262
294
 
263
- // Auto-grows with wrapped content instead of a fixed row count — a
264
- // static `rows` either hides wrapped lines behind a scrollbar (too
265
- // short) or wastes space while empty (too tall). Starts at one line
266
- // (matching the mock's compact minimal state) and grows only as typed
267
- // text actually wraps.
268
- const textareaRef = useRef<HTMLTextAreaElement>(null);
269
- useEffect(() => {
270
- const el = textareaRef.current;
271
- if (!el) return;
272
- el.style.height = "auto";
273
- el.style.height = `${el.scrollHeight}px`;
274
- }, [value]);
275
-
276
- // The optimize/undo cycle (§ its own button below). `value` is already
277
- // the final rewritten text the instant `enhancing` drops back to false —
278
- // the reveal below is a purely cosmetic overlay on top of it, not a
279
- // delay, so nothing here ever gates what the real `<textarea>` holds.
280
- const [originalValue, setOriginalValue] = useState<string | null>(null);
281
- const [enhancedValue, setEnhancedValue] = useState<string | null>(null);
282
- const [prevEnhancing, setPrevEnhancing] = useState(enhancing);
283
- const [animatingText, setAnimatingText] = useState<string | null>(null);
284
- const [revealedLength, setRevealedLength] = useState(0);
285
-
286
- // React to `enhancing` dropping back to false while rendering, not in an
287
- // effect (the rules of React): that's the moment the rewrite has landed.
288
- if (prevEnhancing !== enhancing) {
289
- setPrevEnhancing(enhancing);
290
- if (prevEnhancing && !enhancing && originalValue != null && value !== originalValue) {
291
- setEnhancedValue(value);
292
- // Bails on length (see the constant's own comment) or on a real
293
- // `prefers-reduced-motion` request — the reveal is itself motion, not
294
- // just the shimmer the CSS `@media` query above separately turns off.
295
- const reducedMotion =
296
- typeof window !== "undefined" && window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;
297
- if (value.length <= MAX_ANIMATE_ENHANCE_LENGTH && !reducedMotion) {
298
- setRevealedLength(0);
299
- setAnimatingText(value);
300
- }
301
- }
302
- }
303
-
304
- useEffect(() => {
305
- if (animatingText == null) return;
306
- const total = animatingText.length;
307
- const duration = enhanceRevealDurationMs(total);
308
- const start = performance.now();
309
- let raf: number;
310
- const tick = (now: number) => {
311
- const elapsed = now - start;
312
- const next = Math.min(total, Math.floor((elapsed / duration) * total));
313
- setRevealedLength((prev) => (prev === next ? prev : next));
314
- if (next < total) raf = requestAnimationFrame(tick);
315
- else setAnimatingText(null);
316
- };
317
- raf = requestAnimationFrame(tick);
318
- return () => cancelAnimationFrame(raf);
319
- }, [animatingText]);
320
-
321
- const animating = animatingText != null;
322
- const isEnhanced = !animating && enhancedValue != null && value === enhancedValue;
323
- const enhanceBusy = enhancing || animating;
324
-
325
- function handleOptimizeClick() {
326
- if (isEnhanced) {
327
- const original = originalValue;
328
- setEnhancedValue(null);
329
- setOriginalValue(null);
330
- if (original != null) onChange(original);
331
- return;
332
- }
333
- setOriginalValue(value); // snapshot now — before the rewrite lands, for undo
334
- onEnhance?.(value);
335
- }
295
+ // Which field's Enhance is running: `enhancing` is one flag for the bar.
296
+ const [enhancingField, setEnhancingField] = useState<ComposerPromptField>("prompt");
297
+ const enhanceField = (field: ComposerPromptField) =>
298
+ onEnhance &&
299
+ ((current: string) => {
300
+ setEnhancingField(field);
301
+ onEnhance(current, field);
302
+ });
336
303
 
337
304
  async function handleFilesSelected(fileList: FileList | null) {
338
305
  if (!fileList || fileList.length === 0 || !onAttachmentsChange) return;
@@ -380,49 +347,43 @@ export function Composer({
380
347
  </ul>
381
348
  )}
382
349
 
383
- <div className="chai-composer__field">
384
- <textarea
385
- ref={textareaRef}
386
- className={`chai-composer__input chai-composer__type${animating ? " chai-composer__input--revealing" : ""}`}
350
+ {view.world ? (
351
+ <div className="chai-composer__world-fields">
352
+ <PromptField
353
+ value={value}
354
+ onChange={onChange}
355
+ placeholder={view.placeholder}
356
+ heading="Environment"
357
+ note="(required)"
358
+ hint={view.environmentHint}
359
+ onEnhance={enhanceField("environment")}
360
+ enhancing={enhancing && enhancingField === "environment"}
361
+ disabled={disabled}
362
+ />
363
+ {onCharacterChange && (
364
+ <PromptField
365
+ value={character}
366
+ onChange={onCharacterChange}
367
+ placeholder={view.characterPlaceholder}
368
+ heading="Character"
369
+ note="(optional)"
370
+ onEnhance={enhanceField("character")}
371
+ enhancing={enhancing && enhancingField === "character"}
372
+ disabled={disabled}
373
+ />
374
+ )}
375
+ </div>
376
+ ) : (
377
+ <PromptField
387
378
  value={value}
388
- onChange={(e) => onChange(e.target.value)}
379
+ onChange={onChange}
389
380
  placeholder={view.placeholder}
390
- aria-label={promptLabel ?? view.placeholder}
391
- rows={1}
392
- disabled={disabled || animating}
381
+ label={promptLabel}
382
+ onEnhance={enhanceField("prompt")}
383
+ enhancing={enhancing}
384
+ disabled={disabled}
393
385
  />
394
- {/* The optimize/undo reveal overlay — decorative only. The real
395
- textarea above already holds the final text throughout (just
396
- visually suppressed via `--revealing`); this div paints the
397
- same text back in progressively with a gradient, then unmounts.
398
- `aria-hidden` so a screen reader isn't told the text twice —
399
- the textarea's own (already-final) value is what it reads. */}
400
- {animating && (
401
- <div className="chai-composer__reveal chai-composer__type" aria-hidden="true">
402
- <span className="chai-composer__reveal-text">{animatingText!.slice(0, revealedLength)}</span>
403
- </div>
404
- )}
405
- {/* "Optimize prompt" / "Revert to original prompt" — see
406
- `onEnhance`'s own doc comment on `ComposerProps` for what the
407
- rewrite itself actually does and why Composer doesn't run it.
408
- Once a rewrite lands, this becomes an undo affordance instead —
409
- an already-optimized prompt can't be re-optimized — and reverts
410
- to a plain optimize button again the moment `value` no longer
411
- matches that rewrite exactly, i.e. the person has since edited
412
- it by hand. */}
413
- {onEnhance && (
414
- <button
415
- type="button"
416
- className={`chai-composer__optimize${enhanceBusy ? " chai-composer__optimize--active" : ""}`}
417
- onClick={handleOptimizeClick}
418
- disabled={disabled || (isEnhanced ? false : !value.trim() || enhanceBusy)}
419
- aria-label={isEnhanced ? "Revert to original prompt" : "Optimize prompt"}
420
- title={isEnhanced ? "Revert to original prompt" : "Optimize prompt"}
421
- >
422
- {isEnhanced ? <UndoIcon /> : <OptimizeIcon />}
423
- </button>
424
- )}
425
- </div>
386
+ )}
426
387
 
427
388
  {submitError && (
428
389
  <p className="chai-composer__error" role="alert">
@@ -500,6 +461,19 @@ export function Composer({
500
461
  disabled={disabled}
501
462
  />
502
463
  )}
464
+
465
+ {view.frameRateOptions.length > 0 && onFrameRateChange && (
466
+ <SearchMenu
467
+ options={view.frameRateOptions.map((r) => ({ id: String(r), label: `${r}fps` }))}
468
+ value={view.offeredFrameRate == null ? null : String(view.offeredFrameRate)}
469
+ triggerLabel={view.offeredFrameRate == null ? "Frame rate" : `${view.offeredFrameRate}fps`}
470
+ menuLabel="Frame rate"
471
+ onSelect={(opt) => onFrameRateChange(Number(opt.id))}
472
+ searchable={false}
473
+ triggerVariant="text"
474
+ disabled={disabled}
475
+ />
476
+ )}
503
477
  </div>
504
478
 
505
479
  {/* MD3's `<md-fab>` has no `disabled` property of its own (FABs are
@@ -569,10 +543,190 @@ export function Composer({
569
543
  );
570
544
  }
571
545
 
546
+ /**
547
+ * One prompt textarea with its Enhance button: grows with wrapped text,
548
+ * reveals a rewrite as it lands, and offers undo until the text is edited
549
+ * by hand. A `heading` gives it a visible label above a filled box (a
550
+ * world's Environment and Character); without one it's the bar's plain
551
+ * prompt.
552
+ */
553
+ function PromptField({
554
+ value,
555
+ onChange,
556
+ placeholder,
557
+ label,
558
+ heading,
559
+ note,
560
+ hint,
561
+ onEnhance,
562
+ enhancing,
563
+ disabled,
564
+ }: {
565
+ value: string;
566
+ onChange: (value: string) => void;
567
+ placeholder: string;
568
+ /** Accessible name for the plain prompt. Defaults to `placeholder`. */
569
+ label?: string;
570
+ heading?: string;
571
+ note?: string;
572
+ /** Shown under a headed field, e.g. why submit can't go yet. */
573
+ hint?: string | null;
574
+ onEnhance?: (value: string) => void;
575
+ enhancing: boolean;
576
+ disabled: boolean;
577
+ }) {
578
+ const id = useId();
579
+ const hintId = `${id}-hint`;
580
+
581
+ // Auto-grows with wrapped content instead of a fixed row count — a
582
+ // static `rows` either hides wrapped lines behind a scrollbar (too
583
+ // short) or wastes space while empty (too tall). Starts at one line
584
+ // (matching the mock's compact minimal state) and grows only as typed
585
+ // text actually wraps.
586
+ const textareaRef = useRef<HTMLTextAreaElement>(null);
587
+ useEffect(() => {
588
+ const el = textareaRef.current;
589
+ if (!el) return;
590
+ el.style.height = "auto";
591
+ el.style.height = `${el.scrollHeight}px`;
592
+ }, [value]);
593
+
594
+ // The optimize/undo cycle (§ its own button below). `value` is already
595
+ // the final rewritten text the instant `enhancing` drops back to false —
596
+ // the reveal below is a purely cosmetic overlay on top of it, not a
597
+ // delay, so nothing here ever gates what the real `<textarea>` holds.
598
+ const [originalValue, setOriginalValue] = useState<string | null>(null);
599
+ const [enhancedValue, setEnhancedValue] = useState<string | null>(null);
600
+ const [prevEnhancing, setPrevEnhancing] = useState(enhancing);
601
+ const [animatingText, setAnimatingText] = useState<string | null>(null);
602
+ const [revealedLength, setRevealedLength] = useState(0);
603
+
604
+ // React to `enhancing` dropping back to false while rendering, not in an
605
+ // effect (the rules of React): that's the moment the rewrite has landed.
606
+ if (prevEnhancing !== enhancing) {
607
+ setPrevEnhancing(enhancing);
608
+ if (prevEnhancing && !enhancing && originalValue != null && value !== originalValue) {
609
+ setEnhancedValue(value);
610
+ // Bails on length (see the constant's own comment) or on a real
611
+ // `prefers-reduced-motion` request — the reveal is itself motion, not
612
+ // just the shimmer the CSS `@media` query above separately turns off.
613
+ const reducedMotion =
614
+ typeof window !== "undefined" && window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;
615
+ if (value.length <= MAX_ANIMATE_ENHANCE_LENGTH && !reducedMotion) {
616
+ setRevealedLength(0);
617
+ setAnimatingText(value);
618
+ }
619
+ }
620
+ }
621
+
622
+ useEffect(() => {
623
+ if (animatingText == null) return;
624
+ const total = animatingText.length;
625
+ const duration = enhanceRevealDurationMs(total);
626
+ const start = performance.now();
627
+ let raf: number;
628
+ const tick = (now: number) => {
629
+ const elapsed = now - start;
630
+ const next = Math.min(total, Math.floor((elapsed / duration) * total));
631
+ setRevealedLength((prev) => (prev === next ? prev : next));
632
+ if (next < total) raf = requestAnimationFrame(tick);
633
+ else setAnimatingText(null);
634
+ };
635
+ raf = requestAnimationFrame(tick);
636
+ return () => cancelAnimationFrame(raf);
637
+ }, [animatingText]);
638
+
639
+ const animating = animatingText != null;
640
+ const isEnhanced = !animating && enhancedValue != null && value === enhancedValue;
641
+ const enhanceBusy = enhancing || animating;
642
+
643
+ function handleOptimizeClick() {
644
+ if (isEnhanced) {
645
+ const original = originalValue;
646
+ setEnhancedValue(null);
647
+ setOriginalValue(null);
648
+ if (original != null) onChange(original);
649
+ return;
650
+ }
651
+ setOriginalValue(value); // snapshot now — before the rewrite lands, for undo
652
+ onEnhance?.(value);
653
+ }
654
+
655
+ const optimizeLabel = isEnhanced ? "Revert to original" : "Optimize";
656
+ const optimizeName = `${optimizeLabel} ${heading ? heading.toLowerCase() : "prompt"}`;
657
+ /* "Optimize prompt" / "Revert to original prompt" — see `onEnhance`'s own
658
+ doc comment on `ComposerProps` for what the rewrite itself actually
659
+ does and why Composer doesn't run it. Once a rewrite lands, this
660
+ becomes an undo affordance instead — an already-optimized prompt can't
661
+ be re-optimized — and reverts to a plain optimize button again the
662
+ moment `value` no longer matches that rewrite exactly, i.e. the person
663
+ has since edited it by hand. */
664
+ const optimize = onEnhance && (
665
+ <button
666
+ type="button"
667
+ className={`chai-composer__optimize${enhanceBusy ? " chai-composer__optimize--active" : ""}`}
668
+ onClick={handleOptimizeClick}
669
+ disabled={disabled || (isEnhanced ? false : !value.trim() || enhanceBusy)}
670
+ aria-label={optimizeName}
671
+ title={optimizeName}
672
+ >
673
+ {isEnhanced ? <UndoIcon /> : <OptimizeIcon />}
674
+ </button>
675
+ );
676
+
677
+ const field = (
678
+ <div className={`chai-composer__field${heading ? " chai-composer__field--boxed" : ""}`}>
679
+ <textarea
680
+ ref={textareaRef}
681
+ id={id}
682
+ className={`chai-composer__input chai-composer__type${animating ? " chai-composer__input--revealing" : ""}`}
683
+ value={value}
684
+ onChange={(e) => onChange(e.target.value)}
685
+ placeholder={placeholder}
686
+ aria-label={heading ? undefined : (label ?? placeholder)}
687
+ aria-describedby={hint ? hintId : undefined}
688
+ rows={1}
689
+ disabled={disabled || animating}
690
+ />
691
+ {/* The optimize/undo reveal overlay — decorative only. The real
692
+ textarea above already holds the final text throughout (just
693
+ visually suppressed via `--revealing`); this div paints the
694
+ same text back in progressively with a gradient, then unmounts.
695
+ `aria-hidden` so a screen reader isn't told the text twice —
696
+ the textarea's own (already-final) value is what it reads. */}
697
+ {animating && (
698
+ <div className="chai-composer__reveal chai-composer__type" aria-hidden="true">
699
+ <span className="chai-composer__reveal-text">{animatingText!.slice(0, revealedLength)}</span>
700
+ </div>
701
+ )}
702
+ {!heading && optimize}
703
+ </div>
704
+ );
705
+
706
+ if (!heading) return field;
707
+ return (
708
+ <div className="chai-composer__world-field">
709
+ <div className="chai-composer__world-field-head">
710
+ <label htmlFor={id} className="chai-composer__world-field-label">
711
+ <strong>{heading}</strong> {note}
712
+ </label>
713
+ {optimize}
714
+ </div>
715
+ {field}
716
+ {hint && (
717
+ <p id={hintId} className="chai-composer__field-hint">
718
+ {hint}
719
+ </p>
720
+ )}
721
+ </div>
722
+ );
723
+ }
724
+
572
725
  const ATTACH_MENU_ICONS: Record<ComposerAttachMenuAction, React.ReactNode> = {
573
726
  "add-media": <AttachFileIcon />,
574
727
  "create-image": <ImageIcon />,
575
728
  "create-video": <VideocamIcon />,
729
+ "create-world": <GlobeIcon />,
576
730
  "edit-media": <ContentCutIcon />,
577
731
  };
578
732
 
@@ -891,6 +1045,18 @@ function AttachFileIcon() {
891
1045
  );
892
1046
  }
893
1047
 
1048
+ // Material Symbols "globe" — the attach menu's Create world.
1049
+ function GlobeIcon() {
1050
+ return (
1051
+ <svg viewBox="0 -960 960 960" aria-hidden="true">
1052
+ <path
1053
+ d="M480.27-80q-82.74 0-155.5-31.5Q252-143 197.5-197.5t-86-127.34Q80-397.68 80-480.5t31.5-155.66Q143-709 197.5-763t127.34-85.5Q397.68-880 480.5-880t155.66 31.5Q709-817 763-763t85.5 127Q880-563 880-480.27q0 82.74-31.5 155.5Q817-252 763-197.68q-54 54.31-127 86Q563-80 480.27-80Zm-.27-60q142.38 0 241.19-99.5T820-480v-13q-6 26-27.41 43.5Q771.19-432 742-432h-80q-33 0-56.5-23.5T582-512v-40H422v-80q0-33 23.5-56.5T502-712h40v-22q0-16 13.5-40t30.5-29q-25-8-51.36-12.5Q508.29-820 480-820q-141 0-240.5 98.81T140-480h150q66 0 113 47t47 113v40H330v105q34 17 71.7 26t78.3 9Z"
1054
+ fill="currentColor"
1055
+ />
1056
+ </svg>
1057
+ );
1058
+ }
1059
+
894
1060
  function ImageIcon() {
895
1061
  return (
896
1062
  <svg viewBox="0 -960 960 960" aria-hidden="true">
package/src/index.ts CHANGED
@@ -40,6 +40,7 @@ export type {
40
40
  MediaAnalysisPromptLength,
41
41
  MediaKind,
42
42
  ModelOption,
43
+ OutputKind,
43
44
  ParameterOption,
44
45
  RegionBox,
45
46
  RegionFormat,
package/src/style.css CHANGED
@@ -593,6 +593,75 @@
593
593
  opacity: 0.6;
594
594
  }
595
595
 
596
+ /* Create world's two prompts, side by side (stacked when narrow): each a
597
+ label and its own Enhance button above a filled box. */
598
+ .chai-composer__world-fields {
599
+ display: flex;
600
+ flex-wrap: wrap;
601
+ gap: var(--chai-space-4);
602
+ }
603
+
604
+ .chai-composer__world-field {
605
+ flex: 1 1 240px;
606
+ min-width: 0;
607
+ display: flex;
608
+ flex-direction: column;
609
+ gap: var(--chai-space-2);
610
+ }
611
+
612
+ .chai-composer__world-field-head {
613
+ display: flex;
614
+ align-items: center;
615
+ justify-content: space-between;
616
+ min-height: 24px;
617
+ }
618
+
619
+ .chai-composer__world-field-label {
620
+ font-size: var(--chai-type-size-xs);
621
+ font-weight: var(--chai-type-weight-material-medium);
622
+ line-height: var(--chai-type-leading-label-small);
623
+ letter-spacing: var(--chai-type-tracking-label-small);
624
+ color: var(--chai-color-semantic-control-text-strong);
625
+ }
626
+
627
+ .chai-composer__world-field-label strong {
628
+ font-weight: var(--chai-type-weight-semibold);
629
+ }
630
+
631
+ /* In the heading row, not over the text: no absolute position. */
632
+ .chai-composer__world-field-head .chai-composer__optimize {
633
+ position: static;
634
+ width: 24px;
635
+ }
636
+
637
+ .chai-composer__field--boxed {
638
+ min-height: 144px;
639
+ padding: var(--chai-space-3);
640
+ border-radius: var(--chai-radius-md);
641
+ background: var(--chai-color-semantic-control-field);
642
+ }
643
+
644
+ /* Smaller text than the bar's prompt, and no room kept for an Enhance button. */
645
+ .chai-composer__field--boxed .chai-composer__type {
646
+ padding-right: 0;
647
+ font-size: var(--chai-type-size-body-medium);
648
+ line-height: var(--chai-type-leading-body-medium);
649
+ letter-spacing: var(--chai-type-tracking-body-medium);
650
+ }
651
+
652
+ /* Why submit can't go yet (a world with no environment). */
653
+ .chai-composer__field-hint {
654
+ margin: 0;
655
+ font-size: var(--chai-type-size-xs);
656
+ line-height: var(--chai-type-leading-label-small);
657
+ letter-spacing: var(--chai-type-tracking-label-small);
658
+ color: var(--chai-composer-placeholder);
659
+ }
660
+
661
+ .chai-composer__field--boxed .chai-composer__reveal {
662
+ inset: var(--chai-space-3);
663
+ }
664
+
596
665
  /* The optimize/undo reveal (Composer.tsx's own doc comment on the overlay
597
666
  for the full mechanics) — the real textarea's text goes fully
598
667
  transparent so only the overlay's progressive, gradient-lit copy shows
@@ -2339,7 +2408,9 @@
2339
2408
  draw `<md-focus-ring>`. The Composer's textarea is the one control that
2340
2409
  had none — its ring goes on the whole pill, matching MD3's ring width
2341
2410
  and color so every ring in a component reads as the same system. */
2342
- .chai-composer:has(.chai-composer__input:focus-visible) {
2411
+ .chai-composer:has(.chai-composer__field:not(.chai-composer__field--boxed) .chai-composer__input:focus-visible),
2412
+ /* A world's two boxes: the ring marks the box being typed in, not the bar. */
2413
+ .chai-composer__field--boxed:has(.chai-composer__input:focus-visible) {
2343
2414
  outline: 3px solid var(--chai-color-semantic-accent);
2344
2415
  outline-offset: 2px;
2345
2416
  }
@@ -2365,6 +2436,7 @@
2365
2436
  }
2366
2437
 
2367
2438
  [data-chai-focus-ring="hidden"] .chai-composer:has(.chai-composer__input:focus-visible),
2439
+ [data-chai-focus-ring="hidden"] .chai-composer__field--boxed:has(.chai-composer__input:focus-visible),
2368
2440
  [data-chai-focus-ring="hidden"] :is(
2369
2441
  .chai-composer,
2370
2442
  .chai-media-analyzer,