Skip to content
portalbits
Home Docs GitHub(opens in a new tab)

Guides

Get startedFoundationsMotion

Components

All components

Buttons

ButtonIconButton

Inputs

InputSelectTextareaSlider

Selection

CheckboxToggleToggleGroupSwitchRadioGroup

Identity

AvatarBadge

Overlays

DialogPopoverTooltipDropdownMenuAlertDialog

Disclosure

TabsAccordion

Cards

AppCardArticleCardFeatureCard

Content

CarouselSectionHeaderEmptyStateAlertProgressSeparatorRowListRow

Chrome

PortalShellSidebarNavMobileNavTopBarAuthFrameColorSelectorFloatingNav

Small moments. Lasting feel.

Responsive feedback, a gentle arrival, and a little less friction.

Motion lab

The easing curve

Quick to respond. Soft on arrival.

Duration300ms
Easingcubic-bezier(.215, .61, .355, 1)
EvidenceSampled controls & list opacity

The moving dot visualizes the measured curve. It is a demonstration, not a motion copied from the source.

Feedback you can feel

Every interaction resolves to a clear state.

Press & select

Color, shadow, and thumb travel. No unnecessary bounce.

Source curve; toggle fill, press shadow, and switch travel are adapted behaviors.

Enter & exit

Subtle travel, with focus managed by Bits UI.

Entry: 300ms. Exit: 160ms. Distances, exit duration, and blur are adaptations; not measured source values.

Motion should never get in the way

Respect the person, not just the animation.

ConditionBehavior
Reduced motionNonessential transitions and animations resolve immediately through prefers-reduced-motion.
Rapid inputState follows the latest action. CSS transitions reverse without queuing handlers.
Keyboard navigationVisible focus stays distinct from hover. Dialog focus is contained and restored.
TouchActions remain available without hover. Cards expose persistent controls.
@media (prefers-reduced-motion: reduce) {
  .p-theme * {
    animation-duration: 0.01ms !important;
    transition-duration: 0.01ms !important;
  }
}