Atomic components


Buttons Vue component. Penpot buttons

Buttons are used to initiate actions in your app. This may be a primary action, or it may be used to confirm an action in a dialog, or simply be used for any major action in your app.

There are generally different types of buttons for different purposes:

Primary button "Move" and secondary button "Copy" in Files
  • Primary buttons are used to indicate the main action (“Start call” button in Talk, “Move” in Files). The primary buttons are stylized in Nextcloud blue by default or the theming color when themed. These should only be used sparingly and ideally only for 1 visible action at a time.

  • Secondary buttons are used for actions that have lesser weight than the primary action (“Today” button in Calendar, “Copy” in Files)

Tertiary button "Mark as read" in desktop tray menu
  • Tertiary buttons, which are the buttons without a background, can be used for other actions in your app which are important, but not the main focus. These buttons are usually combined with a primary or secondary button. For example, “Mark as read” is a tertiary button used alongside a secondary button

Mute, video, screenshare and 3-dot buttons in Talk video call
  • The icon-only buttons can be used if the action is frequently used and the icon is easily recognizable, and therefore does not require any text to support it (mute/video/screenshare actions in Talk, and the 3-dot menu icon)

Success button "Join call" in Talk
  • Success buttons are used for a positive action (“Join call” button in Talk)

Danger button "Remove email" in Mail
  • Danger buttons are used to signify a potentially dangerous or negative action (“Remove account” button in the confirmation dialog when you want to remove an account in Mail, or “Delete conversation” in Talk conversation settings)

Action menu

Action menu Vue component. Penpot action menu

Files action menu

The action menu contains commonly used actions associated with an item. Each entry in the action menu has some text accompanied by a suitable icon. In some cases, the action menu may also contain:

Checkbox in action menu in Mail
  • checkboxes to quickly toggle a state, like in Mail

Radio button in action menu in Files link sharing
  • radio buttons to select from a few options, like chat notifications in Talk

Add new mailbox in Mail action menu
  • new entry elements to quickly add items, like add a new mailbox in Mail

Second level of actions in action menu to configure custom permissions for link shares in Files
  • a second level of actions, like to configure custom permissions for link shares in Files

Some commonly used actions in the action menu are favoriting, renaming, downloading and deleting. Delete should always be at the last position as to not be confused with other actions.

It is important to keep the action menu simple and its length at a minimum. Too many entries in the action menu can lead to confusion and people not finding what they are looking for.

Action menu with a paperclip icon for attachments in Talk

In most cases the action menu is accessed through a 3-dot menu. In certain cases, it is better to use a specific icon instead of the generic 3-dot icon. For example in Talk a paperclip icon is used for accessing the action menu for attaching an item, and a heading icon is used in Text formatting bar for heading level selection.

For Android and iOS, the action menu is generally opened as a bottom sheet.

Input fields

Input field Vue component. Penpot text fields

Text input

Talk text input Text input with label in settings

Text inputs are usually used for free-form inputs. Make sure that the label for a text input field is simple and clear. It may also be a good idea to use placeholder text in the field.

Checkboxes and radio buttons

Checkbox and radio button Vue components. Penpot checkboxes and radio buttons

Checkbox in Talk settings Radio buttons in Mail settings

Checkboxes and radio buttons are very common input methods. They are most commonly used in the Action menu, Sidebar and Settings.

They should have a concise label, especially if they are inside an action menu. If more explanation is needed, you can also add a subline.


Datetime picker

Datetime picker Vue component.

Files date picker

A user can quickly select dates, times and date ranges using the datetime picker. Use good default dates relevant to the task at hand. For example, in the case of setting an expiration date, unless the server has something enforced as default, 1 week is a good default.

Color picker

Color picker Vue component.

Deck color picker

For certain elements of your UI you might want to allow people to set colors. This can easily be achieved using a color picker with some predefined colors. Be cautious about using different colors in the UI. In most Nextcloud apps like Deck and Calendar, user defined colors for UI elements are used sparingly and shown as a circle next to the element they refer to.

In addition to these 2 pickers, there is also the emoji picker and the timezone picker which can be also be used in your app.


Mail tags

Tags are used by users to manage their items. They can be colored for easy identification, but make sure to use subtle colors if colored tags are a main part of the UI, as seen in Mail.


Avatar Vue component. Penpot avatars

Avatars in Talk

An avatar is used when referring to any user and displays their photo or initials. The avatar component also shows a menu for that user when clicked.

When using an avatar it is usually accompanied by the name of the user as well, and sometimes it can also show the status of the user, although not always necessary. Statuses can be useful when the user is interacting with another user and is expecting a response, for example when @mentioning someone else in Talk, or in any sharing view.

When multiple people are working on or are assigned to the same element, like in Text, Office, a Deck card, or in the Files list for sharing, they are shown as overlapped.

Progress bars and meters

Progress bar Vue component.

Desktop syncing progress bar

Progress bars shows progress for a potentially lengthy process such as uploading, downloading, or syncing. When using a progress bar it can also be a good idea to have a text-based indication of the progress, such as percentage or time remaining, and make sure to provide feedback when the process has been completed.

Meter in Files for storage quota

The progress bar component is also sometimes used as a meter to visualize data as seen in the settings for Files to show the quota.

User bubbles

User bubble Vue component. Penpot user bubbles

Talk user bubble

When referring to a user inline in your app, a user bubble element can be used. In Talk and Comments, user bubbles are used in the content when someone mentions a user. In Mail, it is used in the header for the recipients of the message.

Counter bubbles

Counter bubble Vue component. Penpot counter bubbles

Talk counter bubble

In Talk, it is used for showing which chats are unread and if you or your group is mentioned.

Empty content

Empty content component. Penpot empty content

Bookmarks empty content

The empty content state provides feedback that a view is empty, e.g. a new folder. This is to differentiate it from the state of loading, or having loaded and showing data.

Make sure that empty content views only show when the view is really empty, and not while it is loading – otherwise people will be shocked as to where their data is gone. The wording on the empty content view should be friendly and helping people out of the situation, for example in the Bookmarks app.

Skeleton screens

Talk skeleton screen :scale: 50%

While the app is loading, it is best to show a skeleton view of the apps probable contents as loading feedback. A good example for this is Talk on web as well as Files and Talk on Android.