Widgets

Android widgets provide a quick overview of key information across the user’s home screens. They retain simplicity by showing only the most valuable information and functionality from the application first, guiding users to access more complex data and actions within the app. While the widget’s content focuses on one subject, users can still adjust the amount of content displayed by resizing the widget, if supported.

Widgets on an Android device
Widgets on an Android device

Usage

Creating Content

  • Display curated and dynamic information for a single idea that relates to the most valuable application information and functionality.
  • Keep the information concise, and if more is needed, the user can navigate to additional details.
  • Offer widgets in multiple sizes when it adds direct value to the user.
A widget that provides the most important and cohesive information first
A widget that provides the most important and cohesive information first
A widget that displays unrelated information, not displaying the most important information on the widget
A widget that displays unrelated information, not displaying the most important information on the widget

Aligning Interaction

  • Offer specific functionality without the user needing to launch the application.
  • Include multiple touch targets if the user can perform different actions on the widget.
  • Ensure the interaction opens the application at the right location.
A widget that utilizes the opportunity to have quick actions right from the widget that are specific to the widget’s topic
A widget that utilizes the opportunity to have quick actions right from the widget that are specific to the widget’s topic
A widget that omits quick actions and uses generic wording to interact with the widget
A widget that omits quick actions and uses generic wording to interact with the widget

Handling Authentication

  • Inform the user when authentication adds value, prompting them to continue in-app.
  • Return an error state for unauthorized users if authorized users permit the application to show data in widgets.
A widget that prompts the user to authenticate when needed
A widget that prompts the user to authenticate when needed
A widget that is problem-oriented, not prompting the user to authenticate to solve the issue
A widget that is problem-oriented, not prompting the user to authenticate to solve the issue

Anatomy

While the header, the body, and the footer are optional to have, we recommend including at least one of the sections.

Across each section, the text fields display the device’s system font in place of the 72 font style, as they are not supported yet for Android widgets. The only exception to using the 72 font style is if the application is drawing directly onto a canvas rather than implementing the widget using a text view.

A. Header

The header provides the user context for the widget’s single subject. It is recommended to only use SAP icons in the header area unless the application creates its own content.

B. Body

The body is comprised of one or multiple SAP BTP SDK for Android components of a single type.

For example, widgets built using Glance support checkboxes, radio buttons, and switches in the body area.

C. Footer

In the footer area, users can access and perform select actions. We recommend a maximum of two actions, in the form of icon or text buttons.

Widgets anatomy
Widgets anatomy

Adaptive Design

Widgets can come in multiple sizes as they adapt to fit the available screen size. Create additional sizes only if they add direct value to the user, such as introducing an additional set of information that can be used to inform the user’s actions.

 

Users can place widgets on their Android home screen’s available grid space. This grid can vary by device. To determine the widget’s size, view this Android Developer article for more information.

Examples of widgets in a small (left), medium (center), and large (right) size
Examples of widgets in a small (left), medium (center), and large (right) size

Variations

Information Widgets

Information widgets track and display crucial data over time. Some common use cases include:

  • Monitoring sales performance
  • Checking in on daily fitness goals
Information widgets example
Information widgets example

Collection Widgets

Collection widgets display multiple of the same element, often in the form of a list. If building widgets with Glance, the collection widget can have vertical scroll. Some common use cases include:

  • Browsing news articles
  • Scrolling through a list of pending approvals
Collection widgets example
Collection widgets example

Control Widgets

Control widgets display frequently used functions. Some common use cases include:

  • Marking a to-do item as complete
  • Checking off a pre-meeting reminder
Control widgets example
Control widgets example

Hybrid Widgets

Hybrid widgets combine elements of different widget types. For example, a widget could be both an information and a control widget. Some common use cases include:

  • Tracking and adding time to timesheet
  • Displaying and playing media
Hybrid widgets example
Hybrid widgets example

Resources

SAP Fiori for iOS: Widgets

Android Developer: App Widgets Overview

Staggered Layout

The staggered layout for cards is a design pattern where cards are arranged in a flexible, grid-like structure, with each card adapting to the available space while maintaining alignment with adjacent cards. It optimizes space usage and provides an aesthetically pleasing visual layout.

Cards displayed in a list (left) and staggered layout (right)
Cards displayed in a list (left) and staggered layout (right)

Usage

Do
  • Ensure that cards in the staggered layout contain related content.
  • If your app includes multiple card layouts, such as a carousel, add an optional title to your staggered layout container.
Don't

Don’t use a staggered layout for your tablet app when you have only a few cards.

Anatomy

Container with Cards

The cards have a consistent width, which is based on the number of columns determined by the window size class. The height of each card can vary depending on the content, resulting in an asymmetric view.

Margins

Margins are the spacings between the content and the outer edges of the window area. Margin widths are defined using fixed values for each window size class and change at different breakpoints to better fit the screen size.

Staggered layout with different card heights
Staggered layout with different card heights

Behavior and Interaction

Scrolling

Cards scroll vertically in a list and staggered layout.

Vertical scrolling in a staggered layout
Vertical scrolling in a staggered layout

Empty States

If there is no card in the list, it is important to use an empty state indicator in the layout container to communicate this information. This indicator serves as an informative message for users to let them know that no information or data is currently available or that some information needs to be created.

Illustrated message to indicate an empty state
Illustrated message to indicate an empty state

Adaptive Design

The number of columns may increase based on the screen width, allowing more cards to be shown side by side, resulting in a grid-like look that enhances readability.

For compact window size classes, cards are arranged in a vertical list, which span across the entire width of the screen and provide a high density of information.

For medium and extended window size classes, the layout changes to a staggered layout, with cards placed at the top and then left-most position. This ensures a seamless layout without gaps.

Staggered layout showing top-most and left-most card placement
Staggered layout showing top-most and left-most card placement

If there is a navigation rail or navigation drawer, the number of columns is reduced and adapts to the remaining screen width.

Staggered layout with cards and with navigation rail (right)
Staggered layout with cards and with navigation rail (right)

Additionally, you can also combine layouts. However, if a staggered and a carousel layout are used on the same page, it creates visual imbalance of the card spacing caused by the outer margins of the different layouts.

Resources

Development: Card System

SAP Fiori for iOS: Masonry Layout

SAP Fiori for Web: Overview Page

Related Components/Patterns: Cards Overview, Carousel Layout

KPIs

KPIs (key performance indicators) are metrics used to evaluate the success of an organization, an individual, a group, or an activity. They serve to highlight the current value of an object or as a summary of the object. KPIs can be displayed in a header, in the content area of an object, on a card, or in a modal window.

KPI header on mobile (left), in a card component (middle), and in a widget component (right)
KPI header on mobile (left), in a card component (middle), and in a widget component (right)

Usage

Do
  • Use KPIs for numerical metrics.
  • Use abbreviations for units of measurement in the KPI prefix and/or suffix that may be too long. For example, “m” or “mil” can be used in place of “millions”.
Don't
  • Don’t use KPIs for non-numerical metrics.
  • Don’t mix standard KPIs with progress view KPIs when nesting KPIs in an object. Standard KPIs should only be grouped and displayed with one another, likewise with progress view KPIs.
  • Don’t write overly long or descriptive KPI labels. KPI labels should be concise while also clearly communicating the KPI meaning.

Anatomy

Standard KPIs and KPIs with Icons

A. Trend/Icon

The KPI icon is used to provide a visual representation of information related to the KPI metric. It defaults to a trend symbol for standard KPIs. With the KPI Icon variant, you can choose an icon from the Icon Explorer.

B. Prefix and Suffix

The KPI prefix and suffix are used to define units of measurement for the KPI metric and are placed right in front or after the KPI numeric value.

C. Value(s)

The KPI value is the core element of the component. It can either be a single value with one number or two values with a combination of numbers, prefixes, and suffixes, such as “15hr12mins”.

D. Label

The KPI label is used to provide additional information about the KPI.

Anatomy of a standard KPI
Anatomy of a standard KPI
Anatomy of a KPI with icon
Anatomy of a KPI with icon

KPI Progress View

A. Progress View

The progress view displays a visual representation of completeness using a circular progress track.

B. KPI

The KPI is a component nested within the progress view KPI component. See information on KPIs above for anatomy.

C. Title

The progress view title is used to provide additional information about the overall KPI progress view.

Anatomy of a KPI progress view
Anatomy of a KPI progress view

Behavior and Interaction 

A KPI is a display-only component used to show a key figure.

Variations 

KPIs

Standard KPI

The standard KPI is available in three different sizes and can be highlighted with semantic colors. Standard KPIs may be used for measurements such as meters, Celsius, percentage, etc.

Small KPI (left), medium KPI in a semantic color (middle), and large KPI (right)
Small KPI (left), medium KPI in a semantic color (middle), and large KPI (right)

KPI with Icon

The KPI with icon is available in three sizes and can be highlighted with semantic colors. The iconography helps represents the KPI metric. For example, a document icon can be used to show there are files associated with a KPI.

