refactor(ui): simplify composer settings chip and animate chevron
Condense the settings-chip summary to quality, ratio, and image count (dropping resolution and pixel size), wrap the label in an ellipsized span, and swap the up/down chevron for a single rotating ChevronDown across the canvas agent and image generator composers. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -242,11 +242,31 @@
|
|||||||
|
|
||||||
.composer-settings-chip {
|
.composer-settings-chip {
|
||||||
max-width: 150px;
|
max-width: 150px;
|
||||||
padding: 0 8px;
|
gap: 2px;
|
||||||
|
padding: 0 4px 0 12px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
background: transparent;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.composer-settings-chip span {
|
||||||
|
overflow: hidden;
|
||||||
|
font-size: 13px;
|
||||||
|
line-height: 20px;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
.composer-settings-chip svg {
|
||||||
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
flex: 0 0 auto;
|
||||||
|
transition: transform 150ms ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.composer-settings-chip svg.open {
|
||||||
|
transform: rotate(180deg);
|
||||||
|
}
|
||||||
|
|
||||||
.composer-icon-button,
|
.composer-icon-button,
|
||||||
.composer-model-button {
|
.composer-model-button {
|
||||||
width: 32px;
|
width: 32px;
|
||||||
|
|||||||
@@ -213,8 +213,7 @@ export function composerImageSize(settings: ComposerImageSettings) {
|
|||||||
|
|
||||||
export function composerSettingsSummary(settings: ComposerImageSettings) {
|
export function composerSettingsSummary(settings: ComposerImageSettings) {
|
||||||
const ratioLabel = composerRatioOptions.find((option) => option.id === settings.ratio)?.label ?? settings.ratio;
|
const ratioLabel = composerRatioOptions.find((option) => option.id === settings.ratio)?.label ?? settings.ratio;
|
||||||
const sizeLabel = composerImageSize(settings).replace("x", "×");
|
return `${qualityLabel(settings.quality)} · ${ratioLabel} · ${settings.count} img`;
|
||||||
return `${qualityLabel(settings.quality)} · ${settings.resolution} · ${ratioLabel} · ${sizeLabel} · ${settings.count} img`;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function qualityLabel(quality: ComposerImageQuality) {
|
function qualityLabel(quality: ComposerImageQuality) {
|
||||||
@@ -377,8 +376,8 @@ export const CanvasAgentComposer = forwardRef<PromptComposerHandle, CanvasAgentC
|
|||||||
<Popover open={settingsOpen} onOpenChange={setSettingsOpen}>
|
<Popover open={settingsOpen} onOpenChange={setSettingsOpen}>
|
||||||
<PopoverTrigger asChild>
|
<PopoverTrigger asChild>
|
||||||
<button className="composer-settings-chip" type="button" aria-label={t("imageSettings")}>
|
<button className="composer-settings-chip" type="button" aria-label={t("imageSettings")}>
|
||||||
{composerSettingsSummary(settings)}
|
<span>{composerSettingsSummary(settings)}</span>
|
||||||
{settingsOpen ? <ChevronUp size={14} /> : <ChevronDown size={14} />}
|
<ChevronDown className={settingsOpen ? "open" : ""} size={18} />
|
||||||
</button>
|
</button>
|
||||||
</PopoverTrigger>
|
</PopoverTrigger>
|
||||||
<PopoverContent className="composer-settings-popover" align="end" sideOffset={12}>
|
<PopoverContent className="composer-settings-popover" align="end" sideOffset={12}>
|
||||||
|
|||||||
@@ -146,12 +146,33 @@
|
|||||||
|
|
||||||
.image-generator-settings-chip {
|
.image-generator-settings-chip {
|
||||||
height: 32px;
|
height: 32px;
|
||||||
max-width: 220px;
|
max-width: 150px;
|
||||||
padding: 0 8px 0 10px;
|
gap: 2px;
|
||||||
|
padding: 0 4px 0 12px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
color: #2f3746;
|
||||||
|
background: transparent;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.image-generator-settings-chip span {
|
||||||
|
overflow: hidden;
|
||||||
|
font-size: 13px;
|
||||||
|
line-height: 20px;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
.image-generator-settings-chip svg {
|
||||||
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
flex: 0 0 auto;
|
||||||
|
transition: transform 150ms ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.image-generator-settings-chip svg.open {
|
||||||
|
transform: rotate(180deg);
|
||||||
|
}
|
||||||
|
|
||||||
.image-generator-settings-chip:hover,
|
.image-generator-settings-chip:hover,
|
||||||
.image-generator-model-button:hover {
|
.image-generator-model-button:hover {
|
||||||
background: #f3f4f6;
|
background: #f3f4f6;
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ import { useI18n } from "@/i18n/i18n";
|
|||||||
import {
|
import {
|
||||||
ComposerSettingsPanel,
|
ComposerSettingsPanel,
|
||||||
composerImageDimensionsFor,
|
composerImageDimensionsFor,
|
||||||
composerImageSize,
|
|
||||||
composerRatioOptions,
|
composerRatioOptions,
|
||||||
type CanvasComposerModel,
|
type CanvasComposerModel,
|
||||||
type ComposerImageRatio,
|
type ComposerImageRatio,
|
||||||
@@ -87,9 +86,7 @@ function composerStyle(bounds: NodeScreenBounds, stageWidth: number, stageHeight
|
|||||||
|
|
||||||
function imageSettingsSummary(settings: ComposerImageSettings, t: (key: string) => string) {
|
function imageSettingsSummary(settings: ComposerImageSettings, t: (key: string) => string) {
|
||||||
const ratioLabel = composerRatioOptions.find((option) => option.id === settings.ratio)?.label ?? settings.ratio;
|
const ratioLabel = composerRatioOptions.find((option) => option.id === settings.ratio)?.label ?? settings.ratio;
|
||||||
const sizeLabel = composerImageSize(settings).replace("x", "×");
|
return `${t(`quality${settings.quality[0].toUpperCase()}${settings.quality.slice(1)}`)} · ${ratioLabel} · ${settings.count} img`;
|
||||||
const countLabel = t("imageCountUnit").replace("{count}", String(settings.count));
|
|
||||||
return `${t(`quality${settings.quality[0].toUpperCase()}${settings.quality.slice(1)}`)} · ${settings.resolution} · ${ratioLabel} · ${sizeLabel} · ${countLabel}`;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function ImageGeneratorFloatingComposer({
|
export function ImageGeneratorFloatingComposer({
|
||||||
@@ -238,8 +235,8 @@ export function ImageGeneratorFloatingComposer({
|
|||||||
<Popover open={settingsOpen} onOpenChange={setSettingsOpen}>
|
<Popover open={settingsOpen} onOpenChange={setSettingsOpen}>
|
||||||
<PopoverTrigger asChild>
|
<PopoverTrigger asChild>
|
||||||
<button className="image-generator-settings-chip" type="button" aria-label={t("imageSettings")} disabled={generating}>
|
<button className="image-generator-settings-chip" type="button" aria-label={t("imageSettings")} disabled={generating}>
|
||||||
{imageSettingsSummary(settings, t)}
|
<span>{imageSettingsSummary(settings, t)}</span>
|
||||||
{settingsOpen ? <ChevronUp size={14} /> : <ChevronDown size={14} />}
|
<ChevronDown className={settingsOpen ? "open" : ""} size={18} />
|
||||||
</button>
|
</button>
|
||||||
</PopoverTrigger>
|
</PopoverTrigger>
|
||||||
<PopoverContent className="composer-settings-popover image-generator-settings-popover-panel" align="start" sideOffset={12}>
|
<PopoverContent className="composer-settings-popover image-generator-settings-popover-panel" align="start" sideOffset={12}>
|
||||||
|
|||||||
Reference in New Issue
Block a user