Skip to content

Docs: automatically screenshot examples as light/dark images#42329

Merged
julien-deramond merged 7 commits intov6-devfrom
v6-dev-js-automatic-examples-screenshot-script
Apr 18, 2026
Merged

Docs: automatically screenshot examples as light/dark images#42329
julien-deramond merged 7 commits intov6-devfrom
v6-dev-js-automatic-examples-screenshot-script

Conversation

@julien-deramond
Copy link
Copy Markdown
Member

@julien-deramond julien-deramond commented Apr 16, 2026

Description

This PR automates the creation of examples screenshots by running npm run screenshots.

Technically, the screenshot automation is handled by a Playwright script that reads the examples data, starts the docs server automatically, navigates to each internal example page, and captures screenshots for both theme states by emulating light and dark color schemes. Instead of capturing only a small crop, it captures a full-width viewport and then uses image resizing to generate consistent thumbnail assets at 480x300 and 960x600, including dark-mode variants with the same naming pattern.

On the rendering side, the examples grid now switches thumbnail sources dynamically based on the resolved theme applied on the html data-bs-theme attribute. That means when the docs are in light mode it serves the standard image set, when in dark mode it serves the dark set, and in auto mode it follows whatever the theme script resolves at runtime. This keeps behavior aligned with the existing docs color-mode system and avoids showing the wrong thumbnail after toggling.

Please note that the .bd-mode-toggle theme selector is removed from each screenshot.

Note

No effort has been done so that the script works on Windows too. Only tested with macOS.

Live previews

Warning

The color modes dropdown isn't working from the /examples page, but it's not due to this PR

Screenshot 2026-04-16 at 21 22 50 Screenshot 2026-04-16 at 21 22 07

@github-actions
Copy link
Copy Markdown
Contributor

Images automagically compressed by Calibre's image-actions

Compression reduced images by 75.3%, saving 919.3 KB.

Displaying top 25 most improved images. 26 images processed.

Filename Before After Improvement Visual comparison
site/static/docs/[version]/assets/img/examples/blog-dark@2x.png 164.3 KB 41.5 KB 74.7% View diff
site/static/docs/[version]/assets/img/examples/blog@2x.png 131.1 KB 37.7 KB 71.3% View diff
site/static/docs/[version]/assets/img/examples/cheatsheet-dark@2x.png 87.8 KB 19.8 KB 77.4% View diff
site/static/docs/[version]/assets/img/examples/album-dark@2x.png 71.9 KB 15.9 KB 77.8% View diff
site/static/docs/[version]/assets/img/examples/carousel-dark@2x.png 70.8 KB 15.6 KB 78.0% View diff
site/static/docs/[version]/assets/img/examples/badges-dark@2x.png 61.1 KB 13.4 KB 78.1% View diff
site/static/docs/[version]/assets/img/examples/carousel@2x.png 62.3 KB 14.8 KB 76.2% View diff
site/static/docs/[version]/assets/img/examples/album@2x.png 59.2 KB 14.6 KB 75.4% View diff
site/static/docs/[version]/assets/img/examples/blog-dark.png 57.7 KB 15.4 KB 73.3% View diff
site/static/docs/[version]/assets/img/examples/badges@2x.png 55.5 KB 16.1 KB 71.0% View diff
site/static/docs/[version]/assets/img/examples/buttons-dark@2x.png 48.2 KB 9.8 KB 79.7% View diff
site/static/docs/[version]/assets/img/examples/blog.png 47.6 KB 15.4 KB 67.6% View diff
site/static/docs/[version]/assets/img/examples/buttons@2x.png 41.5 KB 10.0 KB 75.9% View diff
site/static/docs/[version]/assets/img/examples/cheatsheet-dark.png 31.6 KB 7.9 KB 75.0% View diff
site/static/docs/[version]/assets/img/examples/carousel-dark.png 26.6 KB 7.1 KB 73.2% View diff
site/static/docs/[version]/assets/img/examples/album-dark.png 25.4 KB 6.5 KB 74.5% View diff
site/static/docs/[version]/assets/img/examples/breadcrumbs-dark@2x.png 22.5 KB 4.0 KB 82.2% View diff
site/static/docs/[version]/assets/img/examples/carousel.png 24.5 KB 6.6 KB 73.1% View diff
site/static/docs/[version]/assets/img/examples/badges-dark.png 22.4 KB 4.7 KB 79.0% View diff
site/static/docs/[version]/assets/img/examples/album.png 21.4 KB 5.3 KB 75.3% View diff
site/static/docs/[version]/assets/img/examples/badges.png 20.5 KB 4.8 KB 76.7% View diff
site/static/docs/[version]/assets/img/examples/buttons-dark.png 19.0 KB 4.0 KB 79.1% View diff
site/static/docs/[version]/assets/img/examples/buttons.png 16.9 KB 3.5 KB 79.2% View diff
site/static/docs/[version]/assets/img/examples/breadcrumbs@2x.png 16.7 KB 3.9 KB 76.4% View diff
site/static/docs/[version]/assets/img/examples/breadcrumbs-dark.png 7.9 KB 1.6 KB 79.6% View diff

