diff --git a/AGENTS.md b/AGENTS.md
index 500b188..85318e4 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -57,6 +57,18 @@ of a single commit, use `SKIP_DOCS_HOOK=1` or put `[skip-docs]` in the message.
- TypeScript strict mode
- Follow the existing formatter config; do not reformat unrelated files
+- **Icons**: there is no icon library; icons are hand-authored inline SVGs,
+ with the commonly reused ones centralized in `app/components/ui/icons.tsx`.
+ When adding or touching an icon that toggles between two states based on
+ props/state (e.g. copy → check, menu → close) — not just shown/hidden —
+ consider animating the transition with `morphicons` instead of an instant
+ swap: `` from `morphicons/react`, fed
+ path data on a shared 24x24 grid (`fitIcon()` first if the source art isn't
+ already on that grid). See `CLIPBOARD_MORPH_ICON`/`CHECK_MORPH_ICON` in
+ `app/components/ui/icons.tsx` and their use in
+ `app/demos/b20/components/CopyPromptButton.tsx`,
+ `app/internal-explorer/components/CopyButton.tsx`, and
+ `app/vibenet/components/CopyableValue.tsx`.
## Testing
diff --git a/app/components/ui/icons.tsx b/app/components/ui/icons.tsx
index 95b6370..2751fe2 100644
--- a/app/components/ui/icons.tsx
+++ b/app/components/ui/icons.tsx
@@ -93,6 +93,13 @@ export function ClipboardIcon({ size = 16, className }: { size?: number; classNa
);
}
+// Raw path data (24x24 grid, matching ClipboardIcon/CheckIcon below) for
+// morphicons' , which morphs between two icons on state change
+// instead of an instant swap.
+export const CLIPBOARD_MORPH_ICON =
+ 'M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z';
+export const CHECK_MORPH_ICON = 'M5 13l4 4L19 7';
+
export function CheckIcon({ size = 16, className }: { size?: number; className?: string }) {
return (