/Click feedback
Click feedback • CSS
Project Text Swap Button
An outlined pill whose duplicated label swaps vertically on hover.
Installation
Terminal
npx shadcn@latest add https://microkit.co/r/project-text-swap-button.jsonCode
TypeScript component
1export function ProjectTextSwapButton() {2return (3<button type="button" className="project-text-swap-button">4<span className="project-text-swap-label project-text-swap-label-current">5Start a Project6</span>7<span8className="project-text-swap-label project-text-swap-label-incoming"9aria-hidden="true"10>11Start a Project12</span>13</button>14);15}
CSS
1.project-text-swap-button {2box-sizing: border-box;3appearance: none;4position: relative;5display: inline-flex;6align-items: center;7justify-content: center;8width: 100%;9max-width: 176px;10overflow: hidden;11border: 1px solid #f0f0f0;12border-radius: 999px;13background: transparent;14padding: 12px 32px;15color: #f0f0f0;16text-align: center;17font-family: Arial, Helvetica, sans-serif;18cursor: pointer;19}20.project-text-swap-label {21z-index: 1;22display: flex;23white-space: nowrap;24font-size: 16px;25font-weight: 400;26line-height: normal;27transition: transform .36s cubic-bezier(.16, 1, .3, 1), opacity .22s ease;28}29.project-text-swap-label-current {30position: relative;31}32.project-text-swap-label-incoming {33position: absolute;34opacity: 0;35transform: translateY(160%);36}37.project-text-swap-button:hover .project-text-swap-label-current,38.project-text-swap-button:focus-visible .project-text-swap-label-current {39opacity: 0;40transform: translateY(-160%);41}42.project-text-swap-button:hover .project-text-swap-label-incoming,43.project-text-swap-button:focus-visible .project-text-swap-label-incoming {44opacity: 1;45transform: translateY(0);46}47.project-text-swap-button:focus-visible {48outline: 2px solid #f97316;49outline-offset: 4px;50}