21074 Commits

Author SHA1 Message Date
1337 e907ba6fe1 Merge branch 'backstage:master' into feature/catalog-export 2026-04-22 09:17:13 +02:00
github-actions[bot] 1cc86bee1c Version Packages (next) 2026-04-21 15:07:43 +00:00
Charles de Dreuille 50a66a9183 Merge pull request #33909 from backstage/cursor/add-date-range-picker
feat(ui): add DateRangePicker component
2026-04-21 15:54:38 +01:00
Fredrik Adelöw 03311e33da Make NotificationDescription a swappable component
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
2026-04-21 16:35:29 +02:00
Fredrik Adelöw e5e7700c7b Merge pull request #34001 from backstage/freben/facets-perf
catalog-backend: fix facets endpoint performance regression
2026-04-21 09:59:56 +02:00
1337 7348cc16fb Merge branch 'backstage:master' into feature/catalog-export 2026-04-20 20:14:38 +02:00
Charles de Dreuille c48da5c93d Merge branch 'master' into charlesdedreuille/act-355-header-improvements 2026-04-20 18:07:12 +01:00
Johan Persson e8a1a35714 feat(ui): add isPending prop and deprecate loading
Add `isPending` prop to Alert, Button, ButtonIcon, Table, and
TableRoot, aligning with React Aria naming conventions. The
`loading` prop is deprecated but remains functional as an alias.

CSS selectors now target `data-ispending` instead of `data-loading`
for pending state styling. The `data-loading` attribute is still
emitted for backward compatibility.

Internal Table hooks (`PaginationResult`, `UsePageCacheResult`)
renamed `loading` to `isPending`. The `useTable` hook returns both
`isPending` and `loading` on `tableProps` to preserve backward
compatibility.

Updated docs-ui documentation and stories accordingly.

Signed-off-by: Johan Persson <johanopersson@gmail.com>
2026-04-20 17:36:21 +02:00
Johan Persson df705bbdbf fix(ui): preserve external hrefs in BUI link components
When the app was served under a non-root base path, BUI link
components rewrote absolute `href` values as in-app paths — e.g.
`https://example.com` became `/basename/https:/example.com` —
because every href was passed through react-router's `useHref`,
which treats all strings as relative paths.

External URLs (`http://`, `https://`, `//`, `mailto:`, `tel:`)
now bypass href resolution. Internal hrefs are normalized to
their canonical pre-basename form in `useDefinition`, so
downstream resolution by react-router's `useHref` (for
rendering) and `navigate` (for click-navigation) adds the
basename exactly once.

Signed-off-by: Johan Persson <johanopersson@gmail.com>
2026-04-20 17:28:04 +02:00
Patrik Oldsberg 357d63949e Fix lockfile dependency removal detection in PackageGraph
The `otherGraph` variable in `listChangedPackages` was incorrectly
created from `thisLockfile` instead of `otherLockfile`, making the
merged dependency graph a duplicate of the current one. This meant
that dependencies only present in the old lockfile were never added
to the graph, so transitive removals could not be detected.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-04-20 16:37:26 +02:00
Fredrik Adelöw cf195de72c catalog-backend: fix facets endpoint performance regression
Route the EXISTS-based filters through final_entities (one row per
entity) instead of correlating against the search table directly.
This avoids the pathological case where correlated subqueries scan
the much larger search table for every row in the outer facets query.

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-20 14:02:02 +02:00
MT Lewis 7192e84cad Merge pull request #33948 from backstage/flex-item-props
ui: add support for flex-item props to generic layout components
2026-04-20 09:54:14 +01:00
Fredrik Adelöw e6f30e028a Merge pull request #33993 from backstage/freben/fix-scheduler-sleep
fix(scheduler): handle setTimeout overflow for long sleep durations
2026-04-20 09:47:11 +02:00
Charles de Dreuille c96e2b3445 feat(ui): add description, tags, and metadata props to Header
Add three new props to the Header component:
- `tags`: renders a row of text/link items above the title, separated by
  3×3px circle dividers
- `description`: renders a markdown string below the title with inline
  link support via react-markdown
- `metadata`: renders key-value pairs below the description with 20px gaps

Also deprecates the `breadcrumbs` prop for future removal.

Signed-off-by: Charles de Dreuille <charles.dedreuille@gmail.com>
Made-with: Cursor
2026-04-19 09:48:56 +02:00
Charles de Dreuille 401916d55b feat(ui): add DateRangePicker component
Adds a new DateRangePicker component to @backstage/ui built on React Aria,
featuring a custom field group with two DateInput fields and a calendar
trigger, a RangeCalendar popover with proper range selection visuals
(solid circles for start/end, transparent solid fill for in-range cells
with row-boundary rounding), and full BUI token usage including bg
consumer auto-increment. Includes Storybook stories and a docs-ui page.

