Skip to contentPorsche Design System
You are currently viewing an earlier release of the Porsche Design System.Switch to the latest Porsche Design System documentation.
SearchGitHub repository of Porsche Design SystemOpen settings sidebar
Select Table of Contents Accessibility support Keyboard Combobox Key / stateFunctionDown Arrow Up Arrow Space- Opens the listbox if it is not already displayed without moving focus or changing selection.
- DOM focus remains on the combobox.
SpaceCloses the listbox if it is displayed.
Listbox Key / stateFunctionDown Arrow Up ArrowMoves visual focus to the next/previous option.Home EndMoves visual focus to the first/last option.ESCCloses listboxEnter, SpaceSelects an option ARIA enhancements External ARIA provided by the aria property: Use the aria property to pass supported attributes to the native control inside the shadow DOM. Prefer a visible label for the accessible name. Use aria-label when the label is hidden or missing, and aria-description for extra context that should not replace the name. Do not use aria-label to replace a different visible label (WCAG 2.5.3). ARIAUsagearia-labelDefines an accessible name when the visible label is insufficient or hidden; prefer a visible label for most cases.aria-descriptionProvides additional context for assistive technologies without replacing the accessible name. Internal ARIA that is managed by the component: ARIAUsagearia-labelledby="IDREF"On the listbox: references the field label as the accessible name.aria-describedby="IDREF"References the accessible description and status messages of the combobox.aria-label="STRING"On options without a value: fallback accessible name (Empty value).role="status", role="alert"When message and state prop change, the status message is announced.aria-expanded="BOOLEAN"Indicates that the listbox element is displayed/hidden.aria-controls="IDREF"Identifies the element that serves as the listbox.aria-hidden="true"If required attribute is set, the visible indicator is hidden from assistive technologies.aria-haspopup="listbox"Indicates that the combobox will open a listbox.aria-required="true"Indicates if the element is required. Development considerations Disabled state In general, avoid using the disabled state. Disabled elements are no longer focusable and may be missed by screen reader users. They can also confuse sighted users if the reason they are disabled is not made clear. Common do's and don'ts Do pass extra labelling through the aria prop (aria-label, aria-description). Do provide a clear, persistent label for what the selection controls. Do use meaningful option text so choices are understandable out of context. Do use the component state/message API so validation and status changes are announced. Do use clear error wording that helps users recover. Don't use a prompt option or adjacent text as a substitute for a field label. Don't use very short or ambiguous option labels when context is important. Don't use hide-label without an accessible name. Don't add native aria-* attributes directly on the component host. Integration examples
ARIA on component host vs aria prop❌ Anti-pattern
<p-select name="model" label="Porsche model" aria-label="Accessible name" aria-description="Additional context">
  <p-select-option value="option-a">
    Option A
  </p-select-option>
</p-select>
✅ Recommended
<p-select name="model" label="Porsche model" aria="{'aria-label': 'Accessible name', 'aria-description': 'Additional context'}">
  <p-select-option value="option-a">
    Option A
  </p-select-option>
</p-select>
Prompt option used instead of a label❌ Anti-pattern
<p-select name="model">
  <p-select-option value="">
    Select a model
  </p-select-option>
  <p-select-option value="carrera">
    911 Carrera
  </p-select-option>
  <p-select-option value="carrera-s">
    911 Carrera S
  </p-select-option>
</p-select>
✅ Recommended
<p-select label="Porsche model" name="model" description="Choose the model for your configuration.">
  <p-select-option value="carrera">
    911 Carrera
  </p-select-option>
  <p-select-option value="carrera-s">
    911 Carrera S
  </p-select-option>
</p-select>
Ambiguous option labels without field context❌ Anti-pattern
<p-select label="Model" name="model">
  <p-select-option value="base">
    Base
  </p-select-option>
  <p-select-option value="s">
    S
  </p-select-option>
</p-select>
✅ Recommended
<p-select label="Porsche 911 trim" name="model" description="Select the trim level for your configuration.">
  <p-select-option value="carrera">
    911 Carrera
  </p-select-option>
  <p-select-option value="carrera-s">
    911 Carrera S
  </p-select-option>
</p-select>
Hidden label without accessible name❌ Anti-pattern
<p-select name="model" hide-label="true">
  <p-select-option value="carrera">
    911 Carrera
  </p-select-option>
</p-select>
✅ Recommended
<p-select label="Porsche model" name="model" hide-label="true">
  <p-select-option value="carrera">
    911 Carrera
  </p-select-option>
</p-select>
Validation feedback via state and message API❌ Anti-pattern
<p-select label="Porsche model" name="model" aria-invalid="true" message="Required">
  <p-select-option value="carrera">
    911 Carrera
  </p-select-option>
  <p-select-option value="carrera-s">
    911 Carrera S
  </p-select-option>
</p-select>
✅ Recommended
<p-select label="Porsche model" name="model" state="error" message="Select a model to continue with your configuration.">
  <p-select-option value="carrera">
    911 Carrera
  </p-select-option>
  <p-select-option value="carrera-s">
    911 Carrera S
  </p-select-option>
</p-select>
Error state without recovery guidance❌ Anti-pattern
<p-select label="Porsche model" name="model" state="error" message="Invalid">
  <p-select-option value="carrera">
    911 Carrera
  </p-select-option>
  <p-select-option value="carrera-s">
    911 Carrera S
  </p-select-option>
</p-select>
✅ Recommended
<p-select label="Porsche model" name="model" required="true" state="error" message="Select a Porsche model. This field is required to continue.">
  <p-select-option value="carrera">
    911 Carrera
  </p-select-option>
  <p-select-option value="carrera-s">
    911 Carrera S
  </p-select-option>
</p-select>
Tests Automated TechnologySupportAXE-Core (WCAG 2.2 AA, Best-Practice)✅High-Contrast Mode (light/dark)✅Text-Zoom (200%)✅ Manual TechnologySupportKeyboard✅Screen reader (VoiceOver, NVDA)✅ (Note: Though Safari supports ariaActiveDescendantElement the active option doesn't get announced in VoiceOver)
v4.8.0v2v1
Global settingsColor SchemeAll color tokens use the light-dark() CSS function. Set the theme via the CSS color-scheme property: light for light mode, dark for dark mode, or light dark to follow the user's system preference.LightDarkLight DarkDirectionThe dir global attribute in HTML changes the direction of text and other content within an element. It's most often used on the <html> tag to set the entire page's direction, which is crucial for supporting languages that are written from right to left (RTL), such as Arabic and Hebrew. For example, using <html dir="rtl"> makes the entire page display from right to left, adjusting the layout and text flow accordingly.LTR (left-to-right)RTL (right-to-left)Text ZoomTo ensure accessibility and comply with WCAG 2.2 AA standards, it is mandatory for web content to support text resizing up to at least 200% without loss of content or functionality. Using relative units like rem is a best practice for achieving this, as they allow the text to scale uniformly based on the user's browser settings.100%130%150%200%