docs/releases/v1.50.0-next.0-changelog.md
Upgrade Helper: https://backstage.github.io/upgrade-helper/?to=1.50.0-next.0
8659f33: BREAKING: The Header component's tabs prop now uses HeaderNavTabItem[] instead of HeaderTab[]. Tabs render as a <nav> element with links and optional dropdown menus instead of role="tablist". A new activeTabId prop controls which tab is highlighted.
Migration:
- import { Header, type HeaderTab } from '@backstage/ui';
+ import { Header, type HeaderNavTabItem } from '@backstage/ui';
// Tabs no longer support matchStrategy — active state is controlled via activeTabId
- const tabs: HeaderTab[] = [
- { id: 'overview', label: 'Overview', href: '/overview', matchStrategy: 'prefix' },
+ const tabs: HeaderNavTabItem[] = [
+ { id: 'overview', label: 'Overview', href: '/overview' },
];
- <Header title="My Page" tabs={tabs} />
+ <Header title="My Page" tabs={tabs} activeTabId="overview" />
Affected components: Header
bed3307: BREAKING: Dropped support for React 17. The minimum supported React version is now 18.
49ffe8a: BREAKING: Removed the toolbarWrapper element from PluginHeader and dropped toolbarWrapper from PluginHeaderDefinition.classNames. Toolbar layout styles now live on toolbar (.bui-PluginHeaderToolbar).
Migration: Update custom CSS that targeted .bui-PluginHeaderToolbarWrapper to use .bui-PluginHeaderToolbar instead.
Affected components: PluginHeader
bcbb6eb: Made SearchAutocomplete background-aware. The input now adapts its background color based on its parent container's background level.
Affected components: SearchAutocomplete
8c2e24e: Added aria-hidden to the PluginHeader icon to prevent screen readers from announcing decorative plugin icons.
Affected components: PluginHeader
3d67aeb: Added prefers-reduced-motion support to Tab indicator animations. Users with reduced motion preferences will no longer see sliding transitions on the active and hover indicators.
Affected components: Tabs
cc4a682: Fixed the ButtonIcon's loading spinner animation
Affected components: ButtonIcon
adcdd2f: Simplified the Menu component's item structure by removing the inner wrapper element and applying styles directly to the menu item, improving DOM clarity.
Affected components: Menu
0257ada: Added react-aria, react-stately, @react-aria/interactions, @react-stately/layout, and @react-stately/overlays as dependencies.
Updated dependencies
d7c67cd: BREAKING: The setting auth.omitIdentityTokenOwnershipClaim has had its default value switched to true.
With this setting Backstage user tokens issued by the auth backend will no longer contain an ent claim - the one with the user's ownership entity refs. This means that tokens issued in large orgs no longer risk hitting HTTP header size limits.
To get ownership info for the current user, code should use the userInfo core service. In practice code will typically already conform to this since the ent claim has not been readily exposed in any other way for quite some time. But code which explicitly decodes Backstage tokens - which is strongly discouraged - may be affected by this change.
The setting will remain for some time to allow it to be set back to false if need be, but it will be removed entirely in a future release.
wait-for-expect to ^4.0.0.wait-for-expect to ^4.0.0.undici from 7.22.0 to 7.24.0create-app template: reorganizing sidebar items, removing redundant config and code, and adding a documentation example.@backstage/cli-module-new dependency from the next-app template, since it is already included through @backstage/cli-defaults.apis to BootstrapSpecializedApp and FinalizedSpecializedApp types.titleLink prop to PageLayoutProps so the plugin header title can link back to the plugin root.defineParams callback from PluginHeaderActionBlueprint. It still works, but is no longer required.peer-deps command.PageLayout swap to pass a clickable titleLink on the PluginHeader, resolved from the plugin's root route ref.PluginHeaderActionBlueprint usage to pass params as a plain object.EntityHeader extension, so the page layout header was redundant.getProcessableEntities method used SELECT ... FOR UPDATE SKIP LOCKED to prevent concurrent processors from claiming the same rows, but the call was not wrapped in a transaction, so the row locks were released before the subsequent UPDATE executed. This allowed multiple replicas to select and update overlapping rows, causing PostgreSQL deadlock errors (code 40P01).wait-for-expect to ^4.0.0.type-fest dev dependency, replacing its PartialDeep import with a local helper type in tests.b6f1fae: The unprocessed entities view is now primarily intended for use as a tab within the DevTools plugin. The standalone page is still available but disabled by default. To re-enable it, add the following to your app-config.yaml:
app:
extensions:
- page:catalog-unprocessed-entities
Updated dependencies
wait-for-expect to ^4.0.0.wait-for-expect to ^4.0.0.wait-for-expect to ^4.0.0.flatted from 3.4.1 to 3.4.2wait-for-expect to ^4.0.0.Header and Container instead of legacy Page/Content/ContentHeader wrappers. Added a SupportButton as a plugin header action. Changed plugin title to "Documentation" and icon to RiArticleLine.