@julien-deramond julien-deramond force-pushed the v6-dev-js-automatic-examples-screenshot-script branch from b73d822 to 6a4ee8b Compare April 16, 2026 19:29
@github-actions
Copy link
Copy Markdown
Contributor

Images automagically compressed by Calibre's image-actions

Compression reduced images by 75.2%, saving 917.7 KB.

Displaying top 25 most improved images. 26 images processed.

Filename Before After Improvement Visual comparison
site/static/docs/[version]/assets/img/examples/blog-dark@2x.png 164.3 KB 41.5 KB 74.7% View diff
site/static/docs/[version]/assets/img/examples/blog@2x.png 131.1 KB 37.7 KB 71.3% View diff
site/static/docs/[version]/assets/img/examples/cheatsheet-dark@2x.png 87.8 KB 19.8 KB 77.4% View diff
site/static/docs/[version]/assets/img/examples/album-dark@2x.png 71.9 KB 15.9 KB 77.8% View diff
site/static/docs/[version]/assets/img/examples/carousel-dark@2x.png 70.8 KB 15.6 KB 78.0% View diff
site/static/docs/[version]/assets/img/examples/badges-dark@2x.png 61.1 KB 13.4 KB 78.1% View diff
site/static/docs/[version]/assets/img/examples/carousel@2x.png 62.3 KB 14.8 KB 76.2% View diff
site/static/docs/[version]/assets/img/examples/album@2x.png 59.2 KB 14.6 KB 75.4% View diff
site/static/docs/[version]/assets/img/examples/blog-dark.png 57.7 KB 15.4 KB 73.3% View diff
site/static/docs/[version]/assets/img/examples/buttons-dark@2x.png 48.3 KB 8.7 KB 82.0% View diff
site/static/docs/[version]/assets/img/examples/badges@2x.png 55.5 KB 16.1 KB 71.0% View diff
site/static/docs/[version]/assets/img/examples/blog.png 47.6 KB 15.4 KB 67.6% View diff
site/static/docs/[version]/assets/img/examples/buttons@2x.png 41.4 KB 11.7 KB 71.7% View diff
site/static/docs/[version]/assets/img/examples/cheatsheet-dark.png 31.6 KB 7.9 KB 75.0% View diff
site/static/docs/[version]/assets/img/examples/carousel-dark.png 26.6 KB 7.1 KB 73.2% View diff
site/static/docs/[version]/assets/img/examples/album-dark.png 25.4 KB 6.5 KB 74.5% View diff
site/static/docs/[version]/assets/img/examples/breadcrumbs-dark@2x.png 22.5 KB 4.0 KB 82.2% View diff
site/static/docs/[version]/assets/img/examples/carousel.png 24.5 KB 6.6 KB 73.1% View diff
site/static/docs/[version]/assets/img/examples/badges-dark.png 22.4 KB 4.7 KB 79.0% View diff
site/static/docs/[version]/assets/img/examples/album.png 21.4 KB 5.3 KB 75.3% View diff
site/static/docs/[version]/assets/img/examples/badges.png 20.5 KB 4.8 KB 76.7% View diff
site/static/docs/[version]/assets/img/examples/buttons-dark.png 19.1 KB 4.2 KB 77.9% View diff
site/static/docs/[version]/assets/img/examples/breadcrumbs@2x.png 16.7 KB 3.9 KB 76.4% View diff
site/static/docs/[version]/assets/img/examples/buttons.png 16.9 KB 4.2 KB 75.0% View diff
site/static/docs/[version]/assets/img/examples/breadcrumbs-dark.png 7.9 KB 1.6 KB 79.6% View diff

