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
Button Table of Contents Usage The following section provides guidance for designers and developers on how to use this component in different situations. Do: Use buttons for actions that have clear consequences, such as submitting a form or initiating a purchase. Use buttons to indicate the next step in a process, such as "Continue" or "Next". Use buttons with clear and concise labels that accurately describe the action they perform. Use the primary button for the most important or desired action, and use the secondary button for less important or secondary actions. Use icons in buttons to enhance their meaning, but ensure the icon is relevant and easily recognizable. Use disabled buttons to indicate actions that are currently unavailable or incomplete, and provide context for why the button is disabled. Don't: Don't use buttons for non-actionable elements, such as decorative graphics or text. Don't use ambiguous or unclear labels for buttons, as it can lead to confusion for users. Don't use too many buttons on a page or in a single section, as it can overwhelm users and reduce usability. Don't use primary and secondary buttons interchangeably, as it can confuse users and reduce the clarity of your interface. Don't use disabled buttons without providing context for why the button is disabled. This can lead to confusion and frustration for users. Custom states 🧪 Experimental: The button exposes its loading state as a CSS custom state, which can be targeted with the :state() pseudo-class. This is handy to conditionally override the exposed CSS variables (e.g. --p-button-bg and --p-button-fg) without having to duplicate the state logic in your application. Custom stateApplied whenloadingloading is true
p-button:state(loading) {
  --p-button-bg: light-dark(#025b3f, #21eeae);
  --p-button-fg: light-dark(#21eeae, #025b3f);
}
Custom states are a progressive enhancement: browsers without support for CustomStateSet or the :state() pseudo-class simply ignore these rules, the button keeps working and falls back to its default styling. Be aware that custom states can't be expressed during server side rendering, they are only applied once the component is hydrated on the client. Therefore, don't rely on :state() for styling that has to be correct on first paint. For all other states and variants, use native CSS selectors instead: Styling targetSelectorDisabledp-button:disabled (the button is form-associated)Hoverp-button:not(:disabled, :state(loading)):hoverFocusp-button:focus-visibleVarianta custom class, e.g. <p-button class="my-button" variant="secondary"> Since the button is a form-associated custom element, it is matched by the native :disabled pseudo-class as soon as the disabled attribute is set — no custom state is needed for it.
p-button {
  --p-button-bg: light-dark(#025b3f, #21eeae);
  --p-button-fg: light-dark(#21eeae, #025b3f);
}

p-button:not(:disabled, :state(loading)):hover {
  --p-button-bg: light-dark(#013d2a, #6ef7cf);
  --p-button-fg: light-dark(#6ef7cf, #013d2a);
}

p-button:disabled {
  --p-button-bg: light-dark(#6f3d0b, #ffaa4f);
  --p-button-fg: light-dark(#ffaa4f, #6f3d0b);
}
As with all color customizations, you are responsible for ensuring sufficient contrast and brand compliance. Related components Links
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%