Hive Hive
Sign in

feat(noora, server): improve breadcrumbs, add animations and polish the component

GitHub issue · Closed

Metadata
Source
tuist/tuist #11037
Updated
Jun 24, 2026
Details

https://github.com/user-attachments/assets/40cac699-09f2-41ba-bb0e-160bf01667ee

Breadcrumb project switcher: polish + animations

Improvements to the breadcrumb dropdown (the project switcher) and a few supporting additions to Noora.

What changed:

Project switcher dropdown

  • The selected project now shows a checkmark. Space for it is always reserved, so badges stay neatly aligned whether or not a row is selected.
  • Gave the dropdown a wider minimum width so it doesn’t feel cramped.
  • The selector icon now morphs (smoothly animates) between two states when you open/close the dropdown.
  • The dropdown now fades and slides in when opening, and out when closing, instead of appearing/disappearing instantly.

Dropdown item structure

  • Grouped the item’s text content separately from the trailing icon, so the layout is cleaner and easier to extend (e.g. badges/buttons next to the label).
  • Reusable additions to Noora

New easing tokens (e.g. –ease-out-cubic) available globally for animations.

  • A new morphing_icon component that smoothly transitions one icon into another based on state.
  • A new selector-2 icon.

Developer experience

  • Local dev now hot-reloads when Noora’s JS/CSS changes, so you don’t need a manual rebuild while iterating. Notes
  • Animations respect prefers-reduced-motion and only animate opacity/transform (GPU-friendly).
Comments
F
fortmarek Jun 8, 2026

A couple of concrete things I’d address before merging:

  • noora/lib/noora/breadcrumbs.ex:124: the dropdown trigger is now an icon-only <button> with no accessible name. Previously the trigger contained the visible breadcrumb label, so screen readers had something to announce. We should add an aria-label or visually hidden label for the switcher button.

  • noora/lib/noora/icon.ex:63 / noora/lib/noora/icon.ex:117: morphing_icon looks like a general-purpose Noora icon primitive, but the implementation only seems safe for compatible filled-path icons. Some existing icons are stroked and/or multi-path, so using this broadly could render incorrect filled shapes. If this is intended for multiple dashboard interactions, I think we should make the support contract explicit or validate unsupported icons instead of letting them fail visually.

On the API shape: since this is planned for more than the breadcrumb selector, I’d prefer folding this into the existing .icon component rather than introducing a separate morphing_icon component. I would still keep animation opt-in rather than making morphing the default behavior.

For example:

<.icon name="check" />
<.icon
id="project-switcher-icon"
name="selector"
active_name="selector_2"
transition="morph"
watch="[data-part='trigger']"
active_state="open"
/>

Or even allow cheaper strategies for most UI cases:

<.icon name="selector" active_name="selector_2" transition="crossfade_rotate" />
<.icon name="selector" active_name="selector_2" transition="morph" />

That keeps .icon as the entrypoint, makes animation a first-class capability of icons, and lets Noora choose or validate the right strategy. We could also support transition="auto", where known-compatible pairs use morphing and everything else falls back to a crossfade/rotate transition.

So my take is: yes to a reusable primitive if there are multiple planned uses, but I’d make it a deliberate .icon API with an explicit transition strategy and compatibility checks rather than a general morphing_icon helper.

TA
tuist-atlas[bot] Jun 10, 2026

The breadcrumb improvements, animations, and polish changes from this pull request are now available. Update to xcresult-processor-image@0.14.2 to use them.

TA
tuist-atlas[bot] Jun 10, 2026

The breadcrumb improvements, animations, and polish described in this PR are now available in server@1.208.1. Update to this version to use these enhancements.

TA
tuist-atlas[bot] Jun 10, 2026

The improvements to breadcrumbs, animations, and component polish from this pull request are now available in version noora@0.82.2. Update to that version to use these changes.