Comment thread site/static/docs/[version]/assets/img/examples/blog-dark@2x.png
@julien-deramond julien-deramond force-pushed the v6-dev-js-automatic-examples-screenshot-script branch from 7e77a77 to 867c8a1 Compare April 16, 2026 19:35
@github-actions
Copy link
Copy Markdown
Contributor

Images automagically compressed by Calibre's image-actions

Compression reduced images by 75.9%, saving 913.5 KB.

Displaying top 25 most improved images. 26 images processed.

Filename Before After Improvement Visual comparison
site/static/docs/[version]/assets/img/examples/blog-dark@2x.png 163.4 KB 40.6 KB 75.2% View diff
site/static/docs/[version]/assets/img/examples/blog@2x.png 130.4 KB 37.5 KB 71.3% View diff
site/static/docs/[version]/assets/img/examples/cheatsheet-dark@2x.png 86.9 KB 19.4 KB 77.7% View diff
site/static/docs/[version]/assets/img/examples/carousel-dark@2x.png 70.0 KB 15.0 KB 78.6% View diff
site/static/docs/[version]/assets/img/examples/album-dark@2x.png 71.0 KB 16.2 KB 77.2% View diff
site/static/docs/[version]/assets/img/examples/badges-dark@2x.png 60.2 KB 12.3 KB 79.6% View diff
site/static/docs/[version]/assets/img/examples/carousel@2x.png 61.6 KB 13.7 KB 77.7% View diff
site/static/docs/[version]/assets/img/examples/album@2x.png 58.4 KB 13.7 KB 76.5% View diff
site/static/docs/[version]/assets/img/examples/blog-dark.png 57.2 KB 15.2 KB 73.5% View diff
site/static/docs/[version]/assets/img/examples/badges@2x.png 54.7 KB 14.1 KB 74.2% View diff
site/static/docs/[version]/assets/img/examples/buttons-dark@2x.png 47.3 KB 8.4 KB 82.3% View diff
site/static/docs/[version]/assets/img/examples/blog.png 47.2 KB 13.9 KB 70.5% View diff
site/static/docs/[version]/assets/img/examples/buttons@2x.png 40.5 KB 10.5 KB 74.1% View diff
site/static/docs/[version]/assets/img/examples/cheatsheet-dark.png 31.1 KB 8.1 KB 74.0% View diff
site/static/docs/[version]/assets/img/examples/carousel-dark.png 26.1 KB 6.7 KB 74.1% View diff
site/static/docs/[version]/assets/img/examples/album-dark.png 24.8 KB 6.0 KB 75.9% View diff
site/static/docs/[version]/assets/img/examples/breadcrumbs-dark@2x.png 21.5 KB 3.2 KB 85.2% View diff
site/static/docs/[version]/assets/img/examples/carousel.png 24.0 KB 6.3 KB 73.8% View diff
site/static/docs/[version]/assets/img/examples/badges-dark.png 21.9 KB 4.7 KB 78.4% View diff
site/static/docs/[version]/assets/img/examples/album.png 21.0 KB 5.5 KB 73.6% View diff
site/static/docs/[version]/assets/img/examples/badges.png 20.0 KB 4.7 KB 76.7% View diff
site/static/docs/[version]/assets/img/examples/buttons-dark.png 18.6 KB 3.9 KB 78.8% View diff
site/static/docs/[version]/assets/img/examples/buttons.png 16.5 KB 3.7 KB 77.7% View diff
site/static/docs/[version]/assets/img/examples/breadcrumbs@2x.png 15.8 KB 3.7 KB 76.6% View diff
site/static/docs/[version]/assets/img/examples/breadcrumbs-dark.png 7.3 KB 1.3 KB 82.7% View diff

@github-actions
Copy link
Copy Markdown
Contributor

Images automagically compressed by Calibre's image-actions

Compression reduced images by 75.9%, saving 912.9 KB.

Displaying top 25 most improved images. 26 images processed.

