Skip to content

What Timeless does not ship

View as Markdown

Timeless is a library of primitives over the web platform. That is a boundary as much as a goal: some widely shipped components are outside it, and saying which ones is more useful than leaving the question to be re-argued per pull request.

Each row below is a decision, not an omission. Two tests decide them. Does the platform already do this in a line or two of CSS? Then a component would only be a worse way to reach the same declaration. Does it need domain machinery — a locale database, a layout engine, a virtualiser? Then it is a library in its own right, and wrapping one is not a primitive.

Everything here is buildable on top of Timeless. Nothing here is a gap someone needs to fill before the library is usable.

Not shipping Because
Aspect Ratio aspect-ratio: 16 / 9 is one declaration. A component around it adds a class to learn and a stylesheet to load in exchange for nothing.
Scroll Area Custom scrollbars fight momentum scrolling, trackpad inertia, and platform conventions, and they routinely drop keyboard and assistive-technology access. scrollbar-color, scrollbar-width, and scrollbar-gutter are Baseline and keep the native scroller.
Carousel Almost every implementation wraps a third-party engine. CSS scroll snap with scroll-marker and scroll-button pseudo-elements is the platform answer, and it keeps native swipe, keyboard, and scroll-anchoring behavior.
Not shipping Because
Chart Scales, axes, ticks, legends, and stacking are a charting library’s whole surface area. Timeless would either wrap one or reimplement it badly.
Data Table Sorting, filtering, column resizing, pagination, and virtualisation belong to a table library. The CSS Table stays: it styles the markup one produces.
Tree View The hardest pattern in the ARIA Authoring Practices Guide — typeahead, expand/collapse, multi-select across levels — with the least reuse across products.

The same test cuts both ways. OKLCH and OKLab parsing, gamut mapping, and contrast computation are a color library, so they ship as @timelessui/color rather than from the components package. Color Picker and Color Swatch stay components: they are primitives that depend on that library, the same way every component depends on a platform capability. What decides the boundary is the domain machinery, not the subject matter.

Not shipping Because
Sidebar and app shells A shell is a layout decision that belongs to the application. It is grid, Separator, and whatever navigation the product needs.
Chat and AI surfaces Message lists, streaming indicators, and prompt composers are product surfaces. They are built out of primitives; they are not primitives.
Command palette Combobox inside a Dialog, which is composition rather than a new contract. It is documented as a recipe rather than shipped as a component.
Navigation menu Several triggers, one panel open at a time. Hover Card per trigger already gives the intent delay, the anchored panel, the aria-expanded wiring, and Escape — and a nav of links must not be an APG menu, which is the mistake a component here would make easy. Documented as a recipe.

Date Picker and Calendar. <input type="date"> covers the common case today with a native picker, native validation, and native form behavior, and it is the right default for most forms. A real calendar is a different project: month grids across locales, week-start rules, non-Gregorian calendars, ranges, and the APG grid pattern’s full keyboard contract. That is worth doing properly or not at all, so it is on the list to revisit rather than ruled out.

Until then, use <input type="date"> with Field for labelling, description, and error wiring.