Signed-off-by: Charles de Dreuille <charles.dedreuille@gmail.com>
Made-with: Cursor
2026-04-19 06:38:19 +02:00
Fredrik Adelöw 415e30b489 Add changeset
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-18 22:33:41 +02:00
Fredrik Adelöw 89d324840c fix(scheduler): handle setTimeout overflow for long sleep durations
Node.js setTimeout uses a 32-bit signed integer for the delay, so
values larger than 2^31-1 ms (~24.8 days) cause the callback to fire
immediately. Fix by chunking the wait into segments of at most 2^30 ms.

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-18 15:30:07 +02:00
the-serious-programmer 82cf16f63c feat: catalog export feature
Signed-off-by: the-serious-programmer <19777147+the-serious-programmer@users.noreply.github.com>
2026-04-18 14:29:30 +02:00
Justin Bryant ff13613d32 Merge branch 'master' of github.com:backstage/backstage
Signed-off-by: Justin Bryant <justintbry@gmail.com>
2026-04-17 17:32:16 -04:00
Justin Bryant 6a73fff696 fix(SecureTemplater): implement PR suggestions
Signed-off-by: Justin Bryant <justintbry@gmail.com>
2026-04-17 17:26:10 -04:00
Justin Bryant c78b3b68f6 chore: add changeset
Signed-off-by: Justin Bryant <justintbry@gmail.com>
2026-04-17 17:26:10 -04:00
MT Lewis 62cc936894 ui: fix organization of .changeset/funny-areas-rescue.md
Co-authored-by: Johan Persson <johanopersson@gmail.com>
Signed-off-by: MT Lewis <mtlewis@users.noreply.github.com>
2026-04-17 17:46:04 +01:00
Johan Persson c6fc76f532 fix(ui): prevent hidden Tabs tree from stomping active indicator opacity
React Aria's `CollectionBuilder` renders `TabList`'s children into both a
hidden collection-building tree and the real DOM. The hidden instance of
`TabsIndicators` sits outside the `TabListStateContext` provider, so its
`state` is `null` — causing its `updateCSSVariables` effect to hit the
`else` branch and write `--active-tab-opacity: 0` to the `tabsRef` DOM
element that the real instance also writes to. Under the right render
ordering, this hidden write lands after the real instance's `opacity: 1`
and makes the active indicator disappear on uncontrolled Tabs.

Guard `updateCSSVariables` with an early return when `state == null` so
the hidden instance never writes to the shared DOM element.

Signed-off-by: Johan Persson <johanopersson@gmail.com>
2026-04-17 14:18:22 +02:00
Patrik Oldsberg 64b186f465 Merge pull request #33962 from backstage/rugvip/remove-unused-getgithubintegrationconfig
catalog-import: 🧹
2026-04-17 13:07:27 +02:00
Fredrik Adelöw f9bfb91778 enter prerelease mode
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
2026-04-17 12:45:55 +02:00
Johan Persson e2d9831352 fix: clamp React Aria dependency ranges to patch-only updates
Changed version ranges for react-aria, react-aria-components, and
react-stately from `^` (minor) to `~` (patch) across all consuming
packages to prevent unintended minor version upgrades.

Also aligned app-visualizer's react-aria-components from 1.14 to 1.17.

Signed-off-by: Johan Persson <johanopersson@gmail.com>
2026-04-17 11:49:34 +02:00
MT Lewis 8bb33cd674 ui: add affected components to changeset
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: MT Lewis <mtlewis@users.noreply.github.com>
2026-04-17 10:25:56 +01:00
Patrik Oldsberg 45da25f948 Merge pull request #33957 from backstage/rugvip/delegate-attach-mock-api-factory
frontend-test-utils: remove internal mockWithApiFactory in favor of attachMockApiFactory
2026-04-17 10:43:41 +02:00
Patrik Oldsberg b16ae3cea7 Merge pull request #33955 from backstage/rugvip/deduplicate-joinpaths-in-frontend-app-api-routing
frontend-app-api: deduplicate joinPaths utility in routing
2026-04-17 10:43:26 +02:00
Patrik Oldsberg d9264ed271 Merge pull request #33952 from backstage/rugvip/zod-v3-config-schema-docs
frontend-plugin-api: clarify that zod v3 does not support configSchema
2026-04-17 10:34:20 +02:00
Patrik Oldsberg 0c298f7cf1 Remove internal mockWithApiFactory in favor of attachMockApiFactory
Rather than having the public attachMockApiFactory delegate to an internal
mockWithApiFactory helper, move the implementation directly into
attachMockApiFactory and use it everywhere.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-04-17 10:23:14 +02:00
Patrik Oldsberg f79eaf268c Add changeset for frontend-app-api routing cleanup
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-04-17 10:18:36 +02:00
Patrik Oldsberg 39eb61b28c Add changeset for catalog-import internal refactor
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-04-17 10:15:34 +02:00
Patrik Oldsberg 4db1b03cb9 Merge pull request #33891 from backstage/rugvip/move-registermswtesthooks-to-test-utils
integration: use registerMswTestHooks from backend-test-utils
2026-04-16 22:02:20 +02:00
Patrik Oldsberg ceb4e04ba3 Merge pull request #33721 from aurnik/fix/home-widget-drag-resize
Fix home page widgets not being draggable/resizable after first save
2026-04-16 21:58:59 +02:00
Patrik Oldsberg a6bbb0ae2d Merge pull request #33930 from backstage/remove-portable-schema-deprecated-prop
frontend-plugin-api: remove deprecated PortableSchema .schema property
2026-04-16 21:51:39 +02:00
Patrik Oldsberg 264be8b5c1 Merge pull request #33649 from erikmiller-gusto/feat/slack-scoped-message-updates
feat(notifications-slack): add scope-based message update support
2026-04-16 21:51:23 +02:00
Patrik Oldsberg 8738203119 frontend-plugin-api: remove deprecated PortableSchema .schema property
Remove the deprecated property form of PortableSchema.schema, keeping
only the method form. The schema member is now a plain method that must
be called as schema() rather than accessed as a property.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-04-16 20:56:02 +02:00
Patrik Oldsberg df1e14e369 Merge pull request #33949 from secustor/chore/migrate-module-federation-v2
chore: migrate module-federation to v2
2026-04-16 19:07:18 +02:00
Patrik Oldsberg 085133fde0 Bump zod dependency to v4 for packages using configSchema
These packages use `configSchema` with `zod/v4` imports and require the
full Zod v4 package for JSON Schema support. The dependency range is
narrowed from `^3.25.76 || ^4.0.0` to `^4.0.0`.