Small KPI with icon (left), medium KPI with icon (middle), and large KPI with icon in a semantic color (right)
Small KPI with icon (left), medium KPI with icon (middle), and large KPI with icon in a semantic color (right)

KPI Progress View

The KPI progress view utilizes a circular form that represents the progress of its KPI metric. It can be used to show the step progress of a goal, percentage of completion of a task, and more.

Small KPI progress view with a KPI in a semantic color (left), medium KPI progress view (middle), and large KPI progress view with a KPI with icon (right)
Small KPI progress view with a KPI in a semantic color (left), medium KPI progress view (middle), and large KPI progress view with a KPI with icon (right)

Resources

Development: FioriNumericKpi, FioriProgressViewKpi

SAP Fiori for iOS: KPIs

Related Components/Patterns: Cards Overview, Card Header, Card Body

Cards Overview

A card provides brief, related pieces of information and serves as an entry point, teaser, or preview to more detailed content. By pressing on the card, users can select the card and navigate to a dedicated page with more detailed information.

SAP Fiori for Android Cards
SAP Fiori for Android Cards

Usage

The card system for SAP Fiori for Android provides an advanced approach to utilizing cards, which offer a convenient way for your app to display content from various sources. It consists of a toolkit of nested components that enable the creation of diverse cards to meet the requirements of SAP products. These nested components encompass a wide range of functionalities, such as data table, key value cell, KPIs, and more. Additionally, the card system provides enhanced customization and flexibility, along with adaptable sizing options to accommodate different form factors and layouts, such as list, staggered, or carousel layout for cards. When incorporating cards into your app, it is crucial to keep the following aspects in mind:

Do
  • A card should focus on a single topic and be coherent in itself.
  • A card should serve as an entry point, teaser, or preview to more detailed content.
  • A card should be a short representation of a conceptual unit.
  • A card should present information in a compact and easily scannable format.
  • Incorporate cards into your app design to provide users with a quick overview of various information.
  • Ensure that there is a clear indication on the card when a user selects it and an external app is launched, for example, by incorporating an icon that indicates an external app is launched.
Don't
  • When designing your layout, don’t group components in a container with round corners. This style does not automatically transform a component into a card.
  • Don’t place unrelated elements within a card.
  • Don’t overload the user by including an excessive number of UI elements within a card.
Cards should focus on one topic
Cards should focus on one topic
Don’t place elements within a card that do not relate to the same topic
Don’t place elements within a card that do not relate to the same topic
Cards should display information in a compact format
Cards should display information in a compact format
Don’t include too many UI elements within a card
Don’t include too many UI elements within a card

Anatomy

The content of a card is organized in so-called blocks. The height of a card is determined by its content. However, it’s crucial to keep in mind the maximum permitted height of 520dp.

A. Card Container

The card container is the element that holds the header, body, and footer of the card.

B. Header

The card header, the card’s uppermost part, contains essential information about the card and its associated detail page content. It provides a quick overview of fundamental details such as the title, subtitle, and status of the card. More information on the header can be found in the Card Header article.

C. Body

The card body is the central part of a card that is used to provide additional information alongside the content shown in the card header. This allows for the presentation of in-depth details, data, or graphics relevant to the card’s context. More information on the body can be found in the Card Body article.

D. Footer

The card footer, located at the bottom of the card, is used for important or routine actions that directly impact the card’s functionality, such as “Approve’ or “Submit” actions. More information on the footer can be found in the Card Footer article.

Schematic card anatomy (left) and anatomy of an example card (right)
Schematic card anatomy (left) and anatomy of an example card (right)

Behavior and Interaction

Interaction States

Selecting a Card

When a user presses a card, the ripple effect serves as a clear and immediate feedback to indicate their selection.

When the whole card is selected, the ripple appears as an indicator
When the whole card is selected, the ripple appears as an indicator

Selecting an Interactive Element

When a specific element within the card, such as a card cell, is designed to be interactive, it is visually indicated by a ripple effect.

When an interactive item is selected within the card
When an interactive item is selected within the card
When an interactive element is selected within the card
When an interactive element is selected within the card

Navigation

When a card is selected, it triggers navigation to a designated page that provides more details, such as a list report page or an object details page.

By selecting the card, the user is redirected to a list report with more details
By selecting the card, the user is redirected to a list report with more details

When users engage with an interactive element within the card, such as an object cell, it triggers navigation to a dedicated details page that corresponds to the specific subject of that element.

By selecting an element within the card, the user is redirected to an object details page with more details
By selecting an element within the card, the user is redirected to an object details page with more details

Empty States

When there is no relevant content or data to display, it is important to include an empty state indicator within a card. This indicator serves as an informative message for users, letting them know that there is no information or data available at the moment or that new data needs to be created or uploaded.

Empty state if the entire card content fails to load
Empty state if the entire card content fails to load

If a component within the card fails to load, an empty state indicator is displayed in the body container.

Empty state if only the card body fails to load
Empty state if only the card body fails to load

Skeleton Loading

Skeleton loading is a design technique where a simplified and placeholder version of content is displayed to users while the actual data is being fetched or loaded. It provides users with a visual cue that content is on its way and improves the perceived performance of the interface.
There are three sizes based on the card blocks. This approach allows you to select a card size that approximately reflects the loaded card size.

Skeleton loading on a small, medium, and large card
Skeleton loading on a small, medium, and large card

Adaptive Design

The card system ensures that cards adjust seamlessly to different screen sizes and orientations. For compact window size classes, cards are designed to be narrower to accommodate the limited screen width of phones, making efficient use of the available space in a portrait orientation.

For medium and expanded window size classes, cards can have a wider layout to take advantage of the increased screen real estate, resulting in a more spacious and visually appealing presentation of content. More information about adaptive design can be found in carousel layout and staggered layout.

Variations

The flexible card container allows a variety of cards to be created for any use case
The flexible card container allows a variety of cards to be created for any use case

Data Table Card

Create a data table card to display key data points about an object in a two-column format.

Data table card featuring the card header (with main header), card body (with data table) and card footer
Data table card featuring the card header (with main header), card body (with data table) and card footer

List Card

Create a list card to display a preview of a set of items or objects in a vertical list format.

List cards featuring the card header (with main header) and card body (with card cell and divider or white space components).
List cards featuring the card header (with main header) and card body (with card cell and divider or white space components).

Object Card

Create an object card to display a preview of an object.

Top object card featuring the card header (with header image, main header, extended header), and card footer. Bottom object card featuring the card header (with main header and extended header) and card body (with key value cell, divider/space and KPI).
Top object card featuring the card header (with header image, main header, extended header), and card footer. Bottom object card featuring the card header (with main header and extended header) and card body (with key value cell, divider/space and KPI).

Resources

Development: Card System

SAP Fiori for iOS: Cards Overview

SAP Fiori for Web: Cards (SAPUI5), Cards (Web Component)

Related Components/Patterns: Card Header, Card Body, Card Footer, Carousel Layout, Staggered Layout

Tags

Tags are used to display quick and useful bits of information to the user, such as keywords, labels, categories, or statuses.  

Tags displayed in a row
Tags displayed in a row

Usage

Tags display complementary information that relates to the object. They use a different visual representation than plain text and serve as independent bits of information. When incorporating tags into your app, it is crucial to keep the following aspects in mind:

Do
  • Keep tag labels concise.
  • It is recommended to maintain wording to a maximum of two words per tag.
Don't
  • Don’t write full sentences within a tag.
  • Don’t place icons or images within a tag.
  • Don’t overload the user by including an excessive number of tags or very long text values.
Positive example for showing concise tags in a tag row in a card
Positive example for showing concise tags in a tag row in a card
Negative example for listing an excessive number of tags in an object cell and placing icons in a tag
Negative example for listing an excessive number of tags in an object cell and placing icons in a tag

Anatomy

A. Container

The are two styles available for containers: filled and outlined.

B. Label

The label indicates keywords or other bits of information.

Anatomy of a tag
Anatomy of a tag

Behavior and Interaction

Tags are not interactive. If there is more than one tag, they line up in a horizontal layout one after the other. The tag row can be configured to wrap to the next line depending on the parent container.

Variations

Color

Default vs. Accent

The default tag color is grey, but it can also be displayed in many different colors of the accent color palette.

Tag variations
Tag variations

Resources

SAP Fiori for iOS: Tags

Related Components/Patterns: Cards Overview, Object Header, Object Cell

Design Tokens

Design tokens are our cross-platform solution to managing color across iOS and Android. Design tokens are stored pieces of UI information such as color, spacing, sizing, and typography that collectively make up our design system’s visual identity. Additionally, design tokens help us to maintain visual consistency, scale design decisions, and are simple to maintain and update.

Token groups (left) with Token types (right)
Token groups (left) with Token types (right)

Token Hierarchy

The token hierarchy adds structure and scalability to visual assets in a design system. Each level of the design token hierarchy adds a layer of abstraction that informs designers and developers on how a design token should be used.

