@chai-ui/react 0.1.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 +207 -0
- package/LICENSE +21 -0
- package/README.md +265 -0
- package/dist/ChaiProvider.d.ts +49 -0
- package/dist/ChaiProvider.d.ts.map +1 -0
- package/dist/ChaiProvider.js +54 -0
- package/dist/ChaiProvider.js.map +1 -0
- package/dist/Composer.d.ts +169 -0
- package/dist/Composer.d.ts.map +1 -0
- package/dist/Composer.js +389 -0
- package/dist/Composer.js.map +1 -0
- package/dist/MediaAnalyzer.d.ts +102 -0
- package/dist/MediaAnalyzer.d.ts.map +1 -0
- package/dist/MediaAnalyzer.js +250 -0
- package/dist/MediaAnalyzer.js.map +1 -0
- package/dist/ResultCard.d.ts +55 -0
- package/dist/ResultCard.d.ts.map +1 -0
- package/dist/ResultCard.js +409 -0
- package/dist/ResultCard.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/primitives/Pagination.d.ts +19 -0
- package/dist/primitives/Pagination.d.ts.map +1 -0
- package/dist/primitives/Pagination.js +13 -0
- package/dist/primitives/Pagination.js.map +1 -0
- package/dist/primitives/SearchMenu.d.ts +69 -0
- package/dist/primitives/SearchMenu.d.ts.map +1 -0
- package/dist/primitives/SearchMenu.js +88 -0
- package/dist/primitives/SearchMenu.js.map +1 -0
- package/dist/primitives/Toggle.d.ts +9 -0
- package/dist/primitives/Toggle.d.ts.map +1 -0
- package/dist/primitives/Toggle.js +28 -0
- package/dist/primitives/Toggle.js.map +1 -0
- package/dist/primitives/index.d.ts +4 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/index.js +4 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/style.css +1860 -0
- package/dist/use-latest.d.ts +7 -0
- package/dist/use-latest.d.ts.map +1 -0
- package/dist/use-latest.js +17 -0
- package/dist/use-latest.js.map +1 -0
- package/dist/useComposer.d.ts +75 -0
- package/dist/useComposer.d.ts.map +1 -0
- package/dist/useComposer.js +191 -0
- package/dist/useComposer.js.map +1 -0
- package/dist/useMediaAnalyzer.d.ts +37 -0
- package/dist/useMediaAnalyzer.d.ts.map +1 -0
- package/dist/useMediaAnalyzer.js +114 -0
- package/dist/useMediaAnalyzer.js.map +1 -0
- package/package.json +88 -0
- package/src/ChaiProvider.tsx +88 -0
- package/src/Composer.tsx +961 -0
- package/src/MediaAnalyzer.tsx +527 -0
- package/src/ResultCard.tsx +980 -0
- package/src/index.ts +36 -0
- package/src/primitives/Pagination.tsx +41 -0
- package/src/primitives/SearchMenu.tsx +284 -0
- package/src/primitives/Toggle.tsx +43 -0
- package/src/primitives/index.ts +3 -0
- package/src/style.css +1860 -0
- package/src/use-latest.ts +18 -0
- package/src/useComposer.ts +289 -0
- package/src/useMediaAnalyzer.ts +157 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import type { DroppedMedia, ModelOption, ParameterOption, MediaKind } from "@chai-ui/core";
|
|
3
|
+
export interface ComposerAttachment extends DroppedMedia {
|
|
4
|
+
id: string;
|
|
5
|
+
}
|
|
6
|
+
export type ComposerAttachMenuAction = "add-media" | "create-image" | "create-video" | "edit-media";
|
|
7
|
+
/**
|
|
8
|
+
* The selected generation use case, shown as a removable chip (reference:
|
|
9
|
+
* the mock's "Video"/"Image" chip) — deliberately independent of
|
|
10
|
+
* `attachments`: a use case can be picked from the attach menu with nothing
|
|
11
|
+
* attached yet (e.g. "Create video"). Composer never derives this from
|
|
12
|
+
* `attachments` itself (that's app-level policy, not a Composer opinion —
|
|
13
|
+
* the design). With none picked, `defaultUseCase` applies.
|
|
14
|
+
*/
|
|
15
|
+
export interface ComposerUseCase {
|
|
16
|
+
kind: MediaKind;
|
|
17
|
+
label: string;
|
|
18
|
+
}
|
|
19
|
+
/** A plain text request — what a submit means when no use case is picked, unless the builder sets `defaultUseCase`. */
|
|
20
|
+
export declare const TEXT_USE_CASE: ComposerUseCase;
|
|
21
|
+
/** One use case to run and the models picked for it. Empty `modelIds` means the engine's default model. */
|
|
22
|
+
export interface ComposerSelection {
|
|
23
|
+
useCase: ComposerUseCase;
|
|
24
|
+
modelIds: string[];
|
|
25
|
+
/** The models offered for this use case: what auto-select routes among. */
|
|
26
|
+
models: ModelOption[];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Everything Composer itself tracks, assembled into one object at submit
|
|
30
|
+
* time — not the the design `Request` shape (no `mode`/`params`/
|
|
31
|
+
* `presetId`; those belong to the run store this package doesn't have yet,
|
|
32
|
+
* see the package README), just an honest snapshot of this component's own
|
|
33
|
+
* state. Handed to `onSubmit` so a builder doesn't have to re-derive it
|
|
34
|
+
* from five separately-controlled props they already hold — mainly a
|
|
35
|
+
* correctness/ergonomics win for a coding agent wiring this up from the
|
|
36
|
+
* type signature alone.
|
|
37
|
+
*/
|
|
38
|
+
export interface ComposerSubmitPayload {
|
|
39
|
+
value: string;
|
|
40
|
+
attachments: ComposerAttachment[];
|
|
41
|
+
/** The use case to run — the picked one, or `defaultUseCase` when none is picked. The first one with `multiSelectUseCases`. */
|
|
42
|
+
useCase: ComposerUseCase;
|
|
43
|
+
/** The first picked model, or null for the engine's default. */
|
|
44
|
+
modelId: string | null;
|
|
45
|
+
aspectRatio: string | null;
|
|
46
|
+
/** Everything to run: one entry per use case with its picked models. A single entry unless `multiSelectUseCases` is on. */
|
|
47
|
+
selections: ComposerSelection[];
|
|
48
|
+
/** When true, the model is chosen at submit (`useComposer` routes among each selection's `models`), not by the picks. */
|
|
49
|
+
autoSelectModel: boolean;
|
|
50
|
+
}
|
|
51
|
+
export interface ComposerProps {
|
|
52
|
+
/** The prompt text. Controlled — Composer owns no text state of its own. */
|
|
53
|
+
value: string;
|
|
54
|
+
onChange: (value: string) => void;
|
|
55
|
+
placeholder?: string;
|
|
56
|
+
/** The prompt field's accessible name, read by screen readers. Defaults to `placeholder`, which disappears once the person types. */
|
|
57
|
+
promptLabel?: string;
|
|
58
|
+
attachments?: ComposerAttachment[];
|
|
59
|
+
onAttachmentsChange?: (next: ComposerAttachment[]) => void;
|
|
60
|
+
onUnsupportedFile?: (fileName: string) => void;
|
|
61
|
+
/** The use-case chip. Aspect ratio only renders for an image or video use case. */
|
|
62
|
+
useCase?: ComposerUseCase | null;
|
|
63
|
+
onClearUseCase?: () => void;
|
|
64
|
+
/** What a submit means with no use case picked. Defaults to `TEXT_USE_CASE`, a text request. Never shown as a chip. */
|
|
65
|
+
defaultUseCase?: ComposerUseCase;
|
|
66
|
+
/**
|
|
67
|
+
* Builder opt-in, off by default: several use cases at once (e.g. an image
|
|
68
|
+
* and a video from one prompt), at most one per kind. Uses `useCases`,
|
|
69
|
+
* `onUseCasesChange` and `modelsByKind` instead of `useCase` and `models`;
|
|
70
|
+
* the model menu shows one section per picked use case.
|
|
71
|
+
*/
|
|
72
|
+
multiSelectUseCases?: boolean;
|
|
73
|
+
useCases?: ComposerUseCase[];
|
|
74
|
+
onUseCasesChange?: (next: ComposerUseCase[]) => void;
|
|
75
|
+
/** Models per use-case kind, for `multiSelectUseCases`. */
|
|
76
|
+
modelsByKind?: Partial<Record<MediaKind, ModelOption[]>>;
|
|
77
|
+
/**
|
|
78
|
+
* Builder opt-in, off by default: the end user can pick several models,
|
|
79
|
+
* each producing its own result (ResultCard pages through them). Uses
|
|
80
|
+
* `modelIds` and `onModelIdsChange` instead of `modelId` and
|
|
81
|
+
* `onModelChange`. Always on with `multiSelectUseCases`.
|
|
82
|
+
*/
|
|
83
|
+
multiSelectModels?: boolean;
|
|
84
|
+
modelIds?: string[];
|
|
85
|
+
onModelIdsChange?: (ids: string[]) => void;
|
|
86
|
+
/** Models valid for the current use case. The Model menu only renders when this is non-empty. */
|
|
87
|
+
models?: ModelOption[];
|
|
88
|
+
modelId?: string | null;
|
|
89
|
+
/** `null` clears the pick: Composer does this when auto-select turns on, until routing picks a model. */
|
|
90
|
+
onModelChange?: (id: string | null) => void;
|
|
91
|
+
/**
|
|
92
|
+
* When true, the model is chosen at submit: `useComposer` asks the
|
|
93
|
+
* reasoning model to pick from each use case's models. The trigger reads
|
|
94
|
+
* "Auto-select" until a submit routes, then shows the pick.
|
|
95
|
+
*/
|
|
96
|
+
autoSelectModel?: boolean;
|
|
97
|
+
/**
|
|
98
|
+
* Shows an "Auto-select model" switch at the top of the Model menu
|
|
99
|
+
* (same `toggleHeader` pattern as MediaAnalyzer), letting the *end user*
|
|
100
|
+
* flip `autoSelectModel` themselves — a builder opt-in, not the default.
|
|
101
|
+
* Omit (the default) to keep `autoSelectModel` a builder-only setting:
|
|
102
|
+
* when true, the Model trigger renders disabled with nothing the end
|
|
103
|
+
* user can interact with to change it.
|
|
104
|
+
*/
|
|
105
|
+
showAutoSelectToggle?: boolean;
|
|
106
|
+
/** Fires when the end user toggles the switch — only reachable when `showAutoSelectToggle` is true. */
|
|
107
|
+
onAutoSelectModelChange?: (value: boolean) => void;
|
|
108
|
+
aspectRatios?: ParameterOption<string>[];
|
|
109
|
+
aspectRatio?: string | null;
|
|
110
|
+
onAspectRatioChange?: (value: string) => void;
|
|
111
|
+
/**
|
|
112
|
+
* The "optimize prompt" button — rewrites a
|
|
113
|
+
* sparse prompt into a stronger one via an LLM call. Composer owns none
|
|
114
|
+
* of that call itself: `onEnhance` fires, the builder's own code is what
|
|
115
|
+
* actually runs the rewrite (through whichever `Engine`/model they've
|
|
116
|
+
* configured, §5.1) and calls `onChange` with the result. Omit this prop
|
|
117
|
+
* to hide the button entirely — e.g. before a builder has wired an
|
|
118
|
+
* engine at all, there's nothing for it to do yet. Which model actually
|
|
119
|
+
* runs the rewrite is still an open question at the design-doc level,
|
|
120
|
+
* not just an implementation gap — see the design open question 5
|
|
121
|
+
* ("Enhance model"). Receives the current prompt text so the handler is
|
|
122
|
+
* self-contained — doesn't need its own closure over `value`.
|
|
123
|
+
*/
|
|
124
|
+
onEnhance?: (value: string) => void;
|
|
125
|
+
/** True while the builder's own `onEnhance` handler is running its LLM call — shows the button's active state. */
|
|
126
|
+
enhancing?: boolean;
|
|
127
|
+
/** Fires with everything Composer tracks — see `ComposerSubmitPayload`. Also what retry calls, with the same payload, when `submitError` is set. */
|
|
128
|
+
onSubmit: (payload: ComposerSubmitPayload) => void;
|
|
129
|
+
/**
|
|
130
|
+
* A short, human-readable message for the last submit's failure —
|
|
131
|
+
* Composer never sets or clears this itself, the app does (it's the one
|
|
132
|
+
* that knows whether the actual generation succeeded). While set: the
|
|
133
|
+
* submit FAB becomes a retry action (arrow → refresh icon, danger-
|
|
134
|
+
* tinted) instead of disabling, and a compact inline message appears
|
|
135
|
+
* above the controls row — no blocking dialog. Most real generation UIs
|
|
136
|
+
* don't interrupt with an error dialog on a failed request; they let you
|
|
137
|
+
* try again from where you were, which is what this models. Clear it
|
|
138
|
+
* (pass `null`/`undefined`) once a retry succeeds or the prompt changes.
|
|
139
|
+
*/
|
|
140
|
+
submitError?: string | null;
|
|
141
|
+
/** Overrides the built-in "empty prompt and no attachments" disabled check. Ignored while `submitError` is set — retry stays available regardless. */
|
|
142
|
+
submitDisabled?: boolean;
|
|
143
|
+
/**
|
|
144
|
+
* True while the builder's own `onSubmit` handler has a request in
|
|
145
|
+
* flight — swaps the submit FAB's arrow for a stop icon. Composer owns
|
|
146
|
+
* none of the actual cancellation, same rule `onEnhance` already follows:
|
|
147
|
+
* this is the affordance only, `onAbort` is what the app does with the
|
|
148
|
+
* click. Omit `onAbort` (even with `submitting` true) to leave the FAB
|
|
149
|
+
* merely disabled instead — same "presence of the callback is the opt-in"
|
|
150
|
+
* shape `onEnhance` uses.
|
|
151
|
+
*/
|
|
152
|
+
submitting?: boolean;
|
|
153
|
+
/** Fires when the stop icon is clicked while `submitting` is true. See `submitting`'s own doc comment for why this — not `submitting` alone — is what actually shows the stop icon. */
|
|
154
|
+
onAbort?: () => void;
|
|
155
|
+
onAttachMenuSelect?: (action: ComposerAttachMenuAction) => void;
|
|
156
|
+
disabled?: boolean;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* The `bar`-layout Composer —
|
|
160
|
+
* reference: the "Compose Component" design, whose four states (minimal / model+aspect select / auto-select with
|
|
161
|
+
* attachments / attach-menu open) are all this one controlled component,
|
|
162
|
+
* driven by which props are supplied, not four separate components.
|
|
163
|
+
*
|
|
164
|
+
* The container chrome (flat cool gray, 22px pill radius) comes from the
|
|
165
|
+
* `control-*` semantic tokens, restylable per instance through the
|
|
166
|
+
* `--chai-composer-*` custom properties in style.css.
|
|
167
|
+
*/
|
|
168
|
+
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, disabled, }: ComposerProps): React.JSX.Element;
|
|
169
|
+
//# sourceMappingURL=Composer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Composer.d.ts","sourceRoot":"","sources":["../src/Composer.tsx"],"names":[],"mappings":"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"}
|
package/dist/Composer.js
ADDED
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef, useState } from "react";
|
|
3
|
+
import { createComponent } from "@lit/react";
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { MdFab } from "@material/web/fab/fab.js";
|
|
6
|
+
import { SearchMenu } from "./primitives/SearchMenu.js";
|
|
7
|
+
/** See primitives/Toggle.tsx for why `createComponent` is used instead of raw JSX on custom-element tags. */
|
|
8
|
+
const MdFabElement = createComponent({
|
|
9
|
+
react: React,
|
|
10
|
+
tagName: "md-fab",
|
|
11
|
+
elementClass: MdFab,
|
|
12
|
+
events: { onClick: "click" },
|
|
13
|
+
});
|
|
14
|
+
const ACCEPTED_KINDS = ["image", "video", "audio"];
|
|
15
|
+
function detectKind(file) {
|
|
16
|
+
const prefix = file.type.split("/")[0];
|
|
17
|
+
return ACCEPTED_KINDS.find((k) => k === prefix);
|
|
18
|
+
}
|
|
19
|
+
// Past this length the rewritten prompt just appears instantly — a
|
|
20
|
+
// multi-hundred-character reveal reads as sluggish, not delightful, and a
|
|
21
|
+
// long prompt is exactly the case where a person wants the result now, not
|
|
22
|
+
// a show. Picked to comfortably cover a typical Enhance rewrite (usually a
|
|
23
|
+
// sentence or two of added detail) while bailing out before it doesn't.
|
|
24
|
+
const MAX_ANIMATE_ENHANCE_LENGTH = 260;
|
|
25
|
+
// Time-driven (see the `requestAnimationFrame` loop that uses this), not
|
|
26
|
+
// count-driven — a fixed ms-per-character reveal on a slow frame would
|
|
27
|
+
// drift or stall instead of just finishing a beat later. Capped on both
|
|
28
|
+
// ends: a two-word rewrite shouldn't take as long as a five-word one to
|
|
29
|
+
// feel intentional, and even a near-max-length one should still resolve
|
|
30
|
+
// under a second.
|
|
31
|
+
function enhanceRevealDurationMs(charCount) {
|
|
32
|
+
return Math.min(900, Math.max(300, charCount * 6));
|
|
33
|
+
}
|
|
34
|
+
function nextAttachmentId() {
|
|
35
|
+
return typeof crypto !== "undefined" && "randomUUID" in crypto
|
|
36
|
+
? crypto.randomUUID()
|
|
37
|
+
: `attachment-${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
38
|
+
}
|
|
39
|
+
/** A plain text request — what a submit means when no use case is picked, unless the builder sets `defaultUseCase`. */
|
|
40
|
+
export const TEXT_USE_CASE = { kind: "text", label: "Text" };
|
|
41
|
+
/**
|
|
42
|
+
* The `bar`-layout Composer —
|
|
43
|
+
* reference: the "Compose Component" design, whose four states (minimal / model+aspect select / auto-select with
|
|
44
|
+
* attachments / attach-menu open) are all this one controlled component,
|
|
45
|
+
* driven by which props are supplied, not four separate components.
|
|
46
|
+
*
|
|
47
|
+
* The container chrome (flat cool gray, 22px pill radius) comes from the
|
|
48
|
+
* `control-*` semantic tokens, restylable per instance through the
|
|
49
|
+
* `--chai-composer-*` custom properties in style.css.
|
|
50
|
+
*/
|
|
51
|
+
export function Composer({ value, onChange, placeholder = "Describe media to create", 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, disabled = false, }) {
|
|
52
|
+
const hasContent = value.trim().length > 0 || attachments.length > 0;
|
|
53
|
+
const isSubmitDisabled = submitError ? disabled : (submitDisabled ?? (disabled || !hasContent));
|
|
54
|
+
// The stop icon only appears with somewhere for its click to go — without
|
|
55
|
+
// `onAbort`, `submitting` just disables the FAB instead (below), same as
|
|
56
|
+
// it would with no opt-in wired at all.
|
|
57
|
+
const showStop = submitting && Boolean(onAbort);
|
|
58
|
+
const selectedAspect = aspectRatios?.find((o) => o.value === aspectRatio) ?? null;
|
|
59
|
+
// What the person picked, and what actually runs: with nothing picked,
|
|
60
|
+
// the builder's default use case (a text request unless they chose
|
|
61
|
+
// otherwise), so a typed prompt always goes somewhere.
|
|
62
|
+
const pickedUseCases = multiSelectUseCases ? useCases : useCase ? [useCase] : [];
|
|
63
|
+
const activeUseCases = pickedUseCases.length > 0 ? pickedUseCases : [defaultUseCase];
|
|
64
|
+
const multiModel = multiSelectModels || multiSelectUseCases;
|
|
65
|
+
const pickedModelIds = multiModel ? modelIds : modelId ? [modelId] : [];
|
|
66
|
+
// One menu section per use case with multi-use-case select; otherwise one flat roster.
|
|
67
|
+
const modelSections = multiSelectUseCases
|
|
68
|
+
? activeUseCases
|
|
69
|
+
.map((u) => ({ label: u.label, kind: u.kind, options: modelsByKind?.[u.kind] ?? [] }))
|
|
70
|
+
.filter((s) => s.options.length > 0)
|
|
71
|
+
: [{ label: "", kind: activeUseCases[0].kind, options: models ?? [] }].filter((s) => s.options.length > 0);
|
|
72
|
+
const allModels = modelSections.flatMap((s) => s.options);
|
|
73
|
+
const pickedModels = allModels.filter((m) => pickedModelIds.includes(m.id));
|
|
74
|
+
const modelTriggerLabel = pickedModels.length > 1
|
|
75
|
+
? `${pickedModels.length} models`
|
|
76
|
+
: pickedModels[0]?.label ?? (autoSelectModel ? "Auto-select" : "Select models");
|
|
77
|
+
const showAspectRatio = activeUseCases.some((u) => u.kind === "image" || u.kind === "video");
|
|
78
|
+
function toggleModel(id) {
|
|
79
|
+
if (!multiModel)
|
|
80
|
+
return onModelChange?.(id);
|
|
81
|
+
onModelIdsChange?.(modelIds.includes(id) ? modelIds.filter((m) => m !== id) : [...modelIds, id]);
|
|
82
|
+
}
|
|
83
|
+
function buildSelections() {
|
|
84
|
+
return activeUseCases.map((u) => ({
|
|
85
|
+
useCase: u,
|
|
86
|
+
models: multiSelectUseCases ? (modelsByKind?.[u.kind] ?? []) : (models ?? []),
|
|
87
|
+
modelIds: multiSelectUseCases
|
|
88
|
+
? pickedModelIds.filter((id) => modelsByKind?.[u.kind]?.some((m) => m.id === id))
|
|
89
|
+
: pickedModelIds,
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
// Auto-select chooses at submit, from the prompt (`useComposer` routes
|
|
93
|
+
// with the reasoning model). Turning it on clears the current pick, so
|
|
94
|
+
// the trigger reads "Auto-select" until routing fills in the real model.
|
|
95
|
+
const wasAutoSelect = useRef(autoSelectModel);
|
|
96
|
+
useEffect(() => {
|
|
97
|
+
if (autoSelectModel && !wasAutoSelect.current) {
|
|
98
|
+
if (multiModel)
|
|
99
|
+
onModelIdsChange?.([]);
|
|
100
|
+
else
|
|
101
|
+
onModelChange?.(null);
|
|
102
|
+
}
|
|
103
|
+
wasAutoSelect.current = autoSelectModel;
|
|
104
|
+
}, [autoSelectModel, multiModel, onModelChange, onModelIdsChange]);
|
|
105
|
+
// Auto-grows with wrapped content instead of a fixed row count — a
|
|
106
|
+
// static `rows` either hides wrapped lines behind a scrollbar (too
|
|
107
|
+
// short) or wastes space while empty (too tall). Starts at one line
|
|
108
|
+
// (matching the mock's compact minimal state) and grows only as typed
|
|
109
|
+
// text actually wraps.
|
|
110
|
+
const textareaRef = useRef(null);
|
|
111
|
+
useEffect(() => {
|
|
112
|
+
const el = textareaRef.current;
|
|
113
|
+
if (!el)
|
|
114
|
+
return;
|
|
115
|
+
el.style.height = "auto";
|
|
116
|
+
el.style.height = `${el.scrollHeight}px`;
|
|
117
|
+
}, [value]);
|
|
118
|
+
// The optimize/undo cycle (§ its own button below). `value` is already
|
|
119
|
+
// the final rewritten text the instant `enhancing` drops back to false —
|
|
120
|
+
// the reveal below is a purely cosmetic overlay on top of it, not a
|
|
121
|
+
// delay, so nothing here ever gates what the real `<textarea>` holds.
|
|
122
|
+
const [originalValue, setOriginalValue] = useState(null);
|
|
123
|
+
const [enhancedValue, setEnhancedValue] = useState(null);
|
|
124
|
+
const [prevEnhancing, setPrevEnhancing] = useState(enhancing);
|
|
125
|
+
const [animatingText, setAnimatingText] = useState(null);
|
|
126
|
+
const [revealedLength, setRevealedLength] = useState(0);
|
|
127
|
+
// React to `enhancing` dropping back to false while rendering, not in an
|
|
128
|
+
// effect (the rules of React): that's the moment the rewrite has landed.
|
|
129
|
+
if (prevEnhancing !== enhancing) {
|
|
130
|
+
setPrevEnhancing(enhancing);
|
|
131
|
+
if (prevEnhancing && !enhancing && originalValue != null && value !== originalValue) {
|
|
132
|
+
setEnhancedValue(value);
|
|
133
|
+
// Bails on length (see the constant's own comment) or on a real
|
|
134
|
+
// `prefers-reduced-motion` request — the reveal is itself motion, not
|
|
135
|
+
// just the shimmer the CSS `@media` query above separately turns off.
|
|
136
|
+
const reducedMotion = typeof window !== "undefined" && window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;
|
|
137
|
+
if (value.length <= MAX_ANIMATE_ENHANCE_LENGTH && !reducedMotion) {
|
|
138
|
+
setRevealedLength(0);
|
|
139
|
+
setAnimatingText(value);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
useEffect(() => {
|
|
144
|
+
if (animatingText == null)
|
|
145
|
+
return;
|
|
146
|
+
const total = animatingText.length;
|
|
147
|
+
const duration = enhanceRevealDurationMs(total);
|
|
148
|
+
const start = performance.now();
|
|
149
|
+
let raf;
|
|
150
|
+
const tick = (now) => {
|
|
151
|
+
const elapsed = now - start;
|
|
152
|
+
const next = Math.min(total, Math.floor((elapsed / duration) * total));
|
|
153
|
+
setRevealedLength((prev) => (prev === next ? prev : next));
|
|
154
|
+
if (next < total)
|
|
155
|
+
raf = requestAnimationFrame(tick);
|
|
156
|
+
else
|
|
157
|
+
setAnimatingText(null);
|
|
158
|
+
};
|
|
159
|
+
raf = requestAnimationFrame(tick);
|
|
160
|
+
return () => cancelAnimationFrame(raf);
|
|
161
|
+
}, [animatingText]);
|
|
162
|
+
const animating = animatingText != null;
|
|
163
|
+
const isEnhanced = !animating && enhancedValue != null && value === enhancedValue;
|
|
164
|
+
const enhanceBusy = enhancing || animating;
|
|
165
|
+
function handleOptimizeClick() {
|
|
166
|
+
if (isEnhanced) {
|
|
167
|
+
const original = originalValue;
|
|
168
|
+
setEnhancedValue(null);
|
|
169
|
+
setOriginalValue(null);
|
|
170
|
+
if (original != null)
|
|
171
|
+
onChange(original);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
setOriginalValue(value); // snapshot now — before the rewrite lands, for undo
|
|
175
|
+
onEnhance?.(value);
|
|
176
|
+
}
|
|
177
|
+
function handleFilesSelected(fileList) {
|
|
178
|
+
if (!fileList || fileList.length === 0 || !onAttachmentsChange)
|
|
179
|
+
return;
|
|
180
|
+
const next = [...attachments];
|
|
181
|
+
let pending = fileList.length;
|
|
182
|
+
const settle = () => {
|
|
183
|
+
pending -= 1;
|
|
184
|
+
if (pending === 0)
|
|
185
|
+
onAttachmentsChange(next);
|
|
186
|
+
};
|
|
187
|
+
Array.from(fileList).forEach((file) => {
|
|
188
|
+
const kind = detectKind(file);
|
|
189
|
+
if (!kind) {
|
|
190
|
+
onUnsupportedFile?.(file.name);
|
|
191
|
+
settle();
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
const reader = new FileReader();
|
|
195
|
+
reader.onload = () => {
|
|
196
|
+
next.push({ id: nextAttachmentId(), src: String(reader.result), kind, name: file.name, size: file.size });
|
|
197
|
+
settle();
|
|
198
|
+
};
|
|
199
|
+
reader.onerror = () => {
|
|
200
|
+
onUnsupportedFile?.(file.name);
|
|
201
|
+
settle();
|
|
202
|
+
};
|
|
203
|
+
reader.readAsDataURL(file);
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
function handleRemoveAttachment(id) {
|
|
207
|
+
onAttachmentsChange?.(attachments.filter((a) => a.id !== id));
|
|
208
|
+
}
|
|
209
|
+
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: () => handleRemoveAttachment(a.id) }, a.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: placeholder, "aria-label": promptLabel ?? 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: [_jsx(ComposerAttachMenu, { onSelect: onAttachMenuSelect, onAddMediaFiles: handleFilesSelected, disabled: disabled }), pickedUseCases.map((u) => (_jsx(UseCaseChip, { useCase: u, onRemove: multiSelectUseCases
|
|
210
|
+
? () => onUseCasesChange?.(useCases.filter((x) => x.kind !== u.kind))
|
|
211
|
+
: onClearUseCase, disabled: disabled }, u.kind))), modelSections.length > 0 && (_jsx(SearchMenu, { ...(multiSelectUseCases
|
|
212
|
+
? { sections: modelSections.map((s) => ({ label: s.label, options: s.options })) }
|
|
213
|
+
: { options: modelSections[0].options }), value: multiModel ? pickedModelIds : modelId, multiple: multiModel, toggleHeader: showAutoSelectToggle
|
|
214
|
+
? {
|
|
215
|
+
label: "Auto-select model",
|
|
216
|
+
value: autoSelectModel,
|
|
217
|
+
onChange: (v) => onAutoSelectModelChange?.(v),
|
|
218
|
+
}
|
|
219
|
+
: undefined, triggerLabel: modelTriggerLabel, menuLabel: multiModel ? "Select models" : "Select model", onSelect: (opt) => toggleModel(opt.id), searchable: false, triggerVariant: "text", disabled: disabled || (autoSelectModel && !showAutoSelectToggle), panelWidth: showAutoSelectToggle ? 320 : undefined })), showAspectRatio && aspectRatios && aspectRatios.length > 0 && (_jsx(SearchMenu, { options: aspectRatios.map((o) => ({ id: o.value, label: o.label })), value: aspectRatio, triggerLabel: 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, ...{
|
|
220
|
+
ariaLabel: showStop ? "Stop" : submitError ? "Retry" : "Submit",
|
|
221
|
+
ariaDisabled: showStop ? "false" : submitting ? "true" : isSubmitDisabled ? "true" : "false",
|
|
222
|
+
}, onClick: () => {
|
|
223
|
+
if (showStop)
|
|
224
|
+
onAbort?.();
|
|
225
|
+
else if (!isSubmitDisabled && !submitting) {
|
|
226
|
+
const selections = buildSelections();
|
|
227
|
+
onSubmit({
|
|
228
|
+
value,
|
|
229
|
+
attachments,
|
|
230
|
+
useCase: activeUseCases[0],
|
|
231
|
+
modelId: pickedModelIds[0] ?? null,
|
|
232
|
+
aspectRatio,
|
|
233
|
+
selections,
|
|
234
|
+
autoSelectModel,
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
}, children: _jsx("span", { slot: "icon", children: showStop ? _jsx(StopIcon, {}) : submitError ? _jsx(RefreshIcon, {}) : _jsx(ArrowForwardIcon, {}) }) })] })] }));
|
|
238
|
+
}
|
|
239
|
+
const ATTACH_MENU_ITEMS = [
|
|
240
|
+
{ action: "add-media", label: "Add media", icon: _jsx(AttachFileIcon, {}), divider: true },
|
|
241
|
+
{ action: "create-image", label: "Create image", icon: _jsx(ImageIcon, {}) },
|
|
242
|
+
{ action: "create-video", label: "Create video", icon: _jsx(VideocamIcon, {}) },
|
|
243
|
+
{ action: "edit-media", label: "Edit media", icon: _jsx(ContentCutIcon, {}) },
|
|
244
|
+
];
|
|
245
|
+
/**
|
|
246
|
+
* The "+" / "×" attach control (reference: Composer_01 "Menu open" state,
|
|
247
|
+
* Figma "Menu - Icon button Example") — hand-rolled positioned
|
|
248
|
+
* popover rather than `<md-menu>`, same reasoning `SearchMenu` already
|
|
249
|
+
* documents for its own panel (this needs to live inline under the trigger,
|
|
250
|
+
* not `<md-menu>`'s corner-anchored popover model).
|
|
251
|
+
*/
|
|
252
|
+
function ComposerAttachMenu({ onSelect, onAddMediaFiles, disabled, }) {
|
|
253
|
+
const [open, setOpen] = useState(false);
|
|
254
|
+
const rootRef = useRef(null);
|
|
255
|
+
const inputRef = useRef(null);
|
|
256
|
+
useEffect(() => {
|
|
257
|
+
if (!open)
|
|
258
|
+
return;
|
|
259
|
+
function handlePointerDown(e) {
|
|
260
|
+
if (!rootRef.current?.contains(e.target))
|
|
261
|
+
setOpen(false);
|
|
262
|
+
}
|
|
263
|
+
function handleKeyDown(e) {
|
|
264
|
+
if (e.key === "Escape")
|
|
265
|
+
setOpen(false);
|
|
266
|
+
}
|
|
267
|
+
document.addEventListener("pointerdown", handlePointerDown);
|
|
268
|
+
document.addEventListener("keydown", handleKeyDown);
|
|
269
|
+
return () => {
|
|
270
|
+
document.removeEventListener("pointerdown", handlePointerDown);
|
|
271
|
+
document.removeEventListener("keydown", handleKeyDown);
|
|
272
|
+
};
|
|
273
|
+
}, [open]);
|
|
274
|
+
function handleItemClick(action) {
|
|
275
|
+
setOpen(false);
|
|
276
|
+
if (action === "add-media")
|
|
277
|
+
inputRef.current?.click();
|
|
278
|
+
onSelect?.(action);
|
|
279
|
+
}
|
|
280
|
+
return (_jsxs("div", { className: "chai-composer__attach", ref: rootRef, children: [_jsx("button", { type: "button", className: `chai-composer__attach-toggle${open ? " chai-composer__attach-toggle--open" : ""}`, onClick: () => setOpen((v) => !v), disabled: disabled, "aria-expanded": open, "aria-haspopup": "menu", "aria-label": open ? "Close attach menu" : "Add media", children: open ? _jsx(CloseIcon, {}) : _jsx(PlusIcon, {}) }), open && (_jsx("ul", { className: "chai-composer__attach-menu", role: "menu", children: ATTACH_MENU_ITEMS.map((item) => (_jsxs("li", { role: "none", children: [_jsxs("button", { type: "button", role: "menuitem", className: "chai-composer__attach-menu-item", onClick: () => handleItemClick(item.action), children: [_jsx("span", { className: "chai-composer__attach-menu-icon", children: item.icon }), item.label] }), item.divider && _jsx("hr", { className: "chai-composer__attach-menu-divider", role: "separator" })] }, item.action))) })), _jsx("input", { ref: inputRef, type: "file", accept: "image/*,video/*,audio/*", multiple: true, hidden: true, disabled: disabled, onChange: (e) => {
|
|
281
|
+
onAddMediaFiles(e.target.files);
|
|
282
|
+
e.target.value = "";
|
|
283
|
+
} })] }));
|
|
284
|
+
}
|
|
285
|
+
function ComposerThumbnail({ attachment, onRemove }) {
|
|
286
|
+
return (_jsxs("div", { className: "chai-composer__thumb", children: [attachment.kind === "image" ? (_jsx("img", { className: "chai-composer__thumb-img", src: attachment.src, alt: "" })) : (_jsx("span", { className: "chai-composer__thumb-icon", children: kindIcon(attachment.kind) })), _jsx("button", { type: "button", className: "chai-composer__thumb-remove", onClick: onRemove, "aria-label": "Remove attachment", children: _jsx(CloseIcon, {}) })] }));
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* The use-case chip (reference: the mock's "Video"/"Image" chip) —
|
|
290
|
+
* hand-rolled rather than `@material/web`'s `<md-input-chip>`: that
|
|
291
|
+
* component only ever renders its remove action always-visible (no
|
|
292
|
+
* exposed shadow part for the trailing button, confirmed against its
|
|
293
|
+
* source), but this design wants it hidden until hover, and a rounded-
|
|
294
|
+
* square shape rather than MD3 input chip's stadium default. Same
|
|
295
|
+
* "hand-roll when the primitive doesn't give the needed control" call
|
|
296
|
+
* `SearchMenu`'s own panel already documents. No leading icon — that's the
|
|
297
|
+
* attach menu's own affordance (each of its four items has one); the chip
|
|
298
|
+
* itself is label + hover-revealed remove only.
|
|
299
|
+
*/
|
|
300
|
+
function UseCaseChip({ useCase, onRemove, disabled, }) {
|
|
301
|
+
return (_jsxs("span", { className: "chai-composer__chip", children: [useCase.label, onRemove && (_jsx("button", { type: "button", className: "chai-composer__chip-remove", onClick: onRemove, disabled: disabled, "aria-label": `Remove ${useCase.label}`, children: _jsx(CloseIcon, {}) }))] }));
|
|
302
|
+
}
|
|
303
|
+
function kindIcon(kind) {
|
|
304
|
+
switch (kind) {
|
|
305
|
+
case "video":
|
|
306
|
+
return _jsx(VideocamIcon, {});
|
|
307
|
+
case "audio":
|
|
308
|
+
return _jsx(AudioIcon, {});
|
|
309
|
+
default:
|
|
310
|
+
return _jsx(ImageIcon, {});
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
// --- Icons -------------------------------------------------------------
|
|
314
|
+
//
|
|
315
|
+
// Every icon below except `OptimizeIcon` is a real Material Symbols path
|
|
316
|
+
// (viewBox `0 -960 960 960`, the current Material Symbols coordinate
|
|
317
|
+
// system), copied exactly from the `@material-symbols/svg-400` package
|
|
318
|
+
// (Apache-2.0, installed as a devDependency purely as a source of ground-
|
|
319
|
+
// truth vector data — nothing here imports it at runtime, matching this
|
|
320
|
+
// codebase's existing "trace and inline as a currentColor component"
|
|
321
|
+
// convention). Fixes an earlier pass
|
|
322
|
+
// that hand-approximated several of these (Add media/Create image/Create
|
|
323
|
+
// video/Edit media's icons, plus/close/arrow) because `get_design_context`
|
|
324
|
+
// couldn't resolve their specific instance-swap nodes — those
|
|
325
|
+
// approximations read as visibly off-brand, not real MD3, correctly
|
|
326
|
+
// flagged and replaced with the genuine glyphs (add, close, arrow_forward,
|
|
327
|
+
// attach_file, image, videocam, content_cut, music_note).
|
|
328
|
+
//
|
|
329
|
+
// `OptimizeIcon` is the one exception, still traced exactly from the real
|
|
330
|
+
// exported design asset ("Optimize_icon") — not a Material Symbol at all, this is CHAI's own "prompt
|
|
331
|
+
// optimize" glyph (a pencil plus two sparkles). Same shape in both source
|
|
332
|
+
// assets, differing only by fill color (brand green active, gray
|
|
333
|
+
// inactive) — collapsed here to one currentColor path set,
|
|
334
|
+
// themed via the active/inactive CSS class instead of two hardcoded-color
|
|
335
|
+
// SVGs. See its button's own doc comment above for what it actually does.
|
|
336
|
+
function PlusIcon() {
|
|
337
|
+
return (_jsx("svg", { viewBox: "0 -960 960 960", "aria-hidden": "true", children: _jsx("path", { d: "M450-450H200v-60h250v-250h60v250h250v60H510v250h-60v-250Z", fill: "currentColor" }) }));
|
|
338
|
+
}
|
|
339
|
+
// Material Symbols "close" — reproduced here since icons aren't shared
|
|
340
|
+
// across files yet in this codebase.
|
|
341
|
+
function CloseIcon() {
|
|
342
|
+
return (_jsx("svg", { viewBox: "0 -960 960 960", "aria-hidden": "true", children: _jsx("path", { d: "m249-207-42-42 231-231-231-231 42-42 231 231 231-231 42 42-231 231 231 231-42 42-231-231-231 231Z", fill: "currentColor" }) }));
|
|
343
|
+
}
|
|
344
|
+
function ArrowForwardIcon() {
|
|
345
|
+
return (_jsx("svg", { viewBox: "0 -960 960 960", "aria-hidden": "true", children: _jsx("path", { d: "M686-450H160v-60h526L438-758l42-42 320 320-320 320-42-42 248-248Z", fill: "currentColor" }) }));
|
|
346
|
+
}
|
|
347
|
+
// Material Symbols "refresh" — the submit FAB's retry state.
|
|
348
|
+
function RefreshIcon() {
|
|
349
|
+
return (_jsx("svg", { viewBox: "0 -960 960 960", "aria-hidden": "true", children: _jsx("path", { d: "M480-160q-133 0-226.5-93.5T160-480q0-133 93.5-226.5T480-800q85 0 149 34.5T740-671v-129h60v254H546v-60h168q-38-60-97-97t-137-37q-109 0-184.5 75.5T220-480q0 109 75.5 184.5T480-220q83 0 152-47.5T728-393h62q-29 105-115 169t-195 64Z", fill: "currentColor" }) }));
|
|
350
|
+
}
|
|
351
|
+
// Material Symbols "error" — the inline retry message's leading icon.
|
|
352
|
+
function ErrorIcon() {
|
|
353
|
+
return (_jsx("svg", { viewBox: "0 -960 960 960", "aria-hidden": "true", children: _jsx("path", { d: "M503.5-289.48q9.5-9.48 9.5-23.5t-9.48-23.52q-9.48-9.5-23.5-9.5t-23.52 9.48q-9.5 9.48-9.5 23.5t9.48 23.52q9.48 9.5 23.5 9.5t23.52-9.48ZM453-433h60v-253h-60v253Zm27.27 353q-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.23-60Q622-140 721-239.5t99-241Q820-622 721.19-721T480-820q-141 0-240.5 98.81T140-480q0 141 99.5 240.5t241 99.5Zm-.5-340Z", fill: "currentColor" }) }));
|
|
354
|
+
}
|
|
355
|
+
function OptimizeIcon() {
|
|
356
|
+
return (_jsxs("svg", { viewBox: "0 0 25 24", fill: "none", "aria-hidden": "true", children: [_jsx("path", { d: "M5 19H6.425L16.2 9.225L14.775 7.8L5 17.575V19ZM3 21V16.75L16.2 3.575C16.4 3.39167 16.6208 3.25 16.8625 3.15C17.1042 3.05 17.3583 3 17.625 3C17.8917 3 18.15 3.05 18.4 3.15C18.65 3.25 18.8667 3.4 19.05 3.6L20.425 5C20.625 5.18333 20.7708 5.4 20.8625 5.65C20.9542 5.9 21 6.15 21 6.4C21 6.66667 20.9542 6.92083 20.8625 7.1625C20.7708 7.40417 20.625 7.625 20.425 7.825L7.25 21H3ZM15.475 8.525L14.775 7.8L16.2 9.225L15.475 8.525Z", fill: "currentColor" }), _jsx("path", { d: "M20 12L21.5918 15.4082L25 17L21.5918 18.5918L20 22L18.4082 18.5918L15 17L18.4082 15.4082L20 12Z", fill: "currentColor" }), _jsx("path", { d: "M6 3L7.27345 5.72655L10 7L7.27345 8.27345L6 11L4.72655 8.27345L2 7L4.72655 5.72655L6 3Z", fill: "currentColor" })] }));
|
|
357
|
+
}
|
|
358
|
+
// Real Material Symbols "undo" glyph (viewBox `0 -960 960 960`), same
|
|
359
|
+
// source/convention as every icon above except `OptimizeIcon` itself (see
|
|
360
|
+
// that block's own comment) — the optimize button becomes this once a
|
|
361
|
+
// rewrite has landed (its own doc comment, where it's rendered).
|
|
362
|
+
function UndoIcon() {
|
|
363
|
+
return (_jsx("svg", { viewBox: "0 -960 960 960", "aria-hidden": "true", children: _jsx("path", { d: "M259-200v-60h310q70 0 120.5-46.5T740-422q0-69-50.5-115.5T569-584H274l114 114-42 42-186-186 186-186 42 42-114 114h294q95 0 163.5 64T800-422q0 94-68.5 158T568-200H259Z", fill: "currentColor" }) }));
|
|
364
|
+
}
|
|
365
|
+
// Real Material Symbols "stop" glyph, the filled variant specifically
|
|
366
|
+
// (`stop-fill`, not the base `stop` — that one traces a hollow square-
|
|
367
|
+
// outline shape even filled with `currentColor`, which read as a thin
|
|
368
|
+
// frame rather than a real stop icon at 24px; design review caught
|
|
369
|
+
// this live). Viewbox `0 -960 960 960` — the submit FAB's in-flight state,
|
|
370
|
+
// its own doc comment above where it's rendered.
|
|
371
|
+
function StopIcon() {
|
|
372
|
+
return (_jsx("svg", { viewBox: "0 -960 960 960", "aria-hidden": "true", children: _jsx("path", { d: "M240-240v-480h480v480H240Z", fill: "currentColor" }) }));
|
|
373
|
+
}
|
|
374
|
+
function AttachFileIcon() {
|
|
375
|
+
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" }) }));
|
|
376
|
+
}
|
|
377
|
+
function ImageIcon() {
|
|
378
|
+
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" }) }));
|
|
379
|
+
}
|
|
380
|
+
function VideocamIcon() {
|
|
381
|
+
return (_jsx("svg", { viewBox: "0 -960 960 960", "aria-hidden": "true", children: _jsx("path", { d: "M140-160q-24 0-42-18t-18-42v-520q0-24 18-42t42-18h520q24 0 42 18t18 42v215l160-160v410L720-435v215q0 24-18 42t-42 18H140Zm0-60h520v-520H140v520Zm0 0v-520 520Z", fill: "currentColor" }) }));
|
|
382
|
+
}
|
|
383
|
+
function ContentCutIcon() {
|
|
384
|
+
return (_jsx("svg", { viewBox: "0 -960 960 960", "aria-hidden": "true", children: _jsx("path", { d: "M782-114 481-415 364-298q11 17 13.5 33t2.5 35q0 64-43 107T230-80q-64 0-107-43T80-230q0-64 43-107t107-43q18 0 35.5 5t36.5 15l116-116-118-118q-17 8-34.5 11t-35.5 3q-64 0-107-43T80-730q0-64 43-107t107-43q64 0 107 43t43 107q0 19-2.5 36T367-662l514 514v34h-99ZM599-527l-66-66 249-249h99v33L599-527ZM294-666q26-26 26-64t-26-64q-26-26-64-26t-64 26q-26 26-26 64t26 64q26 26 64 26t64-26Zm202.5 203.5Q502-468 502-476t-5.5-13.5Q491-495 483-495t-13.5 5.5Q464-484 464-476t5.5 13.5Q475-457 483-457t13.5-5.5ZM294-166q26-26 26-64t-26-64q-26-26-64-26t-64 26q-26 26-26 64t26 64q26 26 64 26t64-26Z", fill: "currentColor" }) }));
|
|
385
|
+
}
|
|
386
|
+
function AudioIcon() {
|
|
387
|
+
return (_jsx("svg", { viewBox: "0 -960 960 960", "aria-hidden": "true", children: _jsx("path", { d: "M286.5-163.5Q243-207 243-270t43.5-106.5Q330-420 393-420q28 0 50.5 8t39.5 22v-450h234v135H543v435q0 63-43.5 106.5T393-120q-63 0-106.5-43.5Z", fill: "currentColor" }) }));
|
|
388
|
+
}
|
|
389
|
+
//# sourceMappingURL=Composer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Composer.js","sourceRoot":"","sources":["../src/Composer.tsx"],"names":[],"mappings":"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"}
|