Skip to content

Release: videos library, inline article videos, advisory CTA rail - #319

Merged
digibrander merged 10 commits into
mainfrom
feat/videos-web
Nov 3, 2026
Merged

digibrander merged 10 commits into
mainfrom
feat/videos-web

Conversation

@jadhavgaurav

Copy link
Copy Markdown
Contributor

What ships

Videos library (dark launch)

  • /videos page with inline playback, topic rail, Quick starts, theatre player and a phone filter sheet.
  • Fix: filters reset on production builds (router.replace is a no-op after a hard load; now history.replaceState).
  • CMS videos and videoTopics collections, YouTube sync job, publish gate (needs a topic and a summary).
  • The page stays hidden until VIDEOS_PAGE_PUBLIC is turned on. Nothing here changes what visitors see on /videos.

Videos inside articles

  • New videoEmbed block in the rich-text editor (Add menu and slash menu). It stores a relationship to a published video plus an optional caption.
  • Rendered on blog, guide, advisory, news, resource and knowledge hub pages. Poster first, YouTube loads only after a click.
  • A video that is unpublished or deleted drops out of the article instead of rendering a broken block.

Advisory pages get the blog's CTA rail

  • Same Intent Ladder rail and bottom bar as the live blog. Tracking events are advisory_ladder_rail_<stage>, demo link uses source=advisory.
  • Editors can pick the resource and the Explore image per advisory (ctaResource, ctaImage). Unset, the automatic match applies as before.
  • Searchable catalog image picker in the admin, fed by GET /api/catalog-images.

Deploy notes

  • Two migrations run on CMS boot, both guarded with IF NOT EXISTS: 20261031_100000_add_videos and 20261102_120000_advisories_cta_picks.
  • Deploy the CMS before the web app. The advisory page reads the new ctaResource and ctaImage fields, which exist only after the migration.
  • No new env vars are needed for this release. VIDEOS_SOURCE=cms and VIDEOS_PAGE_PUBLIC are separate switches and stay off.
  • Not covered: webinar, event, case study, careers and legal pages do not run the video pass yet, so a video block there renders as nothing.

Checks

On the merged tree (this branch plus main at 80f07b4):

  • Web: lint, typecheck, build, verify:copy, 704 tests pass.
  • CMS: lint, typecheck, verify:page-registry clean. 2351 tests passed on the branch before the main merge; the suites touched by main pass after it.
  • Real-browser checks of the inline video on a blog page and of the advisory rail were done on a scratch copy.

Not verified

Inserting a Video block through the admin editor UI. A scripted headless run left an empty block (the existing CTA card block did the same), so please try it once in a real browser after deploy.

The draft #313 is the same branch aimed at development. main and development are at the same commit, so this PR carries the same change.

…ark launch

The /videos page: explainers and product demos from the YouTube channel, filtered by
category and topic, each video playing in place (no per-video page, so nothing competes
with the blog or guide on the same topic). Reads the code catalog plus the YouTube feed by
default, or the CMS videos collection when VIDEOS_SOURCE=cms.

Ships dark: lib/videos-launch.ts (VIDEOS_PAGE_PUBLIC = false) keeps the page noindex and
nofollow, out of the sitemap and out of the Resources menu. Flip it on final approval.

Also restores the /videos purge entries and the "Purge this page" button on the Videos
admin screen that the CMS-only change leaves out until this route exists.
…r, phone filter sheet)

Cards carry a colour-coded category tag, topic chips and a clearer length badge.
A Quick starts row lists the explainers under two minutes. Playing a video opens
a theatre band above the grid with an Up next list, so the grid no longer jumps.
Phones get one Filter button that opens a sheet with category, topic and sort.
After a direct load on /videos?topic=x, router.replace('/videos') kept the old
URL, so Clear all, the category tabs and chip removal did nothing. Write the
filters with history.replaceState, which useSearchParams follows and which
needs no request for a static page.
Advisories get the blog's Next steps cards in the right column at xl, and a
bottom bar below it. All three cards show at once (an advisory is too short to
step through by reading depth). The advisory's technology label picks the
catalog image before the text match does. Events are advisory_stacked_rail_*;
the blog's names and demo link source are unchanged.

StickyRail keeps the last card on screen when the rail is taller than the
viewport.
Editors can place a published video from the Videos library in any body
rich-text field (slash menu or Add menu). The block stores only the library id.
Pages call resolveLexicalVideos after highlightLexical, since the blog body
renders in a client component and cannot fetch; it fills each block and drops
one whose video is gone, private or unpublished. The renderer draws a poster
with a play button and loads YouTube only on click.

Wired on blog, guide, advisory, news, resource and knowledge hub pages. Talks
are allowed here, unlike on /videos.
…picker

Advisories now use the blog's Ladder and bottom bar instead of the stacked
version, so the page looks like the live blog. They carry the same two optional
editor picks (ctaResource, ctaImage; hand-written, guarded migration
20261102_120000_advisories_cta_picks, checked against a Payload push).

The image pick is a searchable picker over the images catalog
(CatalogImagePicker, fed by GET /api/catalog-images) instead of a typed name.
The automatic-pick hint under both fields and its web route now take a
collection, so they work for advisories. Clicks are advisory_ladder_rail_*.
@vercel

vercel Bot commented Nov 3, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
cleanstart Skipped Skipped Nov 3, 2026 8:19am UTC

Request Review

@digibrander
digibrander merged commit 8a584f2 into main Nov 3, 2026
11 checks passed
@jadhavgaurav
jadhavgaurav deleted the feat/videos-web branch November 3, 2026 09:17

This branch was previously deployed

1 inactive deployment
Preview — d4d2a0c9 Deployed Nov 3, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants