Long price lists become category tabs (Cuts / Colour / Finish) whose panel glides to its new height while rows slide in and out. Printed-menu rows with dotted leaders and mono prices.
Services and prices
Cuts
Women's cut + blow-dry$65Shampoo, cut, blow-dry. About an hour.
Colour correctionby consultBox-dye fixes, one or two visits.
Gray blending$120Soft lowlights, no hard regrowth line.
Finish
Blow-dry$45Smooth or bouncy.
Bond repair$35Add to any colour.
Switch tabs: the panel glides to its new height and rows slide in (AutoAnimate). ←/→ moves between tabs. Without JS it's three plain lists with headings. Sample menu.
Salons, barbers, nails, restaurants and cafes (Breakfast / Lunch), detailers (Interior / Exterior), med spa
What it does
The markup is plain sections (heading + list), complete without JS. The script builds a real ARIA tablist (roving tabindex, ←/→/Home/End, automatic activation) and one tabpanel, then swaps the list rows per tab. AutoAnimate (MIT, 3.3 KB gzipped, loaded on demand from vendor/) animates the panel's height and the rows entering/leaving with transforms (FLIP); if it fails to load, tabs switch instantly.
When to use
Menus or price lists over ~10 rows (Mobbin: sweetgreen category tabs).
Pair with Service picker below it, or use its rows as the picker's source.
Don't
Fewer than 2 real categories, or one-row tabs.
Hide the main service's price behind a second tab: put the bestsellers in the first tab.