feat: redesign UI and UX around design-engineering principles

- Ink-first palette, drop gradients/glow; tabular numbers
- Home: form stays put, results stack below and auto-copy; paste shortens instantly
- Hold-to-delete replaces the delete confirm modal
- Copy buttons morph to a check instead of toasting
- Motion: CSS press feedback, custom ease-out, origin-aware menu, faster exits,
  no animation on frequent/keyboard actions, reduced-motion respected
- Fix: scheme-less URLs ("example.com") were blocked by native validation

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
sittichok OuamsiriandClaude Opus 5.5 committed 2026-10-10 00:11:22 +07:00
1 parent e2327207e5
commit 2e1133e39c
25 files changed
+753 -814

No files matched your search

+5 -14
View File
@@ -1,4 +1,3 @@
import { AnimatePresence, motion } from "framer-motion";
import { useTheme } from "../context/ThemeContext";
import { Sun, Moon } from "./icons";
@@ -10,20 +9,12 @@ export function ThemeToggle() {
<button
onClick={toggle}
aria-label={dark ? "Switch to light mode" : "Switch to dark mode"}
className="focusable relative grid h-9 w-9 place-items-center overflow-hidden rounded-lg border border-line bg-surface text-muted hover:text-ink"
className="press focusable grid h-9 w-9 place-items-center rounded-lg text-muted hover:bg-surface-2 hover:text-ink"
>
<AnimatePresence mode="wait" initial={false}>
<motion.span
key={theme}
initial={{ y: 12, opacity: 0 }}
animate={{ y: 0, opacity: 1 }}
exit={{ y: -12, opacity: 0 }}
transition={{ duration: 0.18, ease: "easeOut" }}
className="grid place-items-center"
>
{dark ? <Moon size={17} /> : <Sun size={17} />}
</motion.span>
</AnimatePresence>
<span className="swap">
<Sun size={17} data-off={dark} />
<Moon size={17} data-off={!dark} />
</span>
</button>
);
}