Token hierarchy shows the different levels of design tokens
Token hierarchy shows the different levels of design tokens

Reference Tokens

Reference tokens are the foundational elements of a company’s theme by storing the static values of a design decision such as hex code, line height, and typography values. Since the reference token naming does not indicate its usage, they should not be used directly in components and UI elements.

The reference token is used as a foundation for other tokens.
The reference token is used as a foundation for other tokens.

Semantic Tokens

Semantic tokens define the specific role by which a referenced token should be used within the UI. This scales the design language throughout a specific theme or context allowing for themeability across the SAP BTP SDK for Android and iOS. Additionally, semantic tokens assign light and dark mode definitions for each semantic definition providing alignment between modes.

The semantic token is used directly within the UI.
The semantic token is used directly within the UI.

Token Naming

This token naming is platform-agnostic and follows a set structure logic that can be used across mobile platforms.

The naming structure of a design token shows the naming logic
The naming structure of a design token shows the naming logic

1. Company Name

Company name indicates which company’s design system the token belongs to. In our instance we use “sap” to indicate SAP design token system.

2. Level

Level indicates which level in the token hierarchy the token belongs to. There are two levels in our token hierarchy, reference tokens and semantic tokens.

3. Category

Category indicates the type of token. There are five categories in our token system such as color, spacing, sizing, corner radius, and typography.

4. Group

Group refers only to color tokens and indicates which grouping the token belongs to. There are five groupings in the color token system such as brand, neutral, status, accents, and header.

5. Usage

Usage refers only to color tokens and indicates where in the UI the token should be used. There are three sub-groupings in the color token system that explicitly inform developers and designers on the tokens usage such as background, foreground, and stroke.

6. Scale

Scale indicates the token’s sequence within a category, group, or subgroup. A scale’s number sequence is dependent on the type of token, token group, or subgroup.

Theme

Theme refers to the Horizon reference color palette however this baseline theme can be swapped out to a company’s own. For example, Horizon is the baseline theme for our SDK which includes reference colors Blue, Grey, Mango, Indigo, etc. Swapping our baseline theme would cascade a company’s brand colors down to every aspect of the UI allowing for theming. Design tokens only facilitate this scalability of our design system. 

Light and Dark Mode

Each semantic color token definition stores values for both Morning Horizon (light mode) and Evening Horizon (dark mode). Since multiple modes are built-into each color token definition, this helps designers and developers apply color tokens to each UI element consistently across modes.

  1. Morning (Light)
  2. Evening (Dark)
The semantic token stores the value for both light and dark mode
The semantic token stores the value for both light and dark mode

Native OS Mapping

Design tokens map to the native OS APIs. This allows us to implement design tokens across both iOS and Android while preserving the native OS components, behaviors, and interactions. Having a unified workflow would improve the management of all visual assets and better alignment between iOS and Android platforms. Stakeholders would also benefit by making it easier to consume the SDK and our UI Kits.

  1. Semantic Token (Horizon)
  2. System Token (Material 3)
  3. Component Token (Material 3)
The semantic token stores the value for both light and dark mode.
The semantic token stores the value for both light and dark mode.

Resources 

SAP Fiori for iOS: Design Tokens

SAP Fiori for Web: Design Tokens 

Material Design: Design Tokens 

Related Components/Patterns: Colors, Theming 

Status Info Label

The status info label component can be used to provide complementary bits of information.

Status info label displayed in a horizontal and stacked layout
Status info label displayed in a horizontal and stacked layout

Usage

The status info label displays complementary information that relates to the object. It is a flexible combination of a text value and an icon. When incorporating a status info label into your app, it is crucial to keep the following aspects in mind:

Do
  • Keep text values concise.
  • Customize icon and label layout based on your needs.
Don't
  • Don’t use complete sentences within a status info label item.
  • Don’t include links. Status info label items are not interactive.
  • Don’t overload the user by including an excessive number of status info label items within a row or a stack.
Positive example for using a status info label row
Positive example for using a status info label row
Negative example of using very long text values and including links
Negative example of using very long text values and including links

Anatomy

A. Icon (Optional)

The icon is a visual illustration that can complement the text value or be used independently. If it is combined with a label, it can be placed as a leading or trailing element.

B. Label (Optional)

The label indicates short information bits such as keywords, categories, or status. The text value can be used independently or combined with an icon.

C. Dot (Optional)

A dot can be used to separate status info label items in a horizontal alignment.

Anatomy of a status info label row
Anatomy of a status info label row

Behavior and Interaction

Status info label items are not interactive. If there is more than one status info label item, they may either line up in a horizontal layout one after the other or be stacked under each other. A stacked column can be either left or right-aligned.

Variations

Components

A. Icon Only

Shows visual information such as an icon, image, logo, or avatar.

B. Label Only

Text value that implies a brief description, for example, it can show the priority or urgency of the object’s status. Maintain wording to a maximum of two words.

C. Leading Icon

A leading icon is placed in front of the label.

D. Trailing Icon

A trailing icon follows the label.

Variations of status info label components
Variations of status info label components

Layout

Horizontal vs. Stacked

Status info label items can be arranged horizontally, optionally dividing them with a dot, and can either be wrapped to the next line or be stacked vertically.

Status info label row (left) and status info label stack (right)
Status info label row (left) and status info label stack (right)

Color

Default vs. Semantic

The default tag color is grey, but status info label items can also be displayed in many different colors of the semantic color palette.

Resources

Development: FioriStatusInfoLabel

Related Components/Patterns: Cards Overview, Object Header, Object Cell

Card Header

The card header is the uppermost part of the card that provides important information about the card and its related content on the detail page. The optional card header allows for a quick overview of key information, such as the title, subtitle, and status of the card.

Card header examples
Card header examples

Usage

When using the card header, only include essential information about the card‘s content. The card system offers various components for this purpose. Consider the following aspects when using the card header: 

Do
  • In the main header, only include a title, subtitle, left accessory, icon button, and/or a counter. 
  • In the extended header, only include status info label, rating controls, tags, text, and/or a KPI. 
  • For the main header, use a maximum of three rows. 
  • For the extended header, use a maximum of three rows. 
  • Use only an icon button within the card header that directly impacts the card, for example, to favorite or bookmark the card). 
  • Make sure that the title on the header image has a good contrast to the image. For example, use a white title on a darker image and a black title on a lighter image. 
  • Maintain consistent positioning of the components in the card header throughout the app. For example, if one card header contains tags in the first line, all the other cards in your app should have them too. 
  • Use the counter only if the card body includes list components such as card cells or data table. 
Don't
  • Don’t overcrowd the card header with too many elements.  
  • Don’t place other components, such as a key value cell or an avatar row component, in the card header. Use the card body instead. 
  • Don’t use the card header to provide more detailed information on the card, use the card body instead.
  • Don’t add more than three rows to the main header. 
  • Don’t add more than three rows to the extended header. 
Cards with good title contrast on image
Cards with good title contrast on image
Cards with bad title contrast on image
Cards with bad title contrast on image
Card with well-balanced content OR: card with recommended number of elements in card header
Card with well-balanced content OR: card with recommended number of elements in card header
Card with too many elements in the card header
Card with too many elements in the card header

Anatomy

A. Header Container

The header container is the element that holds the header image, main header, and extended header of the card. 

B. Header Image (Media)

The header image, also known as “media” in the SDK, is an optional decorative element that allows you to include an image that matches the card context. 

C. Main Header

The main header contains essential information about the card, such as a title, subtitle, left accessory, icon button, and/or a counter. However, these elements, including the main header itself, are optional components. 

D. Extended Header

The extended header contains additional elements that provide more information. These elements can be a status info label, rating controls, tags, text, and/or a numeric value in the form of a KPI. Only one component can be placed in one row. The content of a row is limited to one line by default, but it can be configured to wrap. 

Card header anatomy
Card header anatomy

Variations

Main Header Components

All components in the main header are optional, including the title. If there is already a title in the header image, it is not recommended to duplicate it or use it for other information in the main header. 

A. Title

B. Subtitle

C. Left accessory

D. Icon button

E. Counter

Information
Counter: The counter refers to the displayed list items in a card and the total number of list items in a list report. The SDK should offer a string, but you need to implement the counter’s logic depending on which dataset the counter refers to. 
Main header components
Main header components

Extended Header Components

Every element in the extended header is optional. To maintain consistency, it’s advisable to arrange the components in the same order across different rows. For instance, if your card includes a status in the first row, it’s recommended to place the status in the same position for other cards throughout your app.

A. Status info label

B. Text

C. Rating control

D. Tags

E. KPIs

Extended header components
Extended header components

Behavior and Interaction

Opening a Menu

Users can open a menu with host actions that directly impact the card, such as hiding the card. To close the menu, users can tap anywhere on the card or tap the icon button again. A common example is the overflow button or a filter option for cards.

Overflow menu interaction
Overflow menu interaction

Action Button 

If a card only requires one specific action instead of multiple actions, you can choose to directly place the corresponding icon button on the card. This eliminates the need for the overflow menu. 

