diff --git a/app/components/buttons/Button/Button.tsx b/app/components/buttons/Button/Button.tsx index accf38a..b29d6fb 100644 --- a/app/components/buttons/Button/Button.tsx +++ b/app/components/buttons/Button/Button.tsx @@ -156,7 +156,7 @@ const Button = memo( // Note: State prop is informational for Figma alignment - actual state is handled by CSS pseudo-classes // For now, we maintain existing behavior and state prop is for documentation/alignment purposes - const baseStyles = `inline-flex items-center justify-start box-border whitespace-nowrap shrink-0 ${sizeStyles[size]} rounded-[var(--radius-measures-radius-full)] ${fontStyles[size]} transition-all duration-500 ease-in-out cursor-pointer ${variantStyles[variant]} ${outlineStyles}`; + const baseStyles = `inline-flex items-center justify-start box-border whitespace-nowrap shrink-0 touch-manipulation [-webkit-tap-highlight-color:transparent] ${sizeStyles[size]} rounded-[var(--radius-measures-radius-full)] ${fontStyles[size]} transition-[transform,color,background-color,border-color,box-shadow,outline-color] duration-150 ease-out cursor-pointer ${variantStyles[variant]} ${outlineStyles}`; const combinedStyles = `${baseStyles} ${className}`; const sharedA11y = { diff --git a/app/components/navigation/Footer.tsx b/app/components/navigation/Footer.tsx index 8f394e3..02a7529 100644 --- a/app/components/navigation/Footer.tsx +++ b/app/components/navigation/Footer.tsx @@ -17,7 +17,7 @@ const Footer = memo(() => { const tChrome = useTranslation("controlsChrome"); const linkFocusClass = - "hover:opacity-80 active:opacity-60 focus:opacity-80 focus:outline-none focus:ring-2 focus:ring-[var(--color-content-default-primary)] focus:ring-offset-2 focus:ring-offset-[var(--color-surface-default-primary)] transition-opacity"; + "touch-manipulation [-webkit-tap-highlight-color:transparent] hover:opacity-80 active:opacity-60 focus:opacity-80 focus:outline-none focus:ring-2 focus:ring-[var(--color-content-default-primary)] focus:ring-offset-2 focus:ring-offset-[var(--color-surface-default-primary)] transition-opacity duration-150 ease-out"; const bodyTextClass = "text-[var(--color-content-default-primary)] font-inter text-base font-medium leading-5 tracking-[0%] lg:text-2xl lg:font-normal lg:leading-7"; diff --git a/tests/components/Button.test.tsx b/tests/components/Button.test.tsx index 4cd964d..8036b43 100644 --- a/tests/components/Button.test.tsx +++ b/tests/components/Button.test.tsx @@ -53,6 +53,16 @@ describe("Button (behavioral tests)", () => { expect(handleClick).toHaveBeenCalledTimes(1); }); + it("uses fast transitions and touch-friendly press feedback", () => { + render(); + + const button = screen.getByRole("button", { name: "Press me" }); + expect(button.className).toContain("touch-manipulation"); + expect(button.className).toContain("duration-150"); + expect(button.className).not.toContain("duration-500"); + expect(button.className).toContain("active:scale-[0.98]"); + }); + it("renders as a link when href is provided", () => { render(