Filename Before After Improvement Visual comparison
site/static/docs/[version]/assets/img/examples/blog-dark@2x.png 163.4 KB 40.6 KB 75.2% View diff
site/static/docs/[version]/assets/img/examples/blog@2x.png 130.4 KB 37.5 KB 71.3% View diff
site/static/docs/[version]/assets/img/examples/cheatsheet-dark@2x.png 86.9 KB 19.4 KB 77.7% View diff
site/static/docs/[version]/assets/img/examples/carousel-dark@2x.png 70.0 KB 15.0 KB 78.6% View diff
site/static/docs/[version]/assets/img/examples/album-dark@2x.png 71.0 KB 16.2 KB 77.2% View diff
site/static/docs/[version]/assets/img/examples/badges-dark@2x.png 60.2 KB 12.3 KB 79.6% View diff
site/static/docs/[version]/assets/img/examples/carousel@2x.png 61.6 KB 13.7 KB 77.7% View diff
site/static/docs/[version]/assets/img/examples/album@2x.png 58.4 KB 13.7 KB 76.5% View diff
site/static/docs/[version]/assets/img/examples/blog-dark.png 57.2 KB 15.2 KB 73.5% View diff
site/static/docs/[version]/assets/img/examples/badges@2x.png 54.7 KB 14.1 KB 74.2% View diff
site/static/docs/[version]/assets/img/examples/buttons-dark@2x.png 47.3 KB 9.1 KB 80.7% View diff
site/static/docs/[version]/assets/img/examples/blog.png 47.2 KB 13.9 KB 70.5% View diff
site/static/docs/[version]/assets/img/examples/buttons@2x.png 40.5 KB 10.2 KB 74.8% View diff
site/static/docs/[version]/assets/img/examples/cheatsheet-dark.png 31.1 KB 8.1 KB 74.0% View diff
site/static/docs/[version]/assets/img/examples/carousel-dark.png 26.1 KB 6.7 KB 74.1% View diff
site/static/docs/[version]/assets/img/examples/album-dark.png 24.8 KB 6.0 KB 75.9% View diff
site/static/docs/[version]/assets/img/examples/breadcrumbs-dark@2x.png 21.5 KB 3.2 KB 85.2% View diff
site/static/docs/[version]/assets/img/examples/carousel.png 24.0 KB 6.3 KB 73.8% View diff
site/static/docs/[version]/assets/img/examples/badges-dark.png 21.9 KB 4.7 KB 78.4% View diff
site/static/docs/[version]/assets/img/examples/album.png 21.0 KB 5.5 KB 73.6% View diff
site/static/docs/[version]/assets/img/examples/badges.png 20.0 KB 4.7 KB 76.7% View diff
site/static/docs/[version]/assets/img/examples/buttons-dark.png 18.6 KB 4.2 KB 77.4% View diff
site/static/docs/[version]/assets/img/examples/buttons.png 16.6 KB 3.6 KB 78.5% View diff
site/static/docs/[version]/assets/img/examples/breadcrumbs@2x.png 15.8 KB 3.7 KB 76.6% View diff
site/static/docs/[version]/assets/img/examples/breadcrumbs-dark.png 7.3 KB 1.3 KB 82.7% View diff

@julien-deramond julien-deramond marked this pull request as ready for review April 16, 2026 19:44
@julien-deramond julien-deramond requested a review from mdo April 16, 2026 19:44
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the only issue I've spotted but this is the behavior I can observe when I load https://deploy-preview-42329--twbs-bootstrap.netlify.app/docs/6.0/examples/masonry/ when 1070x1070 and don't move anything. I don't think this is particularly an issue coming from Playwright. Maybe we can add a movement or something for this specific example. But if we plan to get rid of this example, nevermind, nothing to do.

@julien-deramond julien-deramond changed the title Docs: screenshot automatically examples as light/dark images Docs: automatically screenshot examples as light/dark images Apr 16, 2026
@mdo
Copy link
Copy Markdown
Member

mdo commented Apr 16, 2026

Maybe missing /menus examples? Only thing I immediately saw. And maybe drawers since rename of offcanvas?

@julien-deramond
Copy link
Copy Markdown
Member Author

julien-deramond commented Apr 16, 2026