Bookmark interaction
Bookmark interaction

Resources

Development: Card System

SAP Fiori for iOS: Card Header 

Related Components/Patterns: Cards Overview, Card Body, Card Footer

Card Footer

The card footer is the bottom part of a card that contains important or routine actions that directly impact the card, such as Approve or Submit. The footer can accommodate a maximum of two action buttons. 

Card with a highlighted card footer
Card with a highlighted card footer

Usage

When using the card footer to integrate important user actions related to the content or functionality of the card, consider the following aspects: 

Do
  • Include only one or two of the most important and routine actions in the card footer. 
  • If two buttons are used, always place the primary action on the right side of the footer. 
  • If two buttons are used, place the less important and secondary action on the left side of the footer. 
  • Ensure that the button’s wording reflects the action that will be performed after tapping on the button. 
  • Use short and concise button labels. 
Don't
  • Don’t include more than two buttons in the card footer.  
  • Don’t place an overflow button in the card footer. Having overflow buttons in both the footer and header might lead to visual ambiguity, as they would look identical. 
  • Don’t use long button labels. If the button label needs to be very long, use icon buttons or only one button. 
Card footer with a maximum of two buttons
Card footer with a maximum of two buttons
Footer with an overflow button
Footer with an overflow button

Anatomy

A. Card Footer Container

The card footer container holds one button that is right-aligned by default or set to full width, or two buttons that are right-aligned within the card footer container.

B. Primary Action Button

The contained action button is used to highlight the most important action. Only use one primary action in a card. We recommend using the contained button style for actions that trigger or complete a task. 

C. Secondary Action Button

The tonal action button is used for actions that are not the primary action. If the card doesn’t have a clear primary action or if the displayed actions are equally relevant, the card footer can include only tonal or text buttons. If the action is destructive, use the tonal negative style to warn users about taking extra precautions before performing an action. 

Card footer anatomy with one contained button (top left), one tonal button full width (top right), one contained and one tonal button (bottom left), and one tonal negative button and one contained button (bottom right)
Card footer anatomy with one contained button (top left), one tonal button full width (top right), one contained and one tonal button (bottom left), and one tonal negative button and one contained button (bottom right)
Information
Filled Buttons: We recommend using filled buttons, such as contained or tonal buttons, for the main actions in a card. Filled buttons have a container with a solid fill. The filled style is visually more prominent than text buttons, which helps users identify the action they want to perform. 

Behavior and Interaction

Tapping on the button in the card footer performs the indicated action. 

User-Triggered Feedback Indicator

A user-triggered feedback indicator (progress indicator) refers to a visual element or cue on the card that provides feedback to the user as they perform the action. This indicator is triggered by the user’s actions and is designed to provide a response or confirmation. The overlay informs the user of the affected area that the content is not actionable during the process. Users can still navigate and take actions on other items that are not affected.

Depending on the use case, consider using a short, clear message (see snackbar) about the processes that have been performed to ensure that the user is informed.

Overlay progress indicator on a card
Overlay progress indicator on a card

Resources

Development: Card System

SAP Fiori for iOS: Card Footer

Related Components/Patterns: Card Overview, Card Header, Card Body, Buttons 

Carousel Layout

A carousel layout is a design pattern that displays multiple cards horizontally, one after the other, with a glimpse of the next card visible on the edge of the screen. This partial visibility encourages users to swipe or scroll left or right to reveal more cards.

Carousel with cards compact window size class (left) and expanded size class (right)
Carousel with cards compact window size class (left) and expanded size class (right)

Usage

Use a carousel to maximize the amount of information displayed and preserve the context without making the user scroll further down the page. The cards in the carousel should be closely related to each other, allowing users to anticipate the kind of content they will discover when interacting with the carousel.

For compact window size classes, we recommend displaying a maximum of five cards, as users are unlikely to engage with more than that. For medium and extended window size classes, more cards can be added, and their width is automatically adjusted. When using a carousel, consider the following aspects:

Do
  • For compact window size classes, we recommend displaying a maximum of five cards.
  • For medium and extended window size classes, you can show up to eight cards.
  • Ensure that the cards have related content.
  • Keep the height of the cards compact to avoid additional vertical scrolling.
  • Make sure the carousel container is fully visible on the screen.
Don't

Don’t use a carousel if there are multiple types of cards. Use a staggered layout instead or add a section header with action to a deeper navigation to show all elements.

Anatomy

A. Container with Cards

The height of the carousel container is determined by the card with the most content that is currently visible to the user. All cards have the same height and cards with less content are stretched to match the height of the tallest card and align with the carousel container. This can lead to white space between the body and the footer, which is why the content of a card should always be compact and concise. The footer of the card is always aligned to the bottom edge. For more information, refer to cards overview.

Carousel with different card content
Carousel with different card content

B. Margin

Margins are the spaces between the content and the left and right edge of a window area. Margin widths are defined using fixed values for each window size class and change at different breakpoints to better fit the screen size. In a carousel, the margins on the left and right are not equal to cut the card at the right side of the screen.

Carousel showing a glimpse of the next card
Carousel showing a glimpse of the next card

Behavior and Interaction

Scroll Snapping

Scroll snapping refers to the effect of cards always snapping into place at specific, predefined positions during scrolling, rather than scrolling freely.

This gives the user a sense of precision and makes scrolling more pleasant.

Horizontal scrolling in a carousel
Horizontal scrolling in a carousel

Navigation

If there are too many cards in a carousel, you can add a header with a “See All” interaction. Tapping on “See All” navigates the user to a page that displays all cards from the carousel group in a list or staggered layout, depending on the window size class.

Empty States

If there is no card, it is important to display an indicator for an empty state in the carousel. This indicator serves as an information message for users to let them know that no information or data is currently available or that some information needs to be created.

Illustrated message to indicate an empty state
Illustrated message to indicate an empty state

Adaptive Design

A carousel shows fewer cards for a compact size class, while a medium and expanded window size class shows more, as there is more space available on the page. The height of a carousel container should be fully visible on the screen, regardless of the screen size.

If there is a navigation rail or navigation drawer, the number of columns is reduced and adapts to the remaining screen width.

Carousel with cards expanded size class with navigation drawer (right)
Carousel with cards expanded size class with navigation drawer (right)

You can also combine layouts. However, if a carousel and a staggered layout are used on the same page, it creates a visual imbalance of the card spacing caused by the outer margins of the different layouts.

Resources

Development: Card System

SAP Fiori for iOS: Carousel Layout

SAP Fiori for Web: Carousel (SAPUI5), Carousel (Web Component)

Related Components/Patterns: Layouts Overview, Staggered Layout, Cards Overview

Illustrated Message

The illustrated message communicates empty, error, and success states through a combination of solution-oriented messages, engaging illustrations, and a conversational tone. The illustrated message turns a situation, even a negative one, into a better experience for your users, while ensuring consistency.

General empty, error and success states example
General empty, error and success states example

Usage

Use the illustrated message when you want to improve the user experience for one or more message states in your application. The illustrated message’s content should be concise but prioritize clear messaging.

Turn a negative event into a positive one

Take time to design and write a solution-oriented message. Be precise in your wording and use appropriate illustrations.

Ideally, a negative event in a software product doesn’t generate negative emotions. A well-designed illustrated message that leaves users feeling understood and valued can result in a neutral or even positive feeling. Remember that users will benefit from thoughtfully crafted illustrated messages every time they encounter them – perhaps even daily.

An illustrated message that has positive messaging and cohesive imagery
An illustrated message that has positive messaging and cohesive imagery
An illustrated message that has a problem-oriented message and displays an icon rather than an illustration
An illustrated message that has a problem-oriented message and displays an icon rather than an illustration

Always write a coherent, solution-oriented message

Make sure that the illustration, message, and call to action work together as one to clarify the situation. Always provide a message. Never use an illustration without a message. A message combined with an illustration is more powerful than a message alone.

An illustrated message that has solution-oriented messaging with a related illustration and call to action
An illustrated message that has solution-oriented messaging with a related illustration and call to action
An illustrated message without the message and an illustration unrelated to the call to action
An illustrated message without the message and an illustration unrelated to the call to action

Tailor your message to your use case

Always ensure that the default text fits in the context. If not, replace it or make it more precise.

Example:
Default text: No results found / Try changing your search criteria.
Adapted text (supplier table used with a filter bar): No suppliers found / Try adjusting your filter settings.

 

We recommend replacing generic terms such as “data” and “object” with your specific business object.

Example:
Default text: There’s no data yet / When there is, you’ll see it here.
Adapted text: There are no orders yet / When there are, you’ll see them here.

An illustrated message that has enhanced the message to utilize use case-specific terms
An illustrated message that has enhanced the message to utilize use case-specific terms
An illustrated message displaying a general message without contextual information
An illustrated message displaying a general message without contextual information

Use the illustrated message to communicate high-priority information

