/priority-overflow

Simple utils to implement UI with priority overflow

Primary LanguageTypeScript

Priority overflow implementation

Usage

  • npm install
  • npm start

The app will allow you to try out the different scenarios that this tool supports.

Supported use cases

DOM Order overflow

Simply hides items that no longer fit outside the right (left for rtl) boundary of the viewport.

Reverse DOM Order overflow

Can overflow from the beginning of the container instead of the end.

RTL support

Overflow will work in the same way for RTL and LTR.

Custom overflow order

Allows setting priorities to each overflow item, so that when overflow occurs, the items with the least priority are hidden first

Subscribe for updates

It's possible to subscribe to updates in item visibility which can be used to implement additional UI around overflow.

Not in scope

Overflow menus

The tool does not support managing a dropdown menu for overflow items, since requirements can vary for each invidividual use case. However it's possible to subscribe to changes in item visibility which can be used to implement additional UI around overflow.

How it works

ResizeObserver

The overflow management is done using a ResizeObserver, which watches and reports resizes of a specific container element where this priority overflow pattern needs to be implemented.

Priority queues

In order to support overflow not only for DOM order, but also for custom order, managed overflow items are stored in priority queues. This results in O(log(n)) time for displaying/hiding each item, where n is the number of items. Overflow that is only based on DOM order does not need this extra complexity.

display: none

Overflowed items are manually set with display: none. This benefits frameworks like React, which can result in extra rerenders to remove a rendered item.

Item visibility subscription

It's possible to subscribe to changes in item visibility state. This can let you manage additional pieces of UI such as rendering dividers or overflow dropdown menus.