Maybe missing /menus examples? Only thing I immediately saw.

/menus is currently commented out in examples.yml, so it doesn’t appear on the https://v6-dev--twbs-bootstrap.netlify.app/docs/6.0/examples/ page. As a result, Playwright doesn’t parse it and no images are generated.

# - name: Menus
#   description: 'Enhance your menus with filters, icons, custom styles, and more.'

Do you want me to uncomment it?

And maybe drawers since rename of offcanvas?

There’s already a “Navbars drawer” example, and its images are being generated. Were you thinking of a different drawer example?

Source: https://github.com/twbs/bootstrap/pull/42245/changes#diff-0ac04630c275111044f8785bddcae31b62772055e1dcd359c491d19a6f180790

Screenshot 2026-04-16 at 22 46 24

@github-actions
Copy link
Copy Markdown
Contributor

Images automagically compressed by Calibre's image-actions

Compression reduced images by 12.1%, saving 30.8 KB.

Filename Before After Improvement Visual comparison
site/static/docs/[version]/assets/img/examples/blog@2x.png 37.5 KB 30.4 KB 18.8% View diff
site/static/docs/[version]/assets/img/examples/blog-dark.png 15.2 KB 12.8 KB 15.7% View diff
site/static/docs/[version]/assets/img/examples/blog-dark@2x.png 40.6 KB 38.3 KB 5.5% View diff
site/static/docs/[version]/assets/img/examples/badges@2x.png 14.1 KB 12.0 KB 15.2% View diff
site/static/docs/[version]/assets/img/examples/carousel-dark@2x.png 15.0 KB 13.4 KB 10.3% View diff
site/static/docs/[version]/assets/img/examples/buttons-dark@2x.png 9.1 KB 7.7 KB 16.3% View diff
site/static/docs/[version]/assets/img/examples/buttons@2x.png 10.2 KB 8.8 KB 14.2% View diff
site/static/docs/[version]/assets/img/examples/cheatsheet-dark.png 8.1 KB 6.6 KB 17.9% View diff
site/static/docs/[version]/assets/img/examples/badges-dark@2x.png 12.3 KB 10.9 KB 11.3% View diff
site/static/docs/[version]/assets/img/examples/cheatsheet-dark@2x.png 19.4 KB 18.1 KB 6.5% View diff
site/static/docs/[version]/assets/img/examples/carousel-dark.png 6.7 KB 5.6 KB 17.7% View diff
site/static/docs/[version]/assets/img/examples/album.png 5.5 KB 4.4 KB 20.9% View diff
site/static/docs/[version]/assets/img/examples/carousel@2x.png 13.7 KB 12.8 KB 6.6% View diff
site/static/docs/[version]/assets/img/examples/blog.png 13.9 KB 13.0 KB 6.2% View diff
site/static/docs/[version]/assets/img/examples/buttons-dark.png 4.2 KB 3.4 KB 19.9% View diff
site/static/docs/[version]/assets/img/examples/album-dark.png 6.0 KB 5.2 KB 13.7% View diff
site/static/docs/[version]/assets/img/examples/badges-dark.png 4.7 KB 4.1 KB 14.1% View diff
site/static/docs/[version]/assets/img/examples/breadcrumbs-dark@2x.png 3.2 KB 2.6 KB 17.3% View diff
site/static/docs/[version]/assets/img/examples/breadcrumbs@2x.png 3.7 KB 3.2 KB 13.8% View diff
site/static/docs/[version]/assets/img/examples/carousel.png 6.3 KB 5.9 KB 6.9% View diff
site/static/docs/[version]/assets/img/examples/buttons.png 3.6 KB 3.2 KB 10.3% View diff
site/static/docs/[version]/assets/img/examples/breadcrumbs.png 1.5 KB 1.4 KB 5.5% View diff

4 images did not require optimisation.

Copy link
Copy Markdown
Member

@mdo mdo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh right I remember, good to go!

@julien-deramond julien-deramond merged commit 2c35cf0 into v6-dev Apr 18, 2026
4 checks passed
@julien-deramond julien-deramond deleted the v6-dev-js-automatic-examples-screenshot-script branch April 18, 2026 06:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: Inbox

Development

Successfully merging this pull request may close these issues.

2 participants