Button Library · Signature
Ticket Stub
Punched edges, and the stub tears away on hover.
States
Default
Hover
Active
Focus
Code
sig-ticket.html
<button class="btn-sig-ticket" type="button"> <span class="btn-sig-ticket__body">Book seat</span> <span class="btn-sig-ticket__stub" aria-hidden="true">No 0427</span> </button>
sig-ticket.css
.btn-sig-ticket {
--btn-bg: #7c5cff;
--btn-bg2: #22d3ee;
--btn-fg: #ffffff;
--btn-font: inherit;
--btn-size: 15px;
--btn-weight: 600;
--btn-px: 22px;
--btn-py: 11px;
--btn-w: auto;
--btn-h: auto;
--btn-bw: 0px;
--btn-line: #8b6cff;
--btn-radius: 10px;
--btn-shadow: none;
--btn-speed: 260ms;
}
.btn-sig-ticket {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 0;
box-sizing: border-box;
width: var(--btn-w);
height: var(--btn-h);
padding: 0;
font-family: var(--btn-font);
font-size: var(--btn-size);
font-weight: var(--btn-weight);
line-height: 1.2;
color: var(--btn-fg);
background: transparent;
border: var(--btn-bw) solid var(--btn-line);
border-radius: var(--btn-radius);
box-shadow: var(--btn-shadow);
cursor: pointer;
text-decoration: none;
white-space: nowrap;
transition: all var(--btn-speed) ease;
}
.btn-sig-ticket:focus-visible {
outline: 2px solid var(--btn-bg);
outline-offset: 2px;
}
.btn-sig-ticket:disabled {
opacity: 0.5;
pointer-events: none;
}
.btn-sig-ticket__icon {
width: 1.15em;
height: 1.15em;
flex-shrink: 0;
}
.btn-sig-ticket:hover {
--tear: 8px;
--tilt: 7deg;
}
.btn-sig-ticket__body {
padding: var(--btn-py) var(--btn-px);
background: var(--btn-bg);
border-radius: var(--btn-radius) 0 0 var(--btn-radius);
mask: radial-gradient(circle 7px at 100% 0, transparent 98%, #000), radial-gradient(circle 7px at 100% 100%, transparent 98%, #000);
mask-composite: intersect;
}
.btn-sig-ticket__stub {
display: flex;
align-items: center;
align-self: stretch;
padding: 0 12px;
font-family: ui-monospace, monospace;
font-size: 0.72em;
color: #101014;
background: var(--btn-bg2);
border-left: 2px dashed rgba(0,0,0,.35);
border-radius: 0 var(--btn-radius) var(--btn-radius) 0;
mask: radial-gradient(circle 7px at 0 0, transparent 98%, #000), radial-gradient(circle 7px at 0 100%, transparent 98%, #000);
mask-composite: intersect;
transform: translateX(var(--tear, 0)) rotate(var(--tilt, 0deg));
transform-origin: 0 100%;
transition: transform var(--btn-speed) ease;
}
@media (prefers-reduced-motion: reduce) {
.btn-sig-ticket,
.btn-sig-ticket__stub {
animation: none !important;
transition: none !important;
}
}
sig-ticket.js
// No JavaScript needed: this one is CSS only.
sig-ticket.tsx
import type React from "react";
import "./sig-ticket.css"; // the CSS tab
export function BtnSigTicket({ children = "Book seat", ...props }: React.ComponentProps<"button">) {
return (
<button className="btn-sig-ticket" type="button" {...props}>
<span className="btn-sig-ticket__body">{children}</span>
<span className="btn-sig-ticket__stub" aria-hidden="true">{"No 0427"}</span>
</button>
);
}
sig-ticket.html
<button class="relative inline-flex items-center justify-center gap-[0] [box-sizing:border-box] [padding:0] [font-family:inherit] text-[15px] font-[600] [line-height:1.2] text-[#ffffff] [background:transparent] [border:0px_solid_#8b6cff] rounded-[10px] [box-shadow:none] cursor-pointer no-underline whitespace-nowrap [transition:all_260ms_ease] focus-visible:[outline:2px_solid_#7c5cff] focus-visible:[outline-offset:2px] disabled:[opacity:0.5] disabled:[pointer-events:none] hover:[--tear:8px] hover:[--tilt:7deg] motion-reduce:[transition:none!important]" type="button"> <span class="[padding:11px_22px] bg-[#7c5cff] rounded-[10px_0_0_10px] [mask:radial-gradient(circle_7px_at_100%_0,_transparent_98%,_#000),_radial-gradient(circle_7px_at_100%_100%,_transparent_98%,_#000)] [mask-composite:intersect]">Book seat</span> <span class="[display:flex] items-center [align-self:stretch] [padding:0_12px] [font-family:ui-monospace,_monospace] text-[0.72em] text-[#101014] bg-[#22d3ee] [border-left:2px_dashed_rgba(0,0,0,.35)] rounded-[0_10px_10px_0] [mask:radial-gradient(circle_7px_at_0_0,_transparent_98%,_#000),_radial-gradient(circle_7px_at_0_100%,_transparent_98%,_#000)] [mask-composite:intersect] [transform:translateX(var(--tear,_0))_rotate(var(--tilt,_0deg))] [transform-origin:0_100%] [transition:transform_260ms_ease] motion-reduce:[transition:none!important]" aria-hidden="true">No 0427</span> </button>