Skip to content

🎉 New plugin: Featured Templates - #10324

Open
benjidotsh wants to merge 10 commits into
backstage:mainfrom
benjidotsh:plugins/featured-templates
Open

🎉 New plugin: Featured Templates#10324
benjidotsh wants to merge 10 commits into
backstage:mainfrom
benjidotsh:plugins/featured-templates

Conversation

@benjidotsh

@benjidotsh benjidotsh commented Aug 14, 2026

Copy link
Copy Markdown
Member

This PR introduces a new plugin called Featured Templates, which adds a home page widget that showcases Scaffolder/Software Templates containing a configurable tag (featured by default) to the Backstage home page. (if the Home plugin is installed)

The plugin is exclusively built for the New Frontend System and Backstage UI, although it does use the swappable TemplateCard component, which is by default still a MUI component. There is some CSS in place to make sure the default component renders nicely in this plugin.

Demo:

gifke

Empty state:

empty-state

Error state:

error-state

Loading state:

loading-state

✔️ Checklist

  • A changeset describing the change and affected packages. (more info)
  • Added or updated documentation
  • Tests for new functionality and regression tests for bug fixes
  • Screenshots attached (for UI changes)
  • All your commits have a Signed-off-by line in the message. (more info)

benjidotsh and others added 6 commits August 11, 2026 11:54
Migrate the featured-templates plugin, a New Frontend System home page
widget that showcases Software Templates selected by a catalog tag, from
the DPG Media plugin repository.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Signed-off-by: Benjamin Janssens <benji.janssens@gmail.com>
Restructure the workspace README as the plugin's front door with a
package list, quick start, screenshot, and provenance; add a Features
section to the plugin README.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Signed-off-by: Benjamin Janssens <benji.janssens@gmail.com>
Signed-off-by: Benjamin Janssens <benji.janssens@gmail.com>
approvedGitRepositories and enableScripts were written automatically by
yarn's lockfile v9 migration to preserve pre-hardening behavior. The
workspace has no git dependencies and needs no lifecycle scripts, so the
hardened defaults apply cleanly, matching most other workspaces.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Signed-off-by: Benjamin Janssens <benji.janssens@gmail.com>
Replaces the imperative IntersectionObserver lifecycle in ScrollControls
and the hand-rolled observer mock in tests with useInView and the
library's typed test utils. Pinned to 9.5.3, the last release whose
test-utils type definitions target jest instead of vitest globals,
keeping the strict skipLibCheck build green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Signed-off-by: Benjamin Janssens <benji.janssens@gmail.com>
Signed-off-by: Benjamin Janssens <benji.janssens@gmail.com>
@benjidotsh
benjidotsh requested review from a team and backstage-service as code owners August 14, 2026 12:40
@benjidotsh
benjidotsh requested a review from BethGriggs August 14, 2026 12:40
@backstage-goalie

backstage-goalie Bot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Changed Packages

Package Name Package Path Changeset Bump Current Version
@backstage-community/plugin-featured-templates workspaces/featured-templates/plugins/featured-templates major v0.0.0

Signed-off-by: Benjamin Janssens <benji.janssens@gmail.com>
@benjidotsh
benjidotsh force-pushed the plugins/featured-templates branch from fc2ccf2 to a05a9ca Compare August 14, 2026 12:54
@benjidotsh
benjidotsh force-pushed the plugins/featured-templates branch from d2ea02e to 6bc036a Compare August 14, 2026 13:04

@awanlin awanlin left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Hi @benjidotsh, before this moves forward I'd like clear understanding why this is being added here over being part of the scaffolder. Please bring this up at the next Scaffolder SIG 🙏

@benjidotsh

benjidotsh commented Aug 14, 2026

Copy link
Copy Markdown
Member Author

@awanlin no real reason tbh. didn't consider it. 😅

I've put it on the agenda!

benjidotsh and others added 2 commits August 14, 2026 15:50
ScrollControls exists to scroll a track, so a missing track is not a state
worth representing — the buttons would have nothing to act on. Render it
only once the track element is set, making the prop non-nullable and the
guard in scroll unnecessary.

initialInView stays true: the gate only defers past the render where the
track is still null, while the first IntersectionObserver report lands
later, so it is what keeps both arrows hidden until their real state is
known.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Benjamin Janssens <benji.janssens@gmail.com>
mockIsIntersecting already wraps the observer callback in act, so wrapping
the calls again in the scroll test added nothing.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Benjamin Janssens <benji.janssens@gmail.com>
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