Place the illustrated message in dialogs, cards, and at a page level rather than a snackbar or a banner to indicate high-priority empty, error, and success states.

An illustrated message placed in a full-screen page
An illustrated message placed in a full-screen page
An illustrated message placed in a banner (top) and snackbar (bottom)
An illustrated message placed in a banner (top) and snackbar (bottom)

Prioritize the message over the illustration

When the illustrated message is placed in a container that does not fit all the elements, we recommend removing the illustration so that the user can read the entire message.

An illustrated message that prioritizes the content over the illustration so the most important information can fit in the container
An illustrated message that prioritizes the content over the illustration so the most important information can fit in the container
An illustrated message including all elements that do not fit within the container’s available space
An illustrated message including all elements that do not fit within the container’s available space

Anatomy

A. Illustration (Optional)

Use the illustration to help clarify the situation and add personality. The illustration should be appropriate for the use case and the container being used, such as a dialog or card, and that similar use cases are handled consistently.

This section can display an illustration from an app-specific library, or one provided by the core design team’s illustration library.

B. Title

The title explains the reason for the specific state, preferably in a single line. Use the title to convey the essence of your message in simple language. We recommend writing the title in sentence case.

If you are using one of the standard use cases, you can refine the default text and customize it to the precise use case.

C. Description (Optional)

Use the description to add details and prompt the user what to do next, preferably in two sentences or less. Like the title, the description’s default text can also be customized to fit a specific use case.

D. Call to Action (Optional)

If there are clear next steps for the user to take, there are a maximum of two call to action buttons that can be used.

Illustrated message anatomy
Illustrated message anatomy

Adaptive Design

Illustration Sizes

We recommended using the following fixed mobile illustration sizes for the following containers:

 

A. Size XL (320×240)

Full-screen page, full-screen dialog

B. Size L (160×160)

Page section, larger dialogs, large cards (2×3, 2×2)

C. Size M (92×92)

Page section, smaller dialogs, medium card (2×1)

D. Size S (64×64)

Smaller dialogs, small card (1×1)

E. Size XS (48×48)

Smaller dialogs, small card (1×1)

Illustration set with all five illustration sizes
Illustration set with all five illustration sizes

Message Width Adaptiveness

Depending on the container in which the illustrated message is placed, the message content can stretch to fill the maximum width of the container. Alternatively, the message container can be set to a fixed width to maintain cohesiveness between a set of illustrated messages.

An illustrated message description with a fixed width (left) and a description that stretches to fill the available space (right)
An illustrated message description with a fixed width (left) and a description that stretches to fill the available space (right)

Call-to-Action Adaptiveness

The call-to-action buttons can fill the whole container or can be aligned left, right, center, or fill the available container space. When using two actions in the illustrated message, the buttons can be stacked in a vertical layout or be placed next to each other in a horizontal layout. If the buttons in a horizontal layout exceed the container’s maximum width, the container will responsively take on a vertical layout to provide ample space for the actions.

Illustrated message example that shows buttons in a horizontal call to action layout (left) exceeding the container width and adapting to a vertical call to action layout (right).
Illustrated message example that shows buttons in a horizontal call to action layout (left) exceeding the container width and adapting to a vertical call to action layout (right).

Variations

Empty State

An empty state is a moment in the user experience when there is no content to display. Some common use cases include:

  • Empty list, table, or inbox
  • No notifications or planned activities
  • Before search
“No task” empty state example
“No task” empty state example

Error State

An error state is caused by missing permissions, incorrect configuration, or a system issue. Some common use cases include:

  • Unable to load, upload, or connect
  • No search results found
“Unable to load” error state example
“Unable to load” error state example

Success State

A success state is when an action has been performed without errors or warnings, meaning that the user has achieved a certain task or milestone. Some common use cases include:

  • Reaching a daily goal or target
  • Completing a work task
“Task complete” success state example
“Task complete” success state example

Custom States

The illustrated message component was designed to be flexible enough to handle custom use cases. Along with altering the actual text content (title, description, or call-to-action label), you can also use your own custom illustrations if they conform to the preset dimensions of the different available illustration/image sizes mentioned in the above adaptive design section.

An illustrated message with custom text content and illustration that aligns with the set mobile illustration sizes
An illustrated message with custom text content and illustration that aligns with the set mobile illustration sizes

Message Text Variations

The illustrated message title has a default font size of (Subtitle 2) and a larger title variation of 20pt font size (Header 6) to emphasize the state’s main headline. While choosing the large title variation is optional, we recommend using it in scenarios where the illustrated message is placed in a larger container with ample space. When the illustrated message is placed in a full-page section, large dialog, or large card, it could be beneficial to use the large title variation to make the headline more noticeable to the user. The illustrated message title and description text can align left, center, or right, depending on the use case.

Example of illustrated messages with the large title variation
Example of illustrated messages with the large title variation

Call-to-Action Variations

The call-to-action buttons can take on a variety of styles depending on the use case. While the button style is flexible, we recommend maintaining consistent button styling across the application.

Example of illustrated messages with mixed button styling and call to action layout
Example of illustrated messages with mixed button styling and call to action layout

Resources

Development: Illustrated Message

SAP Fiori for iOS: Empty State View

SAP Fiori for Web: Illustrated Message

Calendar

The calendar view provides a visual overview of a week, a month, or multiple months. It can filter and display different types of content, such as events, agendas, or schedules, based on the time dimension.

Example of calendar view on compact (left) and expanded screen (right)
Example of calendar view on compact (left) and expanded screen (right)

Usage

Do
  • Use calendar view to display a visual overview of a week or a month.
  • Use calendar view to filter the information based on days. For example, events, tasks, and deadlines.
Don't
  • Don’t use calendar view for date selection or multiple date selection in forms. Use pickers instead.
  • Don’t use calendar view when the available screen space is limited and displaying the calendar permanently would take up too much space.

Anatomy

The structure is composed of four parts: calendar header (optional), week label container, date label container, and dragging handle (optional).

The space below the calendar view container is available for different configurations. for instance, using object cells as an agenda or timeline as a timesheet.

A. Calendar Header

The calendar header includes the title, subtitle (optional), and buttons.

B. Week Label Container

The week label container displays the seven days of a week. You can customize the format to match your local preference.

C. Date Label Container

The date label container shows all the days of the month/week in a grid view.

D. Dragging Handle (Optional)

The dragging handle provides a visual cue on the dragging behavior to expand the week view and collapse the month view.

Anatomy of a calendar
Anatomy of a calendar

Behavior and Interaction

Navigate

To navigate between months/weeks, users can use swiping gestures or tap on buttons. To ensure accessibility, it is important to provide visible navigation buttons that support all input channels such as touch screen, keyboard, and mouse. The buttons can be customized to your preference, for example, icon buttons or text buttons.

User interaction of navigating via swiping and tapping buttons
User interaction of navigating via swiping and tapping buttons

Expand and Collapse

If the calendar has a dragging handle (optional), users can expand it from week view to month view by swiping down. Similarly, they can collapse it from month view to week view by swiping up.

User interaction of dragging to expand and collapse
User interaction of dragging to expand and collapse

Back to Today

If the calendar includes a “back to today” button, the user can return to the current month/week by tapping on the button.

User interaction of returning to today
User interaction of returning to today

Variations

Calendar Views

There are different types of calendar views. Select the one that best suits the purpose of your app and start designing from there.

  1. Month View (Default)
  2. Week View
  3. Expandable View – Users can switch from the default week view to month view by swiping up on the dragging handle.
Types of calendar view containers (from top to bottom): week view, month view, and expandable view
Types of calendar view containers (from top to bottom): week view, month view, and expandable view

Calendar Header

The calendar header provides the following layouts:

  1. Left-Aligned

The title is left-aligned. A leading button or icon and a maximum of three trailing buttons are supported.

  1. Center-Aligned

The title is center-aligned. A leading button or icon and a maximum of two trailing buttons are recommended.

 

The header also supports the following types of titles:

  1. Single-Line Title

It can be used to show the displayed month and year, or the topic of the calendar.

  1. Double-Line Title

It can be used to show the main title together with a subtitle for additional information.

  1. Large Title

The title is emphasized by using a larger font size and white space. This design can be applied when showing a calendar on the home screen or at the top of the page.

The text contents can be customized to reflect the month/week on display.

From left to right: left-aligned title, center-aligned title; from top to bottom: single-line title, double-line title, large title
From left to right: left-aligned title, center-aligned title; from top to bottom: single-line title, double-line title, large title

Calendar Week Labels

The format of the calendar week labels can be customized to match your local preference. Besides, the calendar provides the following types of start day of the week:

  1. Sunday (Default) – US Standard
  2. Monday – Europe, Asia, Oceania Standard
  3. Saturday – Middle East Standard
Week label starting from Sunday (top), Monday (middle), and Saturday (bottom)
Week label starting from Sunday (top), Monday (middle), and Saturday (bottom)

Calendar Day Labels

