No.52 · Buttons· New
Corner Cut Button
Chamfered, instrument-panel buttons with a true border: the outline is drawn to the measured shape so cut edges are exactly as crisp as straight ones, and an accent band sweeps in on hover. One corner, two, all four, or square with corner brackets that close in.
The prompt
Written for the variant you picked above: One corner
Build an instrument-panel button in the single shape selected below, in a filled and a hairline tone and three sizes (36px, 46px, 54px tall; 16, 24, 30px side padding). Type: a monospace stack at 600, uppercase, 0.08em tracking, 12 to 14.5px. An optional arrow icon after the label slides 3px on hover. Palette (light / dark): ink #0d0d0e / #f1f1ef, page #ffffff / #0b0b0c, accent signal orange #ff5a1f with near-black text / acid lime #c6ff3d with near-black text, accent wash at 10%. Focus: a 2px accent outline 3px out (the button itself isn't clipped, so the ring always shows). Tones: filled is an ink slab with page-coloured text; on hover or keyboard focus an accent band, slanted -30°, sweeps across from the left in 0.38s, the text turns near-black and the edge accent. Hairline is transparent with a 1.5px ink edge; on hover the band is the 10% wash and the edge turns accent. Press moves it down 1px. Show a large filled 'Launch' with an arrow, a hairline 'View specs' and a small filled 'Arm', on a #efefec panel and a #0b0b0c panel side by side. Selected variant — One corner (one): One corner: the bottom-right corner is cut at 45° (7, 11 or 14px by size). Clip only an inner fill layer to the polygon with clip-path (calc() against a --cut custom property), and draw the 1.5px outline as an SVG polygon from the button's measured size (ResizeObserver), pulled in by half the stroke; where the cut is, move its ends along the sides by inset × tan(22.5°) so the diagonal stays exactly parallel and the same weight. This selection takes precedence over references to other themes or options in the general brief. Implement this selected appearance; do not add a variant picker or alternative appearances unless requested. Implementation requirements: Use React and TypeScript. Keep the component self-contained, with uniquely scoped CSS and no animation libraries. Include required imports, styles and font setup in the result. Interaction: A normal button: click, Enter or Space. Hover and keyboard focus show the same accent state. Motion: 0.38s slanted sweep, 0.2s colour and edge changes, a 3px icon slide, a 1px press. Reduced motion makes them instant. Accessibility: Native button; the outline and sweep are decorative; the focus ring sits outside the shape; text keeps 4.5:1 on every fill. Responsive behavior: Buttons keep their size and wrap in rows; the outline is re-measured whenever the button resizes. Touch: Nothing depends on hover; the press gives touch feedback. Preserve keyboard access, visible focus and reduced-motion behavior. Keep fictional demo data and simulated service calls in a separate usage example; expose callbacks for real actions and recover from rejected requests. Keep usage-example links inside the demo: use local buttons or prevent navigation. Demonstration links must not navigate to Vitrine routes or open other pages; preserve real URL support in the reusable component itself. Verify the result at narrow and wide viewport sizes, with keyboard input and reduced motion enabled.
Notes
- Interaction
- A normal button: click, Enter or Space. Hover and keyboard focus show the same accent state.
- Motion
- 0.38s slanted sweep, 0.2s colour and edge changes, a 3px icon slide, a 1px press. Reduced motion makes them instant.
- Accessibility
- Native button; the outline and sweep are decorative; the focus ring sits outside the shape; text keeps 4.5:1 on every fill.
- Responsive
- Buttons keep their size and wrap in rows; the outline is re-measured whenever the button resizes.
- On touch
- Nothing depends on hover; the press gives touch feedback.