Skip to main content

Command

A search-first menu of actions and places, opened from the keyboard.

Left out of Content first Command suits expert users who type to jump anywhere. Most readers visit now and then, and the catalogue rules it out for them. Use instead: Navigation menu, Input

See it live​

Start Storybook to see it live: npm run storybook

When to use it​

  • Use it when: Expert users who want to jump anywhere or run any action by typing.
  • Not when: The only way to reach an action, or people who visit now and then.

Instead:

Words​

  • Write to one person: "you", not "users".
  • Short sentences with room to breathe.
  • Explain why before asking for anything.
  • Use: Read, Save for later, You, Next issue. Avoid: Click here, Submit, Users, Content.

The labels components use, from the voice tokens:

  • content.action.commit: Save
  • content.action.cancel: Not now
  • content.action.destroy: Remove
  • content.action.retry: Try again
  • content.action.empty-action: Browse guides

See Voice and tone for the whole voice.

Accessibility and keyboard​

KeyboardWhat happensNot
undefinedA shortcut opens it; arrows move; Enter runs; Escape closes.undefined

Test before you ship:

  • Results are a list; the active result is announced. undefined

Use it in code​

npx open-ds add command

The component reads only component keys and semantic tokens, so it follows the brand and mode on <html>.

Tokens it reads​

Command reads 38 tokens of its own, each an alias of a semantic token. Each row is one part: its own token, the semantic it aliases, and the value it ends at. Change a semantic and every component that reads it follows; override one of Command's tokens to change Command alone.

Changes with theme

Content first decides what changes when you switch theme. Here a switch changes colors only, so the marked rows differ between light and dark; everything else holds steady.

PartIts token and the semantic it aliasesValue
Command
Cornercomponent.command.radiusradius.controlvar(--command-radius)radius.8:0.5rem
Fill
Changes with theme
component.command.backgroundcolor.surface.raisedvar(--command-background)Lightstone.light.0:#FFFFFFDarkstone.dark.100:#2E2A24
Text
Changes with theme
component.command.labelcolor.text.primaryvar(--command-label)Lightstone.light.900:#1F1B16Darkstone.dark.900:#FFFDF8
Padding, left and rightcomponent.command.padding-xcomponent-spacing-map.x2var(--command-padding-x)space.8:0.5rem
Weightcomponent.command.font-weighttype.label.font-weightvar(--command-font-weight)font.weight.600:600
Label 2
Changes with theme
component.command.label-2color.text.mutedvar(--command-label-2)Lightstone.light.600:#61594DDarkstone.dark.400:#A39A8B
Padding, top and bottomcomponent.command.padding-ycomponent-spacing-map.x3var(--command-padding-y)space.20:1.25rem
Icon sizecomponent.command.icon-sizesize.iconvar(--command-icon-size)size.16:1rem
Disabled opacitycomponent.command.disabled-opacityopacity.disabledvar(--command-disabled-opacity)opacity.40:0.4
Input
Wrapper gapcomponent.command.input.wrapper.gapspace.gap.defaultvar(--command-input-wrapper-gap)space.16:1rem
Wrapper padding xcomponent.command.input.wrapper.padding-xcomponent-spacing-map.x3var(--command-input-wrapper-padding-x)space.20:1.25rem
Cornercomponent.command.input.radiusradius.controlvar(--command-input-radius)radius.8:0.5rem
Padding, top and bottomcomponent.command.input.padding-ycomponent-spacing-map.x3var(--command-input-padding-y)space.20:1.25rem
Text sizecomponent.command.input.font-sizetype.body.font-sizevar(--command-input-font-size)font.size.18:1.125rem
Label placeholder
Changes with theme
component.command.input.label-placeholdercolor.text.mutedvar(--command-input-label-placeholder)Lightstone.light.600:#61594DDarkstone.dark.400:#A39A8B
Disabled opacity disabled
when disabled
component.command.input.disabled-opacity-disabledopacity.disabledvar(--command-input-disabled-opacity-disabled)opacity.40:0.4
Empty
Padding, top and bottomcomponent.command.empty.padding-ycomponent-spacing-map.x6var(--command-empty-padding-y)space.36:2.25rem
Text sizecomponent.command.empty.font-sizetype.body.font-sizevar(--command-empty-font-size)font.size.18:1.125rem
Group
Paddingcomponent.command.group.paddingcomponent-spacing-map.x1var(--command-group-padding)space.4:0.25rem
Text
Changes with theme
component.command.group.labelcolor.text.primaryvar(--command-group-label)Lightstone.light.900:#1F1B16Darkstone.dark.900:#FFFDF8
Padding, left and rightcomponent.command.group.padding-xcomponent-spacing-map.x2var(--command-group-padding-x)space.8:0.5rem
Padding, top and bottomcomponent.command.group.padding-ycomponent-spacing-map.x2var(--command-group-padding-y)space.8:0.5rem
Text sizecomponent.command.group.font-sizetype.caption.font-sizevar(--command-group-font-size)font.size.14:0.875rem
Weightcomponent.command.group.font-weighttype.label.font-weightvar(--command-group-font-weight)font.weight.600:600
Label 2
Changes with theme
component.command.group.label-2color.text.mutedvar(--command-group-label-2)Lightstone.light.600:#61594DDarkstone.dark.400:#A39A8B
Separator
Fill
Changes with theme
component.command.separator.backgroundcolor.border.defaultvar(--command-separator-background)Lightstone.light.200:#E4DDD0Darkstone.dark.100:#2E2A24
Item
Gapcomponent.command.item.gapspace.gap.defaultvar(--command-item-gap)space.16:1rem
Cornercomponent.command.item.radiusradius.badgevar(--command-item-radius)radius.999:9999px
Padding, left and rightcomponent.command.item.padding-xcomponent-spacing-map.x2var(--command-item-padding-x)space.8:0.5rem
Padding, top and bottomcomponent.command.item.padding-ycomponent-spacing-map.x2var(--command-item-padding-y)space.8:0.5rem
Text sizecomponent.command.item.font-sizetype.body.font-sizevar(--command-item-font-size)font.size.18:1.125rem
Disabled opacity disabled
when disabled
component.command.item.disabled-opacity-disabledopacity.disabledvar(--command-item-disabled-opacity-disabled)opacity.40:0.4
Background selected
Changes with theme
when selected
component.command.item.background-selectedcolor.surface.sunkenvar(--command-item-background-selected)Lightstone.light.100:#F6F2EADarkstone.dark.100:#2E2A24
Label selected
Changes with theme
when selected
component.command.item.label-selectedcolor.text.primaryvar(--command-item-label-selected)Lightstone.light.900:#1F1B16Darkstone.dark.900:#FFFDF8
Icon sizecomponent.command.item.icon-sizesize.iconvar(--command-item-icon-size)size.16:1rem
Text
Changes with theme
component.command.item.labelcolor.text.mutedvar(--command-item-label)Lightstone.light.600:#61594DDarkstone.dark.400:#A39A8B
Shortcut
Text sizecomponent.command.shortcut.font-sizetype.caption.font-sizevar(--command-shortcut-font-size)font.size.14:0.875rem
Text
Changes with theme
component.command.shortcut.labelcolor.text.mutedvar(--command-shortcut-label)Lightstone.light.600:#61594DDarkstone.dark.400:#A39A8B
From the system
Edge
Changes with theme
color.border.default
straight from the system, through --border
Lightstone.light.200 · #E4DDD0Darkstone.dark.100 · #2E2A24