@chai-ui/react 0.7.1 → 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/dist/Composer.d.ts +21 -8
- package/dist/Composer.d.ts.map +1 -1
- package/dist/Composer.js +77 -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 +274 -119
- 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/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
|
|
@@ -86,11 +86,24 @@ export interface ComposerProps {
|
|
|
86
86
|
* runs the rewrite is still an open question at the design-doc level,
|
|
87
87
|
* not just an implementation gap — see the design open question 5
|
|
88
88
|
* ("Enhance model"). Receives the current prompt text so the handler is
|
|
89
|
-
* 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.
|
|
90
93
|
*/
|
|
91
|
-
onEnhance?: (value: string) => void;
|
|
92
|
-
/** 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. */
|
|
93
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;
|
|
94
107
|
/** Fires with everything Composer tracks — see `ComposerSubmitPayload`. Also what retry calls, with the same payload, when `submitError` is set. */
|
|
95
108
|
onSubmit: (payload: ComposerSubmitPayload) => void;
|
|
96
109
|
/**
|
|
@@ -144,5 +157,5 @@ export interface ComposerProps {
|
|
|
144
157
|
* `control-*` semantic tokens, restylable per instance through the
|
|
145
158
|
* `--chai-composer-*` custom properties in style.css.
|
|
146
159
|
*/
|
|
147
|
-
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;
|
|
148
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":"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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,
|
|
@@ -80,6 +82,60 @@ export function Composer({ value, onChange, placeholder, promptLabel, attachment
|
|
|
80
82
|
}
|
|
81
83
|
wasAutoSelect.current = autoSelectModel;
|
|
82
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`;
|
|
83
139
|
// Auto-grows with wrapped content instead of a fixed row count — a
|
|
84
140
|
// static `rows` either hides wrapped lines behind a scrollbar (too
|
|
85
141
|
// short) or wastes space while empty (too tall). Starts at one line
|
|
@@ -152,47 +208,26 @@ export function Composer({ value, onChange, placeholder, promptLabel, attachment
|
|
|
152
208
|
setOriginalValue(value); // snapshot now — before the rewrite lands, for undo
|
|
153
209
|
onEnhance?.(value);
|
|
154
210
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
const
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
});
|
|
169
|
-
function handleRemoveAttachment(id) {
|
|
170
|
-
onAttachmentsChange?.(attachments.filter((a) => a.id !== id));
|
|
171
|
-
}
|
|
172
|
-
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
|
|
173
|
-
? onUseCasesChange && (() => onUseCasesChange(useCases.filter((x) => x.kind !== u.kind)))
|
|
174
|
-
: onClearUseCase, disabled: disabled }, u.kind))), modelSections.length > 0 && view.canPickModel && (_jsx(SearchMenu, { ...(multiSelectUseCases
|
|
175
|
-
? { sections: modelSections.map((s) => ({ label: s.label, options: s.options })) }
|
|
176
|
-
: { options: modelSections[0].options }), value: multiModel ? pickedModelIds : modelId, multiple: multiModel, toggleHeader: showAutoSelectToggle
|
|
177
|
-
? {
|
|
178
|
-
label: "Auto-select model",
|
|
179
|
-
value: autoSelectModel,
|
|
180
|
-
onChange: (v) => onAutoSelectModelChange?.(v),
|
|
181
|
-
}
|
|
182
|
-
: 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, ...{
|
|
183
|
-
ariaLabel: showStop ? "Stop" : submitError ? "Retry" : "Submit",
|
|
184
|
-
ariaDisabled: showStop ? "false" : submitting ? "true" : isSubmitDisabled ? "true" : "false",
|
|
185
|
-
}, onClick: () => {
|
|
186
|
-
if (showStop)
|
|
187
|
-
onAbort?.();
|
|
188
|
-
else if (!isSubmitDisabled && !submitting)
|
|
189
|
-
onSubmit(view.payload());
|
|
190
|
-
}, 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 }))] }));
|
|
191
225
|
}
|
|
192
226
|
const ATTACH_MENU_ICONS = {
|
|
193
227
|
"add-media": _jsx(AttachFileIcon, {}),
|
|
194
228
|
"create-image": _jsx(ImageIcon, {}),
|
|
195
229
|
"create-video": _jsx(VideocamIcon, {}),
|
|
230
|
+
"create-world": _jsx(GlobeIcon, {}),
|
|
196
231
|
"edit-media": _jsx(ContentCutIcon, {}),
|
|
197
232
|
};
|
|
198
233
|
/**
|
|
@@ -327,6 +362,10 @@ function UndoIcon() {
|
|
|
327
362
|
function AttachFileIcon() {
|
|
328
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" }) }));
|
|
329
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
|
+
}
|
|
330
369
|
function ImageIcon() {
|
|
331
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" }) }));
|
|
332
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/
|
|
52
|
-
"@chai-ui/
|
|
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
|
|
@@ -118,11 +120,24 @@ export interface ComposerProps {
|
|
|
118
120
|
* runs the rewrite is still an open question at the design-doc level,
|
|
119
121
|
* not just an implementation gap — see the design open question 5
|
|
120
122
|
* ("Enhance model"). Receives the current prompt text so the handler is
|
|
121
|
-
* 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.
|
|
122
127
|
*/
|
|
123
|
-
onEnhance?: (value: string) => void;
|
|
124
|
-
/** 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. */
|
|
125
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;
|
|
126
141
|
/** Fires with everything Composer tracks — see `ComposerSubmitPayload`. Also what retry calls, with the same payload, when `submitError` is set. */
|
|
127
142
|
onSubmit: (payload: ComposerSubmitPayload) => void;
|
|
128
143
|
/**
|
|
@@ -206,6 +221,10 @@ export function Composer({
|
|
|
206
221
|
onAspectRatioChange,
|
|
207
222
|
onEnhance,
|
|
208
223
|
enhancing = false,
|
|
224
|
+
character = "",
|
|
225
|
+
onCharacterChange,
|
|
226
|
+
frameRate = null,
|
|
227
|
+
onFrameRateChange,
|
|
209
228
|
onSubmit,
|
|
210
229
|
submitError = null,
|
|
211
230
|
submitDisabled,
|
|
@@ -235,6 +254,8 @@ export function Composer({
|
|
|
235
254
|
autoSelectModel,
|
|
236
255
|
aspectRatios,
|
|
237
256
|
aspectRatio,
|
|
257
|
+
character,
|
|
258
|
+
frameRate,
|
|
238
259
|
submitError,
|
|
239
260
|
submitDisabled,
|
|
240
261
|
submitting,
|
|
@@ -271,79 +292,14 @@ export function Composer({
|
|
|
271
292
|
wasAutoSelect.current = autoSelectModel;
|
|
272
293
|
}, [autoSelectModel, multiModel, onModelChange, onModelIdsChange]);
|
|
273
294
|
|
|
274
|
-
//
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
if (!el) return;
|
|
283
|
-
el.style.height = "auto";
|
|
284
|
-
el.style.height = `${el.scrollHeight}px`;
|
|
285
|
-
}, [value]);
|
|
286
|
-
|
|
287
|
-
// The optimize/undo cycle (§ its own button below). `value` is already
|
|
288
|
-
// the final rewritten text the instant `enhancing` drops back to false —
|
|
289
|
-
// the reveal below is a purely cosmetic overlay on top of it, not a
|
|
290
|
-
// delay, so nothing here ever gates what the real `<textarea>` holds.
|
|
291
|
-
const [originalValue, setOriginalValue] = useState<string | null>(null);
|
|
292
|
-
const [enhancedValue, setEnhancedValue] = useState<string | null>(null);
|
|
293
|
-
const [prevEnhancing, setPrevEnhancing] = useState(enhancing);
|
|
294
|
-
const [animatingText, setAnimatingText] = useState<string | null>(null);
|
|
295
|
-
const [revealedLength, setRevealedLength] = useState(0);
|
|
296
|
-
|
|
297
|
-
// React to `enhancing` dropping back to false while rendering, not in an
|
|
298
|
-
// effect (the rules of React): that's the moment the rewrite has landed.
|
|
299
|
-
if (prevEnhancing !== enhancing) {
|
|
300
|
-
setPrevEnhancing(enhancing);
|
|
301
|
-
if (prevEnhancing && !enhancing && originalValue != null && value !== originalValue) {
|
|
302
|
-
setEnhancedValue(value);
|
|
303
|
-
// Bails on length (see the constant's own comment) or on a real
|
|
304
|
-
// `prefers-reduced-motion` request — the reveal is itself motion, not
|
|
305
|
-
// just the shimmer the CSS `@media` query above separately turns off.
|
|
306
|
-
const reducedMotion =
|
|
307
|
-
typeof window !== "undefined" && window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;
|
|
308
|
-
if (value.length <= MAX_ANIMATE_ENHANCE_LENGTH && !reducedMotion) {
|
|
309
|
-
setRevealedLength(0);
|
|
310
|
-
setAnimatingText(value);
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
useEffect(() => {
|
|
316
|
-
if (animatingText == null) return;
|
|
317
|
-
const total = animatingText.length;
|
|
318
|
-
const duration = enhanceRevealDurationMs(total);
|
|
319
|
-
const start = performance.now();
|
|
320
|
-
let raf: number;
|
|
321
|
-
const tick = (now: number) => {
|
|
322
|
-
const elapsed = now - start;
|
|
323
|
-
const next = Math.min(total, Math.floor((elapsed / duration) * total));
|
|
324
|
-
setRevealedLength((prev) => (prev === next ? prev : next));
|
|
325
|
-
if (next < total) raf = requestAnimationFrame(tick);
|
|
326
|
-
else setAnimatingText(null);
|
|
327
|
-
};
|
|
328
|
-
raf = requestAnimationFrame(tick);
|
|
329
|
-
return () => cancelAnimationFrame(raf);
|
|
330
|
-
}, [animatingText]);
|
|
331
|
-
|
|
332
|
-
const animating = animatingText != null;
|
|
333
|
-
const isEnhanced = !animating && enhancedValue != null && value === enhancedValue;
|
|
334
|
-
const enhanceBusy = enhancing || animating;
|
|
335
|
-
|
|
336
|
-
function handleOptimizeClick() {
|
|
337
|
-
if (isEnhanced) {
|
|
338
|
-
const original = originalValue;
|
|
339
|
-
setEnhancedValue(null);
|
|
340
|
-
setOriginalValue(null);
|
|
341
|
-
if (original != null) onChange(original);
|
|
342
|
-
return;
|
|
343
|
-
}
|
|
344
|
-
setOriginalValue(value); // snapshot now — before the rewrite lands, for undo
|
|
345
|
-
onEnhance?.(value);
|
|
346
|
-
}
|
|
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
|
+
});
|
|
347
303
|
|
|
348
304
|
async function handleFilesSelected(fileList: FileList | null) {
|
|
349
305
|
if (!fileList || fileList.length === 0 || !onAttachmentsChange) return;
|
|
@@ -391,49 +347,43 @@ export function Composer({
|
|
|
391
347
|
</ul>
|
|
392
348
|
)}
|
|
393
349
|
|
|
394
|
-
|
|
395
|
-
<
|
|
396
|
-
|
|
397
|
-
|
|
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
|
|
398
378
|
value={value}
|
|
399
|
-
onChange={
|
|
379
|
+
onChange={onChange}
|
|
400
380
|
placeholder={view.placeholder}
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
381
|
+
label={promptLabel}
|
|
382
|
+
onEnhance={enhanceField("prompt")}
|
|
383
|
+
enhancing={enhancing}
|
|
384
|
+
disabled={disabled}
|
|
404
385
|
/>
|
|
405
|
-
|
|
406
|
-
textarea above already holds the final text throughout (just
|
|
407
|
-
visually suppressed via `--revealing`); this div paints the
|
|
408
|
-
same text back in progressively with a gradient, then unmounts.
|
|
409
|
-
`aria-hidden` so a screen reader isn't told the text twice —
|
|
410
|
-
the textarea's own (already-final) value is what it reads. */}
|
|
411
|
-
{animating && (
|
|
412
|
-
<div className="chai-composer__reveal chai-composer__type" aria-hidden="true">
|
|
413
|
-
<span className="chai-composer__reveal-text">{animatingText!.slice(0, revealedLength)}</span>
|
|
414
|
-
</div>
|
|
415
|
-
)}
|
|
416
|
-
{/* "Optimize prompt" / "Revert to original prompt" — see
|
|
417
|
-
`onEnhance`'s own doc comment on `ComposerProps` for what the
|
|
418
|
-
rewrite itself actually does and why Composer doesn't run it.
|
|
419
|
-
Once a rewrite lands, this becomes an undo affordance instead —
|
|
420
|
-
an already-optimized prompt can't be re-optimized — and reverts
|
|
421
|
-
to a plain optimize button again the moment `value` no longer
|
|
422
|
-
matches that rewrite exactly, i.e. the person has since edited
|
|
423
|
-
it by hand. */}
|
|
424
|
-
{onEnhance && (
|
|
425
|
-
<button
|
|
426
|
-
type="button"
|
|
427
|
-
className={`chai-composer__optimize${enhanceBusy ? " chai-composer__optimize--active" : ""}`}
|
|
428
|
-
onClick={handleOptimizeClick}
|
|
429
|
-
disabled={disabled || (isEnhanced ? false : !value.trim() || enhanceBusy)}
|
|
430
|
-
aria-label={isEnhanced ? "Revert to original prompt" : "Optimize prompt"}
|
|
431
|
-
title={isEnhanced ? "Revert to original prompt" : "Optimize prompt"}
|
|
432
|
-
>
|
|
433
|
-
{isEnhanced ? <UndoIcon /> : <OptimizeIcon />}
|
|
434
|
-
</button>
|
|
435
|
-
)}
|
|
436
|
-
</div>
|
|
386
|
+
)}
|
|
437
387
|
|
|
438
388
|
{submitError && (
|
|
439
389
|
<p className="chai-composer__error" role="alert">
|
|
@@ -511,6 +461,19 @@ export function Composer({
|
|
|
511
461
|
disabled={disabled}
|
|
512
462
|
/>
|
|
513
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
|
+
)}
|
|
514
477
|
</div>
|
|
515
478
|
|
|
516
479
|
{/* MD3's `<md-fab>` has no `disabled` property of its own (FABs are
|
|
@@ -580,10 +543,190 @@ export function Composer({
|
|
|
580
543
|
);
|
|
581
544
|
}
|
|
582
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
|
+
|
|
583
725
|
const ATTACH_MENU_ICONS: Record<ComposerAttachMenuAction, React.ReactNode> = {
|
|
584
726
|
"add-media": <AttachFileIcon />,
|
|
585
727
|
"create-image": <ImageIcon />,
|
|
586
728
|
"create-video": <VideocamIcon />,
|
|
729
|
+
"create-world": <GlobeIcon />,
|
|
587
730
|
"edit-media": <ContentCutIcon />,
|
|
588
731
|
};
|
|
589
732
|
|
|
@@ -902,6 +1045,18 @@ function AttachFileIcon() {
|
|
|
902
1045
|
);
|
|
903
1046
|
}
|
|
904
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
|
+
|
|
905
1060
|
function ImageIcon() {
|
|
906
1061
|
return (
|
|
907
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,
|