Description

A workspace is a typical work area based on a role a user might have or may want to focus on. This is an organization pattern that allows the main workflow of an app to be divided into multiple portions with their own dedicated space. Each workspace may contain its own floorplans, page tabs, split screens, views, and other space-defining components, such as menu bars, toolbars, contextual side panels, and dialogs.

All workspaces inside a module app contribute to the same object file. They come short of being their own module app because they don't make sense as stand-alone applications and don’t produce their own object files.

Usage

Use workspaces for support content and sub-workflows when the main content area has grown in complexity and acting in-line and in-place is no longer feasible. Or, when smaller support layout options have been exhausted or outgrown.

Anatomy

1. Header / Toolbar

Workspace headers can take different forms to support its content and workflow. Object file creation pages generally use a menu bar, non-creation pages use a title toolbar, and object pages use a header toolbar. Do not combine two different styles of headers, or create a hybrid using elements from different types. Workspace headers should be consistently used and applied, and their structure should be recognizable to users.

2. Workspace Switchers

Workspace switchers can take one of two forms, depending on the number of spaces available in an app. When two workspaces are available, use a segmented button. When three or more spaces are available, use a select dropdown component.

Switchers are placed on the left-most side of the global menu bar under a ‘Workspaces’ section, and their toolbar placement should be the same across all workspaces. Users should be able to recognize a space by its name and anticipate what they’ll find in it before clicking on it.

switcher 1.png

Segmented Button

Switcher for two workspaces.

switcher 2.png

Select (Dropdown)

Switcher for three or more workspaces.

3. Container Pages

The container page of a workspace occupies the full content area of a screen. This allows them to have their own floorplans, page tabs, split screens, views, and other space-defining components, such as menu bars, toolbars, contextual side panels, and dialogs. However, container pages, and workspaces by extension, do not occupy or make up another level in the module app’s breadcrumb.

Only one workspace may be open and visible in the screen at a time, and creating situations where they can be compared or consumed next to each other should be completely avoided.

2
do
false
Design workspaces with their individual global menu bars, floorplans, toolbars, contextual side panels, dialogs, etc.
dont
false
Don't have more than one workspace opened at a time, in the same screen, for whatever reason.

Different colors for the background can be achieved using the sap.m.PageBackgroundDesign enumeration, or by hard coding their values if not using UI5. The default background for a workspace is , resulting in a light grey background; or resulting in a white background. Follow the link to see API references or see Specifications for exact color values.

The underlying grid of becomes its main structural system. As with all other Fiori-based UI design, workspaces employ a 1rem (16px) grid system. This base unit allows consistent and predictable content layouts, sizing, and zooming. The grid system may be exposed or hidden from users.

Best Practices

Dividing a modular app into multiple workspaces has many benefits but may also lead to a range of usability problems that confuse and disorient the user. Consider the following best practices when introducing workspaces to a module app.

Define and Optimize Workspaces

Define workspaces around common tools, goals, themes, or functions expected by the users who will use that module app. A workspace can appeal to one or more user roles/groups.

Decide which space makes the most sense to act as the main content's space:

Optimize the experience by leveraging the module app's empty state/introductory screen. This screen provides alternative ways to begin the workflow that may begin from a different workspace as the starting point (that is, start a story by connecting to data first, instead of story building. Or, start by creating dimensions instead of the model). However, in all those scenarios, the main workspace still retains the priority.

Adopt a Flexible Workflow

Module apps with workspaces follow a matrix organization, as opposed to a sequential or hierarchical one. As such, the notion of a strictly linear workflow for those kinds of apps are naturally challenged and should be avoided.

Workspaces afford the user a large degree of autonomy and flexibility to decide which part of the workflow to address first and how to proceed from that moment onward. This principle is similar to the third heuristic of UI design, which grants the to explore without being hindered or limited.

Choose Simple Navigation Patterns

Workspace switchers, as described above, provide a simple mechanism for navigating between workspaces. When mapping out user journeys and flows, consider making workspaces as self-contained and self-reliant as possible to reduce the interaction costs of having to go back-and-forth between spaces to complete a single task.

2
do
false
Design workspaces that are contained and self-reliant
dont
false
Don't create scenarios that require switching back-and-forth between several workspaces in order to complete a single task.

Occasionally, and only when appropriate, consider contextual transition points to different workspaces. Transition points are buttons or actions that automatically navigate the user to another space; or, any messaging component or help text that prompts the user into making that switch themselves.

information
Tip: When considering the placement of transition points, be mindful of the implication it will have on the overall object file, and the disruption it will cause to the user’s workflow.
2
do
false
Provide contextual transition points into other workspaces sparingly.
dont
false
Don't navigate users to another workspace unless it was a conscious and deliberate choice.

Use the Same Saving Pattern for all Spaces

A module app should use the same saving pattern between all its workspaces. Because all workspaces remain in a perpetual ‘open’ state, avoid creating scenarios where some require a finalizing action, while others do not.

Likewise, avoid scenarios where a workspace cannot be accessed again after a task has been completed in it. Ideally, clicking on ‘Save’ in one space should also save the current state of all other spaces.

