Make shop hub category sidebar sticky, collapsing to a FAB on mobile

Desktop: the "Shop COPSCOR" category panel now stays pinned in view
while scrolling through the hero, tiles, and promo banner beside it.
This required two changes: restructuring the hub from a fixed 12-col
grid (where the sidebar's row was only as tall as the hero card) to a
flex layout where the sidebar sits beside a column containing all of
that content, giving it real height to stick against; and fixing the
homepage's overflow-x-hidden wrapper, which — per the CSS overflow
spec — implicitly forces overflow-y to "auto" whenever only one axis
is set to a non-visible value, silently turning it into an unintended
scroll container that made every position:sticky descendant on the
page inert. Switched it to overflow-x-clip, which doesn't trigger
that coupling.

Mobile: the panel scrolls normally, then once it passes above the
viewport a floating round button appears (bottom-right) that reopens
the full category list from a bottom sheet — extracted the category
accordion markup into a shared MobileCategoryAccordion component so
both the inline panel and the sheet render identically.