The calendar supports the following states:

  1. Default – days of the month/week being displayed
  2. Today – the current system date
  3. Selected – the selected date
  4. Today + Selected – only appears when the selected date is today
  5. Out of Month – days in the previous or next month/week
Date label states from left to right: default, today, selected, today and selected, out of month
Date label states from left to right: default, today, selected, today and selected, out of month

Status Indicators

The calendar can display status information via status indicators, which should be a set of simple icons that are easy to recognize. A legend row is required to ensure that the status meanings are accessible.

Calendars with status indicators: month view (top), week view (bottom)
Calendars with status indicators: month view (top), week view (bottom)

Alternate Calendar

The calendar can show two calendar types on the same frame. The alternate calendar date label is displayed below the primary calendar date label, and the year and month are shown on the subtitle as a default. Below are the available calendar types for both the primary and the secondary calendar:  

  1. Gregorian (default primary calendar)
  2. Chinese
  3. Hebrew
  4. Islamic
  5. Japanese
Calendar with alternate calendar labels
Calendar with alternate calendar labels

Adaptive Design

The calendar view adapts to different window sizes.

In compact windows, the width of the week labels and date labels expand to full width.

In medium windows, the week labels and date labels are fixed to 72dp.

In expanded windows, the week labels and date labels are fixed to 100dp.

Calendar view adapting to compact (left), medium (middle), and expanded windows (right)
Calendar view adapting to compact (left), medium (middle), and expanded windows (right)

Resources

Development: FioriCalendar

SAP Fiori for iOS: Calendar

Related Components/Patterns: Pickers, Object Cell, Timeline View

Layouts Overview

Card layouts are structured containers that determine how cards are arranged and displayed in a user interface. These layouts control the placement, order, and visual presentation of cards, ensuring an aesthetically pleasing design. The layouts adjust to multiple devices, window size classes, and orientations, ensuring consistency across layouts.

Cards in a carousel (left) and staggered layout (right)
Cards in a carousel (left) and staggered layout (right)

Usage

A layout is used to group cards with similar content, ensuring a visually structured arrangement. The proper usage of a grid layout draws the user’s attention to the most important cards on a page, resulting in improved efficiency and higher quality.

Make sure that the layout is optimized for different window size classes to display the cards in the best way possible. Find more information in the staggered layout and carousel layout articles.

Anatomy

When designing card layouts for native apps, consider the following key factors that determine the horizontal width of the screen.

A. Columns

Content is organized into columns on the screen. This is where the cards are placed.
In responsive layouts, the column width is not defined by fixed values. This allows the content to adjust to any screen size. The number of columns displayed in the grid is determined by the breakpoints of window size classes, ranging from 4, 8, or 12 columns.

B. Gutters

A gutter is the space between columns that helps to visually separate content.
Gutter widths have predefined values at each breakpoint range. To enhance the content’s adaptability to a given screen size, gutter widths can change at different breakpoints.

C. Margins

Margins are the spaces between the content and the left and right edge of a window area. Margin widths are defined by specific values for each window size class and change at different breakpoints to better fit the screen size.

Schematic grid layout anatomy
Schematic grid layout anatomy

Behavior and Interaction

Scrolling

Cards can be scrolled vertically or horizontally, depending on the layout. You can also combine different layouts, for example, a carousel with cards and a list with cards below it.

Animation: Horizontal scrolling in carousel combined with a vertical scrolling list
Animation: Horizontal scrolling in carousel combined with a vertical scrolling list

Adaptive Design

The layouts are designed to be compatible with multiple devices. They change according to the window size class and automatically adjust the number of columns to ensure a visually appealing and user-friendly layout. Depending on the window size class, the card width and height adjust automatically, ensuring that the content remains fully visible.

If there is a navigation rail or navigation drawer, the number of columns decreases and adjusts to the remaining screen width.

Schematic compact grid layout with 4 columns (left) and expanded with 12 columns (right)
Schematic compact grid layout with 4 columns (left) and expanded with 12 columns (right)

Resources

SAP Fiori for Web: Cards (SAPUI5), Cards (Web Component)

Related Components/Patterns: Carousel Layout, Staggered Layout, Cards Overview

Rating Control

The rating control can be used in various contexts to provide insight regarding the opinions and preferences of an object.

Rating control on mobile (left) and tablet (right)
Rating control on mobile (left) and tablet (right)

Anatomy

A. Icon

The icons represent the average object rating value through several states: on, off, and half. The states of these icons depict a rating from a scale of one to five.

B. Counter/Label

The counter or label supplements the rating. It can be used to display the number of ratings, the exact rating value, and more.

Anatomy of rating control and icon states
Anatomy of rating control and icon states

Behavior and Interaction

The rating control is currently display-only.

Variations

Size

Small vs. Large

The rating control can be displayed in a small or large format depending on the fit to context.

Counter/Label

Without vs. With

The counter or label for the rating can be hidden as needed.

Color

Default vs. Accent

The accent color for the icons can provide a unique variation when needed.

Rating control size (top), counter/label (middle), and color (bottom)
Rating control size (top), counter/label (middle), and color (bottom)

Resources

Development: Rating Control, FioriRating

SAP Fiori for iOS: Rating Control

SAP Fiori for Web: Rating Indicator

Card Body

The card body is the central part of the card that is used to display additional information alongside the content shown in the card header. By using the card body, several components from the SAP BTP SDK for Android can be integrated into a card, enabling the recreation of card types such as object cards, list cards, and many more.

Card body examples
Card body examples

Usage

While the card body is optional, it can be used for different use cases. To improve user comprehension, we recommend including additional details. Avoid using the card body for complex tasks; instead, provide additional functionality and detailed information on a subsequent details page that users can access by pressing the card.

To maintain compact card sizes, be mindful of not overcrowding the card body with too many components. Additionally, consider the following aspects when adding components to the body:

Do
  • Limit the number of components in the card body.
  • Use components that are relevant to the context of the card.
  • Only use components that are listed below in the Variations section or variants of components that have been adapted for cards.
  • Make sure that the placement of the components within the card body is consistent throughout your app. For example, a KPI is placed in the body and centered aligned, other cards in your app should follow the same pattern.
Don't
  • Don’t include any components in the card body that are not listed below.
  • Don’t overcrowd the card body with too many elements.
  • Don’t add additional components such as a status or tags to the card body. Use the card header for that.
Cards with different components
Cards with different components
Don’t put too many components into the card body
Don’t put too many components into the card body

Anatomy

The card body is a single container that can hold various components. The container is flexible in height to accommodate a reasonable number of UI components until the maximum height of the entire card is reached.

Variations

In addition to the SAP Fiori for Android components that can be added to the card body, the card system also offers variants. These variants are specifically tailored to seamlessly fit within a card. The reduced horizontal and vertical spacing of the variants compared to the default components, ensuring a concise card design.

You can include the following components in the card body: 

Existing Components

Selection of existing card body components
Selection of existing card body components

Variants for Cards

Selection of card body components
Selection of card body components

A. Card Cell

The card cell component is a simplified version of the object cell, featuring a thumbnail, title, subtitle, footnote, and right accessories. There are a few variations for the right accessories such as a small KPI, status info label, two icon buttons, or a single button.

Card cell component
Card cell component

B. Divider/Spacing 

The divider can be placed between elements to better separate them visually or by hiding the divider a white space can be applied. 

Divider and white space component
Divider and white space component

C. Text

The text component can be used to add a short description on the card. The description should provide additional information related to the content. Keep the description short and precise to prevent it from wrapping into multiple lines.

D. Custom Composable

The custom composable allows custom components to be integrated into the body container. It provides flexibility in cases where the existing components included in the body do not support the use case. For example, a diagram or “live” map can be integrated.

E. Image

You can use an image in the card body to highlight information, such as an address of a hotel.

F. Data Table

The data table provides a title for each of the two available columns. You can have up to three entries. To accommodate various use cases, you can configure entries to adjust the text color, icon, and placement of an icon. You can choose to display a divider below the table, along with a text indicating that there are more items in the data set.

Data table component
Data table component

Behavior and Interaction

The default component used in the card determines the general interaction and navigation behavior. For example, if a key value cell is placed in the body, it inherits the interaction behavior and can either be displayed only or made clickable to trigger a call or other actions.

Card cell with icon buttons
Card cell with icon buttons

States

Use a suitable illustrated message to communicate different states.

For example, when there is no relevant content or data to be displayed in the body, include an empty state indicator. This indicator serves as an informational message for users, notifying them that there is currently no information or data available, or that new data or information needs to be generated.

Card body with an empty list
Card body with an empty list

Resources

Development: Card System, Card Cell

SAP Fiori for iOS: Card Body

SAP Fiori for Web: Card Content

Related Components/Patterns: Cards Overview, Card Header, Card Footer

Step Progress Indicator

The step progress indicator is a progress indicator for tracking and displaying a user’s state in a user flow. It allows the user to navigate to another step in both the horizontal view and the vertical “All Steps” view.

A step can be displayed as either a regular step or a dynamic step.  

