- Shipped
- August 19, 2026 at 3:13 AM UTC
- Author
- Kamo
- Commit
- e4a4062
Five fixes, all of them things that looked present but did nothing. OFFER BANNER — HeroOfferBanner was dead code; nothing imported it. Restored, but driven by whatever the pricing API actually returns rather than by the old hardcoded PROMO_CODE plus FALLBACK_PROMOTION. That fallback is why it died: its end date passed and the component then rendered nothing forever. Now publishing a promotion in the backend makes it appear on the next revalidate and letting it lapse removes it, with no deploy either way. Promotions already come back alongside the plans, so the banner costs no extra request. The selection filters to FLAT_PER_SEAT, which is a correctness guard rather than a preference: the banner's copy reads "Save $N/user", so a PERCENTAGE promo would render "$20/user" for what is really 20% off. It also requires a real endDate — a countdown needs something to count down to, and the previous version faked one with the year 2099. LEARN MORE — the indicator on every home feature card was a bare <div> on a nothing. It is now a real Link with a stretched ::after so the whole card is the hit area, pointing at a new per-category anchor on /features. The six category slugs are a public contract now, and are commented as such. HEXAGON FIELD — `.hexagon-grid` declared `position: relative` while its only usage asks for `absolute inset-0` via utilities. This file loads after the Tailwind import, so at equal specificity the stylesheet won: the element collapsed to zero height and clipped its own ::before through `overflow:hidden` and `contain:paint`. The field had been rendering nothing at all. VIDEO CUT OFF — the reel's frame overhung the viewport by 1.5–5rem so it would visibly run off-screen. That reads fine for decoration and badly for a product demo, where the cropped strip is content someone is meant to watch. It now ends flush with the edge: still no right-hand gutter, so it keeps reading as a window rather than a card, but the whole reel is visible. Also: a restart control beside the sound button, and Integrations 64 -> 100+. Both video controls are icon-only now, which is a fix rather than a style choice. heroVideoMute/heroVideoUnmute were missing from the translation dictionary, so next-intl rendered the raw key path — live HTML was serving **************** and the hero rebuild turned that into visible text on the button. The keys are added to kamo-translation-dictionary (f4d2b65b); icons plus an aria-label keep a copy gap from becoming furniture. The countdown's 50ms tick is 20 renders a second forever on a page that is also decoding video, so anyone asking for reduced motion gets a 1s clock and loses the millisecond unit.