@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 +1 -0
- package/README.md +13 -7
- package/dist/Composer.d.ts +26 -12
- package/dist/Composer.d.ts.map +1 -1
- package/dist/Composer.js +88 -38
- package/dist/Composer.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/style.css +73 -1
- package/dist/useComposer.d.ts +1 -1
- package/package.json +3 -3
- package/src/Composer.tsx +289 -123
- package/src/index.ts +1 -0
- package/src/style.css +73 -1
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,
|
|
84
|
-
//
|
|
85
|
-
//
|
|
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`.
|
|
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)`)
|
|
221
|
-
|
|
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
|
-
//
|
|
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} />}
|
package/dist/Composer.d.ts
CHANGED
|
@@ -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,
|
|
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<
|
|
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`)
|
|
45
|
-
*
|
|
46
|
-
*
|
|
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
|
|
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
|
package/dist/Composer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Composer.d.ts","sourceRoot":"","sources":["../src/Composer.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAQL,KAAK,wBAAwB,
|
|
1
|
+
{"version":3,"file":"Composer.d.ts","sourceRoot":"","sources":["../src/Composer.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAQL,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACzB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAa,UAAU,EAAE,MAAM,eAAe,CAAC;AAErG,OAAO,KAAK,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhG,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,KAAK,wBAAwB,EAC7B,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,GACrB,MAAM,eAAe,CAAC;AAUvB,MAAM,WAAW,aAAa;IAC5B,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,4FAA4F;IAC5F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qIAAqI;IACrI,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACnC,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,EAAE,KAAK,IAAI,CAAC;IAC3D,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,mFAAmF;IACnF,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,uHAAuH;IACvH,cAAc,CAAC,EAAE,eAAe,CAAC;IACjC;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAC7B,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,IAAI,CAAC;IACrD,wHAAwH;IACxH,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;IAC1D;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC3C;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,yGAAyG;IACzG,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC5C;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;;OAOG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,2NAA2N;IAC3N,uBAAuB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnD;;;;OAIG;IACH,YAAY,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;IACzC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C;;;;;;;;;;;;;;;OAeG;IACH,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAChE,wIAAwI;IACxI,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,qFAAqF;IACrF,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,oJAAoJ;IACpJ,QAAQ,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACnD;;;;;;;;;;OAUG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,sJAAsJ;IACtJ,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uLAAuL;IACvL,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,wBAAwB,KAAK,IAAI,CAAC;IAChE;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,wBAAwB,EAAE,CAAC;IAC/C;;;OAGG;IACH,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IAC/C,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,QAAQ,EACR,WAAW,EACX,WAAW,EACX,WAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,OAAc,EACd,cAAc,EACd,cAA8B,EAC9B,mBAA2B,EAC3B,QAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,iBAAyB,EACzB,QAAa,EACb,gBAAgB,EAChB,MAAM,EACN,OAAc,EACd,aAAa,EACb,eAAuB,EACvB,oBAA4B,EAC5B,uBAAuB,EACvB,YAAY,EACZ,WAAkB,EAClB,mBAAmB,EACnB,SAAS,EACT,SAAiB,EACjB,SAAc,EACd,iBAAiB,EACjB,SAAgB,EAChB,iBAAiB,EACjB,QAAQ,EACR,WAAkB,EAClB,cAAc,EACd,UAAkB,EAClB,OAAO,EACP,kBAAkB,EAClB,iBAAiB,EACjB,OAAY,EACZ,eAAe,EACf,QAAgB,GACjB,EAAE,aAAa,qBAkTf"}
|
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
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
const
|
|
155
|
-
|
|
156
|
-
|
|
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
|
}
|
package/dist/Composer.js.map
CHANGED
|
@@ -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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
package/dist/useComposer.d.ts
CHANGED
|
@@ -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.
|
|
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.
|
|
52
|
-
"@chai-ui/tokens": "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<
|
|
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`)
|
|
77
|
-
*
|
|
78
|
-
*
|
|
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
|
|
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
|
-
//
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
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
|
-
|
|
384
|
-
<
|
|
385
|
-
|
|
386
|
-
|
|
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={
|
|
379
|
+
onChange={onChange}
|
|
389
380
|
placeholder={view.placeholder}
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
381
|
+
label={promptLabel}
|
|
382
|
+
onEnhance={enhanceField("prompt")}
|
|
383
|
+
enhancing={enhancing}
|
|
384
|
+
disabled={disabled}
|
|
393
385
|
/>
|
|
394
|
-
|
|
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
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,
|