Step progress indicator in horizontal view (left), vertical “All Steps” view (middle), and different states (right)
Step progress indicator in horizontal view (left), vertical “All Steps” view (middle), and different states (right)

Usage

Do
  • A step progress indicator should at least show two steps. 
  • Use dynamic steps for sub-steps and steps which are dependent on default steps. 
  • Displaying a partial view of the last step on the screen for a scrollable step progress indicator is highly recommended. 
  • Keep step names short – we recommend no more than two lines of text. 
Don't
  • Try to avoid showing both header and step names under step nodes. If the flow is short, try not to use the “All Step” button. Display the full step names in the horizontal view. 
  • Don’t count dynamic steps in the total number of steps.  
  • Don’t show a partial view of a step on the screen if the step progress indicator is not scrollable. 
Display a partial view of the last step on the screen to indicator more steps
Display a partial view of the last step on the screen to indicator more steps
Try not to cut off the edge of the last step on the screen
Try not to cut off the edge of the last step on the screen
If the flow is short, hide the header and the “All Steps” button. Display the full step names in the horizontal view
If the flow is short, hide the header and the “All Steps” button. Display the full step names in the horizontal view
Try to avoid showing both header and step names under step nodes. If the flow is short, try not to use the “All Steps” button.
Try to avoid showing both header and step names under step nodes. If the flow is short, try not to use the “All Steps” button.

Anatomy

Horizontal View

A. Current Step Name (Optional) 

Name of the selected step. Show the current step name in the header if no step names are displayed under the step nodes. 

B. “All Steps” Button (Optional)

The “All Steps” button shows the total number of steps and directs users to an overview page of the steps. Show the “All Steps” button when the flow is long.

C. Step Node

The step node is a numeric circle that indicates the sequence of the flow. It also indicates the state of the step. You can also use letters or other simples to replace the number.

D. Line

A line is used to connect the nodes. Don’t use a line after the last node.

E. Step Name (Optional)

The step name of each step is shown below the step node. Only show step names when the header of the current step name is disabled.

Step progress indicator with a header (top) and without a header (bottom)
Step progress indicator with a header (top) and without a header (bottom)

Vertical View

A. Step Node

The step node is a numeric circle that indicates the sequence of the flow. It also indicates the state of the step. You can also use letters or other simples to replace the number.

B. Line

A line is used to connect the nodes. Don’t use a line after the last node. In the vertical view, the length of the line is dependent on the step name text.

C. Step Name

The step name of each step is shown next to the step node. In the vertical view, show the full text of the step name.

Step progress indicators in a vertical view
Step progress indicators in a vertical view

Behavior and Interaction

Text Wrapping

In the horizontal view, a step name allows truncation. In a vertical view, a step name allows text wrapping to show the full text. Always try to be concise for the names. Otherwise, it may distract users when they are focusing on the task on the screen.

The current step name truncates after one line. Full text is available in “All Steps” view.

A step name can wrap up to two lines. Adjust the width of the line to allow more space for the text. If any step name is longer than two lines, use the “All Steps” button to allow users to view the full text

The current step name truncates if it’s two long (top) and the step name under the step node truncates after two lines (bottom).
The current step name truncates if it’s two long (top) and the step name under the step node truncates after two lines (bottom).
Show full text of the step name in the vertical view
Show full text of the step name in the vertical view

Value States

Default

Idle state of an enabled step.

Default state of a horizontal step (left) and a vertical step (right)
Default state of a horizontal step (left) and a vertical step (right)

Active

Selected state of a step.

Active state of a horizontal step (left) and a vertical step (right)
Active state of a horizontal step (left) and a vertical step (right)

Complete

Triggered when required actions are complete and users have navigated to another step.

Complete state of a horizontal step (left) and a vertical step (right)
Complete state of a horizontal step (left) and a vertical step (right)

Error

Triggered when users already navigated to another step but required actions of this step are incomplete.

Error state of a horizontal step (left) and a vertical step (right)
Error state of a horizontal step (left) and a vertical step (right)

Error Active

Triggered when users tap on a step that has incomplete required actions.

Error active state of a horizontal step (left) and a vertical step (right)
Error active state of a horizontal step (left) and a vertical step (right)

Read-Only

A read-only step is a step that is not tappable.

Read-only state of a horizontal step (left) and a vertical step (right)
Read-only state of a horizontal step (left) and a vertical step (right)

Navigation and Interaction

Tap on the Node

When users tap on a step indicator node, they are navigated to this specific step.

If the step is already on the screen, the step node stays without moving.

If the user scrolls to tap a step beyond what was on the screen, the selected step is displayed as the first step in the indicator.

When users tap on a step indicator node, they are navigated to this specific step
When users tap on a step indicator node, they are navigated to this specific step

View All Steps

Users can tap on the “All Steps” button to view all steps vertically on a new screen.

If the user taps on a step from the “All Steps” list, they are navigated to the selected step. The selected step is displayed as the first step in the indicator.

Users can tap on the “All Steps” button to view all steps vertically on a new screen
Users can tap on the “All Steps” button to view all steps vertically on a new screen

Scrolling

Users can press and scroll left or right on the step progress indicator to view steps that are outside the screen. The indicator automatically comes back to the active step when users tap anywhere on the screen.

Users can scroll left or right on the step progress indicator to navigate to another step
Users can scroll left or right on the step progress indicator to navigate to another step

Variations

Dynamic Steps

Dynamic steps are used to indicate a sub-step or an indeterminate step. Same as regular steps, dynamic steps also have different value states: default, active, error, error active, and read-only.

From left to right: dynamic steps in horizontal view, dynamic steps in vertical view, and dynamic steps in different states
From left to right: dynamic steps in horizontal view, dynamic steps in vertical view, and dynamic steps in different states

Adaptive Design

A step progress indicator can adapt to both mobile and tablet sizes. For the tablet version, the horizontal step progress bar can have broader width for each step than the mobile version, and the “All Steps” view is displayed in a dialog window.

Horizontal view on mobile (left) and tablet (right)
Horizontal view on mobile (left) and tablet (right)
"All Steps” view on mobile (left) and tablet (right)

Resources

Development: StepperProgress

SAP Fiori for iOS: Step Progress Indicator

SAP Fiori for Web: Wizard Floorplan

Related Components/Patterns: Header, Persistent Footer, Dialog

Circular Progress Indicator

A circular progress indicator is a visual element that displays the status of ongoing processes, such as logging in, uploading files, or refreshing content in a circular shape. It typically consists of a circular track and a moving indicator that fills up the track as the progress increases.

Content refresh with circular progress indicator (left) and partial loading with circular progress indicator (right)
Content refresh with circular progress indicator (left) and partial loading with circular progress indicator (right)

Usage

Do
  • Use a circular progress indicator if the wait time exceeds one second. 
  • Use a circular progress indicator for the following scenarios: 
    • User-triggered content refresh by pulling down or up. 
    • Partial screen loading that requires blocking user interactions. 
    • Full-screen processing, such as during payment checkout. 
  • Use only one indicator type for each activity in an app, for example, if a circular indicator represents a refresh action on a screen, a linear indicator should not be used for the same action elsewhere in the app. 
  • Keep labels short – we recommend one line of text. 
  • For determinate indicators, include a progress value at the end of the label, for example, 60%, 30/100 etc.
  • Labels are mandatory for error and success states.
Don't
  • Don’t transition from a circular to a linear progress indicator or vice versa. 
  • Don’t use labels when a loading process takes less than 10 seconds, or when the height or the width is too constrained.  
  • Try to avoid using progress indicators with two lines of text. Wrapping is not recommended and is only available for compact window sizes. 
  • Don’t display a progress value for error/fail and success states. 

Anatomy 

Active State

A. Indicator

B. Track

C. Label (Optional)

Anatomy of determinate and indeterminate circular progress indicators in active state
Anatomy of determinate and indeterminate circular progress indicators in active state

Value State

A. Indicator (Hidden by Track)

B. Track

C. Validation Message

Anatomy of circular progress indicators in error/fail (left) and success state (right)
Anatomy of circular progress indicators in error/fail (left) and success state (right)

Behavior and Interaction 

Text Wrapping (Only for Mobile)  

Labels are optional and should only be used when the process takes 10 seconds or more. They should be concise and, ideally, not exceed one line of text.  

If the length of the text exceeds the available space, the text wraps into the next line and the progress indicator will keep its position on the top. Wrapping is not recommended and is only available for mobile window sizes ranging from 0-599 dp. Labels can’t exceed two lines of text. 

Text wrapping example of a circular progress indicator
Text wrapping example of a circular progress indicator

Value States

Error/Fail State 

If an error occurs or a process fails, the loading animation stops. The indicator turns red and the entire track fills with the error color. 

Labels are mandatory and should always inform the user what kind of error/fail happened and how this issue can be resolved. The message should be as concise as possible. Follow the guideline for indicators with a label.

Error/fail state behavior of a circular progress indicator
Error/fail state behavior of a circular progress indicator

