Skip to content

feat(web): /videos with inline playback, topic rail and a dark launch - #313

Merged
jadhavgaurav merged 10 commits into
developmentfrom
feat/videos-web
Nov 3, 2026
Merged

jadhavgaurav merged 10 commits into
developmentfrom
feat/videos-web

Conversation

@jadhavgaurav

Copy link
Copy Markdown
Contributor

What this is

The /videos page for the website, stacked on the CMS PR (feat/videos-cms): this branch contains that commit first, so the diff shrinks to the web changes once the CMS PR is merged into development.

  • Explainers and product demos from the CleanStart channel, filtered by category, topic (left rail on desktop, dropdown on mobile), search and sort.
  • Each video plays in place, one at a time. There is no page per video, so nothing competes with the blog or guide on the same topic (decision from the 2026-10-26 SEO call).
  • One ItemList of VideoObject entries is the indexable record.
  • Reads the code catalog plus the YouTube feed by default, or the CMS videos collection when VIDEOS_SOURCE=cms; videos that are private, removed or not embeddable are hidden in CMS mode.

Dark launch

apps/web/src/lib/videos-launch.ts (VIDEOS_PAGE_PUBLIC = false) keeps the page noindex and nofollow, out of the sitemap and out of the Resources menu. The page is reachable by URL for review. Flip the constant to true on final approval and all three switch on together (a test pins the current state).

Also in this branch

The pieces the CMS PR leaves out because they point at this route: the /videos page-registry row, the purge map entries and the "Purge this page" button on the Videos admin screen.

Checks run

Web lint, typecheck, 670 tests, production build, copy check (no dashes); CMS lint, typecheck, 2,315 tests and page-registry check on this branch. Client preview: https://cleanstart-b7y2klx4g-digibranders-projects.vercel.app/videos (earlier build of the same page).

Merging

Merging into development has no deploy effect (web deploys from main). Promoting to main publishes the page dark, as above.

…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.
@vercel

vercel Bot commented Oct 31, 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 Oct 31, 2026 6:46am UTC

Request Review

…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_*.
@jadhavgaurav
jadhavgaurav merged commit 8a584f2 into development 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.

1 participant