2
do
false
Use a single, global saving pattern for all workspaces inside the same module app
dont
false
Don't force the user to save before switching to another workspace.

Avoid Workspace Comparison

Workspaces are not conducive to comparing items between spaces, as the back-and-forth places undue burden on short-term memory, increasing cognitive load and interaction costs.

If your intention is to compare items between workspaces, then consider other layout options that are more suitable for this, such as flexible column or split screen layouts.

Specifications

For apps with two workspaces, create switchers by adding transparent (ghost) style segmented buttons in text-only style on the left-most side of the menu toolbar. For apps with three workspaces or more, use a select dropdown. Place switcher under a header labelled Links to specs found below.

Page Background

<div> <div>Badge</div> <div>Component</div> <div>Specification</div> <div>Details</div> </div> <div> <div></div> <div></div> <div> <p>@sapUiBaseBG</p> <p>@sapUiGroupContentBackground</p> </div> <div> <p>#F7F7F7</p> <p>#FFFFFF</p> </div> </div>

Segmented Button Switcher

<div> <div>Badge</div> <div>Component</div> <div>Specification</div> <div>Details</div> </div> <div> <div></div> <div></div> <div> <p>@sapFontFamily;</p> <p>@sapMFontMediumSize;</p> <p>normal</p> <p>varies (see below)</p> <p>0.5rem left / right</p> </div> <div> <p>72</p> <p>14</p> <p>normal</p> <p>varies (see below)</p> <p>8px left / right</p> </div> </div> <div> <div></div> <div></div> <div> <p>text label + padding</p> <p>1.625rem</p> <p>0.25rem on outer edges</p> <p>varies (see below)</p> <p>* Button may have a fixed width based on px or %. Both segments should be of equal width and have centered labels.</p> </div> <div> <p>text label + padding</p> <p>26px</p> <p>4px on outer edges</p> <p>varies (see below)</p> <p>* Button may have a fixed width based on px or %. Both segments should be of equal width and have centered labels.</p> </div> </div> <div> <div></div> <div></div> <div>2rem (button vertically centered inside)</div> <div>32px (button vertically centered inside)</div> </div> <div> <div></div> <div></div> <div> <p>transparent (after Fiori's <a href="https%3A%2F%2Fwiki.wdf.sap.corp%2Fwiki%2Fpages%2Fviewpage.action%3FpageId%3D2025039257%23Button(Fiori3)-SecondaryGhostButton(withnoBackground)">ghost style</a>)</p> <p>@sapUiButtonBorderColor</p> <p>@sapUiButtonTextColor</p> </div> <div> <p>transparent (after Fiori's <a href="https%3A%2F%2Fwiki.wdf.sap.corp%2Fwiki%2Fpages%2Fviewpage.action%3FpageId%3D2025039257%23Button(Fiori3)-SecondaryGhostButton(withnoBackground)">ghost style</a>)</p> <p>#0854A0</p> <p>#0854A0</p> </div> </div> <div> <div></div> <div></div> <div>@sapUiButtonHoverBackground</div> <div>#EBF5FE</div> </div> <div> <div></div> <div></div> <div> <p>@sapUiButtonSelectedBackground</p> <p>@sapUiButtonSelectedBorderColor</p> <p>@sapUiButtonSelectedTextColor</p> </div> <div> <p>#0854A0</p> <p>#0854A0</p> <p>#FFFFFF</p> </div> </div> <div> <div></div> <div></div> <div> <p>@sapUiButtonSelectedBackground</p> <p>@sapUiButtonSelectedBorderColor</p> <p>@sapUiButtonSelectedTextColor</p> </div> <div> <p>#0854A0</p> <p>#0854A0</p> <p>#FFFFFF</p> </div> </div> <div> <div></div> <div></div> <div> <p>@sapUiButtonSelectedHoverBackground</p> <p>@sapUiButtonSelectedHoverBorderColor</p> <p>@sapUiButtonSelectedTextColor</p> </div> <div> <p>#095CAF</p> <p>#095CAF</p> <p>#FFFFFF</p> </div> </div> <div> <div></div> <div></div> <div>0.5;</div> <div>50% opacity</div> </div>

Select Dropdown Switcher

<div> <div>Badge</div> <div>Component</div> <div>Specification</div> <div>Detail</div> </div> <div> <div></div> <div></div> <div> <p>11rem</p> <p>1.625rem</p> <p>0.125rem</p> <p>@sapUiFieldBackground;</p> <p>1px solid @sapUiFieldBorderColor;</p> <p>0.1875 rem top and bottom</p> </div> <div> <p>176px</p> <p>26px</p> <p>2px</p> <p>#FFFFFF</p> <p>1px solid, #89919A</p> <p>3 px top and bottom</p> </div> </div> <div> <div></div> <div></div> <div>0.5 rem left and right</div> <div>8 px left and right</div> </div> <div> <div></div> <div></div> <div>2 rem (includes field + margins)</div> <div>32 px (includes filed + margins)</div> </div> <div> <div></div> <div></div> <div> <p>@sapUiFieldTextColor;</p> <p>@sapMFontMediumSize;</p> </div> <div> <p>#32363A</p> <p>72, Regular, 14pt</p> </div> </div> <div> <div></div> <div>* Based on transparent button</div> <div> <p>2rem; 32px</p> <p>100%;</p> <p>1.5rem (icon is centered)</p> <p>SAP-icons</p> <p>slim-down-arrow, “e1ef"</p> <p>@sapUiContentIconColor;</p> <p>@sapUiButtonLiteBackground</p> </div> <div> <p>32px</p> <p>100%;</p> <p>24px (icon is centered)</p> <p>FPA-icons</p> <p>slim-down-arrow, &#xe7ac</p> <p>#0854A0</p> <p>transparent</p> </div> </div> <div> <div></div> <div>* Consistent with Global Focus Visual Concept</div> <div> <p>1px;</p> <p>@sapUIContentFocusColor;</p> <p>dotted;</p> <p>-3px;</p> <p>0.125rem;</p> </div> <div> <p>Outline width: 1px;</p> <p>Outline color: #000000</p> <p>Outline style: 1px dotted;</p> <p>Outline offset: -3px;</p> <p>Border radius: 2px</p> </div> </div> <div> <div></div> <div></div> <div> <ul> <li><em>Border:</em> 1px, @sapUiFieldHoverBorderColor;</li> <li><em>Bg:</em> @sapUiFieldHoverBackground;</li> <li><em>Bg:</em> @sapUiButtonLiteHoverBackground;</li> </ul> </div> <div> <ul> <li><em>Border:</em> 1px, solid, #0854A0</li> <li><em>Bg:</em> #FFFFFF</li> <li><em>Button bg:</em> #EBF5FE</li> </ul> </div> </div> <div> <div></div> <div></div> <div> <ul> <li><em>Border:</em> @sapUiFieldActiveBorderColor;</li> <li><em>Bg:</em> @sapUiFieldBackground;</li> <li><em>Icon:</em> @sapUiButtonActiveTextColor;</li> <li><em>Bg:</em> @sapUiButtonSelectedBackground;</li> <li><em>Bg:</em>@sapUiButtonSelectedHoverBackground;</li> <li><em>Border:</em> left, 1px, solid @sapUiFieldHoverBorderColor;</li> </ul> </div> <div> <ul> <li><em>Border:</em> #0854A0</li> <li><em>Bg:</em> #FFFFFF</li> <li><em>Icon:</em> #FFFFFF</li> <li><em>Bg:</em> #0854A0</li> <li><em>Bg:</em> #095CAF</li> <li><em>Border:</em> left: 1px solid #0854A0</li> </ul> </div> </div> <div> <div></div> <div></div> <div>Opacity: 0.5</div> <div>Opacity: 50%</div> </div>

<div> <div>Badge</div> <div>Component</div> <div>Specification</div> <div>Details</div> </div> <div> <div></div> <div></div> <div> <p>11rem</p> <p>0.25rem</p> <p>@sapUiContentShadow1</p> </div> <div> <p>176px</p> <p>4px</p> <p>X:0, Y:0, blur: 0, spread: 1, #000000, alpha: 15 X:0, Y:2, blur: 8, spread: 0, #000000, alpha: 30</p> </div> </div> <div> <div></div> <div></div> <div> <p>2rem</p> <p>0, 1rem, 0, 1rem</p> </div> <div> <p>32px</p> <p>0, 16px, 0, 16px</p> </div> </div> <div> <div></div> <div></div> <div> <p>@sapMFontMediumSize</p> <p>@sapUiListTextColor</p> <p>@sapUiListBackground</p> </div> <div> <p>72, regular, 14pt</p> <p>#32363A</p> <p>#FFFFFF</p> </div> </div> <div> <div></div> <div></div> <div>@sapUiListHoverBackground</div> <div>#F5F5F5</div> </div> <div> <div></div> <div></div> <div> <p>@sapUiListActiveTextColor</p> <p>@sapUiListActiveBackground</p> </div> <div> <p>#FFFFFF</p> <p>0854A0</p> </div> </div> <div> <div></div> <div></div> <div> <p>@sapUiListSelectionBackgroundColor</p> <p>@sapUiSelected</p> <p>* bottom border required for accessibility</p> </div> <div> <p>#E5F0FA</p> <p>#0854A0</p> <p>* bottom border required for accessibility</p> </div> </div> <div> <div></div> <div></div> <div> <p>@sapUiListSelectionHoverBackground</p> <p>@sapUiSelected</p> <p>* bottom border required for accessibility</p> </div> <div> <p>#D8E9F8</p> <p>#0854A0</p> <p>* bottom border required for accessibility</p> </div> </div> <div> <div></div> <div></div> <div>0.5</div> <div>50%</div> </div>

Button

Segmented Button

Segmented Button

sap.m.Segmented Button

Select

Select

Select

sap.m.Select

Support

If you have any questions or feedback about this page, please contact our team. For further information and questions in regards to the Design System, please visit the DNA Design SharePoint.