Success State

The success state appears after the successful completion of a process or request. The indicator turns red and the entire track fills with the success color.

Depending on the use case, you can choose one of the following options for the success indicator 

  • Persisting until the user triggers another action, such as closing or changing screens 
  • Disappearing after 3 seconds 

Labels are mandatory for the success message and should be concise. A short information about the completed process or the executed action is sufficient, for example, “Download completed”. One line of text is recommended. 

 

Success state behavior of a circular progress indicator
Success state behavior of a circular progress indicator

Swipe-to-Refresh

The circular loading indicator appears at the top of the existing content when the user triggers the content refresh by swiping down the page. This action loads new data from the server and displays it in the interface. The indicator disappears once the loading process is complete, or when the user navigates away from the content that is being refreshed.

The swipe-to-refresh behavior should be used with dynamic content sorted in descending order. In these cases, the most recent content always appears on top. Common examples are inboxes sorted by descending date, or other types of lists and card collections.

Swipe-down behavior of the circular progress indicator
Swipe-down behavior of the circular progress indicator

Scroll Up to Load

The circular loading indicator appears at the bottom of the existing content when a user scrolls beyond the end of the data that the application has loaded in memory. The indicator disappears when the loading process is complete, or when the user navigates away from the content that is being refreshed.

 Scroll-up behavior of the circular progress indicator
Scroll-up behavior of the circular progress indicator

Variations 

Circular progress indicators display progress by animating an indicator along an invisible circular track in a clockwise direction. They can be applied directly to a surface or a card. 

Regular Use Cases

A. Determinate

The determinate circular indicator moves from 0 to 360 degrees along an invisible circular track and fills it with color. Use this variation when the process completion can be determined.

Determinate circular progress indicator
Determinate circular progress indicator

B. Indeterminate

Indeterminate circular progress indicators grow and shrink in size as they move along an invisible track. They should be used when the process completion can’t be determined, or when it is not necessary to indicate how long an activity will take.  

Indeterminate circular progress indicator
Indeterminate circular progress indicator

C. Indeterminate to Determinate

The indicator can switch from an indeterminate state to a determinate state. It should be used when an indeterminate process reaches a point where its duration can be determined and the loading animation can be stopped.

Circular progress indicator (indeterminate to determinate)
Circular progress indicator (indeterminate to determinate)

C. With Label

  • Labels are optional to communicate the status and progress. If there is nothing to communicate, then having no label is valid.
  • Only include labels to give extra context or to provide useful information. For example, what information the progress bar is processing. Avoid using terms such as “loading” that don’t add any value.
  • Use sentence style capitalization.
  • We recommend including a progress value, for example, 60%, 30/100, etc., at the end of the label for determinate indicators to show how much of the process is already completed, the current progress, and how much is remaining.
  • The display of the progress value is under application control. The application should be able to turn the progress value off.
  • Keep labels short – we recommend one line of text.
Circular progress indicator with label
Circular progress indicator with label

Checkout Use Cases

Checkout use cases are processing states triggered by user actions. During a checkout process, any user action on the affected content is not encouraged; it may interrupt the process. Use only the indeterminate variant in these cases. A checkout use case can be one of the following types:

A. Same-Screen Loading

A circular progress indicator can be used when a screen is in progress to transition to a new screen, triggered by a user action. The circular progress indicator is placed in a message box on top of a dialog overlay. Use the message to briefly inform users about the progress. The dialog overlay and the message disappear once the loading is complete.

If needed, use a banner or a snackbar to inform users about an error state.

Same-screen loading example with a circular progress indicator in a message box
Same-screen loading example with a circular progress indicator in a message box

B. Partial Loading

A circular progress indicator can be used when a part of the screen content needs to be loaded or refreshed. The circular progress indicator is placed on the top of an overlay that covers the content. The progress indicator and the overlay disappear once the loading is complete. No message is needed for a partial loading use case.

If needed, use a banner or a snackbar to inform users about an error state.

Partial loading example with a circular progress indicator on top of a card
Partial loading example with a circular progress indicator on top of a card

Resources

Development: FioriCircularProgressIndicator

SAP Fiori for iOS: Feedback Indicators

Material Design: Progress Indicator

Linear Progress Indicator

A linear progress indicator visually represents the status of ongoing processes, such as logging in, uploading files, or refreshing content by animating an indicator along a fixed track. It communicates the state of an app and indicates available actions, such as whether users can navigate away from the current screen.  

Login screen with linear progress indicator (left) and uploading files (right)
Login screen with linear progress indicator (left) and uploading files (right)

Usage

Do
  • Use a linear progress indicator if the wait time exceeds one second.
  • Use a linear progress indicator for the following scenarios: 
    • Inside a container, where no user interaction is blocked.
    • When a more precise progress update is required. 
    • When there is limited space and a complex message needs to be conveyed.   
  • Use only one indicator type for each activity in an app, for example, if a circular indicator represents a refresh action on a screen, a linear indicator should not be used for the same action elsewhere in the app. 
  • Keep labels short – we recommend one line of text. 
  • For determinate indicators, include a progress value at the end of the label, for example, 60%, 30/100 etc. 
  • Labels are mandatory for error and success states.
Don't
  • Don’t transition from a linear to a circular progress indicator or vice versa. 
  • Don’t use labels when a loading process takes less than 10 seconds, or when the height or the width is too constrained.  
  • Try to avoid using progress indicators with two lines of text. Wrapping is not recommended and is only available for compact window sizes. 
  • Don’t display a progress value for error/fail and success states. 

Anatomy 

Active State

A. Indicator

B. Track

C. Label (Optional)

Anatomy of determinate and indeterminate linear progress indicators in active state
Anatomy of determinate and indeterminate linear progress indicators in active state

Value State

A. Indicator (Hidden by Track)

B. Track

C. Validation Message

Anatomy of linear progress indicators in error/fail (left) and success state (right)
Anatomy of linear progress indicators in error/fail (left) and success state (right)

Behavior and Interaction 

Text Wrapping (Only for Mobile)  

Labels are optional and should only be used when the process takes 10 seconds or more. They should be concise and, ideally, not exceed one line of text.  

If the length of the text exceeds the available space, the text wraps into the next line and the progress indicator will keep its position on the top. Wrapping is not recommended and is only available for mobile window sizes ranging from 0-599 dp. Labels can’t exceed two lines of text. 

Text wrapping example of a linear progress indicator
Text wrapping example of a linear progress indicator

Value States

Error/Fail State 

If an error occurs or a process fails, the loading animation stops. The indicator turns red and the entire track fills with the error color. 

Labels are mandatory and should always inform the user what kind of error/fail happened and how this issue can be resolved. The message should be as concise as possible. Follow the guideline for indicators with a label. 

Error/fail state behavior of a linear progress indicator
Error/fail state behavior of a linear progress indicator

Success State

The success state appears after the successful completion of a process or request. The indicator turns green and the entire track fills with the success color.

Depending on the use case, you can choose one of the following options for the success indicator 

  • Persisting until the user triggers another action, such as closing or changing screens 
  • Disappearing after 3 seconds 

Labels are mandatory for the success message and should be concise. A short information about the completed process or the executed action is sufficient, for example, “Download completed”. One line of text is recommended. 

 

Success state behavior of a linear progress indicator
Success state behavior of a linear progress indicator

Variations 

Linear progress indicators display progress by animating an indicator along the length of a fixed, visible track. The behavior of the indicator is dependent on whether the progress of a process is known. 

A. Determinate 

Determinate linear progress indicators display how long a process will take. They should be used when the process can be completed within a specified amount of time. They fill from 0% to 100% and never decrease in value. For example, downloading/uploading a file of known size. 

Determinate linear progress indicator
Determinate linear progress indicator

B. Indeterminate 

Indeterminate linear progress indicators express an indefinite waiting time. They should be used when the process completion can’t be determined, or when it is not necessary to indicate how long an activity will take. It conveys that a user’s action, request, or data is being processed. 

Indeterminate linear progress indicator
Indeterminate linear progress indicator

C. Indeterminate to Determinate 

The indicator can switch from an indeterminate state to a determinate state. It should be used when an indeterminate process reaches a point where its duration can be determined, and the loading animation can be stopped. 

Linear progress indicator (indeterminate to determinate)
Linear progress indicator (indeterminate to determinate)

D. With Label 

  • Labels are optional to communicate the status and progress. If there is nothing to communicate, having no label is valid. 
  • Only include labels to give extra context or to provide useful information, for example, what information the progress bar is processing. Avoid using terms such as “loading” that don’t add any value.  
  • If the label is comprised of one or more sentences, use sentence-style capitalization.
  • We recommend including a progress value, for example, 60%, 30/100, at the end of the label for determinate indicators to show how much of the process is already completed, the current progress, and how much is remaining. 
  • The display of the progress value is under application control. The application should be able to turn the progress value off. 
  • Keep labels short – we recommend one line of text. 
Linear progress indicator with label
Linear progress indicator with label

Resources