Zazz 0.13 alpha
Zazz 0.13 alpha adds a grid that picks its own column count, makes subgrid a display, moves the carousel to Embla v9, and gives tabs an underline variant.
Zazz 0.13 alpha is mostly about grids. --display: grid-gallery picks its column count from the number of children, and subgrid is now a display keyword instead of a --grid-cols value. The carousel moves to Embla v9, tabs get an underline variant, and toggles follow the button more closely. Three changes need attention when you update; the migration list at the end covers them.
A grid that counts its children
A row of logos, stats, or cards usually wants a column count that depends on how many items there are. You often don't know that number when you write the markup. --display: grid-gallery works it out. It puts as many children in a row as fit, up to six, and it skips any count that would leave one child alone in the last row.
Seven children could sit as 6 + 1. The gallery picks 5 + 2 instead. As the space narrows, six children go 6, then 4 + 2, then 3 + 3, and never 5 + 1.
A child is at least --ui-gallery-min-w wide (20ch by default). Set it on the gallery to change how soon the columns drop: 12rem suits cards, and something like 5rem suits logos. The keyword takes breakpoints, so --display: flex-col; --display--md: grid-gallery is a stack on a phone and a gallery from md up.
It can't always avoid a lone child. At two columns an odd count still ends on one, and a few counts (13, 21, 25, 31) do at some widths. The display reference lists the limits.
Subgrid is a display
--grid-cols: subgrid put a display in a column count, and it needed --display: grid beside it every time. Now there are three display keywords:
--display: subgridtakes both the columns and the rows from the parent grid.--display: subgrid-coltakes the columns. Use it for a row that lines up with the grid above it.--display: subgrid-rowtakes the rows. Put it on each card in a grid, with--row-span: 3, and the titles, text, and footers stay level across the row.
Each takes breakpoints, and the axis a keyword doesn't take keeps its own --grid-cols or --grid-rows. --template-cols: subgrid and --template-rows: subgrid still work.
Carousel on Embla v9
The carousel now runs on Embla v9 (9.0.0-rc04, pinned in the import map). Embla's option attributes pass straight through, so the v8 names changed with it: data-carousel-watch-drag is data-carousel-draggable, the startIndex option is data-carousel-start-snap, and the rest are in the migration list. data-carousel-drag-free="snap" and data-carousel-in-view-margin are new.
Autoplay and Auto Scroll behave as they did. Embla v9 dropped playOnInit and stopOnInteraction, so the kit implements them itself: both plugins play on init, and a drag or slide focus stops them. With data-carousel-autoplay-stop-on-interaction="false", a drag or focus holds the plugin and it resumes after. -play-on-init="false" still leaves a plugin stopped, and a playing one keeps playing through a resize. One thing is different from v8: once an interaction has stopped a plugin, a resize no longer restarts it.
Underline tabs
data-tabs-variant="underline" draws tabs without a track. The indicator is a 2px line under the checked label, or at its start edge on vertical tabs, and the labels use --font-size-md. --ui-tabs-underline-width and --ui-tabs-underline-color set the line.
Tabs nested inside a panel also work now. The outer tabs used to lose their panels, because the rule that hides an unchecked panel matched any tab list inside the root.
Toggles follow the button
- A disabled toggle with a variant keeps that variant's color at 60% opacity. It used to go muted, whatever the variant.
- The
primary,secondary, andtertiaryvariants hover and press with the button's lightness steps. - A
<kbd>at either end of a toggle's content tightens that side's padding, the same as on a button. - The checked border is
--color-border, with the fill painted under it.
Fewer tiers
Some utilities had breakpoint or state tiers that did nothing useful, such as --font-family--md and --z--starting. They're gone, which takes about 10 KB off the built CSS (1 KB gzipped). The editor and <ui-debug> report each one as a tier the utility doesn't take, and the warning now names the utility.
Migrating
--display: grid; --grid-cols: subgridbecomes--display: subgrid-col. Both axes become--display: subgrid, and a tier such as--grid-cols--md: subgridbecomes--display--md: subgrid-col. The editor andvp run lint:htmlsuggest the rewrite.- Rename the carousel's v8 option attributes:
-watch-dragto-draggable,-watch-resizeto-resize,-watch-slidesto-slide-changes,-watch-focusto-focus, thestartIndexoption todata-carousel-start-snap(data-carousel-start-indexis the kit's own dialog attribute now),-autoplay-jumpto-autoplay-instant, and-class-names-draggingto-class-names-pointer-down.-stop-on-mouse-enterand-stop-on-focus-inare gone. Code on_emblaApior<ui-carousel>.apiuses the v9 names (goTo,goToNext,selectedSnap, lowercase events such asreinit). If you wrote your import map by hand, update the four Embla entries and their SRI hashes. - Remove the tiers that no longer exist:
--isolation,--font-family, and--font-styletake no breakpoints. Set the base value.--container-nametakes no breakpoints. Name the container at the base and switch it on with--container-type--md, or put the name in the shorthand (--container--md: panel / inline-size).--border-styletakes no breakpoints. Change the width instead (--border--md: 0).--border-style--hoverstill works.--shadow-angletakes no states. Use--shadow--hoveror--elevation--hover.--shadow-angle--mdstill works.--startingis gone from the transition, animation, and anchor utilities, and from--text-wrap,--text-decoration,--border-style,--mix-blend, and--z. Delete the declaration.
The changelog lists every change by primitive, and npx zazz-ui update prints the slice for the files you've vendored.