Skip to content

Commit bd4a98b

Browse files
committed
feat(docs-ai): animate copy button feedback icon transitions
1 parent c67d508 commit bd4a98b

File tree

1 file changed

+31
-3
lines changed

1 file changed

+31
-3
lines changed

docs/components/ai-panel/chat-message.tsx

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
"use client";
22

33
import type { UIMessage } from "ai";
4-
import { IconSquare2StackedLine } from "@karrotmarket/react-monochrome-icon";
4+
import {
5+
IconCheckmarkCircleLine,
6+
IconSquare2StackedLine,
7+
} from "@karrotmarket/react-monochrome-icon";
58
import { Icon } from "@seed-design/react";
69
import { DynamicCodeBlock } from "fumadocs-ui/components/dynamic-codeblock";
10+
import { AnimatePresence, m } from "motion/react";
711
import { ActionButton } from "seed-design/ui/action-button";
812
import { useEffect, useState } from "react";
913
import { parseMarkdownCodeBlocks } from "./parse-markdown-code-blocks";
@@ -250,7 +254,7 @@ export function ChatMessage({ message }: { message: UIMessage }) {
250254

251255
const timeout = window.setTimeout(() => {
252256
setIsCopied(false);
253-
}, 1000);
257+
}, 2000);
254258

255259
return () => window.clearTimeout(timeout);
256260
}, [isCopied]);
@@ -377,7 +381,31 @@ export function ChatMessage({ message }: { message: UIMessage }) {
377381
aria-label={isCopied ? "응답 복사됨" : "응답 복사"}
378382
disabled={!canCopy}
379383
>
380-
<Icon svg={<IconSquare2StackedLine />} />
384+
<AnimatePresence mode="wait" initial={false}>
385+
{isCopied ? (
386+
<m.span
387+
key="copied"
388+
initial={{ opacity: 0 }}
389+
animate={{ opacity: 1 }}
390+
exit={{ opacity: 0 }}
391+
transition={{ duration: 0.15 }}
392+
className="inline-flex"
393+
>
394+
<Icon svg={<IconCheckmarkCircleLine />} />
395+
</m.span>
396+
) : (
397+
<m.span
398+
key="copy"
399+
initial={{ opacity: 0 }}
400+
animate={{ opacity: 1 }}
401+
exit={{ opacity: 0 }}
402+
transition={{ duration: 0.15 }}
403+
className="inline-flex"
404+
>
405+
<Icon svg={<IconSquare2StackedLine />} />
406+
</m.span>
407+
)}
408+
</AnimatePresence>
381409
</ActionButton>
382410
</div>
383411
)}

0 commit comments

Comments
 (0)