The Elix project aims to create a universal library of all general-purpose user interface patterns commonly found in desktop and mobile UIs, where each pattern is implemented as a well-designed, attractive, high-quality, performant, accessible, localizable, and extensively customizable web component.
Core Principles
Each component tries to provide the best implementation possible of a very common user interface pattern, freeing you from having to worry about small details, and letting you focus on your application’s core value. Elix includes universal access in its definition of usability excellence.
These components are measured against the Gold Standard checklist for web components, which uses the built-in HTML elements as the quality bar to which web components should aspire. Elix components should work predictably and reliably in a wide variety of contexts.
Elix components are designed to be usable as-is. Since no design can meet every situation, the components are factored into smaller elements and mixins that you can readily recombine to create solid components to meet your needs.
By virtue of being web components, these elements can be used with any front-end framework. We use the web platform to the maximum extent possible to get the best performance, and to ensure the longest useful lifetime for UI built with these elements.
Each component comes with a bare minimum of styling. They can be extensively customized to achieve more distinctive visual effects or branding to blend seamlessly with your application’s own style.
This includes the latest versions of Apple Safari and Mobile Safari, Google Chrome and Chrome for Android, Microsoft Edge (Chromium-based) and Mozilla Firefox.
Comprehensive list of user interface patterns
The list below includes the general-purpose patterns which are candidates for the Elix project. Patterns we have already implemented as components are indicated with a link to the relevant component documentation.
- Accordion. A list that can have a single item or multiple items expanded to show more detail.
- AlertDialog. Asks a single question the user can answer with a set of choices.
- Alphabetic indices. Renders the characters in a culture’s alphabet in standard order (e.g., as a vertical or horizontal strip). If supplied with a set of strings (or array of objects with key pointing to the important data member?), the UI will disable those characters which are not found as the initial character of any string.
- Async operation button. A button whose caption changes to reflect an operation in progress (e.g., changing from “Sign In” to “Signing In...”) until the operation completes. The button is disabled during the operation to avoid confusion and to prevent unnecessary extra clicks.
- AutoCompleteInput. A text input field that helps the user quickly enter strings from a known list.
- AutoCompleteComboBox. A ListComboBox that auto-completes the user's text against the list items.
- Auto-format. Applies a collection of heuristics for formatting text: adding smart quotes, converts double hyphens to en dashes, etc.
- AutoSizeTextarea. Text area that grows to accommodate its content.
- Backdrop. Shows a background region of non-interactive elements behind the region’s main contents.
- Breadcrumb bar. Indicates the user’s position in a navigational hierarchy.
- Button. A base class for a custom button.
- CalendarDay. Shows a single calendar day.
- CalendarDays. Shows a 7-column grid of dates in a given range.
- CalendarDayNamesHeader. Shows the localized names of the days of the week.
- CalendarMonth. Shows a single calendar month, localized for a given locale.
- CalendarMonthDay. Shows the days of a single calendar month without headers.
- CalendarMonthNavigator. Lets the user select a date, typically in the near future, by navigating through calendar months.
- Calendar months. Shows multiple months from a calendar.
- CalendarMonthYearHeader. A header showing the localized month name and the year.
- Calendar year.
- Carousel. Shows a single item from a navigable collection of items (often images or including imagery).
- CarouselSlideshow. Slideshow with carousel controls.
- CarouselWithThumbnails. Carousel showing a thumbnail for each image.
- CenteredStrip. Horizontal strip of items with selected item centered.
- CenteredStripHighlight. Centered strip showing selected item with a highlight color.
- CenteredStripOpacity. Centered strip showing unselected items with partial opacity.
- Checked list box. A list box showing a check box next to each item; the user can create a multiple selection by checking the boxes.
- Close box. A platform-sensitive representation of a button that will close the current dialog or window.
- Closable panel. Shows information (e.g., a warning, or the result of a completed operation) that can be dismissed to remove the panel from the visible page.
- Color wheel. Lets the user select a color in a variety of color spaces.
- Combed text box. A text box sporting tick marks or vertical lines to visually indicate how many characters should be entered. (Combine with masked input?)
- ComboBox. Text panel paired with a popup that can be used as an alternative to typing.
- Content with banner(s). Such as toolbar (on top) or status bar (on the bottom).
- Content with sidebar(s) on the left and/or right side.
- CrossfadeStage. A stage that exhibits a crossfade effect when transitioning between items.
- Current anchor. A link that changes its style when the link's destination points to the current page (or site area).
- DateComboBox. Lets the user type a date or choose one from a dropdown calendar.
- Date range calendar. Lets the user select a date range, typically in the near future.
- Date text box. Lets the user type a date in several culture-specific formats.
- Delimited list. A list of items interspersed with a decorative element (bullet, vertical bar, etc.) for cleaner delineation.
- Dialog. A modal overlay.
- Drawer. Modal panel that slides in from the side of the page.
- DropdownList. A button that shows the current choice made from a menu of choices.
- Editable in place. An element that supports its own in situ editing.
- Editable list. A meta-component that presents a data-driven list of items as well as UI for creating, editing, and deleting items.
- Editable text. A piece of static text data which can be clicked to produce a text box that can then be used to edit the data.
- ExpandablePanel. Expands/collapses in place with an animated transition.
- Expandable summary. A block of content with a “More” link at bottom; clicking this reveals the remainder of the content.
- Explorer. Synchronizes two elements that both support selection, typically a larger "stage" element showing a single selected item at a time, and a list of proxies for the complete set of possible choices.
- Fade overflow.
- File uploader. Allows the user to click or drag-and-drop to supply a single file for upload.
- FilterComboBox. A ListComboBox that filters the items in the list as the user types.
- FilterListBox. A list that can filter its items to show only those matching a text query. It highlights the matching portion of each item.
- Full screen expandable. A region supporting a mode in which the region will expand to fill the entire screen.
- Full screen. A region which fills the viewport, independent of the size of the page content.
- Gesture navigation. Allows the user to move between pages with swipe gestures.
- HamburgerMenuButton. Button that invokes a mobile navigation menu.
- Infinite list. A list which asynchronously loads additional contents as the user scrolls.
- Labeled input. An HTML input control (generally a check box or radio button) with an associated clickable label.
- Lazy list.
- Link list. Uses a platform-sensitive presentation of a set of links (or items that behave like links).
- ListBox. Single-selection list of items.
- ListExplorer.
- ListComboBox. A combo box which presents its choices as a dropdown list.
- Marquee selection. An area that lets the user select items by dragging out a rectangle.
- ListWithSearch. A list with an input element that filters the list to show matching items and highlight matching text.
- List with swipe commands. The user can swipe an item with touch or a trackpad to reveal commands that operate on the item.
- ModalBackdrop. A Backdrop whose visual design signals that the overlay on top of it is modal.
- Media specific. Conditionally shows contents based on the type of device being used and/or device capabilities.
- Masked text. A text box which only accepts specified input characters.
- Menu bar. A row of menus.
- Menu. A popup menu, often in a menu bar.
- MenuButton. An element (by default, a button) that invokes a Menu.
- MenuItem. A command in a menu.
- MenuSeparator. A line separating commands in a menu.
- Mobile date/time picker. Platform-sensitive collection of elements which emulate the platform’s native date/time picker.
- ModalBackdrop. Semi-transparent backdrop for a modal overlay.
- Modes. Shows a single panel at a time.
- Multi list box. A list that supports multiple selection, including keyboard navigation.
- Multiple file uploader. Allows the user to click or drag-and-drop to supply multiple files for upload.
- NumberSpinBox. A SpinBox optimized for a simple numeric value.
- Number with units. Facilitates entry of a number with units (e.g., “10 in.”, “5 minutes”, “60 kg”). Accepts an array of allowable units.
- Overlay. A transparent or semi-transparent blanket over the entire page which absorbs interactions outside a modal element. May be able to use Polymer’s overlay component.
- OverlayFrame.
- Packed columns. Packs its children into a dynamic number of columns of roughly equal height (e.g., see the Pinterest home page).
- PageDot. A small dot used as a proxy element for an item in a Carousel.
- Page number navigator. Indicates the number of pages, e.g. of search results, and also allows navigation to a particular page of results.
- Page transitions. Navigates between pages with animated transitions that can vary between navigation operations.
- Palette window. A persistent set of tools adjacent to, or superimposed on, a work surface, providing tools for manipulating the information on the surface.
- Panel with overflow menu. A panel fixed in width or height which allows any items which don't fit to overflow into a dropdown menu.
- Persistent header. A scrolling list in which the header for the group of items currently at the top of the visible list remains visible until the user scrolls the next group to the top. At this point, the new group header pushes the previous group header out of sight.
- Persistent navigation bar. When user scrolls page, the navigation bar shrinks to a smaller, but persistent size.
- Persistent panel. A panel whose contents will bump up against the top or bottom of a scrolling parent so as to remain always visible.
- Popout. An item that can expand (e.g., on hover) without affecting the visual position of surrounding items.
- Popup. An modeless element which temporarily pops up over other things.
- PopupSource. An element which invokes a Popup.
- Process steps. Shows a numbered list of steps in a task. Steps which are not yet available are disabled.
- Progress bar. Indicates the fraction of an operation which has been completed.
- ProgressSpinner. Representation of an ongoing operation whose expected duration is unknown.
- PullToRefresh. A region which the user can pull down to reload content.
- Radio button list. A list box showing a radio button next to each item; an alternative way to represent selection in a single-selection list.
- Range slider. Lets the user drag/swipe/click to select the start and end points of a range on an axis/timeline.
- Resolved entity list. Lets the user enter free-form text descriptors for entities that are resolved into discrete entity representations. Example: the To/Cc/Bcc fields in an email editor allow the user to enter plain text email addresses, then resolves these to create pill buttons for each recognized user in the To/Cc/Bcc list.
- Ribbon. A space-sensitive presentation of a set of commands.
- Rich text editor. Supports the basics: bold, italic, insert link, etc.
- Scrolled anchors. A scrollable region containing sections marked by anchors (e.g., name="introduction"). As the user scrolls, the document URL updates to reflect the current section ("page.html#introduction").
- Scroll-up bar. Appears only when user scrolls down, then up. (See article.)
- Seamless iframe.
- Search box. A text box with standard decorations (magnifying class, customizable “Search” hint) to suggest a search field.
- Shimmer. A content panel which, during the asynchronous loading of content, shows placeholder elements with a shimmer effect (gray gradient moving from left to right).
- Slider. Accepts a discrete number in a constrained range.
- Slideshow. Plays through a collection of items with a simple crossfade transition.
- SlideshowWithPlayControls. Slideshow with buttons for controlling playback.
- SlidingPages. Primitive carousel supporting multiple input modes but no UI of its own.
- SlidingStage. Slides between selected items on a horizontal axis.
- SpinBox. Input with buttons to increment/decrement across a continuous range.
- Splitter. A movable line sitting between two panels which can be dragged to change their relative sizes.
- Stacked navigation pages. As the user navigates deeper in an app, a small residual portion of the previous page remains visible (typically on the left); the user can swipe away the top page to navigate back to an earlier point.
- Star rating. Lets the user rate something (a restaurant, product, etc.) using the conventional star system.
- TabButton. Generic tab button with a text label.
- Tabs. Basic tabs structure for navigation and configuration.
- TabStrip. Strip of tab buttons.
- Tag text box. Tokenizes text input into a set of tags, and provides auto-completion against a set of existing tags.
- Text box with button. A control with a content area (usually some form of text box) and an associated button (“Go”, “Submit”, etc.).
- Time combo box / time picker. On desktop, lets the user type a time or choose one from a dropdown time picker. On mobile, opens a half-screen or full-screen time picker.
- Timeline. Positions items on a horizontal time axis.
- Toggle button. A button the user can tap/click to toggle its selected state.
- Toggle switch. A toggle that can be tapped/clicked, or swiped left/right, to toggle its selected state. See the Material Design Switch.
- ToolTip. A popup that appears when hovering the mouse over another element, providing more detail about that element.
- Toast. A message which briefly appears on a page before automatically disappearing. Typically used to display feedback after an operation has completed (e.g., “Message sent”) without requiring user acknowledgement.
- Tree view. Visually renders a hierarchy of items as a tree whose branches can be expanded and collapsed.
- Validating text input. Verifies that text input content meets some criteria.
- Vote up/down. A pair of buttons to vote something up or down; can reflect the current state of the user’s vote.
- Wizard. Steps the user through a task through a small set of pages.
In our ongoing study of user interface patterns, we occasionally add new patterns to the list. We have also found that implementing a pattern often uncovers variations or new patterns that we ultimately add to the list.
We welcome new ideas. Please keep in mind that our goal is to provide great implementations of the patterns people are already using widely in production apps, not to design or promote novel user interface patterns.
When we're successful
- Designers and developers will be able to readily adopt any common UI pattern without hesitation, and without concerns of implementation cost.
- Instead of wasting time reinventing wheels, app teams will be able to focus on their energy on the specific needs of their users and the unique value of their application.
- Users will enjoy applications whose fundamental interactions are more predictable and satisfying.
- We will see more experimentation and variation on common UI patterns. Teams will extensively customize generic components or build new variations that reuse substantial behavior from existing generic components.
- Designing and implementing UI will be significantly cheaper and less labor-intensive.
- Good UI designs will spread faster.
- People with disabilities will encounter fewer obstacles in app UIs.