Also adds a `.patches` entry for the patch release.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-04-16 18:44:51 +02:00
Patrik Oldsberg 72a552f0db frontend-plugin-api: clarify that zod v3 /v4 subpath does not support configSchema
Update error messages, deprecation warnings, migration docs, release
notes, and changelogs to reflect that the zod/v4 subpath export from
the Zod v3 package does not support JSON Schema conversion via the
Standard Schema interface. Users must fully migrate to the zod v4
package (zod@^4.0.0) to use configSchema.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-04-16 17:23:54 +02:00
Fredrik Adelöw 7b4ea63b38 Merge pull request #33945 from backstage/freben/add-missing-deps
chore: add missing transitive dependencies
2026-04-16 16:54:33 +02:00
MT Lewis a2814693fa ui: add changeset for new flex-item props
Signed-off-by: MT Lewis <mtlewis@users.noreply.github.com>
2026-04-16 15:10:08 +01:00
secustor 41070b89c5 chore: migrate module-federation to v2
Signed-off-by: secustor <sebastian@poxhofer.at>
2026-04-16 15:15:04 +02:00
Fredrik Adelöw db03264327 Revert "chore: unpin @rjsf/utils version ranges"
This reverts commit ad6c40e86a.

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-16 14:18:25 +02:00
Fredrik Adelöw ad6c40e86a chore: unpin @rjsf/utils version ranges
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-16 14:17:17 +02:00
Johan Persson 8d1e093ae8 feat(techdocs): make sidebar positioning configurable via CSS custom properties (#33908)
* feat(techdocs): make sidebar positioning configurable via CSS custom properties

Replace hardcoded Backstage app sidebar widths (224px/72px) in the
TechDocs layout CSS with CSS custom properties that inherit through
the shadow DOM boundary, allowing apps with custom sidebar widths
to override the defaults.

- `--techdocs-sidebar-closed-offset-pinned` (default: 224px)
- `--techdocs-sidebar-closed-offset-collapsed` (default: 72px)
- `--techdocs-sidebar-open-translate` (default: 16rem)

Also extract all magic values into named constants.

Signed-off-by: Johan Persson <johanopersson@gmail.com>

* Add PR #33908 to patch release

Signed-off-by: Johan Persson <johanopersson@gmail.com>

---------

Signed-off-by: Johan Persson <johanopersson@gmail.com>
2026-04-16 08:02:54 -04:00
Fredrik Adelöw 3846774beb chore: add missing transitive dependencies
Add dependencies that were only available transitively through other
packages but were being imported directly:

- csstype and copy-to-clipboard in @backstage/core-components
- @storybook/react-vite in @backstage/ui
- react-aria-components in @backstage/plugin-notifications
- @octokit/core in @backstage/plugin-scaffolder-backend-module-github
- @rjsf/utils in example-app-legacy

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-16 13:28:21 +02:00
Fredrik Adelöw 0c5e41f984 chore: remove unused dependencies
Remove 30 dependencies across 18 packages that have no imports in
source code and are not peer dependencies of any other dependency.

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-16 11:52:59 +02:00
Fredrik Adelöw 744fa1fb8b chore: remove duplicate dependencies/devDependencies entries
Remove duplicated entries that appeared in both dependencies and
devDependencies across 10 packages. Also remove zod entirely from
core-compat-api as it is unused.

Signed-off-by: Fredrik Adelöw <freben@spotify.com>
Made-with: Cursor
2026-04-16 10:43:07 +02:00