diff --git a/packages/ui/src/components/button-shortcut.css b/packages/ui/src/components/button-shortcut.css new file mode 100644 index 0000000000..fd76464a29 --- /dev/null +++ b/packages/ui/src/components/button-shortcut.css @@ -0,0 +1,36 @@ +[data-component="button"][data-button-shortcut] { + [data-slot="button-shortcut-label"] { + min-width: 0; + } + + [data-slot="button-shortcut-key"] { + display: flex; + align-items: center; + flex-shrink: 0; + } + + [data-slot="button-shortcut-key"] [data-component="keybind"] { + box-shadow: none; + background: var(--surface-raised-base); + color: var(--text-weak); + font-family: var(--font-family-sans); + font-weight: var(--font-weight-regular); + } + + &[data-size="small"] [data-slot="button-shortcut-key"] [data-component="keybind"], + &[data-size="normal"] [data-slot="button-shortcut-key"] [data-component="keybind"] { + height: 18px; + padding: 0 4px; + border-radius: 3px; + font-size: var(--font-size-small); + line-height: 18px; + } + + &[data-size="large"] [data-slot="button-shortcut-key"] [data-component="keybind"] { + height: 20px; + padding: 0 6px; + border-radius: 4px; + font-size: var(--font-size-small); + line-height: 20px; + } +} diff --git a/packages/ui/src/components/button-shortcut.stories.tsx b/packages/ui/src/components/button-shortcut.stories.tsx new file mode 100644 index 0000000000..ca395e2845 --- /dev/null +++ b/packages/ui/src/components/button-shortcut.stories.tsx @@ -0,0 +1,86 @@ +// @ts-nocheck +import { ButtonShortcut } from "./button-shortcut" + +const docs = `### Overview +Button with a trailing shortcut keycap. + +Use this when the action label and shortcut should be taught together at the control level. + +### API +- Inherits Button props. +- \`shortcut\`: visible keycap text. +- \`shortcutAria\`: semantic shortcut string for \`aria-keyshortcuts\`. +- \`shortcutClass\`: optional class override for the keycap. + +### Variants and states +- Uses the same \`variant\` and \`size\` options as \`Button\`. +- Supports disabled state. + +### Accessibility +- Keep the visible shortcut concise. +- Use \`shortcutAria\` for the canonical key sequence when it differs from the visible label. + +### Theming/tokens +- Extends \`Button\` and composes \`Keybind\`. + +` + +export default { + title: "UI/ButtonShortcut", + id: "components-button-shortcut", + component: ButtonShortcut, + tags: ["autodocs"], + parameters: { + docs: { + description: { + component: docs, + }, + }, + }, + args: { + children: "Cancel", + shortcut: "Esc", + shortcutAria: "Escape", + variant: "ghost", + size: "small", + }, + argTypes: { + variant: { + control: "select", + options: ["primary", "secondary", "ghost"], + }, + size: { + control: "select", + options: ["small", "normal", "large"], + }, + }, +} + +export const Basic = {} + +export const Sizes = { + render: () => ( +