diff --git a/.changeset/afraid-items-drum.md b/.changeset/afraid-items-drum.md
deleted file mode 100644
index 94ddd608cd..0000000000
--- a/.changeset/afraid-items-drum.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli-node': patch
----
-
-Updated to use new utilities from `@backstage/cli-common`.
diff --git a/.changeset/alert-api-replay.md b/.changeset/alert-api-replay.md
deleted file mode 100644
index b41ec091a3..0000000000
--- a/.changeset/alert-api-replay.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/core-app-api': patch
----
-
-Added replay functionality to `AlertApiForwarder` to buffer and replay recent alerts to new subscribers, preventing missed alerts that were posted before subscription.
diff --git a/.changeset/all-socks-taste.md b/.changeset/all-socks-taste.md
deleted file mode 100644
index 377782c2f9..0000000000
--- a/.changeset/all-socks-taste.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder-backend-module-gitlab': minor
----
-
-In the `gitlabRepoPush` action, add 'auto' possibility for `commitAction` input.
diff --git a/.changeset/angry-views-win.md b/.changeset/angry-views-win.md
deleted file mode 100644
index 9d406280a7..0000000000
--- a/.changeset/angry-views-win.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-events-backend-module-kafka': minor
----
-
-Added support for multiple named instances in `kafkaConsumingEventPublisher` configuration. The previous single configuration format is still supported for backward compatibility.
diff --git a/.changeset/better-ghosts-tell.md b/.changeset/better-ghosts-tell.md
new file mode 100644
index 0000000000..af66b4fc6e
--- /dev/null
+++ b/.changeset/better-ghosts-tell.md
@@ -0,0 +1,5 @@
+---
+'@backstage/ui': patch
+---
+
+Fixes app background color on dark mode.
diff --git a/.changeset/blue-signs-fry.md b/.changeset/blue-signs-fry.md
deleted file mode 100644
index 26861e3b7e..0000000000
--- a/.changeset/blue-signs-fry.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-mcp-actions-backend': patch
----
-
-Added `@cfworker/json-schema` as a dependency to this package part of the `@modelcontextprotocol/sdk` bump as it's required in the types
diff --git a/.changeset/bright-lions-unite.md b/.changeset/bright-lions-unite.md
deleted file mode 100644
index e9bef02e10..0000000000
--- a/.changeset/bright-lions-unite.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': minor
----
-
-Provide `--no-node-snapshot` by default when running the `package start` or `package test`. You can disable this behavior by providing `NODE_OPTIONS='--node-snapshot'`.
diff --git a/.changeset/bumpy-pens-swim.md b/.changeset/bumpy-pens-swim.md
deleted file mode 100644
index 462045e462..0000000000
--- a/.changeset/bumpy-pens-swim.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/integration': patch
----
-
-Added support for using a GitHub App installation to generate tokens for public repository access when the `publicAccess` option is enabled. When all other authentication methods fail (e.g., the app is not installed in that organization), the provider will now use an available installation to generate a token that can be used to access public repositories as read only.
diff --git a/.changeset/bumpy-planets-go.md b/.changeset/bumpy-planets-go.md
deleted file mode 100644
index 5477711c1a..0000000000
--- a/.changeset/bumpy-planets-go.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/ui': patch
----
-
-Fixed Checkbox indicator showing checkmark color when unchecked.
-
-Affected components: Checkbox
diff --git a/.changeset/chatty-sides-wear.md b/.changeset/chatty-sides-wear.md
deleted file mode 100644
index 33937a1286..0000000000
--- a/.changeset/chatty-sides-wear.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog-graph': patch
----
-
-Fixed zoom out description (replace `&` with &)
diff --git a/.changeset/chilly-bikes-rule.md b/.changeset/chilly-bikes-rule.md
deleted file mode 100644
index 894999cf56..0000000000
--- a/.changeset/chilly-bikes-rule.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@techdocs/cli': patch
----
-
-Updated to use new utilities from `@backstage/cli-common`.
diff --git a/.changeset/chilly-hotels-walk.md b/.changeset/chilly-hotels-walk.md
deleted file mode 100644
index e9b1ff66ba..0000000000
--- a/.changeset/chilly-hotels-walk.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-search-backend-node': minor
----
-
-Improving method that search tokenizer breaks apart entity names
diff --git a/.changeset/chilly-waves-relate.md b/.changeset/chilly-waves-relate.md
deleted file mode 100644
index 2e78f9245e..0000000000
--- a/.changeset/chilly-waves-relate.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-'@backstage/cli': minor
----
-
-Switched the default module resolution to `bundler` and the `module` setting to `ES2020`.
-
-You may need to bump some dependencies as part of this change and fix imports in code. The most common source of this is that type checking will now consider the `exports` field in `package.json` when resolving imports. This in turn can break older versions of packages that had incompatible `exports` fields. Generally these issues will have already been fixed in the upstream packages.
-
-You might be tempted to use `--skipLibCheck` to hide issues due to this change, but it will weaken the type safety of your project. If you run into a large number of issues and want to keep the old behavior, you can reset the `moduleResolution` and `module` settings your own `tsconfig.json` file to `node` and `ESNext` respectively. But keep in mind that the `node` option will be removed in future versions of TypeScript.
-
-A future version of Backstage will make these new settings mandatory, as we move to rely on the `exports` field for type resolution in packages, rather than the `typesVersions` field.
diff --git a/.changeset/clean-toys-reply.md b/.changeset/clean-toys-reply.md
deleted file mode 100644
index 66002903ab..0000000000
--- a/.changeset/clean-toys-reply.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-auth-node': patch
----
-
-remove leading dot in auth cookie cleanup call
diff --git a/.changeset/early-doors-visit.md b/.changeset/clever-streets-roll.md
similarity index 50%
rename from .changeset/early-doors-visit.md
rename to .changeset/clever-streets-roll.md
index 41cd9e92b8..7efa961533 100644
--- a/.changeset/early-doors-visit.md
+++ b/.changeset/clever-streets-roll.md
@@ -2,4 +2,4 @@
'@backstage/backend-defaults': patch
---
-Allow configuration of the `referrerPolicy`
+Implementing `readTree` for `GoogleGcsReader`
diff --git a/.changeset/cold-dogs-study.md b/.changeset/cold-dogs-study.md
new file mode 100644
index 0000000000..a27309fc15
--- /dev/null
+++ b/.changeset/cold-dogs-study.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-techdocs-backend': patch
+---
+
+Some AWS `publisher` config options such as `region`, `endpoint`, `accountId` are now marked as `@visibility backend` instead of `secret`.
diff --git a/.changeset/common-coins-stare.md b/.changeset/common-coins-stare.md
deleted file mode 100644
index 0bd0078cf9..0000000000
--- a/.changeset/common-coins-stare.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/ui': patch
----
-
-Fixed `ButtonIcon` incorrectly applying `className` to inner elements instead of only the root element.
-
-Affected components: ButtonIcon
diff --git a/.changeset/crazy-hornets-spend.md b/.changeset/crazy-hornets-spend.md
deleted file mode 100644
index 4db99675ac..0000000000
--- a/.changeset/crazy-hornets-spend.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-'@backstage/plugin-catalog-graph': patch
-'@backstage/plugin-api-docs': patch
-'@backstage/plugin-techdocs': patch
-'@backstage/plugin-catalog': patch
-'@backstage/plugin-search': patch
-'@backstage/plugin-app': patch
-'@backstage/plugin-org': patch
----
-
-Minor extension type updates after frontend API bump
diff --git a/.changeset/create-app-1764689798.md b/.changeset/create-app-1766498726.md
similarity index 100%
rename from .changeset/create-app-1764689798.md
rename to .changeset/create-app-1766498726.md
diff --git a/.changeset/create-app-1767101113.md b/.changeset/create-app-1767101113.md
new file mode 100644
index 0000000000..b50d431d4b
--- /dev/null
+++ b/.changeset/create-app-1767101113.md
@@ -0,0 +1,5 @@
+---
+'@backstage/create-app': patch
+---
+
+Bumped create-app version.
diff --git a/.changeset/curvy-things-call.md b/.changeset/curvy-things-call.md
deleted file mode 100644
index d64f1a14fa..0000000000
--- a/.changeset/curvy-things-call.md
+++ /dev/null
@@ -1,21 +0,0 @@
----
-'@backstage/plugin-notifications-backend-module-email': patch
----
-
-SES config for the notification email processor now supports utilizing an ARN for the SES identity when sending an email after the SES SDK V2 update.
-
-The `sesConfig.fromArn` will set the `fromEmailAddressIdentityArn` option for the SES `SendEmailCommand`. The `sesConfig.sourceArn` field is removed since no equivalent option is available in the send email command options. Setting `sesConfig.sourceArn` will have no effect and log a warning. Example changes:
-
-```diff
-notifications:
- processors:
- email:
- transportConfig:
- transport: "ses"
- region: "us-west-2"
- sender: "sender@mycompany.com"
- replyTo: "no-reply@mycompany.com"
- sesConfig:
-- sourceArn: "arn:aws:ses:us-west-2:123456789012:identity/example.com"
- fromArn: "arn:aws:ses:us-west-2:123456789012:identity/example.com"
-```
diff --git a/.changeset/dependabot-0d8f6de.md b/.changeset/dependabot-0d8f6de.md
deleted file mode 100644
index b0a3955f2d..0000000000
--- a/.changeset/dependabot-0d8f6de.md
+++ /dev/null
@@ -1,47 +0,0 @@
----
-'@backstage/backend-defaults': patch
-'@backstage/backend-dynamic-feature-service': patch
-'@backstage/backend-openapi-utils': patch
-'@backstage/backend-test-utils': patch
-'@backstage/cli': patch
-'@backstage/plugin-app-backend': patch
-'@backstage/plugin-app-node': patch
-'@backstage/plugin-auth-backend-module-atlassian-provider': patch
-'@backstage/plugin-auth-backend-module-auth0-provider': patch
-'@backstage/plugin-auth-backend-module-aws-alb-provider': patch
-'@backstage/plugin-auth-backend-module-azure-easyauth-provider': patch
-'@backstage/plugin-auth-backend-module-bitbucket-provider': patch
-'@backstage/plugin-auth-backend-module-cloudflare-access-provider': patch
-'@backstage/plugin-auth-backend-module-gcp-iap-provider': patch
-'@backstage/plugin-auth-backend-module-gitlab-provider': patch
-'@backstage/plugin-auth-backend-module-guest-provider': patch
-'@backstage/plugin-auth-backend-module-microsoft-provider': patch
-'@backstage/plugin-auth-backend-module-oidc-provider': patch
-'@backstage/plugin-auth-backend-module-okta-provider': patch
-'@backstage/plugin-auth-backend-module-onelogin-provider': patch
-'@backstage/plugin-auth-backend-module-openshift-provider': patch
-'@backstage/plugin-auth-backend-module-pinniped-provider': patch
-'@backstage/plugin-auth-backend': patch
-'@backstage/plugin-auth-node': patch
-'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch
-'@backstage/plugin-catalog-backend': patch
-'@backstage/plugin-devtools-backend': patch
-'@backstage/plugin-events-backend': patch
-'@backstage/plugin-events-node': patch
-'@backstage/plugin-gateway-backend': patch
-'@backstage/plugin-kubernetes-backend': patch
-'@backstage/plugin-mcp-actions-backend': patch
-'@backstage/plugin-notifications-backend': patch
-'@backstage/plugin-permission-backend': patch
-'@backstage/plugin-permission-node': patch
-'@backstage/plugin-proxy-backend': patch
-'@backstage/plugin-scaffolder-backend': patch
-'@backstage/plugin-search-backend': patch
-'@backstage/plugin-signals-backend': patch
-'@backstage/plugin-signals-node': patch
-'@backstage/plugin-techdocs-backend': patch
-'@backstage/plugin-techdocs-node': patch
-'@backstage/plugin-user-settings-backend': patch
----
-
-chore(deps): bump `express` from 4.21.2 to 4.22.0
diff --git a/.changeset/dependabot-5e654fe.md b/.changeset/dependabot-5e654fe.md
deleted file mode 100644
index 93563cffc6..0000000000
--- a/.changeset/dependabot-5e654fe.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/backend-defaults': patch
----
-
-build(deps): bump `node-forge` from 1.3.1 to 1.3.2
diff --git a/.changeset/dependabot-aed8e01.md b/.changeset/dependabot-aed8e01.md
new file mode 100644
index 0000000000..8606ea8b91
--- /dev/null
+++ b/.changeset/dependabot-aed8e01.md
@@ -0,0 +1,5 @@
+---
+'@backstage/ui': patch
+---
+
+build(deps-dev): bump `storybook` from 10.1.9 to 10.1.10
diff --git a/.changeset/early-carpets-rush.md b/.changeset/early-carpets-rush.md
deleted file mode 100644
index dbdc5410c9..0000000000
--- a/.changeset/early-carpets-rush.md
+++ /dev/null
@@ -1,16 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Add missing peer/dev dependencies to the frontend plugin template.
-
-`react-dom` was not declared as a peer dependency, causing module resolution
-errors when generating plugins outside a Backstage monorepo. This adds
-`react-dom` to `peerDependencies` (for consuming apps) and `devDependencies`
-(for local development). `react-router-dom` is also added to `peerDependencies` (for consuming apps) and `devDependencies`
-to support routing during plugin development.
-
-Fixes:
-
-- Module not found: Can't resolve 'react-dom'
-- Module not found: Can't resolve 'react-router-dom'
diff --git a/.changeset/error-boundary-api.md b/.changeset/error-boundary-api.md
deleted file mode 100644
index 74803f1dc0..0000000000
--- a/.changeset/error-boundary-api.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/frontend-plugin-api': patch
----
-
-Added a new `errorPresentation` prop to `ExtensionBoundary` to control how errors are presented to the user. The default is `'error-display'`, which is the current behavior of showing the error in the `ErrorDisplay` component. The new option is `'error-api'`, posts errors to the `ErrorApi` and does not allow retries.
-
-The `AppRootElementBlueprint` now wraps its element in an `ErrorBoundary` using the new `'error-api'` presentation mode.
diff --git a/.changeset/every-bears-add.md b/.changeset/every-bears-add.md
new file mode 100644
index 0000000000..83c6d6b06d
--- /dev/null
+++ b/.changeset/every-bears-add.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli': patch
+---
+
+Bump `@swc/core` to support `ES2023` and `ES2024`
diff --git a/.changeset/fair-lines-warn.md b/.changeset/fair-lines-warn.md
deleted file mode 100644
index ffd387efbf..0000000000
--- a/.changeset/fair-lines-warn.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@backstage/plugin-auth-backend-module-github-provider': minor
-'@backstage/plugin-catalog-backend-module-github': minor
----
-
-Added the `github.com/user-id` annotation to store GitHub's user ID (immutable) in user entities. Also includes addition of the `userIdMatchingUserEntityAnnotation` sign-in resolver that matches users by the new ID.
diff --git a/.changeset/famous-jars-lose.md b/.changeset/famous-jars-lose.md
deleted file mode 100644
index 4070701e4e..0000000000
--- a/.changeset/famous-jars-lose.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/ui': patch
----
-
-Fixed Table Row component to correctly handle cases where no `href` is provided, preventing unnecessary router provider wrapping and fixing the cursor incorrectly showing as a pointer despite the element not being a link.
-
-Affected components: Row
diff --git a/.changeset/fifty-coats-feel.md b/.changeset/fifty-coats-feel.md
deleted file mode 100644
index 0e3425a505..0000000000
--- a/.changeset/fifty-coats-feel.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-kubernetes-react': patch
----
-
-Enabled a pod terminal at GKE
diff --git a/.changeset/fifty-lights-marry.md b/.changeset/fifty-lights-marry.md
deleted file mode 100644
index 423ef89721..0000000000
--- a/.changeset/fifty-lights-marry.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch
-'@backstage/plugin-kubernetes-backend': patch
-'@backstage/backend-defaults': patch
-'@backstage/plugin-scaffolder-react': patch
-'@backstage/integration': patch
----
-
-Updated luxon types
diff --git a/.changeset/fine-eagles-sleep.md b/.changeset/fine-eagles-sleep.md
deleted file mode 100644
index 0af6d0dfc0..0000000000
--- a/.changeset/fine-eagles-sleep.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/backend-app-api': minor
----
-
-Introduced backend startup result tracking and error handling. The `Backend.start()` method now returns a `BackendStartupResult` with detailed success/failure status and timing information for all plugins and modules. When startup fails, a `BackendStartupError` is thrown that includes the complete startup results, making it easier to diagnose which plugins or modules failed.
-
-This also improves the default error message when backend startup fails, and of course makes it possible to craft your own custom error reporting based on the startup results.
diff --git a/.changeset/flat-pillows-rush.md b/.changeset/flat-pillows-rush.md
deleted file mode 100644
index bb64013f62..0000000000
--- a/.changeset/flat-pillows-rush.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/frontend-plugin-api': patch
----
-
-Fixed a versioning conflict that could result in a `.withContext` is not a function error.
diff --git a/.changeset/floppy-bobcats-serve.md b/.changeset/floppy-bobcats-serve.md
deleted file mode 100644
index d698e1482c..0000000000
--- a/.changeset/floppy-bobcats-serve.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-'@backstage/core-components': patch
----
-
-Fixed bug in the `LogViewer` component where shift + click always opened a new window instead of just changing the selection.
-
-In addition, improved the `LogViewer` component by a few usability enhancements:
-
-- Added support for multiple selections using cmd/ctrl + click
-- Improved the generated hash that is added to the URL to also support ranges & multiple selections
-- Added an hover effect & info tooltip to the "Copy to clipboard" button to indicate its functionality
-- Added some color and a separator to the line numbers to improve readability
diff --git a/.changeset/four-peaches-train.md b/.changeset/four-peaches-train.md
deleted file mode 100644
index 81b35589c1..0000000000
--- a/.changeset/four-peaches-train.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@backstage/backend-defaults': patch
-'@backstage/backend-plugin-api': patch
----
-
-**BREAKING ALPHA**: The old `instanceMetadataService` has been removed from alpha. Please switch over to using the stable `coreServices.rootInstanceMetadata` and related types instead, available from `@backstage/backend-plugin-api`.
diff --git a/.changeset/fruity-rivers-arrive.md b/.changeset/fruity-rivers-arrive.md
deleted file mode 100644
index a816946bcc..0000000000
--- a/.changeset/fruity-rivers-arrive.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder-backend': minor
----
-
-Add `defaultEnvironment` config to scaffolder to enable more flexible and custom templates. Now it's possible enable access to default parameters and secrets in templates, improving security and reducing complexity.
diff --git a/.changeset/fruity-words-melt.md b/.changeset/fruity-words-melt.md
deleted file mode 100644
index 0f02acee2b..0000000000
--- a/.changeset/fruity-words-melt.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-techdocs-module-addons-contrib': patch
----
-
-Updated tests to match test-utils change
diff --git a/.changeset/full-needles-drive.md b/.changeset/full-needles-drive.md
deleted file mode 100644
index d0d7a59551..0000000000
--- a/.changeset/full-needles-drive.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@backstage/plugin-kubernetes-backend': minor
-'@backstage/plugin-kubernetes-node': minor
----
-
-Add possibility to extends Kubernetes REST API. Add fetcher to parameters for custom objects provider
diff --git a/.changeset/funny-hornets-peel.md b/.changeset/funny-hornets-peel.md
deleted file mode 100644
index 2af6702295..0000000000
--- a/.changeset/funny-hornets-peel.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder-backend': patch
----
-
-Updated `isolated-vm` to `6.0.1`
diff --git a/.changeset/funny-papayas-rest.md b/.changeset/funny-papayas-rest.md
deleted file mode 100644
index 95f52966ec..0000000000
--- a/.changeset/funny-papayas-rest.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@backstage/repo-tools': patch
-'@backstage/codemods': patch
----
-
-Updated to use new utilities from `@backstage/cli-common`.
diff --git a/.changeset/fuzzy-phones-own.md b/.changeset/fuzzy-phones-own.md
deleted file mode 100644
index 61725d1f1d..0000000000
--- a/.changeset/fuzzy-phones-own.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-'@backstage/plugin-catalog-backend-module-github-org': patch
-'@backstage/plugin-catalog-backend-module-github': patch
----
-
-Introduce new configuration option to exclude suspended users from GitHub Enterprise instances.
-
-When it’s set to true, suspended users won’t be returned when querying the organization users for GitHub Enterprise instances.
-Note that this option should be used only against GitHub Enterprise instances, the property does not exist in the github.com GraphQL schema, setting it will cause a schema validation error and the syncing of users will fail.
diff --git a/.changeset/fuzzy-rivers-travel.md b/.changeset/fuzzy-rivers-travel.md
deleted file mode 100644
index fa2c08a671..0000000000
--- a/.changeset/fuzzy-rivers-travel.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/frontend-plugin-api': patch
----
-
-Made the return type of `.withOverrides` to be simplified.
diff --git a/.changeset/fuzzy-trees-live.md b/.changeset/fuzzy-trees-live.md
deleted file mode 100644
index 84cec56fab..0000000000
--- a/.changeset/fuzzy-trees-live.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/core-components': patch
----
-
-long words like urls now breaks to new line on warning panels instead of overflowing the container
diff --git a/.changeset/gentle-results-lie.md b/.changeset/gentle-results-lie.md
deleted file mode 100644
index 0c53407db3..0000000000
--- a/.changeset/gentle-results-lie.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-techdocs': patch
----
-
-Fixed schema type for additionalAllowedURIProtocols
diff --git a/.changeset/gentle-singers-love.md b/.changeset/gentle-singers-love.md
deleted file mode 100644
index ed4372ee06..0000000000
--- a/.changeset/gentle-singers-love.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-app': patch
----
-
-Support to set `defaultLanguage` and `availableLanguages` for the app language API in the new frontend system
diff --git a/.changeset/gentle-trains-juggle.md b/.changeset/gentle-trains-juggle.md
deleted file mode 100644
index e8b1397180..0000000000
--- a/.changeset/gentle-trains-juggle.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@backstage/plugin-kubernetes-backend': patch
----
-
-Replace `@aws-sdk/signature-v4` with `@smithy/signature-v4`,
-as stated in the [package documentation](https://www.npmjs.com/package/@aws-sdk/signature-v4?activeTab=readme)
diff --git a/.changeset/great-files-shave.md b/.changeset/great-files-shave.md
deleted file mode 100644
index 271a8e8955..0000000000
--- a/.changeset/great-files-shave.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog-react': patch
----
-
-Fixed an issue where `EntityOwnerPicker` failed to filter options when the input text contained uppercase characters.
diff --git a/.changeset/green-lizards-boil.md b/.changeset/green-lizards-boil.md
deleted file mode 100644
index 640699e001..0000000000
--- a/.changeset/green-lizards-boil.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog-react': patch
----
-
-Use a versioned context for `useEntityList`, to better work with mixed `@backstage/plugin-catalog-react` versions.
diff --git a/.changeset/happy-bottles-invite.md b/.changeset/happy-bottles-invite.md
deleted file mode 100644
index 07fc222cad..0000000000
--- a/.changeset/happy-bottles-invite.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/backend-defaults': minor
----
-
-Move `better-sqlite3` from dependencies to peer dependencies
diff --git a/.changeset/happy-streets-dress.md b/.changeset/happy-streets-dress.md
deleted file mode 100644
index 46f4d798ed..0000000000
--- a/.changeset/happy-streets-dress.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/create-app': patch
----
-
-Updated engines to support Node 22 or 24
diff --git a/.changeset/honest-bears-itch.md b/.changeset/honest-bears-itch.md
deleted file mode 100644
index 4c0cd5f47e..0000000000
--- a/.changeset/honest-bears-itch.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/backend-test-utils': patch
----
-
-Switched `textextensions` dependency for `text-extensions`.
diff --git a/.changeset/hot-colts-float.md b/.changeset/hot-colts-float.md
new file mode 100644
index 0000000000..093dcfb12a
--- /dev/null
+++ b/.changeset/hot-colts-float.md
@@ -0,0 +1,7 @@
+---
+'@backstage/ui': patch
+---
+
+Fixed SearchField `startCollapsed` prop not working correctly in Backstage UI. The field now properly starts in a collapsed state, expands when clicked and focused, and collapses back when unfocused with no input. Also fixed CSS logic to work correctly in all layout contexts (flex row, flex column, and regular containers).
+
+Affected components: SearchField
diff --git a/.changeset/hungry-mugs-fall.md b/.changeset/hungry-mugs-fall.md
new file mode 100644
index 0000000000..4332d92cc3
--- /dev/null
+++ b/.changeset/hungry-mugs-fall.md
@@ -0,0 +1,5 @@
+---
+'@backstage/integration': patch
+---
+
+Implementing `ScmIntegration` for `GoogleGcs`
diff --git a/.changeset/kind-hoops-double.md b/.changeset/kind-hoops-double.md
deleted file mode 100644
index fd2f9f023f..0000000000
--- a/.changeset/kind-hoops-double.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/integration': patch
----
-
-Made the github urls case insensitive.
diff --git a/.changeset/large-planes-punch.md b/.changeset/large-planes-punch.md
deleted file mode 100644
index 3216653eb9..0000000000
--- a/.changeset/large-planes-punch.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/backend-defaults': patch
----
-
-Fix for `jose` types
diff --git a/.changeset/legal-cloths-spend.md b/.changeset/legal-cloths-spend.md
deleted file mode 100644
index 50d965307a..0000000000
--- a/.changeset/legal-cloths-spend.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-mcp-actions-backend': patch
----
-
-Clarify error handling in readme and update handleError.ts to include all backstage/errors
diff --git a/.changeset/legal-otters-punch.md b/.changeset/legal-otters-punch.md
deleted file mode 100644
index 2003492e29..0000000000
--- a/.changeset/legal-otters-punch.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/plugin-kubernetes-backend': patch
-'@backstage/plugin-kubernetes-common': patch
-'@backstage/plugin-kubernetes-react': patch
----
-
-Add Kubernetes Plugin Secrets Accordion with masked secret datas
diff --git a/.changeset/lemon-corners-hug.md b/.changeset/lemon-corners-hug.md
deleted file mode 100644
index b41c09c928..0000000000
--- a/.changeset/lemon-corners-hug.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-techdocs-node': patch
----
-
-There was an issue in the uploading of large size files to the AWS S3. We have modified the logic by adding retry along with multipart uploading functionality.
diff --git a/.changeset/loose-pets-slide.md b/.changeset/loose-pets-slide.md
deleted file mode 100644
index b8ec201f1c..0000000000
--- a/.changeset/loose-pets-slide.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-'@backstage/repo-tools': patch
----
-
-Updates OpenAPI generator templates to preserve original property names (like 'group-name', 'user-id') from OpenAPI specs when propertyNaming=original is specified. Previously, these were always converted to camelCase regardless of the propertyNaming setting.
-
-- Updates modelGeneric.mustache templates in both client and server generators
-- Updates modelTaggedUnion.mustache templates in both client and server generators
-- Uses {{baseName}} when available, falls back to {{name}} for backward compatibility
-- Maintains backward compatibility - no changes when propertyNaming=original is not used
diff --git a/.changeset/loud-yaks-watch.md b/.changeset/loud-yaks-watch.md
deleted file mode 100644
index b7ad65b9eb..0000000000
--- a/.changeset/loud-yaks-watch.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/repo-tools': patch
----
-
-Bump `@microsoft/api-documenter` and `@microsoft/api-extractor` to latest versions.
diff --git a/.changeset/lucky-days-hug.md b/.changeset/lucky-days-hug.md
deleted file mode 100644
index 4d76caa098..0000000000
--- a/.changeset/lucky-days-hug.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@backstage/plugin-kubernetes-react': patch
-'@backstage/plugin-kubernetes': patch
----
-
-add missing i18n support for kubernetes and kubernetes-react
diff --git a/.changeset/major-mangos-shine.md b/.changeset/major-mangos-shine.md
new file mode 100644
index 0000000000..f42fcf5d0e
--- /dev/null
+++ b/.changeset/major-mangos-shine.md
@@ -0,0 +1,5 @@
+---
+'@backstage/backend-openapi-utils': patch
+---
+
+Internal update to use native feature from our request validation library for handling base path determination.
diff --git a/.changeset/many-planes-join.md b/.changeset/many-planes-join.md
deleted file mode 100644
index 66107cd370..0000000000
--- a/.changeset/many-planes-join.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@backstage/core-app-api': patch
-'@backstage/test-utils': patch
----
-
-Internal update of translation imports.
diff --git a/.changeset/metal-boxes-laugh.md b/.changeset/metal-boxes-laugh.md
deleted file mode 100644
index 9a5ab24e0e..0000000000
--- a/.changeset/metal-boxes-laugh.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/core-plugin-api': patch
----
-
-The `useApp` and `useRouteRef` functions are now forwards compatible with the new frontend system. Along with the previous route reference changes this means that there is no longer a need to use `compatWrapper` from `@backstage/core-compat-api` to make code based on `@backstage/core-plugin-api` compatible with `@backstage/frontend-plugin-api` APIs.
diff --git a/.changeset/metal-humans-lose.md b/.changeset/metal-humans-lose.md
deleted file mode 100644
index f96d33a779..0000000000
--- a/.changeset/metal-humans-lose.md
+++ /dev/null
@@ -1,21 +0,0 @@
----
-'@backstage/plugin-catalog-unprocessed-entities': patch
-'@backstage/plugin-app-visualizer': patch
-'@backstage/plugin-catalog-import': patch
-'@backstage/plugin-catalog-graph': patch
-'@backstage/plugin-catalog-react': patch
-'@backstage/plugin-notifications': patch
-'@backstage/plugin-user-settings': patch
-'@backstage/plugin-kubernetes': patch
-'@backstage/plugin-scaffolder': patch
-'@backstage/plugin-api-docs': patch
-'@backstage/plugin-devtools': patch
-'@backstage/plugin-techdocs': patch
-'@backstage/plugin-catalog': patch
-'@backstage/plugin-search': patch
-'@backstage/plugin-home': patch
-'@backstage/plugin-app': patch
-'@backstage/plugin-org': patch
----
-
-Remove unnecessary use of `compatWrapper` and `convertLegacyRouteRef`(s) for the new frontend system.
diff --git a/.changeset/modern-taxes-start.md b/.changeset/modern-taxes-start.md
deleted file mode 100644
index 9fd7645570..0000000000
--- a/.changeset/modern-taxes-start.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli-common': patch
----
-
-Added new `run`, `runOutput`, and `runCheck` utilities to help run child processes in a safe and portable way.
diff --git a/.changeset/neat-pens-clean.md b/.changeset/neat-pens-clean.md
deleted file mode 100644
index aff67a2a10..0000000000
--- a/.changeset/neat-pens-clean.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/repo-tools': patch
----
-
-Properly create workspace in OS temporary directory for `generate-patch` command
diff --git a/.changeset/nice-humans-cry.md b/.changeset/nice-humans-cry.md
deleted file mode 100644
index c6119702b4..0000000000
--- a/.changeset/nice-humans-cry.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@backstage/plugin-scaffolder-backend': patch
-'@backstage/backend-defaults': patch
----
-
-Internal change to support new versions of the `logform` library
diff --git a/.changeset/nice-trams-shake.md b/.changeset/nice-trams-shake.md
deleted file mode 100644
index b58c03200f..0000000000
--- a/.changeset/nice-trams-shake.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder-react': patch
----
-
-Fixed bug where custom `review.name` values were incorrectly formatted by `startCase`, preserving them exactly as written.
diff --git a/.changeset/old-cats-shake.md b/.changeset/old-cats-shake.md
deleted file mode 100644
index 3ca30a0421..0000000000
--- a/.changeset/old-cats-shake.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@backstage/backend-defaults': patch
-'@backstage/backend-plugin-api': minor
----
-
-Adds a new experimental `RootSystemMetadataService` for tracking the collection of Backstage instances that may be deployed at any one time. It currently offers a single API, `getInstalledPlugins` that returns a list of installed plugins based on config you have set up in `discovery.endpoints` as well as the plugins installed on the instance you're calling the API with. It does not handle wildcard values or fallback values. The intention is for this plugin to provide plugin authors with a simple interface to fetch a trustworthy list of all installed plugins.
diff --git a/.changeset/old-parks-smell.md b/.changeset/old-parks-smell.md
deleted file mode 100644
index f089c7da21..0000000000
--- a/.changeset/old-parks-smell.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-'@backstage/plugin-techdocs-addons-test-utils': major
----
-
-**BREAKING**: `TechDocsAddonTester.renderWithEffects()` no longer returns a screen; this means that you can no longer grab assertions such as `getByText` from its return value.
-
-Newer versions of `@testing-library` recommends using the `screen` export for assertions - and removing this from the addon tester contract allows us to more freely iterate on which underlying version of the testing library is being used.
-
-One notable effect of this, however, is that the `@testing-library` `screen` does NOT support assertions on the shadow DOM, which techdocs relies on. You will therefore want to add a dependency on [the `shadow-dom-testing-library` package](https://github.com/konnorrogers/shadow-dom-testing-library/) in your tests, and using its `screen` and its dedicated `*Shadow*` methods. As an example, if you keep doing `getByText` you will not get matches inside the shadow DOM - switch to `getByShadowText` instead.
-
-```ts
-import { screen } from 'shadow-dom-testing-library';
-
-// ... render the addon ...
-await TechDocsAddonTester.buildAddonsInTechDocs([])
- .withDom(
TEST_CONTENT)
- .renderWithEffects();
-
-expect(screen.getByShadowText('TEST_CONTENT')).toBeInTheDocument();
-```
diff --git a/.changeset/open-points-beam.md b/.changeset/open-points-beam.md
deleted file mode 100644
index b58bf2b3d5..0000000000
--- a/.changeset/open-points-beam.md
+++ /dev/null
@@ -1,37 +0,0 @@
----
-'@backstage/ui': minor
----
-
-**Breaking change** The `Cell` component has been refactored to be a generic wrapper component that accepts `children` for custom cell content. The text-specific functionality (previously part of `Cell`) has been moved to a new `CellText` component.
-
-### Migration Guide
-
-If you were using `Cell` with text-specific props (`title`, `description`, `leadingIcon`, `href`), you need to update your code to use `CellText` instead:
-
-**Before:**
-
-```tsx
-}
- href="/path"
-/>
-```
-
-**After:**
-
-```tsx
-}
- href="/path"
-/>
-```
-
-For custom cell content, use the new generic `Cell` component:
-
-```tsx
-{/* Your custom content */}
-```
diff --git a/.changeset/polite-pillows-accept.md b/.changeset/polite-pillows-accept.md
new file mode 100644
index 0000000000..ece7c02ee1
--- /dev/null
+++ b/.changeset/polite-pillows-accept.md
@@ -0,0 +1,5 @@
+---
+'@backstage/integration': patch
+---
+
+Rollback the lowercase replacing in GitHub integration config
diff --git a/.changeset/pre.json b/.changeset/pre.json
index 3419f9dbb2..8b1cbc3ad4 100644
--- a/.changeset/pre.json
+++ b/.changeset/pre.json
@@ -1,298 +1,227 @@
{
- "mode": "exit",
+ "mode": "pre",
"tag": "next",
"initialVersions": {
- "example-app": "0.2.115",
- "@backstage/app-defaults": "1.7.2",
- "example-app-next": "0.0.29",
- "app-next-example-plugin": "0.0.29",
- "example-backend": "0.0.44",
- "@backstage/backend-app-api": "1.3.0",
- "@backstage/backend-defaults": "0.13.1",
- "@backstage/backend-dev-utils": "0.1.5",
- "@backstage/backend-dynamic-feature-service": "0.7.6",
- "@backstage/backend-openapi-utils": "0.6.3",
- "@backstage/backend-plugin-api": "1.5.0",
- "@backstage/backend-test-utils": "1.10.0",
+ "example-app": "0.2.116",
+ "@backstage/app-defaults": "1.7.3",
+ "example-app-next": "0.0.30",
+ "app-next-example-plugin": "0.0.30",
+ "example-backend": "0.0.45",
+ "@backstage/backend-app-api": "1.4.0",
+ "@backstage/backend-defaults": "0.14.0",
+ "@backstage/backend-dev-utils": "0.1.6",
+ "@backstage/backend-dynamic-feature-service": "0.7.7",
+ "@backstage/backend-openapi-utils": "0.6.4",
+ "@backstage/backend-plugin-api": "1.6.0",
+ "@backstage/backend-test-utils": "1.10.2",
"@backstage/catalog-client": "1.12.1",
"@backstage/catalog-model": "1.7.6",
- "@backstage/cli": "0.34.5",
- "@backstage/cli-common": "0.1.15",
- "@backstage/cli-node": "0.2.15",
- "@backstage/codemods": "0.1.52",
+ "@backstage/cli": "0.35.0",
+ "@backstage/cli-common": "0.1.16",
+ "@backstage/cli-node": "0.2.16",
+ "@backstage/codemods": "0.1.53",
"@backstage/config": "1.3.6",
- "@backstage/config-loader": "1.10.6",
- "@backstage/core-app-api": "1.19.2",
- "@backstage/core-compat-api": "0.5.4",
- "@backstage/core-components": "0.18.3",
- "@backstage/core-plugin-api": "1.12.0",
- "@backstage/create-app": "0.7.6",
- "@backstage/dev-utils": "1.1.17",
- "e2e-test": "0.2.34",
+ "@backstage/config-loader": "1.10.7",
+ "@backstage/core-app-api": "1.19.3",
+ "@backstage/core-compat-api": "0.5.5",
+ "@backstage/core-components": "0.18.4",
+ "@backstage/core-plugin-api": "1.12.1",
+ "@backstage/create-app": "0.7.7",
+ "@backstage/dev-utils": "1.1.18",
+ "e2e-test": "0.2.35",
"@backstage/e2e-test-utils": "0.1.1",
"@backstage/errors": "1.2.7",
"@backstage/eslint-plugin": "0.2.0",
- "@backstage/frontend-app-api": "0.13.2",
- "@backstage/frontend-defaults": "0.3.3",
- "@backstage/frontend-dynamic-feature-loader": "0.1.7",
- "@internal/frontend": "0.0.15",
- "@backstage/frontend-plugin-api": "0.13.0",
- "@backstage/frontend-test-utils": "0.4.1",
- "@backstage/integration": "1.18.2",
+ "@backstage/frontend-app-api": "0.13.3",
+ "@backstage/frontend-defaults": "0.3.4",
+ "@backstage/frontend-dynamic-feature-loader": "0.1.8",
+ "@internal/frontend": "0.0.16",
+ "@backstage/frontend-plugin-api": "0.13.2",
+ "@backstage/frontend-test-utils": "0.4.2",
+ "@backstage/integration": "1.19.0",
"@backstage/integration-aws-node": "0.1.19",
- "@backstage/integration-react": "1.2.12",
+ "@backstage/integration-react": "1.2.13",
"@internal/opaque": "0.0.1",
"@backstage/release-manifests": "0.0.13",
- "@backstage/repo-tools": "0.16.0",
- "@internal/scaffolder": "0.0.15",
- "@techdocs/cli": "1.10.2",
- "techdocs-cli-embedded-app": "0.2.114",
- "@backstage/test-utils": "1.7.13",
- "@backstage/theme": "0.7.0",
+ "@backstage/repo-tools": "0.16.1",
+ "@internal/scaffolder": "0.0.16",
+ "@techdocs/cli": "1.10.3",
+ "techdocs-cli-embedded-app": "0.2.115",
+ "@backstage/test-utils": "1.7.14",
+ "@backstage/theme": "0.7.1",
"@backstage/types": "1.2.2",
- "@backstage/ui": "0.9.0",
+ "@backstage/ui": "0.10.0",
"@backstage/version-bridge": "1.0.11",
- "yarn-plugin-backstage": "0.0.7",
- "@backstage/plugin-api-docs": "0.13.1",
+ "yarn-plugin-backstage": "0.0.8",
+ "@backstage/plugin-api-docs": "0.13.2",
"@backstage/plugin-api-docs-module-protoc-gen-doc": "0.1.10",
- "@backstage/plugin-app": "0.3.2",
- "@backstage/plugin-app-backend": "0.5.8",
- "@backstage/plugin-app-node": "0.1.39",
- "@backstage/plugin-app-visualizer": "0.1.25",
- "@backstage/plugin-auth": "0.1.2",
- "@backstage/plugin-auth-backend": "0.25.6",
- "@backstage/plugin-auth-backend-module-atlassian-provider": "0.4.9",
- "@backstage/plugin-auth-backend-module-auth0-provider": "0.2.9",
- "@backstage/plugin-auth-backend-module-aws-alb-provider": "0.4.9",
- "@backstage/plugin-auth-backend-module-azure-easyauth-provider": "0.2.14",
- "@backstage/plugin-auth-backend-module-bitbucket-provider": "0.3.9",
- "@backstage/plugin-auth-backend-module-bitbucket-server-provider": "0.2.9",
- "@backstage/plugin-auth-backend-module-cloudflare-access-provider": "0.4.9",
- "@backstage/plugin-auth-backend-module-gcp-iap-provider": "0.4.9",
- "@backstage/plugin-auth-backend-module-github-provider": "0.3.9",
- "@backstage/plugin-auth-backend-module-gitlab-provider": "0.3.9",
- "@backstage/plugin-auth-backend-module-google-provider": "0.3.9",
- "@backstage/plugin-auth-backend-module-guest-provider": "0.2.14",
- "@backstage/plugin-auth-backend-module-microsoft-provider": "0.3.9",
- "@backstage/plugin-auth-backend-module-oauth2-provider": "0.4.9",
- "@backstage/plugin-auth-backend-module-oauth2-proxy-provider": "0.2.14",
- "@backstage/plugin-auth-backend-module-oidc-provider": "0.4.9",
- "@backstage/plugin-auth-backend-module-okta-provider": "0.2.9",
- "@backstage/plugin-auth-backend-module-onelogin-provider": "0.3.9",
- "@backstage/plugin-auth-backend-module-openshift-provider": "0.1.2",
- "@backstage/plugin-auth-backend-module-pinniped-provider": "0.3.9",
- "@backstage/plugin-auth-backend-module-vmware-cloud-provider": "0.5.9",
- "@backstage/plugin-auth-node": "0.6.9",
- "@backstage/plugin-auth-react": "0.1.21",
- "@backstage/plugin-bitbucket-cloud-common": "0.3.4",
- "@backstage/plugin-catalog": "1.32.0",
- "@backstage/plugin-catalog-backend": "3.2.0",
- "@backstage/plugin-catalog-backend-module-aws": "0.4.17",
- "@backstage/plugin-catalog-backend-module-azure": "0.3.11",
- "@backstage/plugin-catalog-backend-module-backstage-openapi": "0.5.8",
- "@backstage/plugin-catalog-backend-module-bitbucket-cloud": "0.5.5",
- "@backstage/plugin-catalog-backend-module-bitbucket-server": "0.5.5",
- "@backstage/plugin-catalog-backend-module-gcp": "0.3.14",
- "@backstage/plugin-catalog-backend-module-gerrit": "0.3.8",
- "@backstage/plugin-catalog-backend-module-gitea": "0.1.6",
- "@backstage/plugin-catalog-backend-module-github": "0.11.2",
- "@backstage/plugin-catalog-backend-module-github-org": "0.3.16",
- "@backstage/plugin-catalog-backend-module-gitlab": "0.7.5",
- "@backstage/plugin-catalog-backend-module-gitlab-org": "0.2.15",
- "@backstage/plugin-catalog-backend-module-incremental-ingestion": "0.7.6",
- "@backstage/plugin-catalog-backend-module-ldap": "0.12.0",
- "@backstage/plugin-catalog-backend-module-logs": "0.1.16",
- "@backstage/plugin-catalog-backend-module-msgraph": "0.8.2",
- "@backstage/plugin-catalog-backend-module-openapi": "0.2.16",
- "@backstage/plugin-catalog-backend-module-puppetdb": "0.2.16",
- "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "0.2.14",
- "@backstage/plugin-catalog-backend-module-unprocessed": "0.6.6",
+ "@backstage/plugin-app": "0.3.3",
+ "@backstage/plugin-app-backend": "0.5.9",
+ "@backstage/plugin-app-node": "0.1.40",
+ "@backstage/plugin-app-visualizer": "0.1.26",
+ "@backstage/plugin-auth": "0.1.3",
+ "@backstage/plugin-auth-backend": "0.25.7",
+ "@backstage/plugin-auth-backend-module-atlassian-provider": "0.4.10",
+ "@backstage/plugin-auth-backend-module-auth0-provider": "0.2.10",
+ "@backstage/plugin-auth-backend-module-aws-alb-provider": "0.4.10",
+ "@backstage/plugin-auth-backend-module-azure-easyauth-provider": "0.2.15",
+ "@backstage/plugin-auth-backend-module-bitbucket-provider": "0.3.10",
+ "@backstage/plugin-auth-backend-module-bitbucket-server-provider": "0.2.10",
+ "@backstage/plugin-auth-backend-module-cloudflare-access-provider": "0.4.10",
+ "@backstage/plugin-auth-backend-module-gcp-iap-provider": "0.4.10",
+ "@backstage/plugin-auth-backend-module-github-provider": "0.4.0",
+ "@backstage/plugin-auth-backend-module-gitlab-provider": "0.3.10",
+ "@backstage/plugin-auth-backend-module-google-provider": "0.3.10",
+ "@backstage/plugin-auth-backend-module-guest-provider": "0.2.15",
+ "@backstage/plugin-auth-backend-module-microsoft-provider": "0.3.10",
+ "@backstage/plugin-auth-backend-module-oauth2-provider": "0.4.10",
+ "@backstage/plugin-auth-backend-module-oauth2-proxy-provider": "0.2.15",
+ "@backstage/plugin-auth-backend-module-oidc-provider": "0.4.10",
+ "@backstage/plugin-auth-backend-module-okta-provider": "0.2.10",
+ "@backstage/plugin-auth-backend-module-onelogin-provider": "0.3.10",
+ "@backstage/plugin-auth-backend-module-openshift-provider": "0.1.3",
+ "@backstage/plugin-auth-backend-module-pinniped-provider": "0.3.10",
+ "@backstage/plugin-auth-backend-module-vmware-cloud-provider": "0.5.10",
+ "@backstage/plugin-auth-node": "0.6.10",
+ "@backstage/plugin-auth-react": "0.1.22",
+ "@backstage/plugin-bitbucket-cloud-common": "0.3.5",
+ "@backstage/plugin-catalog": "1.32.1",
+ "@backstage/plugin-catalog-backend": "3.3.0",
+ "@backstage/plugin-catalog-backend-module-aws": "0.4.18",
+ "@backstage/plugin-catalog-backend-module-azure": "0.3.12",
+ "@backstage/plugin-catalog-backend-module-backstage-openapi": "0.5.9",
+ "@backstage/plugin-catalog-backend-module-bitbucket-cloud": "0.5.6",
+ "@backstage/plugin-catalog-backend-module-bitbucket-server": "0.5.6",
+ "@backstage/plugin-catalog-backend-module-gcp": "0.3.15",
+ "@backstage/plugin-catalog-backend-module-gerrit": "0.3.9",
+ "@backstage/plugin-catalog-backend-module-gitea": "0.1.7",
+ "@backstage/plugin-catalog-backend-module-github": "0.12.0",
+ "@backstage/plugin-catalog-backend-module-github-org": "0.3.17",
+ "@backstage/plugin-catalog-backend-module-gitlab": "0.7.6",
+ "@backstage/plugin-catalog-backend-module-gitlab-org": "0.2.16",
+ "@backstage/plugin-catalog-backend-module-incremental-ingestion": "0.7.7",
+ "@backstage/plugin-catalog-backend-module-ldap": "0.12.1",
+ "@backstage/plugin-catalog-backend-module-logs": "0.1.17",
+ "@backstage/plugin-catalog-backend-module-msgraph": "0.8.3",
+ "@backstage/plugin-catalog-backend-module-openapi": "0.2.17",
+ "@backstage/plugin-catalog-backend-module-puppetdb": "0.2.17",
+ "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "0.2.15",
+ "@backstage/plugin-catalog-backend-module-unprocessed": "0.6.7",
"@backstage/plugin-catalog-common": "1.1.7",
- "@backstage/plugin-catalog-graph": "0.5.3",
- "@backstage/plugin-catalog-import": "0.13.7",
- "@backstage/plugin-catalog-node": "1.20.0",
- "@backstage/plugin-catalog-react": "1.21.3",
- "@backstage/plugin-catalog-unprocessed-entities": "0.2.23",
- "@backstage/plugin-catalog-unprocessed-entities-common": "0.0.11",
- "@backstage/plugin-config-schema": "0.1.74",
- "@backstage/plugin-devtools": "0.1.33",
- "@backstage/plugin-devtools-backend": "0.5.11",
- "@backstage/plugin-devtools-common": "0.1.19",
- "@backstage/plugin-events-backend": "0.5.8",
- "@backstage/plugin-events-backend-module-aws-sqs": "0.4.17",
- "@backstage/plugin-events-backend-module-azure": "0.2.26",
- "@backstage/plugin-events-backend-module-bitbucket-cloud": "0.2.26",
- "@backstage/plugin-events-backend-module-bitbucket-server": "0.1.7",
- "@backstage/plugin-events-backend-module-gerrit": "0.2.26",
- "@backstage/plugin-events-backend-module-github": "0.4.6",
- "@backstage/plugin-events-backend-module-gitlab": "0.3.7",
- "@backstage/plugin-events-backend-module-google-pubsub": "0.1.6",
- "@backstage/plugin-events-backend-module-kafka": "0.1.5",
- "@backstage/plugin-events-backend-test-utils": "0.1.50",
- "@backstage/plugin-events-node": "0.4.17",
- "@internal/plugin-todo-list": "1.0.45",
- "@internal/plugin-todo-list-backend": "1.0.45",
+ "@backstage/plugin-catalog-graph": "0.5.4",
+ "@backstage/plugin-catalog-import": "0.13.8",
+ "@backstage/plugin-catalog-node": "1.20.1",
+ "@backstage/plugin-catalog-react": "1.21.4",
+ "@backstage/plugin-catalog-unprocessed-entities": "0.2.24",
+ "@backstage/plugin-catalog-unprocessed-entities-common": "0.0.12",
+ "@backstage/plugin-config-schema": "0.1.75",
+ "@backstage/plugin-devtools": "0.1.34",
+ "@backstage/plugin-devtools-backend": "0.5.12",
+ "@backstage/plugin-devtools-common": "0.1.20",
+ "@backstage/plugin-events-backend": "0.5.9",
+ "@backstage/plugin-events-backend-module-aws-sqs": "0.4.18",
+ "@backstage/plugin-events-backend-module-azure": "0.2.27",
+ "@backstage/plugin-events-backend-module-bitbucket-cloud": "0.2.27",
+ "@backstage/plugin-events-backend-module-bitbucket-server": "0.1.8",
+ "@backstage/plugin-events-backend-module-gerrit": "0.2.27",
+ "@backstage/plugin-events-backend-module-github": "0.4.7",
+ "@backstage/plugin-events-backend-module-gitlab": "0.3.8",
+ "@backstage/plugin-events-backend-module-google-pubsub": "0.1.7",
+ "@backstage/plugin-events-backend-module-kafka": "0.2.0",
+ "@backstage/plugin-events-backend-test-utils": "0.1.51",
+ "@backstage/plugin-events-node": "0.4.18",
+ "@internal/plugin-todo-list": "1.0.46",
+ "@internal/plugin-todo-list-backend": "1.0.46",
"@internal/plugin-todo-list-common": "1.0.28",
- "@backstage/plugin-gateway-backend": "1.1.0",
- "@backstage/plugin-home": "0.8.14",
- "@backstage/plugin-home-react": "0.1.32",
- "@backstage/plugin-kubernetes": "0.12.13",
- "@backstage/plugin-kubernetes-backend": "0.20.4",
- "@backstage/plugin-kubernetes-cluster": "0.0.31",
- "@backstage/plugin-kubernetes-common": "0.9.8",
- "@backstage/plugin-kubernetes-node": "0.3.6",
- "@backstage/plugin-kubernetes-react": "0.5.13",
- "@backstage/plugin-mcp-actions-backend": "0.1.5",
- "@backstage/plugin-mui-to-bui": "0.2.1",
- "@backstage/plugin-notifications": "0.5.11",
- "@backstage/plugin-notifications-backend": "0.6.0",
- "@backstage/plugin-notifications-backend-module-email": "0.3.16",
- "@backstage/plugin-notifications-backend-module-slack": "0.2.1",
+ "@backstage/plugin-gateway-backend": "1.1.1",
+ "@backstage/plugin-home": "0.8.15",
+ "@backstage/plugin-home-react": "0.1.33",
+ "@backstage/plugin-kubernetes": "0.12.14",
+ "@backstage/plugin-kubernetes-backend": "0.21.0",
+ "@backstage/plugin-kubernetes-cluster": "0.0.32",
+ "@backstage/plugin-kubernetes-common": "0.9.9",
+ "@backstage/plugin-kubernetes-node": "0.4.0",
+ "@backstage/plugin-kubernetes-react": "0.5.14",
+ "@backstage/plugin-mcp-actions-backend": "0.1.6",
+ "@backstage/plugin-mui-to-bui": "0.2.2",
+ "@backstage/plugin-notifications": "0.5.12",
+ "@backstage/plugin-notifications-backend": "0.6.1",
+ "@backstage/plugin-notifications-backend-module-email": "0.3.17",
+ "@backstage/plugin-notifications-backend-module-slack": "0.3.0",
"@backstage/plugin-notifications-common": "0.2.0",
- "@backstage/plugin-notifications-node": "0.2.21",
- "@backstage/plugin-org": "0.6.46",
- "@backstage/plugin-org-react": "0.1.44",
- "@backstage/plugin-permission-backend": "0.7.6",
- "@backstage/plugin-permission-backend-module-allow-all-policy": "0.2.14",
+ "@backstage/plugin-notifications-node": "0.2.22",
+ "@backstage/plugin-org": "0.6.47",
+ "@backstage/plugin-org-react": "0.1.45",
+ "@backstage/plugin-permission-backend": "0.7.7",
+ "@backstage/plugin-permission-backend-module-allow-all-policy": "0.2.15",
"@backstage/plugin-permission-common": "0.9.3",
- "@backstage/plugin-permission-node": "0.10.6",
- "@backstage/plugin-permission-react": "0.4.38",
- "@backstage/plugin-proxy-backend": "0.6.8",
- "@backstage/plugin-proxy-node": "0.1.10",
- "@backstage/plugin-scaffolder": "1.34.3",
- "@backstage/plugin-scaffolder-backend": "3.0.1",
- "@backstage/plugin-scaffolder-backend-module-azure": "0.2.15",
- "@backstage/plugin-scaffolder-backend-module-bitbucket": "0.3.16",
- "@backstage/plugin-scaffolder-backend-module-bitbucket-cloud": "0.2.15",
- "@backstage/plugin-scaffolder-backend-module-bitbucket-server": "0.2.15",
- "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown": "0.3.15",
- "@backstage/plugin-scaffolder-backend-module-cookiecutter": "0.3.17",
- "@backstage/plugin-scaffolder-backend-module-gcp": "0.2.15",
- "@backstage/plugin-scaffolder-backend-module-gerrit": "0.2.15",
- "@backstage/plugin-scaffolder-backend-module-gitea": "0.2.15",
- "@backstage/plugin-scaffolder-backend-module-github": "0.9.2",
- "@backstage/plugin-scaffolder-backend-module-gitlab": "0.10.0",
- "@backstage/plugin-scaffolder-backend-module-notifications": "0.1.16",
- "@backstage/plugin-scaffolder-backend-module-rails": "0.5.15",
- "@backstage/plugin-scaffolder-backend-module-sentry": "0.2.15",
- "@backstage/plugin-scaffolder-backend-module-yeoman": "0.4.16",
- "@backstage/plugin-scaffolder-common": "1.7.3",
- "@backstage/plugin-scaffolder-node": "0.12.1",
- "@backstage/plugin-scaffolder-node-test-utils": "0.3.5",
- "@backstage/plugin-scaffolder-react": "1.19.3",
- "@backstage/plugin-search": "1.5.0",
- "@backstage/plugin-search-backend": "2.0.8",
- "@backstage/plugin-search-backend-module-catalog": "0.3.10",
- "@backstage/plugin-search-backend-module-elasticsearch": "1.7.8",
- "@backstage/plugin-search-backend-module-explore": "0.3.9",
- "@backstage/plugin-search-backend-module-pg": "0.5.50",
- "@backstage/plugin-search-backend-module-stack-overflow-collator": "0.3.15",
- "@backstage/plugin-search-backend-module-techdocs": "0.4.8",
- "@backstage/plugin-search-backend-node": "1.3.17",
+ "@backstage/plugin-permission-node": "0.10.7",
+ "@backstage/plugin-permission-react": "0.4.39",
+ "@backstage/plugin-proxy-backend": "0.6.9",
+ "@backstage/plugin-proxy-node": "0.1.11",
+ "@backstage/plugin-scaffolder": "1.35.0",
+ "@backstage/plugin-scaffolder-backend": "3.1.0",
+ "@backstage/plugin-scaffolder-backend-module-azure": "0.2.16",
+ "@backstage/plugin-scaffolder-backend-module-bitbucket": "0.3.17",
+ "@backstage/plugin-scaffolder-backend-module-bitbucket-cloud": "0.3.0",
+ "@backstage/plugin-scaffolder-backend-module-bitbucket-server": "0.2.16",
+ "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown": "0.3.16",
+ "@backstage/plugin-scaffolder-backend-module-cookiecutter": "0.3.18",
+ "@backstage/plugin-scaffolder-backend-module-gcp": "0.2.16",
+ "@backstage/plugin-scaffolder-backend-module-gerrit": "0.2.16",
+ "@backstage/plugin-scaffolder-backend-module-gitea": "0.2.16",
+ "@backstage/plugin-scaffolder-backend-module-github": "0.9.3",
+ "@backstage/plugin-scaffolder-backend-module-gitlab": "0.11.0",
+ "@backstage/plugin-scaffolder-backend-module-notifications": "0.1.17",
+ "@backstage/plugin-scaffolder-backend-module-rails": "0.5.16",
+ "@backstage/plugin-scaffolder-backend-module-sentry": "0.2.16",
+ "@backstage/plugin-scaffolder-backend-module-yeoman": "0.4.17",
+ "@backstage/plugin-scaffolder-common": "1.7.4",
+ "@backstage/plugin-scaffolder-node": "0.12.2",
+ "@backstage/plugin-scaffolder-node-test-utils": "0.3.6",
+ "@backstage/plugin-scaffolder-react": "1.19.4",
+ "@backstage/plugin-search": "1.5.1",
+ "@backstage/plugin-search-backend": "2.0.9",
+ "@backstage/plugin-search-backend-module-catalog": "0.3.11",
+ "@backstage/plugin-search-backend-module-elasticsearch": "1.7.9",
+ "@backstage/plugin-search-backend-module-explore": "0.3.10",
+ "@backstage/plugin-search-backend-module-pg": "0.5.51",
+ "@backstage/plugin-search-backend-module-stack-overflow-collator": "0.3.16",
+ "@backstage/plugin-search-backend-module-techdocs": "0.4.9",
+ "@backstage/plugin-search-backend-node": "1.4.0",
"@backstage/plugin-search-common": "1.2.21",
- "@backstage/plugin-search-react": "1.10.0",
- "@backstage/plugin-signals": "0.0.25",
- "@backstage/plugin-signals-backend": "0.3.10",
- "@backstage/plugin-signals-node": "0.1.26",
- "@backstage/plugin-signals-react": "0.0.17",
- "@backstage/plugin-techdocs": "1.16.0",
- "@backstage/plugin-techdocs-addons-test-utils": "1.1.2",
- "@backstage/plugin-techdocs-backend": "2.1.2",
+ "@backstage/plugin-search-react": "1.10.1",
+ "@backstage/plugin-signals": "0.0.26",
+ "@backstage/plugin-signals-backend": "0.3.11",
+ "@backstage/plugin-signals-node": "0.1.27",
+ "@backstage/plugin-signals-react": "0.0.18",
+ "@backstage/plugin-techdocs": "1.16.1",
+ "@backstage/plugin-techdocs-addons-test-utils": "2.0.0",
+ "@backstage/plugin-techdocs-backend": "2.1.3",
"@backstage/plugin-techdocs-common": "0.1.1",
- "@backstage/plugin-techdocs-module-addons-contrib": "1.1.30",
- "@backstage/plugin-techdocs-node": "1.13.9",
- "@backstage/plugin-techdocs-react": "1.3.5",
- "@backstage/plugin-user-settings": "0.8.29",
- "@backstage/plugin-user-settings-backend": "0.3.8",
+ "@backstage/plugin-techdocs-module-addons-contrib": "1.1.31",
+ "@backstage/plugin-techdocs-node": "1.13.10",
+ "@backstage/plugin-techdocs-react": "1.3.6",
+ "@backstage/plugin-user-settings": "0.8.30",
+ "@backstage/plugin-user-settings-backend": "0.3.9",
"@backstage/plugin-user-settings-common": "0.0.1"
},
"changesets": [
- "afraid-items-drum",
- "alert-api-replay",
- "all-socks-taste",
- "blue-signs-fry",
- "bumpy-planets-go",
- "chatty-sides-wear",
- "chilly-bikes-rule",
- "chilly-hotels-walk",
- "chilly-waves-relate",
- "clean-toys-reply",
- "common-coins-stare",
- "crazy-hornets-spend",
- "create-app-1764689798",
- "dependabot-0d8f6de",
- "dependabot-5e654fe",
- "early-doors-visit",
- "error-boundary-api",
- "famous-jars-lose",
- "fifty-coats-feel",
- "fifty-lights-marry",
- "fine-eagles-sleep",
- "flat-pillows-rush",
- "floppy-bobcats-serve",
- "four-peaches-train",
- "fruity-rivers-arrive",
- "fruity-words-melt",
- "full-needles-drive",
- "funny-hornets-peel",
- "funny-papayas-rest",
- "fuzzy-phones-own",
- "fuzzy-rivers-travel",
- "fuzzy-trees-live",
- "gentle-singers-love",
- "gentle-trains-juggle",
- "great-files-shave",
- "green-lizards-boil",
- "happy-bottles-invite",
- "happy-streets-dress",
- "honest-bears-itch",
- "kind-hoops-double",
- "large-planes-punch",
- "legal-cloths-spend",
- "legal-otters-punch",
- "lemon-corners-hug",
- "loose-pets-slide",
- "loud-yaks-watch",
- "lucky-days-hug",
- "many-planes-join",
- "metal-boxes-laugh",
- "metal-humans-lose",
- "modern-taxes-start",
- "neat-pens-clean",
- "nice-humans-cry",
- "nice-trams-shake",
- "old-cats-shake",
- "old-parks-smell",
- "open-points-beam",
- "quiet-hats-sleep",
- "rare-rice-throw",
- "ready-results-march",
- "renovate-7b76d6d",
- "renovate-959c095",
- "renovate-97eef4b",
- "renovate-9ec01ff",
- "renovate-a3c2cbd",
- "renovate-aa0bb93",
- "renovate-ad7bf17",
- "renovate-d7ceb06",
- "renovate-ea25c93",
- "rotten-melons-sleep",
- "salty-camels-wash",
- "seven-games-rest",
- "short-groups-knock",
- "slick-books-sleep",
- "slick-onions-wash",
- "slimy-islands-play",
- "slimy-mugs-taste",
- "sour-bats-press",
- "spicy-teeth-study",
- "stale-eagles-rush",
- "stupid-cases-fold",
- "tall-ideas-lead",
- "tame-mirrors-sit",
- "tender-dancers-hunt",
- "tired-dogs-remain",
- "tough-lies-grow",
- "twenty-ducks-relate"
+ "better-ghosts-tell",
+ "clever-streets-roll",
+ "cold-dogs-study",
+ "create-app-1766498726",
+ "create-app-1767101113",
+ "dependabot-aed8e01",
+ "every-bears-add",
+ "hot-colts-float",
+ "hungry-mugs-fall",
+ "major-mangos-shine",
+ "polite-pillows-accept",
+ "proud-streets-switch",
+ "shaggy-bats-film",
+ "thin-teams-roll",
+ "weak-lemons-create",
+ "wild-toys-retire"
]
}
diff --git a/.changeset/pretty-breads-speak.md b/.changeset/pretty-breads-speak.md
deleted file mode 100644
index 13accd1cd0..0000000000
--- a/.changeset/pretty-breads-speak.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-notifications-backend-module-slack': patch
----
-
-Slack notification handler throttling can now be configured with the `concurrencyLimit` and `throttleInterval` options.
diff --git a/.changeset/proud-streets-switch.md b/.changeset/proud-streets-switch.md
new file mode 100644
index 0000000000..188b66f178
--- /dev/null
+++ b/.changeset/proud-streets-switch.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-auth-backend-module-oidc-provider': patch
+---
+
+Added support for custom start URL search parameters (with the new `startUrlSearchParams` config property)
diff --git a/.changeset/quiet-hats-sleep.md b/.changeset/quiet-hats-sleep.md
deleted file mode 100644
index 5f75f22f6c..0000000000
--- a/.changeset/quiet-hats-sleep.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder-backend': patch
----
-
-Fixing OpenAPI definition
diff --git a/.changeset/rare-rice-throw.md b/.changeset/rare-rice-throw.md
deleted file mode 100644
index 6fa0434f67..0000000000
--- a/.changeset/rare-rice-throw.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/core-components': patch
----
-
-Add `tooltipClasses` prop to `OverflowTooltip` component to allow customisation of the tooltip
diff --git a/.changeset/ready-results-march.md b/.changeset/ready-results-march.md
deleted file mode 100644
index c28ade8de9..0000000000
--- a/.changeset/ready-results-march.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog': patch
----
-
-Fixed `catalogAboutEntityCard` to filter icon links before calling useProps(), preventing side effects from hooks in filtered-out links
diff --git a/.changeset/renovate-7b76d6d.md b/.changeset/renovate-7b76d6d.md
deleted file mode 100644
index 9ccb2dd94b..0000000000
--- a/.changeset/renovate-7b76d6d.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@backstage/cli': patch
-'@backstage/plugin-scaffolder-backend': patch
----
-
-Updated dependency `esbuild` to `^0.27.0`.
diff --git a/.changeset/renovate-959c095.md b/.changeset/renovate-959c095.md
deleted file mode 100644
index d2370a1c8b..0000000000
--- a/.changeset/renovate-959c095.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-'@backstage/plugin-home-react': patch
-'@backstage/plugin-home': patch
-'@backstage/plugin-scaffolder-react': patch
-'@backstage/plugin-scaffolder': patch
----
-
-Updated dependency `@rjsf/utils` to `5.24.13`.
-Updated dependency `@rjsf/core` to `5.24.13`.
-Updated dependency `@rjsf/material-ui` to `5.24.13`.
-Updated dependency `@rjsf/validator-ajv8` to `5.24.13`.
diff --git a/.changeset/renovate-97eef4b.md b/.changeset/renovate-97eef4b.md
deleted file mode 100644
index 9b3692bc1c..0000000000
--- a/.changeset/renovate-97eef4b.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/config-loader': patch
----
-
-Updated dependency `typescript-json-schema` to `^0.67.0`.
diff --git a/.changeset/renovate-9ec01ff.md b/.changeset/renovate-9ec01ff.md
deleted file mode 100644
index 1ab750c0e6..0000000000
--- a/.changeset/renovate-9ec01ff.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-search-backend-module-explore': patch
----
-
-Updated dependency `@backstage-community/plugin-explore-common` to `^0.9.0`.
diff --git a/.changeset/renovate-a3c2cbd.md b/.changeset/renovate-a3c2cbd.md
deleted file mode 100644
index 2fde85d39e..0000000000
--- a/.changeset/renovate-a3c2cbd.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder-react': patch
----
-
-Updated dependency `use-immer` to `^0.11.0`.
diff --git a/.changeset/renovate-aa0bb93.md b/.changeset/renovate-aa0bb93.md
deleted file mode 100644
index 5f40a61fab..0000000000
--- a/.changeset/renovate-aa0bb93.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-notifications-backend-module-email': patch
----
-
-Updated dependency `@types/nodemailer` to `^7.0.0`.
diff --git a/.changeset/renovate-ad7bf17.md b/.changeset/renovate-ad7bf17.md
deleted file mode 100644
index a0f90ff97d..0000000000
--- a/.changeset/renovate-ad7bf17.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/backend-defaults': patch
----
-
-Updated dependency `@types/archiver` to `^7.0.0`.
diff --git a/.changeset/renovate-d7ceb06.md b/.changeset/renovate-d7ceb06.md
deleted file mode 100644
index d22f266301..0000000000
--- a/.changeset/renovate-d7ceb06.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Updated dependency `@pmmmwh/react-refresh-webpack-plugin` to `^0.6.0`.
diff --git a/.changeset/renovate-ea25c93.md b/.changeset/renovate-ea25c93.md
deleted file mode 100644
index 958e032b64..0000000000
--- a/.changeset/renovate-ea25c93.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Updated dependency `webpack` to `~5.103.0`.
diff --git a/.changeset/rotten-carrots-relax.md b/.changeset/rotten-carrots-relax.md
deleted file mode 100644
index 339a5cdd6b..0000000000
--- a/.changeset/rotten-carrots-relax.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-'@backstage/plugin-notifications': patch
----
-
-Move long notification descriptions behind `Show more/less` button.
-
-This improves readability of the notifications list by preventing long descriptions from taking up too much space
-or rendering very small scrollable areas.
diff --git a/.changeset/rotten-melons-sleep.md b/.changeset/rotten-melons-sleep.md
deleted file mode 100644
index c12e0a9669..0000000000
--- a/.changeset/rotten-melons-sleep.md
+++ /dev/null
@@ -1,15 +0,0 @@
----
-'@backstage/plugin-catalog-unprocessed-entities-common': patch
-'@backstage/plugin-catalog-unprocessed-entities': patch
----
-
-Moved types, API and client to the common package, allowing both frontend and
-backend plugins to use the `CatalogUnprocessedEntitiesClient`.
-
-The following types, clients and interfaces have been deprecated and should be
-imported from the `@backstage/plugin-catalog-unprocessed-entities-common` instead:
-`CatalogUnprocessedEntitiesApi`, `CatalogUnprocessedEntitiesApiResponse`, `UnprocessedEntity`,
-`UnprocessedEntityCache`, `UnprocessedEntityError`, `CatalogUnprocessedEntitiesClient`.
-
-All those types, clients and interfaces are re-exported temporarily in the
-`@backstage/plugin-catalog-unprocessed-entities` package until cleaned up.
diff --git a/.changeset/salty-camels-wash.md b/.changeset/salty-camels-wash.md
deleted file mode 100644
index 56600db540..0000000000
--- a/.changeset/salty-camels-wash.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Fixed internal usage of `yargs`.
diff --git a/.changeset/seven-games-rest.md b/.changeset/seven-games-rest.md
deleted file mode 100644
index b498c3b138..0000000000
--- a/.changeset/seven-games-rest.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-techdocs-backend': patch
----
-
-Corrected `ErrorCallback` type to work with Node 22 types
diff --git a/.changeset/shaggy-bats-film.md b/.changeset/shaggy-bats-film.md
new file mode 100644
index 0000000000..3e5be9648b
--- /dev/null
+++ b/.changeset/shaggy-bats-film.md
@@ -0,0 +1,5 @@
+---
+'@backstage/ui': minor
+---
+
+**BREAKING**: Renamed CSS variable `--bui-bg` to `--bui-bg-surface-0` for consistency.
diff --git a/.changeset/short-cloths-tie.md b/.changeset/short-cloths-tie.md
deleted file mode 100644
index fe379fb18d..0000000000
--- a/.changeset/short-cloths-tie.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/backend-defaults': patch
----
-
-Don't warn when parsing `storeOptions` for `memory` cache
diff --git a/.changeset/short-groups-knock.md b/.changeset/short-groups-knock.md
deleted file mode 100644
index 0b622a71ed..0000000000
--- a/.changeset/short-groups-knock.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/cli-common': patch
-'@backstage/create-app': patch
-'@backstage/cli': patch
----
-
-Add proxy configuration from env-vars to create-app tasks
diff --git a/.changeset/short-lizards-find.md b/.changeset/short-lizards-find.md
deleted file mode 100644
index 320a4db64d..0000000000
--- a/.changeset/short-lizards-find.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/plugin-devtools-common': patch
-'@backstage/plugin-devtools-backend': patch
-'@backstage/plugin-devtools': patch
----
-
-Added scheduled tasks UI feature for the DevTools plugin
diff --git a/.changeset/slick-books-sleep.md b/.changeset/slick-books-sleep.md
deleted file mode 100644
index 7aa3be5b03..0000000000
--- a/.changeset/slick-books-sleep.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/theme': patch
----
-
-Added a `themeName` prop to `UnifiedThemeProvider`, enabling Backstage UI `data-theme-name` CSS attribute to be set based on active theme.
diff --git a/.changeset/slick-onions-wash.md b/.changeset/slick-onions-wash.md
deleted file mode 100644
index 4627d02e81..0000000000
--- a/.changeset/slick-onions-wash.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/core-components': patch
----
-
-Add i18n support for LogViewer search control
diff --git a/.changeset/slimy-islands-play.md b/.changeset/slimy-islands-play.md
deleted file mode 100644
index 497d86761b..0000000000
--- a/.changeset/slimy-islands-play.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/ui': patch
----
-
-Added row selection support with visual state styling for hover, selected, and pressed states. Fixed checkbox rendering to only show for multi-select toggle mode.
-
-Affected components: Table, TableHeader, Row, Column
diff --git a/.changeset/slimy-mugs-taste.md b/.changeset/slimy-mugs-taste.md
deleted file mode 100644
index 5773db6853..0000000000
--- a/.changeset/slimy-mugs-taste.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/backend-test-utils': patch
----
-
-Fix PostgreSQL 18 `TestDatabases` by pinning the data directory
diff --git a/.changeset/sour-bats-press.md b/.changeset/sour-bats-press.md
deleted file mode 100644
index bfcf3985e6..0000000000
--- a/.changeset/sour-bats-press.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-auth-node': patch
----
-
-fix flawed cookie removal logic with chunked tokens
diff --git a/.changeset/spicy-sides-grow.md b/.changeset/spicy-sides-grow.md
deleted file mode 100644
index 3f44f35866..0000000000
--- a/.changeset/spicy-sides-grow.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/core-components': patch
----
-
-added support for wrapLongLines option in CodeSnippet
diff --git a/.changeset/spicy-teeth-study.md b/.changeset/spicy-teeth-study.md
deleted file mode 100644
index 03cc8a5440..0000000000
--- a/.changeset/spicy-teeth-study.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/ui': patch
----
-
-Fixed `useTable` hook to prioritize `providedRowCount` over data length for accurate row count in server-side pagination scenarios.
diff --git a/.changeset/stale-eagles-rush.md b/.changeset/stale-eagles-rush.md
deleted file mode 100644
index fe640ccd44..0000000000
--- a/.changeset/stale-eagles-rush.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@backstage/frontend-plugin-api': patch
-'@backstage/core-plugin-api': patch
----
-
-Reversed the relationship between the old `@backstage/core-plugin-api` and the new `@backstage/frontend-plugin-api`. Previously, the a lot of API definitions and utilities where defined in the old and re-exported from the old, but this change flips that around so that they now reside in the new package and are re-exported from the old. The external API of both packages remain the same, but this is a step towards being able to add further compatibility with the new frontend system built into the old.
diff --git a/.changeset/stale-poets-battle.md b/.changeset/stale-poets-battle.md
deleted file mode 100644
index 1725fd2885..0000000000
--- a/.changeset/stale-poets-battle.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/plugin-events-backend-module-kafka': minor
----
-
-Added `KafkaPublishingEventConsumer` to support sending Backstage events to Kafka topics.
-
-This addition enables Backstage to publish events to external Kafka systems, complementing the existing ability to receive events from Kafka. This allows for better integration with external systems that rely on Kafka for event streaming.
diff --git a/.changeset/stupid-cases-fold.md b/.changeset/stupid-cases-fold.md
deleted file mode 100644
index 6ee2472746..0000000000
--- a/.changeset/stupid-cases-fold.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Switched compilation target to ES2022 in order to match the new set of supported Node.js versions, which are 22 and 24.
-
-The TypeScript compilation target has been set to ES2022, because setting it to a higher target will break projects on older TypeScript versions. If you use a newer TypeScript version in your own project, you can bump `compilerOptions.target` to ES2023 or ES2024 in your own `tsconfig.json` file.
diff --git a/.changeset/swift-moments-think.md b/.changeset/swift-moments-think.md
deleted file mode 100644
index 185fd4ff48..0000000000
--- a/.changeset/swift-moments-think.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog-backend-module-github': patch
----
-
-Added configurable `pageSizes` option to `GithubOrgEntityProvider` for GitHub GraphQL API queries to prevent `RESOURCE_LIMITS_EXCEEDED` errors with organizations with large number of teams and members. This aligns the configuration options with `GithubMultiOrgEntityProvider`.
diff --git a/.changeset/swift-wolves-judge.md b/.changeset/swift-wolves-judge.md
deleted file mode 100644
index 399ed5bad8..0000000000
--- a/.changeset/swift-wolves-judge.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/frontend-plugin-api': patch
----
-
-Removed unnecessary dependencies on `@backstage/core-components`, `@backstage/config`, `@material-ui/core`, and `lodash`.
diff --git a/.changeset/tall-ideas-lead.md b/.changeset/tall-ideas-lead.md
deleted file mode 100644
index 60bef903d8..0000000000
--- a/.changeset/tall-ideas-lead.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder-backend-module-bitbucket-server': patch
----
-
-Improve error message when provided target branch is missing
diff --git a/.changeset/tame-mirrors-sit.md b/.changeset/tame-mirrors-sit.md
deleted file mode 100644
index f317185ea2..0000000000
--- a/.changeset/tame-mirrors-sit.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/backend-dev-utils': patch
----
-
-Internal update for Node.js v24 support.
diff --git a/.changeset/tender-dancers-hunt.md b/.changeset/tender-dancers-hunt.md
deleted file mode 100644
index e20ec43ae0..0000000000
--- a/.changeset/tender-dancers-hunt.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Updated to use new utilities from `@backstage/cli-common`.
diff --git a/.changeset/thin-teams-roll.md b/.changeset/thin-teams-roll.md
new file mode 100644
index 0000000000..f0c395410a
--- /dev/null
+++ b/.changeset/thin-teams-roll.md
@@ -0,0 +1,5 @@
+---
+'@backstage/backend-defaults': patch
+---
+
+Fixed a spelling mistake in root health service shutdown response.
diff --git a/.changeset/tired-dogs-remain.md b/.changeset/tired-dogs-remain.md
deleted file mode 100644
index 06c193068b..0000000000
--- a/.changeset/tired-dogs-remain.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-'@backstage/plugin-scaffolder-backend-module-rails': patch
-'@backstage/plugin-kubernetes-cluster': patch
-'@techdocs/cli': patch
-'@backstage/cli-common': patch
-'@backstage/create-app': patch
-'@backstage/repo-tools': patch
-'@backstage/codemods': patch
-'@backstage/cli': patch
----
-
-Bumped dev dependencies `@types/node`
diff --git a/.changeset/tough-lies-grow.md b/.changeset/tough-lies-grow.md
deleted file mode 100644
index dab952df65..0000000000
--- a/.changeset/tough-lies-grow.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@backstage/plugin-techdocs-backend': patch
-'@backstage/plugin-techdocs': patch
----
-
-The `techdocs` config is now marked as optional.
diff --git a/.changeset/twenty-ducks-relate.md b/.changeset/twenty-ducks-relate.md
deleted file mode 100644
index 359eda66f3..0000000000
--- a/.changeset/twenty-ducks-relate.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/ui': patch
----
-
-Fixed Table column sorting indicator to show up arrow when no sort is active, correctly indicating that clicking will sort ascending.
-
-Affected components: Column
diff --git a/.changeset/weak-lemons-create.md b/.changeset/weak-lemons-create.md
new file mode 100644
index 0000000000..344a6660ce
--- /dev/null
+++ b/.changeset/weak-lemons-create.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli': patch
+---
+
+Bump minimum required `@swc/core` to avoid transpilation bug
diff --git a/.changeset/wild-toys-retire.md b/.changeset/wild-toys-retire.md
new file mode 100644
index 0000000000..f7179e2527
--- /dev/null
+++ b/.changeset/wild-toys-retire.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-mui-to-bui': patch
+---
+
+Updated tokens from `--bui-bg` to `--bui-bg-surface-0`
diff --git a/.cursor/rules/general.mdc b/.cursor/rules/general.mdc
new file mode 100644
index 0000000000..3a81a0cb5f
--- /dev/null
+++ b/.cursor/rules/general.mdc
@@ -0,0 +1,7 @@
+---
+description: General project guidelines for Backstage development
+globs:
+alwaysApply: true
+---
+
+Follow the instructions at /.github/copilot-instructions.md
diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md
index 98073c5128..ee3fe6fda0 100644
--- a/.github/copilot-instructions.md
+++ b/.github/copilot-instructions.md
@@ -1,11 +1,22 @@
-This is a TypeScript project structured as a monorepo using Yarn workspaces.
+Backstage is an open platform for building developer portals. This is a TypeScript monorepo using Yarn workspaces.
+
+## Key Directories
+
+- `/packages`: Core framework packages (prefixed `@backstage/`)
+- `/plugins`: Plugin packages (prefixed `@backstage/plugin-*`)
+- `/packages/app` and `/packages/backend`: Example app for local development
+- `/packages/app-next`: Example app using the new frontend system (NFS)
+- `/docs`: Documentation files
+
+Packages prefixed with `core-` (e.g., `@backstage/core-plugin-api`) are part of the old frontend system. Packages prefixed with `frontend-` (e.g., `@backstage/frontend-plugin-api`) are part of the new frontend system (NFS). Packages prefixed with `backend-` (e.g., `@backstage/backend-plugin-api`) are part of the backend system.
## Code Standards
The following files contain guidelines for the project:
+- `/CONTRIBUTING.md`: comprehensive contribution guidelines.
- `/STYLE.md`: guidelines for code style.
-- `/REVIEWING.md`: guidelines for pull requests.
+- `/REVIEWING.md`: guidelines for pull requests and writing changesets.
- `/SECURITY.md`: guidelines for security.
- `/docs/architecture-decisions/`: contains the architecture decisions for the project.
@@ -19,10 +30,12 @@ Before any of these commands can be run, you need to run `yarn install` in the p
- Code formatting: Use `yarn prettier --write ` to format code.
- Lint: Use `yarn lint --fix` in the project root to run the linter.
- API reports: Before submitting a pull request with changes to any package in the workspace, run `yarn build:api-reports` in the project root to generate API reports for all packages.
+- Dev server: Use `yarn start` to run the example app locally (frontend on :3000, backend on :7007).
+- Create: Use `yarn new` to scaffold new plugins, packages, or modules.
You MUST NOT create a release by running `yarn changesets version` or `yarn release` as part of any changes. Releases are created by separate workflows.
-All changes that affect the published version of packages in the `/packages` and `/plugins` directories must be accompanied by a changeset. See the guidelines in `/REVIEWING.md` for information on how to write good changesets. Changesets are stored in the `/.changeset` directory. Breaking changes must be accompanied by a `minor` version bump for packages that below version `1.0.0`, or a `major` version bump for packages that are at version `1.0.0` or higher.
+All changes that affect the published version of packages in the `/packages` and `/plugins` directories must be accompanied by a changeset. Only non-private packages require changesets. See the guidelines in `/CONTRIBUTING.md#creating-changesets` for information on how to write good changesets. Changesets are stored in the `/.changeset` directory. Breaking changes must be accompanied by a `minor` version bump for packages below version `1.0.0`, or a `major` version bump for packages at version `1.0.0` or higher.
Never update ESLint, Prettier, or TypeScript configuration files unless specifically requested.
diff --git a/.github/vale/config/vocabularies/Backstage/accept.txt b/.github/vale/config/vocabularies/Backstage/accept.txt
index 6697fad858..22818c0965 100644
--- a/.github/vale/config/vocabularies/Backstage/accept.txt
+++ b/.github/vale/config/vocabularies/Backstage/accept.txt
@@ -268,6 +268,7 @@ maintainer's
maintainership
makefile
Matomo
+matchers
md
memcache
memoization
@@ -576,3 +577,4 @@ zoomable
zsh
resizable
enums
+LLMs
diff --git a/.github/workflows/sync_patch-release.yml b/.github/workflows/sync_patch-release.yml
index e17a229256..bdf93aa8a0 100644
--- a/.github/workflows/sync_patch-release.yml
+++ b/.github/workflows/sync_patch-release.yml
@@ -36,6 +36,12 @@ jobs:
fetch-tags: true
token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }}
+ - name: Use Node.js 22.x
+ uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
+ with:
+ node-version: 22.x
+ registry-url: https://registry.npmjs.org/ # Needed for auth
+
- name: Configure Git
run: |
git config --global user.email noreply@backstage.io
diff --git a/.storybook/main.ts b/.storybook/main.ts
index 788df83ba9..5453627f34 100644
--- a/.storybook/main.ts
+++ b/.storybook/main.ts
@@ -1,7 +1,13 @@
-import type { StorybookConfig } from '@storybook/react-vite';
+import { defineMain } from '@storybook/react-vite/node';
+import { fileURLToPath } from 'node:url';
+import { createRequire } from 'node:module';
import { join, dirname, posix } from 'path';
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = dirname(__filename);
+const require = createRequire(import.meta.url);
+
const isChromatic = process.env.STORYBOOK_STORY_SET === 'chromatic';
// All stories for full development
@@ -35,13 +41,14 @@ function getAbsolutePath(value: string): any {
return dirname(require.resolve(join(value, 'package.json')));
}
-const config: StorybookConfig = {
+export default defineMain({
stories,
addons: [
getAbsolutePath('@storybook/addon-links'),
getAbsolutePath('@storybook/addon-themes'),
getAbsolutePath('@storybook/addon-docs'),
getAbsolutePath('@storybook/addon-a11y'),
+ getAbsolutePath('@storybook/addon-vitest'),
],
framework: {
name: getAbsolutePath('@storybook/react-vite'),
@@ -122,6 +129,4 @@ const config: StorybookConfig = {
return config;
},
-};
-
-export default config;
+});
diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx
index 8f987ebab1..4e15677aed 100644
--- a/.storybook/preview.tsx
+++ b/.storybook/preview.tsx
@@ -1,8 +1,12 @@
-import React, { useEffect } from 'react';
+import addonA11y from '@storybook/addon-a11y';
+import addonDocs from '@storybook/addon-docs';
+import addonThemes from '@storybook/addon-themes';
+import addonLinks from '@storybook/addon-links';
+import { definePreview } from '@storybook/react-vite';
+import { useEffect } from 'react';
import { TestApiProvider } from '@backstage/test-utils';
import { Content, AlertDisplay } from '@backstage/core-components';
import { apis } from './support/apis';
-import type { Decorator, Preview } from '@storybook/react-vite';
import { useGlobals } from 'storybook/preview-api';
import { UnifiedThemeProvider, themes } from '@backstage/theme';
import { allModes } from './modes';
@@ -16,7 +20,7 @@ import './storybook.css';
// Custom themes
import './themes/spotify.css';
-const preview: Preview = {
+export default definePreview({
globalTypes: {
themeMode: {
name: 'Theme Mode',
@@ -47,10 +51,12 @@ const preview: Preview = {
},
},
},
+
initialGlobals: {
themeMode: 'light',
themeName: 'backstage',
},
+
parameters: {
layout: 'fullscreen',
@@ -72,7 +78,7 @@ const preview: Preview = {
},
viewport: {
- viewports: {
+ options: {
initial: {
name: 'Initial',
styles: { width: '320px', height: '100%' },
@@ -102,6 +108,7 @@ const preview: Preview = {
},
},
},
+
decorators: [
Story => {
const [globals] = useGlobals();
@@ -121,10 +128,11 @@ const preview: Preview = {
};
}, [selectedTheme, selectedThemeName]);
- document.body.style.backgroundColor = 'var(--bui-bg)';
+ document.body.style.backgroundColor = 'var(--bui-bg-surface-0)';
const docsStoryElements = document.getElementsByClassName('docs-story');
Array.from(docsStoryElements).forEach(element => {
- (element as HTMLElement).style.backgroundColor = 'var(--bui-bg)';
+ (element as HTMLElement).style.backgroundColor =
+ 'var(--bui-bg-surface-0)';
});
return (
@@ -140,6 +148,6 @@ const preview: Preview = {
);
},
],
-};
-export default preview;
+ addons: [addonLinks(), addonThemes(), addonDocs(), addonA11y()],
+});
diff --git a/.storybook/themes/spotify.css b/.storybook/themes/spotify.css
index bcb1ded9ff..db3a0ca16c 100644
--- a/.storybook/themes/spotify.css
+++ b/.storybook/themes/spotify.css
@@ -216,9 +216,6 @@
}
[data-theme-mode='light'][data-theme-name='spotify'] {
- --bui-bg: var(--bui-gray-1);
- --bui-bg-surface-1: var(--bui-white);
- --bui-bg-surface-2: var(--bui-gray-2);
--bui-bg-solid: #1ed760;
--bui-bg-solid-hover: #3be477;
--bui-bg-solid-pressed: #1abc54;
@@ -248,9 +245,7 @@
}
[data-theme-mode='dark'][data-theme-name='spotify'] {
- --bui-bg: var(--bui-black);
- --bui-bg-surface-1: var(--bui-gray-1);
- --bui-bg-surface-2: var(--bui-gray-2);
+ --bui-bg-surface-0: var(--bui-black);
--bui-bg-solid: #1ed760;
--bui-bg-solid-hover: #3be477;
--bui-bg-solid-pressed: #1abc54;
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index ba40be86c8..80381417a0 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -17,6 +17,7 @@ If you need help, just jump into our [Discord chatroom](https://discord.gg/backs
- [Accessibility](#accessibility)
- [Get Started!](#get-started)
- [Coding Guidelines](#coding-guidelines)
+- [AI Use Policy and Guidelines](#ai-use-policy-and-guidelines)
- [Documentation Guidelines](#documentation-guidelines)
- [Package Scripts](#package-scripts)
- [Local configuration](#local-configuration)
@@ -128,6 +129,37 @@ If there are any updates in `markdown` file please make sure to run `yarn run li
The Backstage development environment does not require any specific editor, but it is intended to be used with one that has built-in linting and type-checking. The development server does not include any checks by default, but they can be enabled using the `--check` flag. Note that using the flag may consume more system resources and slow things down.
+## AI Use Policy and Guidelines
+
+Our goal in the Backstage project is to develop an excellent software system. This requires careful attention to detail in every change we integrate. Maintainer time and attention is very limited, so it's important that changes you ask us to review represent your _best_ work.
+
+You are encouraged to use tools that help you write good code, including AI tools. However, you always need to understand and explain the changes you're proposing to make, whether or not you used an LLM as part of your process to produce them. The answer to "Why did you make change X?" should never be "I'm not sure. The AI did it."
+
+**Do not submit an AI-generated PR you haven't personally understood and tested**, as this wastes maintainers' time. PRs that appear to violate this guideline will be closed without review. If you do submit a largely AI-generated PR, clearly mark it as such in the description—maintainers may still close it without further review if it does not seem worthwhile.
+
+### Using AI as a Coding Assistant
+
+1. Don't skip **becoming familiar with the part of the codebase** you're working on. This will let you write better prompts and validate their output if you use an LLM. Code assistants can be a useful search engine/discovery tool in this process, but don't trust claims they make about how Backstage works. LLMs are often wrong, even about details that are clearly answered in the [Backstage documentation](https://backstage.io/docs).
+2. Split up your changes into **coherent commits**, even if an LLM generates them all in one go. See our section on [Creating Changesets](#creating-changesets) for guidance on documenting your changes.
+3. Don't simply ask an LLM to add **code comments**, as it will likely produce a bunch of text that unnecessarily explains what's already clear from the code. If using an LLM to generate comments, be really specific in your request, demand succinctness, and carefully edit the result.
+
+### Using AI for Communication
+
+Backstage contributors are expected to communicate with intention, to avoid wasting maintainer time with long, sloppy writing. We strongly prefer clear and concise communication about points that actually require discussion over long AI-generated comments.
+
+When you use an LLM to write a message for you, it remains **your responsibility** to read through the whole thing and make sure that it makes sense to you and represents your ideas concisely. A good rule of thumb is that if you can't make yourself carefully read some LLM output that you generated, nobody else wants to read it either.
+
+Here are some concrete guidelines for using LLMs as part of your communication workflows:
+
+1. When writing a pull request description, **do not include anything that's obvious** from looking at your changes directly (e.g., files changed, functions updated, etc.). Instead, focus on the _why_ behind your changes. Don't ask an LLM to generate a PR description on your behalf based on your code changes, as it will simply regurgitate the information that's already there.
+2. Similarly, when responding to a pull request comment, **explain _your_ reasoning**. Don't prompt an LLM to re-describe what can already be seen from the code.
+3. Verify that **everything you write is accurate**, whether or not an LLM generated any part of it. Backstage's maintainers will be unable to review your contributions if you misrepresent your work (e.g., wrongly describing your code changes, their effect, or your testing process).
+4. Complete all parts of the **PR description template**, including screenshots and the checklist. Don't simply overwrite the template with LLM output.
+5. **Clarity and succinctness** are much more important than perfect grammar, so you shouldn't feel obliged to pass your writing through an LLM. If you do ask an LLM to clean up your writing style, be sure it does _not_ make it longer in the process. Demand succinctness in your prompt.
+6. Quoting an LLM answer is usually less helpful than linking to **relevant primary sources**, like source code, [Backstage documentation](https://backstage.io/docs), or reference materials. If you do need to quote an LLM answer in a discussion, clearly distinguish LLM output from your own thoughts.
+
+If you have questions about AI usage or need help, feel free to ask in [Discord](https://discord.gg/backstage-687207715902193673).
+
## Documentation Guidelines
Contributing to the docs is one of the best ways to start getting involved with Backstage. The documentation site is often the first stop for anyone using or exploring Backstage, so even small improvements can have a big impact!
diff --git a/app-config.yaml b/app-config.yaml
index 08c97c1172..54ece44da3 100644
--- a/app-config.yaml
+++ b/app-config.yaml
@@ -109,8 +109,12 @@ integrations:
token: ${GITLAB_TOKEN}
### Example for how to add a bitbucket cloud integration
# bitbucketCloud:
+ # # Using API token
# - username: ${BITBUCKET_USERNAME}
# token: ${BITBUCKET_API_TOKEN}
+ # # Using OAuth
+ # - clientId: ${BITBUCKET_CLIENT_ID}
+ # clientSecret: ${BITBUCKET_CLIENT_SECRET}
### Example for how to add your bitbucket server instance using the API:
# - host: server.bitbucket.com
# apiBaseUrl: server.bitbucket.com
diff --git a/docs-ui/package.json b/docs-ui/package.json
index d6dcb4830a..2f17987107 100644
--- a/docs-ui/package.json
+++ b/docs-ui/package.json
@@ -38,7 +38,7 @@
"react": "19.1.1",
"react-dom": "19.1.1",
"shiki": "^3.13.0",
- "storybook": "^8.6.12"
+ "storybook": "^8.6.15"
},
"devDependencies": {
"@octokit/rest": "^22.0.1",
diff --git a/docs-ui/public/theme-backstage.css b/docs-ui/public/theme-backstage.css
index 59a5b986be..9b59448c11 100644
--- a/docs-ui/public/theme-backstage.css
+++ b/docs-ui/public/theme-backstage.css
@@ -1 +1 @@
-@layer tokens{:root{--bui-font-regular:system-ui;--bui-font-monospace:ui-monospace,"Menlo","Monaco","Consolas","Liberation Mono","Courier New",monospace;--bui-font-weight-regular:400;--bui-font-weight-bold:600;--bui-font-size-1:.625rem;--bui-font-size-2:.75rem;--bui-font-size-3:.875rem;--bui-font-size-4:1rem;--bui-font-size-5:1.25rem;--bui-font-size-6:1.5rem;--bui-font-size-7:2rem;--bui-font-size-8:3rem;--bui-font-size-9:4rem;--bui-font-size-10:5.75rem;--bui-space:.25rem;--bui-space-0_5:calc(var(--bui-space)*.5);--bui-space-1:var(--bui-space);--bui-space-1_5:calc(var(--bui-space)*1.5);--bui-space-2:calc(var(--bui-space)*2);--bui-space-3:calc(var(--bui-space)*3);--bui-space-4:calc(var(--bui-space)*4);--bui-space-5:calc(var(--bui-space)*5);--bui-space-6:calc(var(--bui-space)*6);--bui-space-7:calc(var(--bui-space)*7);--bui-space-8:calc(var(--bui-space)*8);--bui-space-9:calc(var(--bui-space)*9);--bui-space-10:calc(var(--bui-space)*10);--bui-space-11:calc(var(--bui-space)*11);--bui-space-12:calc(var(--bui-space)*12);--bui-space-13:calc(var(--bui-space)*13);--bui-space-14:calc(var(--bui-space)*14);--bui-radius-1:calc(.125rem);--bui-radius-2:calc(.25rem);--bui-radius-3:calc(.5rem);--bui-radius-4:calc(.75rem);--bui-radius-5:calc(1rem);--bui-radius-6:calc(1.25rem);--bui-radius-full:9999px;--bui-black:#000;--bui-white:#fff;--bui-gray-1:#f8f8f8;--bui-gray-2:#ececec;--bui-gray-3:#d9d9d9;--bui-gray-4:#c1c1c1;--bui-gray-5:#9e9e9e;--bui-gray-6:#8c8c8c;--bui-gray-7:#757575;--bui-gray-8:#595959;--bui-bg:var(--bui-gray-1);--bui-bg-surface-1:var(--bui-white);--bui-bg-surface-2:var(--bui-gray-2);--bui-bg-solid:#1f5493;--bui-bg-solid-hover:#163a66;--bui-bg-solid-pressed:#0f2b4e;--bui-bg-solid-disabled:#ebebeb;--bui-bg-tint:transparent;--bui-bg-tint-hover:#1f549366;--bui-bg-tint-pressed:#1f549399;--bui-bg-tint-disabled:#ebebeb;--bui-bg-danger:#feebe7;--bui-bg-warning:#fff2b2;--bui-bg-success:#e6f6eb;--bui-fg-primary:var(--bui-black);--bui-fg-secondary:var(--bui-gray-7);--bui-fg-link:#1f5493;--bui-fg-link-hover:#1f2d5c;--bui-fg-disabled:#9e9e9e;--bui-fg-solid:var(--bui-white);--bui-fg-solid-disabled:#9c9c9c;--bui-fg-tint:#1f5493;--bui-fg-tint-disabled:var(--bui-gray-5);--bui-fg-danger:#e22b2b;--bui-fg-warning:#e36d05;--bui-fg-success:#1db954;--bui-border:#0000001a;--bui-border-hover:#0003;--bui-border-pressed:#0006;--bui-border-disabled:#0000001a;--bui-border-danger:#f87a7a;--bui-border-warning:#e36d05;--bui-border-success:#53db83;--bui-ring:#1f5493;--bui-scrollbar:#a0a0a03b;--bui-scrollbar-thumb:#a0a0a0;--bui-animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite}[data-theme-mode=dark]{--bui-gray-1:#191919;--bui-gray-2:#242424;--bui-gray-3:#373737;--bui-gray-4:#464646;--bui-gray-5:#575757;--bui-gray-6:#7b7b7b;--bui-gray-7:#9e9e9e;--bui-gray-8:#b4b4b4;--bui-bg:#333;--bui-bg-surface-1:#424242;--bui-bg-surface-2:var(--bui-gray-2);--bui-bg-solid:#9cc9ff;--bui-bg-solid-hover:#83b9fd;--bui-bg-solid-pressed:#83b9fd;--bui-bg-solid-disabled:#222;--bui-bg-tint:transparent;--bui-bg-tint-hover:#9cc9ff1f;--bui-bg-tint-pressed:#9cc9ff29;--bui-bg-tint-disabled:transparent;--bui-bg-danger:#3b1219;--bui-bg-warning:#302008;--bui-bg-success:#132d21;--bui-fg-primary:var(--bui-white);--bui-fg-secondary:var(--bui-gray-7);--bui-fg-link:#9cc9ff;--bui-fg-link-hover:#7eb5f7;--bui-fg-disabled:var(--bui-gray-7);--bui-fg-solid:#101821;--bui-fg-solid-disabled:var(--bui-gray-5);--bui-fg-tint:#9cc9ff;--bui-fg-tint-disabled:var(--bui-gray-5);--bui-fg-danger:#e22b2b;--bui-fg-warning:#e36d05;--bui-fg-success:#1db954;--bui-border:#ffffff1f;--bui-border-hover:#fff6;--bui-border-pressed:#ffffff80;--bui-border-disabled:#fff3;--bui-border-danger:#f87a7a;--bui-border-warning:#e36d05;--bui-border-success:#53db83;--bui-ring:#1f5493;--bui-scrollbar:#3636363a;--bui-scrollbar-thumb:#575757}}@layer base{*,:before,:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;tab-size:4;font-family:system-ui,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;line-height:1.15}body{margin:0}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{border-color:currentColor}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:100%;line-height:1.15}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}legend{padding:0}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}:where(a){color:inherit;text-decoration:none}@keyframes pulse{50%{opacity:.5}}body{background-color:var(--bui-bg);color:var(--bui-fg-primary);font-family:var(--bui-font-regular);font-weight:var(--bui-font-weight-regular);font-size:var(--bui-font-size-3);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}}@layer components;@layer utilities{.bui-p{padding:var(--p)}.bui-p-0\.5{padding:var(--bui-space-0_5)}.bui-p-1{padding:var(--bui-space-1)}.bui-p-1\.5{padding:var(--bui-space-1_5)}.bui-p-2{padding:var(--bui-space-2)}.bui-p-3{padding:var(--bui-space-3)}.bui-p-4{padding:var(--bui-space-4)}.bui-p-5{padding:var(--bui-space-5)}.bui-p-6{padding:var(--bui-space-6)}.bui-p-7{padding:var(--bui-space-7)}.bui-p-8{padding:var(--bui-space-8)}.bui-p-9{padding:var(--bui-space-9)}.bui-p-10{padding:var(--bui-space-10)}.bui-p-11{padding:var(--bui-space-11)}.bui-p-12{padding:var(--bui-space-12)}.bui-p-13{padding:var(--bui-space-13)}.bui-p-14{padding:var(--bui-space-14)}@media (width>=640px){.xs\:bui-p{padding:var(--p-xs)}.xs\:bui-p-0\.5{padding:var(--bui-space-0_5)}.xs\:bui-p-1{padding:var(--bui-space-1)}.xs\:bui-p-1\.5{padding:var(--bui-space-1_5)}.xs\:bui-p-2{padding:var(--bui-space-2)}.xs\:bui-p-3{padding:var(--bui-space-3)}.xs\:bui-p-4{padding:var(--bui-space-4)}.xs\:bui-p-5{padding:var(--bui-space-5)}.xs\:bui-p-6{padding:var(--bui-space-6)}.xs\:bui-p-7{padding:var(--bui-space-7)}.xs\:bui-p-8{padding:var(--bui-space-8)}.xs\:bui-p-9{padding:var(--bui-space-9)}.xs\:bui-p-10{padding:var(--bui-space-10)}.xs\:bui-p-11{padding:var(--bui-space-11)}.xs\:bui-p-12{padding:var(--bui-space-12)}.xs\:bui-p-13{padding:var(--bui-space-13)}.xs\:bui-p-14{padding:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-p{padding:var(--p-sm)}.sm\:bui-p-0\.5{padding:var(--bui-space-0_5)}.sm\:bui-p-1{padding:var(--bui-space-1)}.sm\:bui-p-1\.5{padding:var(--bui-space-1_5)}.sm\:bui-p-2{padding:var(--bui-space-2)}.sm\:bui-p-3{padding:var(--bui-space-3)}.sm\:bui-p-4{padding:var(--bui-space-4)}.sm\:bui-p-5{padding:var(--bui-space-5)}.sm\:bui-p-6{padding:var(--bui-space-6)}.sm\:bui-p-7{padding:var(--bui-space-7)}.sm\:bui-p-8{padding:var(--bui-space-8)}.sm\:bui-p-9{padding:var(--bui-space-9)}.sm\:bui-p-10{padding:var(--bui-space-10)}.sm\:bui-p-11{padding:var(--bui-space-11)}.sm\:bui-p-12{padding:var(--bui-space-12)}.sm\:bui-p-13{padding:var(--bui-space-13)}.sm\:bui-p-14{padding:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-p{padding:var(--p-md)}.md\:bui-p-0\.5{padding:var(--bui-space-0_5)}.md\:bui-p-1{padding:var(--bui-space-1)}.md\:bui-p-1\.5{padding:var(--bui-space-1_5)}.md\:bui-p-2{padding:var(--bui-space-2)}.md\:bui-p-3{padding:var(--bui-space-3)}.md\:bui-p-4{padding:var(--bui-space-4)}.md\:bui-p-5{padding:var(--bui-space-5)}.md\:bui-p-6{padding:var(--bui-space-6)}.md\:bui-p-7{padding:var(--bui-space-7)}.md\:bui-p-8{padding:var(--bui-space-8)}.md\:bui-p-9{padding:var(--bui-space-9)}.md\:bui-p-10{padding:var(--bui-space-10)}.md\:bui-p-11{padding:var(--bui-space-11)}.md\:bui-p-12{padding:var(--bui-space-12)}.md\:bui-p-13{padding:var(--bui-space-13)}.md\:bui-p-14{padding:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-p{padding:var(--p-lg)}.lg\:bui-p-0\.5{padding:var(--bui-space-0_5)}.lg\:bui-p-1{padding:var(--bui-space-1)}.lg\:bui-p-1\.5{padding:var(--bui-space-1_5)}.lg\:bui-p-2{padding:var(--bui-space-2)}.lg\:bui-p-3{padding:var(--bui-space-3)}.lg\:bui-p-4{padding:var(--bui-space-4)}.lg\:bui-p-5{padding:var(--bui-space-5)}.lg\:bui-p-6{padding:var(--bui-space-6)}.lg\:bui-p-7{padding:var(--bui-space-7)}.lg\:bui-p-8{padding:var(--bui-space-8)}.lg\:bui-p-9{padding:var(--bui-space-9)}.lg\:bui-p-10{padding:var(--bui-space-10)}.lg\:bui-p-11{padding:var(--bui-space-11)}.lg\:bui-p-12{padding:var(--bui-space-12)}.lg\:bui-p-13{padding:var(--bui-space-13)}.lg\:bui-p-14{padding:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-p{padding:var(--p-xl)}.xl\:bui-p-0\.5{padding:var(--bui-space-0_5)}.xl\:bui-p-1{padding:var(--bui-space-1)}.xl\:bui-p-1\.5{padding:var(--bui-space-1_5)}.xl\:bui-p-2{padding:var(--bui-space-2)}.xl\:bui-p-3{padding:var(--bui-space-3)}.xl\:bui-p-4{padding:var(--bui-space-4)}.xl\:bui-p-5{padding:var(--bui-space-5)}.xl\:bui-p-6{padding:var(--bui-space-6)}.xl\:bui-p-7{padding:var(--bui-space-7)}.xl\:bui-p-8{padding:var(--bui-space-8)}.xl\:bui-p-9{padding:var(--bui-space-9)}.xl\:bui-p-10{padding:var(--bui-space-10)}.xl\:bui-p-11{padding:var(--bui-space-11)}.xl\:bui-p-12{padding:var(--bui-space-12)}.xl\:bui-p-13{padding:var(--bui-space-13)}.xl\:bui-p-14{padding:var(--bui-space-14)}}.bui-pl{padding-left:var(--pl)}.bui-pl-0\.5{padding-left:var(--bui-space-0_5)}.bui-pl-1{padding-left:var(--bui-space-1)}.bui-pl-1\.5{padding-left:var(--bui-space-1_5)}.bui-pl-2{padding-left:var(--bui-space-2)}.bui-pl-3{padding-left:var(--bui-space-3)}.bui-pl-4{padding-left:var(--bui-space-4)}.bui-pl-5{padding-left:var(--bui-space-5)}.bui-pl-6{padding-left:var(--bui-space-6)}.bui-pl-7{padding-left:var(--bui-space-7)}.bui-pl-8{padding-left:var(--bui-space-8)}.bui-pl-9{padding-left:var(--bui-space-9)}.bui-pl-10{padding-left:var(--bui-space-10)}.bui-pl-11{padding-left:var(--bui-space-11)}.bui-pl-12{padding-left:var(--bui-space-12)}.bui-pl-13{padding-left:var(--bui-space-13)}.bui-pl-14{padding-left:var(--bui-space-14)}@media (width>=640px){.xs\:bui-pl{padding-left:var(--pl-xs)}.xs\:bui-pl-0\.5{padding-left:var(--bui-space-0_5)}.xs\:bui-pl-1{padding-left:var(--bui-space-1)}.xs\:bui-pl-1\.5{padding-left:var(--bui-space-1_5)}.xs\:bui-pl-2{padding-left:var(--bui-space-2)}.xs\:bui-pl-3{padding-left:var(--bui-space-3)}.xs\:bui-pl-4{padding-left:var(--bui-space-4)}.xs\:bui-pl-5{padding-left:var(--bui-space-5)}.xs\:bui-pl-6{padding-left:var(--bui-space-6)}.xs\:bui-pl-7{padding-left:var(--bui-space-7)}.xs\:bui-pl-8{padding-left:var(--bui-space-8)}.xs\:bui-pl-9{padding-left:var(--bui-space-9)}.xs\:bui-pl-10{padding-left:var(--bui-space-10)}.xs\:bui-pl-11{padding-left:var(--bui-space-11)}.xs\:bui-pl-12{padding-left:var(--bui-space-12)}.xs\:bui-pl-13{padding-left:var(--bui-space-13)}.xs\:bui-pl-14{padding-left:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-pl{padding-left:var(--pl-sm)}.sm\:bui-pl-0\.5{padding-left:var(--bui-space-0_5)}.sm\:bui-pl-1{padding-left:var(--bui-space-1)}.sm\:bui-pl-1\.5{padding-left:var(--bui-space-1_5)}.sm\:bui-pl-2{padding-left:var(--bui-space-2)}.sm\:bui-pl-3{padding-left:var(--bui-space-3)}.sm\:bui-pl-4{padding-left:var(--bui-space-4)}.sm\:bui-pl-5{padding-left:var(--bui-space-5)}.sm\:bui-pl-6{padding-left:var(--bui-space-6)}.sm\:bui-pl-7{padding-left:var(--bui-space-7)}.sm\:bui-pl-8{padding-left:var(--bui-space-8)}.sm\:bui-pl-9{padding-left:var(--bui-space-9)}.sm\:bui-pl-10{padding-left:var(--bui-space-10)}.sm\:bui-pl-11{padding-left:var(--bui-space-11)}.sm\:bui-pl-12{padding-left:var(--bui-space-12)}.sm\:bui-pl-13{padding-left:var(--bui-space-13)}.sm\:bui-pl-14{padding-left:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-pl{padding-left:var(--pl-md)}.md\:bui-pl-0\.5{padding-left:var(--bui-space-0_5)}.md\:bui-pl-1{padding-left:var(--bui-space-1)}.md\:bui-pl-1\.5{padding-left:var(--bui-space-1_5)}.md\:bui-pl-2{padding-left:var(--bui-space-2)}.md\:bui-pl-3{padding-left:var(--bui-space-3)}.md\:bui-pl-4{padding-left:var(--bui-space-4)}.md\:bui-pl-5{padding-left:var(--bui-space-5)}.md\:bui-pl-6{padding-left:var(--bui-space-6)}.md\:bui-pl-7{padding-left:var(--bui-space-7)}.md\:bui-pl-8{padding-left:var(--bui-space-8)}.md\:bui-pl-9{padding-left:var(--bui-space-9)}.md\:bui-pl-10{padding-left:var(--bui-space-10)}.md\:bui-pl-11{padding-left:var(--bui-space-11)}.md\:bui-pl-12{padding-left:var(--bui-space-12)}.md\:bui-pl-13{padding-left:var(--bui-space-13)}.md\:bui-pl-14{padding-left:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-pl{padding-left:var(--pl-lg)}.lg\:bui-pl-0\.5{padding-left:var(--bui-space-0_5)}.lg\:bui-pl-1{padding-left:var(--bui-space-1)}.lg\:bui-pl-1\.5{padding-left:var(--bui-space-1_5)}.lg\:bui-pl-2{padding-left:var(--bui-space-2)}.lg\:bui-pl-3{padding-left:var(--bui-space-3)}.lg\:bui-pl-4{padding-left:var(--bui-space-4)}.lg\:bui-pl-5{padding-left:var(--bui-space-5)}.lg\:bui-pl-6{padding-left:var(--bui-space-6)}.lg\:bui-pl-7{padding-left:var(--bui-space-7)}.lg\:bui-pl-8{padding-left:var(--bui-space-8)}.lg\:bui-pl-9{padding-left:var(--bui-space-9)}.lg\:bui-pl-10{padding-left:var(--bui-space-10)}.lg\:bui-pl-11{padding-left:var(--bui-space-11)}.lg\:bui-pl-12{padding-left:var(--bui-space-12)}.lg\:bui-pl-13{padding-left:var(--bui-space-13)}.lg\:bui-pl-14{padding-left:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-pl{padding-left:var(--pl-xl)}.xl\:bui-pl-0\.5{padding-left:var(--bui-space-0_5)}.xl\:bui-pl-1{padding-left:var(--bui-space-1)}.xl\:bui-pl-1\.5{padding-left:var(--bui-space-1_5)}.xl\:bui-pl-2{padding-left:var(--bui-space-2)}.xl\:bui-pl-3{padding-left:var(--bui-space-3)}.xl\:bui-pl-4{padding-left:var(--bui-space-4)}.xl\:bui-pl-5{padding-left:var(--bui-space-5)}.xl\:bui-pl-6{padding-left:var(--bui-space-6)}.xl\:bui-pl-7{padding-left:var(--bui-space-7)}.xl\:bui-pl-8{padding-left:var(--bui-space-8)}.xl\:bui-pl-9{padding-left:var(--bui-space-9)}.xl\:bui-pl-10{padding-left:var(--bui-space-10)}.xl\:bui-pl-11{padding-left:var(--bui-space-11)}.xl\:bui-pl-12{padding-left:var(--bui-space-12)}.xl\:bui-pl-13{padding-left:var(--bui-space-13)}.xl\:bui-pl-14{padding-left:var(--bui-space-14)}}.bui-pr{padding-right:var(--pr)}.bui-pr-0\.5{padding-right:var(--bui-space-0_5)}.bui-pr-1{padding-right:var(--bui-space-1)}.bui-pr-1\.5{padding-right:var(--bui-space-1_5)}.bui-pr-2{padding-right:var(--bui-space-2)}.bui-pr-3{padding-right:var(--bui-space-3)}.bui-pr-4{padding-right:var(--bui-space-4)}.bui-pr-5{padding-right:var(--bui-space-5)}.bui-pr-6{padding-right:var(--bui-space-6)}.bui-pr-7{padding-right:var(--bui-space-7)}.bui-pr-8{padding-right:var(--bui-space-8)}.bui-pr-9{padding-right:var(--bui-space-9)}.bui-pr-10{padding-right:var(--bui-space-10)}.bui-pr-11{padding-right:var(--bui-space-11)}.bui-pr-12{padding-right:var(--bui-space-12)}.bui-pr-13{padding-right:var(--bui-space-13)}.bui-pr-14{padding-right:var(--bui-space-14)}@media (width>=640px){.xs\:bui-pr{padding-right:var(--pr-xs)}.xs\:bui-pr-0\.5{padding-right:var(--bui-space-0_5)}.xs\:bui-pr-1{padding-right:var(--bui-space-1)}.xs\:bui-pr-1\.5{padding-right:var(--bui-space-1_5)}.xs\:bui-pr-2{padding-right:var(--bui-space-2)}.xs\:bui-pr-3{padding-right:var(--bui-space-3)}.xs\:bui-pr-4{padding-right:var(--bui-space-4)}.xs\:bui-pr-5{padding-right:var(--bui-space-5)}.xs\:bui-pr-6{padding-right:var(--bui-space-6)}.xs\:bui-pr-7{padding-right:var(--bui-space-7)}.xs\:bui-pr-8{padding-right:var(--bui-space-8)}.xs\:bui-pr-9{padding-right:var(--bui-space-9)}.xs\:bui-pr-10{padding-right:var(--bui-space-10)}.xs\:bui-pr-11{padding-right:var(--bui-space-11)}.xs\:bui-pr-12{padding-right:var(--bui-space-12)}.xs\:bui-pr-13{padding-right:var(--bui-space-13)}.xs\:bui-pr-14{padding-right:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-pr{padding-right:var(--pr-sm)}.sm\:bui-pr-0\.5{padding-right:var(--bui-space-0_5)}.sm\:bui-pr-1{padding-right:var(--bui-space-1)}.sm\:bui-pr-1\.5{padding-right:var(--bui-space-1_5)}.sm\:bui-pr-2{padding-right:var(--bui-space-2)}.sm\:bui-pr-3{padding-right:var(--bui-space-3)}.sm\:bui-pr-4{padding-right:var(--bui-space-4)}.sm\:bui-pr-5{padding-right:var(--bui-space-5)}.sm\:bui-pr-6{padding-right:var(--bui-space-6)}.sm\:bui-pr-7{padding-right:var(--bui-space-7)}.sm\:bui-pr-8{padding-right:var(--bui-space-8)}.sm\:bui-pr-9{padding-right:var(--bui-space-9)}.sm\:bui-pr-10{padding-right:var(--bui-space-10)}.sm\:bui-pr-11{padding-right:var(--bui-space-11)}.sm\:bui-pr-12{padding-right:var(--bui-space-12)}.sm\:bui-pr-13{padding-right:var(--bui-space-13)}.sm\:bui-pr-14{padding-right:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-pr{padding-right:var(--pr-md)}.md\:bui-pr-0\.5{padding-right:var(--bui-space-0_5)}.md\:bui-pr-1{padding-right:var(--bui-space-1)}.md\:bui-pr-1\.5{padding-right:var(--bui-space-1_5)}.md\:bui-pr-2{padding-right:var(--bui-space-2)}.md\:bui-pr-3{padding-right:var(--bui-space-3)}.md\:bui-pr-4{padding-right:var(--bui-space-4)}.md\:bui-pr-5{padding-right:var(--bui-space-5)}.md\:bui-pr-6{padding-right:var(--bui-space-6)}.md\:bui-pr-7{padding-right:var(--bui-space-7)}.md\:bui-pr-8{padding-right:var(--bui-space-8)}.md\:bui-pr-9{padding-right:var(--bui-space-9)}.md\:bui-pr-10{padding-right:var(--bui-space-10)}.md\:bui-pr-11{padding-right:var(--bui-space-11)}.md\:bui-pr-12{padding-right:var(--bui-space-12)}.md\:bui-pr-13{padding-right:var(--bui-space-13)}.md\:bui-pr-14{padding-right:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-pr{padding-right:var(--pr-lg)}.lg\:bui-pr-0\.5{padding-right:var(--bui-space-0_5)}.lg\:bui-pr-1{padding-right:var(--bui-space-1)}.lg\:bui-pr-1\.5{padding-right:var(--bui-space-1_5)}.lg\:bui-pr-2{padding-right:var(--bui-space-2)}.lg\:bui-pr-3{padding-right:var(--bui-space-3)}.lg\:bui-pr-4{padding-right:var(--bui-space-4)}.lg\:bui-pr-5{padding-right:var(--bui-space-5)}.lg\:bui-pr-6{padding-right:var(--bui-space-6)}.lg\:bui-pr-7{padding-right:var(--bui-space-7)}.lg\:bui-pr-8{padding-right:var(--bui-space-8)}.lg\:bui-pr-9{padding-right:var(--bui-space-9)}.lg\:bui-pr-10{padding-right:var(--bui-space-10)}.lg\:bui-pr-11{padding-right:var(--bui-space-11)}.lg\:bui-pr-12{padding-right:var(--bui-space-12)}.lg\:bui-pr-13{padding-right:var(--bui-space-13)}.lg\:bui-pr-14{padding-right:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-pr{padding-right:var(--pr-xl)}.xl\:bui-pr-0\.5{padding-right:var(--bui-space-0_5)}.xl\:bui-pr-1{padding-right:var(--bui-space-1)}.xl\:bui-pr-1\.5{padding-right:var(--bui-space-1_5)}.xl\:bui-pr-2{padding-right:var(--bui-space-2)}.xl\:bui-pr-3{padding-right:var(--bui-space-3)}.xl\:bui-pr-4{padding-right:var(--bui-space-4)}.xl\:bui-pr-5{padding-right:var(--bui-space-5)}.xl\:bui-pr-6{padding-right:var(--bui-space-6)}.xl\:bui-pr-7{padding-right:var(--bui-space-7)}.xl\:bui-pr-8{padding-right:var(--bui-space-8)}.xl\:bui-pr-9{padding-right:var(--bui-space-9)}.xl\:bui-pr-10{padding-right:var(--bui-space-10)}.xl\:bui-pr-11{padding-right:var(--bui-space-11)}.xl\:bui-pr-12{padding-right:var(--bui-space-12)}.xl\:bui-pr-13{padding-right:var(--bui-space-13)}.xl\:bui-pr-14{padding-right:var(--bui-space-14)}}.bui-pt{padding-top:var(--pt)}.bui-pt-0\.5{padding-top:var(--bui-space-0_5)}.bui-pt-1{padding-top:var(--bui-space-1)}.bui-pt-1\.5{padding-top:var(--bui-space-1_5)}.bui-pt-2{padding-top:var(--bui-space-2)}.bui-pt-3{padding-top:var(--bui-space-3)}.bui-pt-4{padding-top:var(--bui-space-4)}.bui-pt-5{padding-top:var(--bui-space-5)}.bui-pt-6{padding-top:var(--bui-space-6)}.bui-pt-7{padding-top:var(--bui-space-7)}.bui-pt-8{padding-top:var(--bui-space-8)}.bui-pt-9{padding-top:var(--bui-space-9)}.bui-pt-10{padding-top:var(--bui-space-10)}.bui-pt-11{padding-top:var(--bui-space-11)}.bui-pt-12{padding-top:var(--bui-space-12)}.bui-pt-13{padding-top:var(--bui-space-13)}.bui-pt-14{padding-top:var(--bui-space-14)}@media (width>=640px){.xs\:bui-pt{padding-top:var(--pt-xs)}.xs\:bui-pt-0\.5{padding-top:var(--bui-space-0_5)}.xs\:bui-pt-1{padding-top:var(--bui-space-1)}.xs\:bui-pt-1\.5{padding-top:var(--bui-space-1_5)}.xs\:bui-pt-2{padding-top:var(--bui-space-2)}.xs\:bui-pt-3{padding-top:var(--bui-space-3)}.xs\:bui-pt-4{padding-top:var(--bui-space-4)}.xs\:bui-pt-5{padding-top:var(--bui-space-5)}.xs\:bui-pt-6{padding-top:var(--bui-space-6)}.xs\:bui-pt-7{padding-top:var(--bui-space-7)}.xs\:bui-pt-8{padding-top:var(--bui-space-8)}.xs\:bui-pt-9{padding-top:var(--bui-space-9)}.xs\:bui-pt-10{padding-top:var(--bui-space-10)}.xs\:bui-pt-11{padding-top:var(--bui-space-11)}.xs\:bui-pt-12{padding-top:var(--bui-space-12)}.xs\:bui-pt-13{padding-top:var(--bui-space-13)}.xs\:bui-pt-14{padding-top:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-pt{padding-top:var(--pt-sm)}.sm\:bui-pt-0\.5{padding-top:var(--bui-space-0_5)}.sm\:bui-pt-1{padding-top:var(--bui-space-1)}.sm\:bui-pt-1\.5{padding-top:var(--bui-space-1_5)}.sm\:bui-pt-2{padding-top:var(--bui-space-2)}.sm\:bui-pt-3{padding-top:var(--bui-space-3)}.sm\:bui-pt-4{padding-top:var(--bui-space-4)}.sm\:bui-pt-5{padding-top:var(--bui-space-5)}.sm\:bui-pt-6{padding-top:var(--bui-space-6)}.sm\:bui-pt-7{padding-top:var(--bui-space-7)}.sm\:bui-pt-8{padding-top:var(--bui-space-8)}.sm\:bui-pt-9{padding-top:var(--bui-space-9)}.sm\:bui-pt-10{padding-top:var(--bui-space-10)}.sm\:bui-pt-11{padding-top:var(--bui-space-11)}.sm\:bui-pt-12{padding-top:var(--bui-space-12)}.sm\:bui-pt-13{padding-top:var(--bui-space-13)}.sm\:bui-pt-14{padding-top:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-pt{padding-top:var(--pt-md)}.md\:bui-pt-0\.5{padding-top:var(--bui-space-0_5)}.md\:bui-pt-1{padding-top:var(--bui-space-1)}.md\:bui-pt-1\.5{padding-top:var(--bui-space-1_5)}.md\:bui-pt-2{padding-top:var(--bui-space-2)}.md\:bui-pt-3{padding-top:var(--bui-space-3)}.md\:bui-pt-4{padding-top:var(--bui-space-4)}.md\:bui-pt-5{padding-top:var(--bui-space-5)}.md\:bui-pt-6{padding-top:var(--bui-space-6)}.md\:bui-pt-7{padding-top:var(--bui-space-7)}.md\:bui-pt-8{padding-top:var(--bui-space-8)}.md\:bui-pt-9{padding-top:var(--bui-space-9)}.md\:bui-pt-10{padding-top:var(--bui-space-10)}.md\:bui-pt-11{padding-top:var(--bui-space-11)}.md\:bui-pt-12{padding-top:var(--bui-space-12)}.md\:bui-pt-13{padding-top:var(--bui-space-13)}.md\:bui-pt-14{padding-top:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-pt{padding-top:var(--pt-lg)}.lg\:bui-pt-0\.5{padding-top:var(--bui-space-0_5)}.lg\:bui-pt-1{padding-top:var(--bui-space-1)}.lg\:bui-pt-1\.5{padding-top:var(--bui-space-1_5)}.lg\:bui-pt-2{padding-top:var(--bui-space-2)}.lg\:bui-pt-3{padding-top:var(--bui-space-3)}.lg\:bui-pt-4{padding-top:var(--bui-space-4)}.lg\:bui-pt-5{padding-top:var(--bui-space-5)}.lg\:bui-pt-6{padding-top:var(--bui-space-6)}.lg\:bui-pt-7{padding-top:var(--bui-space-7)}.lg\:bui-pt-8{padding-top:var(--bui-space-8)}.lg\:bui-pt-9{padding-top:var(--bui-space-9)}.lg\:bui-pt-10{padding-top:var(--bui-space-10)}.lg\:bui-pt-11{padding-top:var(--bui-space-11)}.lg\:bui-pt-12{padding-top:var(--bui-space-12)}.lg\:bui-pt-13{padding-top:var(--bui-space-13)}.lg\:bui-pt-14{padding-top:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-pt{padding-top:var(--pt-xl)}.xl\:bui-pt-0\.5{padding-top:var(--bui-space-0_5)}.xl\:bui-pt-1{padding-top:var(--bui-space-1)}.xl\:bui-pt-1\.5{padding-top:var(--bui-space-1_5)}.xl\:bui-pt-2{padding-top:var(--bui-space-2)}.xl\:bui-pt-3{padding-top:var(--bui-space-3)}.xl\:bui-pt-4{padding-top:var(--bui-space-4)}.xl\:bui-pt-5{padding-top:var(--bui-space-5)}.xl\:bui-pt-6{padding-top:var(--bui-space-6)}.xl\:bui-pt-7{padding-top:var(--bui-space-7)}.xl\:bui-pt-8{padding-top:var(--bui-space-8)}.xl\:bui-pt-9{padding-top:var(--bui-space-9)}.xl\:bui-pt-10{padding-top:var(--bui-space-10)}.xl\:bui-pt-11{padding-top:var(--bui-space-11)}.xl\:bui-pt-12{padding-top:var(--bui-space-12)}.xl\:bui-pt-13{padding-top:var(--bui-space-13)}.xl\:bui-pt-14{padding-top:var(--bui-space-14)}}.bui-pb{padding-bottom:var(--pb)}.bui-pb-0\.5{padding-bottom:var(--bui-space-0_5)}.bui-pb-1{padding-bottom:var(--bui-space-1)}.bui-pb-1\.5{padding-bottom:var(--bui-space-1_5)}.bui-pb-2{padding-bottom:var(--bui-space-2)}.bui-pb-3{padding-bottom:var(--bui-space-3)}.bui-pb-4{padding-bottom:var(--bui-space-4)}.bui-pb-5{padding-bottom:var(--bui-space-5)}.bui-pb-6{padding-bottom:var(--bui-space-6)}.bui-pb-7{padding-bottom:var(--bui-space-7)}.bui-pb-8{padding-bottom:var(--bui-space-8)}.bui-pb-9{padding-bottom:var(--bui-space-9)}.bui-pb-10{padding-bottom:var(--bui-space-10)}.bui-pb-11{padding-bottom:var(--bui-space-11)}.bui-pb-12{padding-bottom:var(--bui-space-12)}.bui-pb-13{padding-bottom:var(--bui-space-13)}.bui-pb-14{padding-bottom:var(--bui-space-14)}@media (width>=640px){.xs\:bui-pb{padding-bottom:var(--pb-xs)}.xs\:bui-pb-0\.5{padding-bottom:var(--bui-space-0_5)}.xs\:bui-pb-1{padding-bottom:var(--bui-space-1)}.xs\:bui-pb-1\.5{padding-bottom:var(--bui-space-1_5)}.xs\:bui-pb-2{padding-bottom:var(--bui-space-2)}.xs\:bui-pb-3{padding-bottom:var(--bui-space-3)}.xs\:bui-pb-4{padding-bottom:var(--bui-space-4)}.xs\:bui-pb-5{padding-bottom:var(--bui-space-5)}.xs\:bui-pb-6{padding-bottom:var(--bui-space-6)}.xs\:bui-pb-7{padding-bottom:var(--bui-space-7)}.xs\:bui-pb-8{padding-bottom:var(--bui-space-8)}.xs\:bui-pb-9{padding-bottom:var(--bui-space-9)}.xs\:bui-pb-10{padding-bottom:var(--bui-space-10)}.xs\:bui-pb-11{padding-bottom:var(--bui-space-11)}.xs\:bui-pb-12{padding-bottom:var(--bui-space-12)}.xs\:bui-pb-13{padding-bottom:var(--bui-space-13)}.xs\:bui-pb-14{padding-bottom:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-pb{padding-bottom:var(--pb-sm)}.sm\:bui-pb-0\.5{padding-bottom:var(--bui-space-0_5)}.sm\:bui-pb-1{padding-bottom:var(--bui-space-1)}.sm\:bui-pb-1\.5{padding-bottom:var(--bui-space-1_5)}.sm\:bui-pb-2{padding-bottom:var(--bui-space-2)}.sm\:bui-pb-3{padding-bottom:var(--bui-space-3)}.sm\:bui-pb-4{padding-bottom:var(--bui-space-4)}.sm\:bui-pb-5{padding-bottom:var(--bui-space-5)}.sm\:bui-pb-6{padding-bottom:var(--bui-space-6)}.sm\:bui-pb-7{padding-bottom:var(--bui-space-7)}.sm\:bui-pb-8{padding-bottom:var(--bui-space-8)}.sm\:bui-pb-9{padding-bottom:var(--bui-space-9)}.sm\:bui-pb-10{padding-bottom:var(--bui-space-10)}.sm\:bui-pb-11{padding-bottom:var(--bui-space-11)}.sm\:bui-pb-12{padding-bottom:var(--bui-space-12)}.sm\:bui-pb-13{padding-bottom:var(--bui-space-13)}.sm\:bui-pb-14{padding-bottom:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-pb{padding-bottom:var(--pb-md)}.md\:bui-pb-0\.5{padding-bottom:var(--bui-space-0_5)}.md\:bui-pb-1{padding-bottom:var(--bui-space-1)}.md\:bui-pb-1\.5{padding-bottom:var(--bui-space-1_5)}.md\:bui-pb-2{padding-bottom:var(--bui-space-2)}.md\:bui-pb-3{padding-bottom:var(--bui-space-3)}.md\:bui-pb-4{padding-bottom:var(--bui-space-4)}.md\:bui-pb-5{padding-bottom:var(--bui-space-5)}.md\:bui-pb-6{padding-bottom:var(--bui-space-6)}.md\:bui-pb-7{padding-bottom:var(--bui-space-7)}.md\:bui-pb-8{padding-bottom:var(--bui-space-8)}.md\:bui-pb-9{padding-bottom:var(--bui-space-9)}.md\:bui-pb-10{padding-bottom:var(--bui-space-10)}.md\:bui-pb-11{padding-bottom:var(--bui-space-11)}.md\:bui-pb-12{padding-bottom:var(--bui-space-12)}.md\:bui-pb-13{padding-bottom:var(--bui-space-13)}.md\:bui-pb-14{padding-bottom:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-pb{padding-bottom:var(--pb-lg)}.lg\:bui-pb-0\.5{padding-bottom:var(--bui-space-0_5)}.lg\:bui-pb-1{padding-bottom:var(--bui-space-1)}.lg\:bui-pb-1\.5{padding-bottom:var(--bui-space-1_5)}.lg\:bui-pb-2{padding-bottom:var(--bui-space-2)}.lg\:bui-pb-3{padding-bottom:var(--bui-space-3)}.lg\:bui-pb-4{padding-bottom:var(--bui-space-4)}.lg\:bui-pb-5{padding-bottom:var(--bui-space-5)}.lg\:bui-pb-6{padding-bottom:var(--bui-space-6)}.lg\:bui-pb-7{padding-bottom:var(--bui-space-7)}.lg\:bui-pb-8{padding-bottom:var(--bui-space-8)}.lg\:bui-pb-9{padding-bottom:var(--bui-space-9)}.lg\:bui-pb-10{padding-bottom:var(--bui-space-10)}.lg\:bui-pb-11{padding-bottom:var(--bui-space-11)}.lg\:bui-pb-12{padding-bottom:var(--bui-space-12)}.lg\:bui-pb-13{padding-bottom:var(--bui-space-13)}.lg\:bui-pb-14{padding-bottom:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-pb{padding-bottom:var(--pb-xl)}.xl\:bui-pb-0\.5{padding-bottom:var(--bui-space-0_5)}.xl\:bui-pb-1{padding-bottom:var(--bui-space-1)}.xl\:bui-pb-1\.5{padding-bottom:var(--bui-space-1_5)}.xl\:bui-pb-2{padding-bottom:var(--bui-space-2)}.xl\:bui-pb-3{padding-bottom:var(--bui-space-3)}.xl\:bui-pb-4{padding-bottom:var(--bui-space-4)}.xl\:bui-pb-5{padding-bottom:var(--bui-space-5)}.xl\:bui-pb-6{padding-bottom:var(--bui-space-6)}.xl\:bui-pb-7{padding-bottom:var(--bui-space-7)}.xl\:bui-pb-8{padding-bottom:var(--bui-space-8)}.xl\:bui-pb-9{padding-bottom:var(--bui-space-9)}.xl\:bui-pb-10{padding-bottom:var(--bui-space-10)}.xl\:bui-pb-11{padding-bottom:var(--bui-space-11)}.xl\:bui-pb-12{padding-bottom:var(--bui-space-12)}.xl\:bui-pb-13{padding-bottom:var(--bui-space-13)}.xl\:bui-pb-14{padding-bottom:var(--bui-space-14)}}.bui-py{padding-top:var(--py);padding-bottom:var(--py)}.bui-py-0\.5{padding-top:var(--bui-space-0_5);padding-bottom:var(--bui-space-0_5)}.bui-py-1{padding-top:var(--bui-space-1);padding-bottom:var(--bui-space-1)}.bui-py-1\.5{padding-top:var(--bui-space-1_5);padding-bottom:var(--bui-space-1_5)}.bui-py-2{padding-top:var(--bui-space-2);padding-bottom:var(--bui-space-2)}.bui-py-3{padding-top:var(--bui-space-3);padding-bottom:var(--bui-space-3)}.bui-py-4{padding-top:var(--bui-space-4);padding-bottom:var(--bui-space-4)}.bui-py-5{padding-top:var(--bui-space-5);padding-bottom:var(--bui-space-5)}.bui-py-6{padding-top:var(--bui-space-6);padding-bottom:var(--bui-space-6)}.bui-py-7{padding-top:var(--bui-space-7);padding-bottom:var(--bui-space-7)}.bui-py-8{padding-top:var(--bui-space-8);padding-bottom:var(--bui-space-8)}.bui-py-9{padding-top:var(--bui-space-9);padding-bottom:var(--bui-space-9)}.bui-py-10{padding-top:var(--bui-space-10);padding-bottom:var(--bui-space-10)}.bui-py-11{padding-top:var(--bui-space-11);padding-bottom:var(--bui-space-11)}.bui-py-12{padding-top:var(--bui-space-12);padding-bottom:var(--bui-space-12)}.bui-py-13{padding-top:var(--bui-space-13);padding-bottom:var(--bui-space-13)}.bui-py-14{padding-top:var(--bui-space-14);padding-bottom:var(--bui-space-14)}@media (width>=640px){.xs\:bui-py{padding-top:var(--py-xs);padding-bottom:var(--py-xs)}.xs\:bui-py-0\.5{padding-top:var(--bui-space-0_5);padding-bottom:var(--bui-space-0_5)}.xs\:bui-py-1{padding-top:var(--bui-space-1);padding-bottom:var(--bui-space-1)}.xs\:bui-py-1\.5{padding-top:var(--bui-space-1_5);padding-bottom:var(--bui-space-1_5)}.xs\:bui-py-2{padding-top:var(--bui-space-2);padding-bottom:var(--bui-space-2)}.xs\:bui-py-3{padding-top:var(--bui-space-3);padding-bottom:var(--bui-space-3)}.xs\:bui-py-4{padding-top:var(--bui-space-4);padding-bottom:var(--bui-space-4)}.xs\:bui-py-5{padding-top:var(--bui-space-5);padding-bottom:var(--bui-space-5)}.xs\:bui-py-6{padding-top:var(--bui-space-6);padding-bottom:var(--bui-space-6)}.xs\:bui-py-7{padding-top:var(--bui-space-7);padding-bottom:var(--bui-space-7)}.xs\:bui-py-8{padding-top:var(--bui-space-8);padding-bottom:var(--bui-space-8)}.xs\:bui-py-9{padding-top:var(--bui-space-9);padding-bottom:var(--bui-space-9)}.xs\:bui-py-10{padding-top:var(--bui-space-10);padding-bottom:var(--bui-space-10)}.xs\:bui-py-11{padding-top:var(--bui-space-11);padding-bottom:var(--bui-space-11)}.xs\:bui-py-12{padding-top:var(--bui-space-12);padding-bottom:var(--bui-space-12)}.xs\:bui-py-13{padding-top:var(--bui-space-13);padding-bottom:var(--bui-space-13)}.xs\:bui-py-14{padding-top:var(--bui-space-14);padding-bottom:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-py{padding-top:var(--py-sm);padding-bottom:var(--py-sm)}.sm\:bui-py-0\.5{padding-top:var(--bui-space-0_5);padding-bottom:var(--bui-space-0_5)}.sm\:bui-py-1{padding-top:var(--bui-space-1);padding-bottom:var(--bui-space-1)}.sm\:bui-py-1\.5{padding-top:var(--bui-space-1_5);padding-bottom:var(--bui-space-1_5)}.sm\:bui-py-2{padding-top:var(--bui-space-2);padding-bottom:var(--bui-space-2)}.sm\:bui-py-3{padding-top:var(--bui-space-3);padding-bottom:var(--bui-space-3)}.sm\:bui-py-4{padding-top:var(--bui-space-4);padding-bottom:var(--bui-space-4)}.sm\:bui-py-5{padding-top:var(--bui-space-5);padding-bottom:var(--bui-space-5)}.sm\:bui-py-6{padding-top:var(--bui-space-6);padding-bottom:var(--bui-space-6)}.sm\:bui-py-7{padding-top:var(--bui-space-7);padding-bottom:var(--bui-space-7)}.sm\:bui-py-8{padding-top:var(--bui-space-8);padding-bottom:var(--bui-space-8)}.sm\:bui-py-9{padding-top:var(--bui-space-9);padding-bottom:var(--bui-space-9)}.sm\:bui-py-10{padding-top:var(--bui-space-10);padding-bottom:var(--bui-space-10)}.sm\:bui-py-11{padding-top:var(--bui-space-11);padding-bottom:var(--bui-space-11)}.sm\:bui-py-12{padding-top:var(--bui-space-12);padding-bottom:var(--bui-space-12)}.sm\:bui-py-13{padding-top:var(--bui-space-13);padding-bottom:var(--bui-space-13)}.sm\:bui-py-14{padding-top:var(--bui-space-14);padding-bottom:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-py{padding-top:var(--py-md);padding-bottom:var(--py-md)}.md\:bui-py-0\.5{padding-top:var(--bui-space-0_5);padding-bottom:var(--bui-space-0_5)}.md\:bui-py-1{padding-top:var(--bui-space-1);padding-bottom:var(--bui-space-1)}.md\:bui-py-1\.5{padding-top:var(--bui-space-1_5);padding-bottom:var(--bui-space-1_5)}.md\:bui-py-2{padding-top:var(--bui-space-2);padding-bottom:var(--bui-space-2)}.md\:bui-py-3{padding-top:var(--bui-space-3);padding-bottom:var(--bui-space-3)}.md\:bui-py-4{padding-top:var(--bui-space-4);padding-bottom:var(--bui-space-4)}.md\:bui-py-5{padding-top:var(--bui-space-5);padding-bottom:var(--bui-space-5)}.md\:bui-py-6{padding-top:var(--bui-space-6);padding-bottom:var(--bui-space-6)}.md\:bui-py-7{padding-top:var(--bui-space-7);padding-bottom:var(--bui-space-7)}.md\:bui-py-8{padding-top:var(--bui-space-8);padding-bottom:var(--bui-space-8)}.md\:bui-py-9{padding-top:var(--bui-space-9);padding-bottom:var(--bui-space-9)}.md\:bui-py-10{padding-top:var(--bui-space-10);padding-bottom:var(--bui-space-10)}.md\:bui-py-11{padding-top:var(--bui-space-11);padding-bottom:var(--bui-space-11)}.md\:bui-py-12{padding-top:var(--bui-space-12);padding-bottom:var(--bui-space-12)}.md\:bui-py-13{padding-top:var(--bui-space-13);padding-bottom:var(--bui-space-13)}.md\:bui-py-14{padding-top:var(--bui-space-14);padding-bottom:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-py{padding-top:var(--py-lg);padding-bottom:var(--py-lg)}.lg\:bui-py-0\.5{padding-top:var(--bui-space-0_5);padding-bottom:var(--bui-space-0_5)}.lg\:bui-py-1{padding-top:var(--bui-space-1);padding-bottom:var(--bui-space-1)}.lg\:bui-py-1\.5{padding-top:var(--bui-space-1_5);padding-bottom:var(--bui-space-1_5)}.lg\:bui-py-2{padding-top:var(--bui-space-2);padding-bottom:var(--bui-space-2)}.lg\:bui-py-3{padding-top:var(--bui-space-3);padding-bottom:var(--bui-space-3)}.lg\:bui-py-4{padding-top:var(--bui-space-4);padding-bottom:var(--bui-space-4)}.lg\:bui-py-5{padding-top:var(--bui-space-5);padding-bottom:var(--bui-space-5)}.lg\:bui-py-6{padding-top:var(--bui-space-6);padding-bottom:var(--bui-space-6)}.lg\:bui-py-7{padding-top:var(--bui-space-7);padding-bottom:var(--bui-space-7)}.lg\:bui-py-8{padding-top:var(--bui-space-8);padding-bottom:var(--bui-space-8)}.lg\:bui-py-9{padding-top:var(--bui-space-9);padding-bottom:var(--bui-space-9)}.lg\:bui-py-10{padding-top:var(--bui-space-10);padding-bottom:var(--bui-space-10)}.lg\:bui-py-11{padding-top:var(--bui-space-11);padding-bottom:var(--bui-space-11)}.lg\:bui-py-12{padding-top:var(--bui-space-12);padding-bottom:var(--bui-space-12)}.lg\:bui-py-13{padding-top:var(--bui-space-13);padding-bottom:var(--bui-space-13)}.lg\:bui-py-14{padding-top:var(--bui-space-14);padding-bottom:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-py{padding-top:var(--py-xl);padding-bottom:var(--py-xl)}.xl\:bui-py-0\.5{padding-top:var(--bui-space-0_5);padding-bottom:var(--bui-space-0_5)}.xl\:bui-py-1{padding-top:var(--bui-space-1);padding-bottom:var(--bui-space-1)}.xl\:bui-py-1\.5{padding-top:var(--bui-space-1_5);padding-bottom:var(--bui-space-1_5)}.xl\:bui-py-2{padding-top:var(--bui-space-2);padding-bottom:var(--bui-space-2)}.xl\:bui-py-3{padding-top:var(--bui-space-3);padding-bottom:var(--bui-space-3)}.xl\:bui-py-4{padding-top:var(--bui-space-4);padding-bottom:var(--bui-space-4)}.xl\:bui-py-5{padding-top:var(--bui-space-5);padding-bottom:var(--bui-space-5)}.xl\:bui-py-6{padding-top:var(--bui-space-6);padding-bottom:var(--bui-space-6)}.xl\:bui-py-7{padding-top:var(--bui-space-7);padding-bottom:var(--bui-space-7)}.xl\:bui-py-8{padding-top:var(--bui-space-8);padding-bottom:var(--bui-space-8)}.xl\:bui-py-9{padding-top:var(--bui-space-9);padding-bottom:var(--bui-space-9)}.xl\:bui-py-10{padding-top:var(--bui-space-10);padding-bottom:var(--bui-space-10)}.xl\:bui-py-11{padding-top:var(--bui-space-11);padding-bottom:var(--bui-space-11)}.xl\:bui-py-12{padding-top:var(--bui-space-12);padding-bottom:var(--bui-space-12)}.xl\:bui-py-13{padding-top:var(--bui-space-13);padding-bottom:var(--bui-space-13)}.xl\:bui-py-14{padding-top:var(--bui-space-14);padding-bottom:var(--bui-space-14)}}.bui-px{padding-left:var(--px);padding-right:var(--px)}.bui-px-0\.5{padding-left:var(--bui-space-0_5);padding-right:var(--bui-space-0_5)}.bui-px-1{padding-left:var(--bui-space-1);padding-right:var(--bui-space-1)}.bui-px-1\.5{padding-left:var(--bui-space-1_5);padding-right:var(--bui-space-1_5)}.bui-px-2{padding-left:var(--bui-space-2);padding-right:var(--bui-space-2)}.bui-px-3{padding-left:var(--bui-space-3);padding-right:var(--bui-space-3)}.bui-px-4{padding-left:var(--bui-space-4);padding-right:var(--bui-space-4)}.bui-px-5{padding-left:var(--bui-space-5);padding-right:var(--bui-space-5)}.bui-px-6{padding-left:var(--bui-space-6);padding-right:var(--bui-space-6)}.bui-px-7{padding-left:var(--bui-space-7);padding-right:var(--bui-space-7)}.bui-px-8{padding-left:var(--bui-space-8);padding-right:var(--bui-space-8)}.bui-px-9{padding-left:var(--bui-space-9);padding-right:var(--bui-space-9)}.bui-px-10{padding-left:var(--bui-space-10);padding-right:var(--bui-space-10)}.bui-px-11{padding-left:var(--bui-space-11);padding-right:var(--bui-space-11)}.bui-px-12{padding-left:var(--bui-space-12);padding-right:var(--bui-space-12)}.bui-px-13{padding-left:var(--bui-space-13);padding-right:var(--bui-space-13)}.bui-px-14{padding-left:var(--bui-space-14);padding-right:var(--bui-space-14)}@media (width>=640px){.xs\:bui-px{padding-left:var(--px-xs);padding-right:var(--px-xs)}.xs\:bui-px-0\.5{padding-left:var(--bui-space-0_5);padding-right:var(--bui-space-0_5)}.xs\:bui-px-1{padding-left:var(--bui-space-1);padding-right:var(--bui-space-1)}.xs\:bui-px-1\.5{padding-left:var(--bui-space-1_5);padding-right:var(--bui-space-1_5)}.xs\:bui-px-2{padding-left:var(--bui-space-2);padding-right:var(--bui-space-2)}.xs\:bui-px-3{padding-left:var(--bui-space-3);padding-right:var(--bui-space-3)}.xs\:bui-px-4{padding-left:var(--bui-space-4);padding-right:var(--bui-space-4)}.xs\:bui-px-5{padding-left:var(--bui-space-5);padding-right:var(--bui-space-5)}.xs\:bui-px-6{padding-left:var(--bui-space-6);padding-right:var(--bui-space-6)}.xs\:bui-px-7{padding-left:var(--bui-space-7);padding-right:var(--bui-space-7)}.xs\:bui-px-8{padding-left:var(--bui-space-8);padding-right:var(--bui-space-8)}.xs\:bui-px-9{padding-left:var(--bui-space-9);padding-right:var(--bui-space-9)}.xs\:bui-px-10{padding-left:var(--bui-space-10);padding-right:var(--bui-space-10)}.xs\:bui-px-11{padding-left:var(--bui-space-11);padding-right:var(--bui-space-11)}.xs\:bui-px-12{padding-left:var(--bui-space-12);padding-right:var(--bui-space-12)}.xs\:bui-px-13{padding-left:var(--bui-space-13);padding-right:var(--bui-space-13)}.xs\:bui-px-14{padding-left:var(--bui-space-14);padding-right:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-px{padding-left:var(--px-sm);padding-right:var(--px-sm)}.sm\:bui-px-0\.5{padding-left:var(--bui-space-0_5);padding-right:var(--bui-space-0_5)}.sm\:bui-px-1{padding-left:var(--bui-space-1);padding-right:var(--bui-space-1)}.sm\:bui-px-1\.5{padding-left:var(--bui-space-1_5);padding-right:var(--bui-space-1_5)}.sm\:bui-px-2{padding-left:var(--bui-space-2);padding-right:var(--bui-space-2)}.sm\:bui-px-3{padding-left:var(--bui-space-3);padding-right:var(--bui-space-3)}.sm\:bui-px-4{padding-left:var(--bui-space-4);padding-right:var(--bui-space-4)}.sm\:bui-px-5{padding-left:var(--bui-space-5);padding-right:var(--bui-space-5)}.sm\:bui-px-6{padding-left:var(--bui-space-6);padding-right:var(--bui-space-6)}.sm\:bui-px-7{padding-left:var(--bui-space-7);padding-right:var(--bui-space-7)}.sm\:bui-px-8{padding-left:var(--bui-space-8);padding-right:var(--bui-space-8)}.sm\:bui-px-9{padding-left:var(--bui-space-9);padding-right:var(--bui-space-9)}.sm\:bui-px-10{padding-left:var(--bui-space-10);padding-right:var(--bui-space-10)}.sm\:bui-px-11{padding-left:var(--bui-space-11);padding-right:var(--bui-space-11)}.sm\:bui-px-12{padding-left:var(--bui-space-12);padding-right:var(--bui-space-12)}.sm\:bui-px-13{padding-left:var(--bui-space-13);padding-right:var(--bui-space-13)}.sm\:bui-px-14{padding-left:var(--bui-space-14);padding-right:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-px{padding-left:var(--px-md);padding-right:var(--px-md)}.md\:bui-px-0\.5{padding-left:var(--bui-space-0_5);padding-right:var(--bui-space-0_5)}.md\:bui-px-1{padding-left:var(--bui-space-1);padding-right:var(--bui-space-1)}.md\:bui-px-1\.5{padding-left:var(--bui-space-1_5);padding-right:var(--bui-space-1_5)}.md\:bui-px-2{padding-left:var(--bui-space-2);padding-right:var(--bui-space-2)}.md\:bui-px-3{padding-left:var(--bui-space-3);padding-right:var(--bui-space-3)}.md\:bui-px-4{padding-left:var(--bui-space-4);padding-right:var(--bui-space-4)}.md\:bui-px-5{padding-left:var(--bui-space-5);padding-right:var(--bui-space-5)}.md\:bui-px-6{padding-left:var(--bui-space-6);padding-right:var(--bui-space-6)}.md\:bui-px-7{padding-left:var(--bui-space-7);padding-right:var(--bui-space-7)}.md\:bui-px-8{padding-left:var(--bui-space-8);padding-right:var(--bui-space-8)}.md\:bui-px-9{padding-left:var(--bui-space-9);padding-right:var(--bui-space-9)}.md\:bui-px-10{padding-left:var(--bui-space-10);padding-right:var(--bui-space-10)}.md\:bui-px-11{padding-left:var(--bui-space-11);padding-right:var(--bui-space-11)}.md\:bui-px-12{padding-left:var(--bui-space-12);padding-right:var(--bui-space-12)}.md\:bui-px-13{padding-left:var(--bui-space-13);padding-right:var(--bui-space-13)}.md\:bui-px-14{padding-left:var(--bui-space-14);padding-right:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-px{padding-left:var(--px-lg);padding-right:var(--px-lg)}.lg\:bui-px-0\.5{padding-left:var(--bui-space-0_5);padding-right:var(--bui-space-0_5)}.lg\:bui-px-1{padding-left:var(--bui-space-1);padding-right:var(--bui-space-1)}.lg\:bui-px-1\.5{padding-left:var(--bui-space-1_5);padding-right:var(--bui-space-1_5)}.lg\:bui-px-2{padding-left:var(--bui-space-2);padding-right:var(--bui-space-2)}.lg\:bui-px-3{padding-left:var(--bui-space-3);padding-right:var(--bui-space-3)}.lg\:bui-px-4{padding-left:var(--bui-space-4);padding-right:var(--bui-space-4)}.lg\:bui-px-5{padding-left:var(--bui-space-5);padding-right:var(--bui-space-5)}.lg\:bui-px-6{padding-left:var(--bui-space-6);padding-right:var(--bui-space-6)}.lg\:bui-px-7{padding-left:var(--bui-space-7);padding-right:var(--bui-space-7)}.lg\:bui-px-8{padding-left:var(--bui-space-8);padding-right:var(--bui-space-8)}.lg\:bui-px-9{padding-left:var(--bui-space-9);padding-right:var(--bui-space-9)}.lg\:bui-px-10{padding-left:var(--bui-space-10);padding-right:var(--bui-space-10)}.lg\:bui-px-11{padding-left:var(--bui-space-11);padding-right:var(--bui-space-11)}.lg\:bui-px-12{padding-left:var(--bui-space-12);padding-right:var(--bui-space-12)}.lg\:bui-px-13{padding-left:var(--bui-space-13);padding-right:var(--bui-space-13)}.lg\:bui-px-14{padding-left:var(--bui-space-14);padding-right:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-px{padding-left:var(--px-xl);padding-right:var(--px-xl)}.xl\:bui-px-0\.5{padding-left:var(--bui-space-0_5);padding-right:var(--bui-space-0_5)}.xl\:bui-px-1{padding-left:var(--bui-space-1);padding-right:var(--bui-space-1)}.xl\:bui-px-1\.5{padding-left:var(--bui-space-1_5);padding-right:var(--bui-space-1_5)}.xl\:bui-px-2{padding-left:var(--bui-space-2);padding-right:var(--bui-space-2)}.xl\:bui-px-3{padding-left:var(--bui-space-3);padding-right:var(--bui-space-3)}.xl\:bui-px-4{padding-left:var(--bui-space-4);padding-right:var(--bui-space-4)}.xl\:bui-px-5{padding-left:var(--bui-space-5);padding-right:var(--bui-space-5)}.xl\:bui-px-6{padding-left:var(--bui-space-6);padding-right:var(--bui-space-6)}.xl\:bui-px-7{padding-left:var(--bui-space-7);padding-right:var(--bui-space-7)}.xl\:bui-px-8{padding-left:var(--bui-space-8);padding-right:var(--bui-space-8)}.xl\:bui-px-9{padding-left:var(--bui-space-9);padding-right:var(--bui-space-9)}.xl\:bui-px-10{padding-left:var(--bui-space-10);padding-right:var(--bui-space-10)}.xl\:bui-px-11{padding-left:var(--bui-space-11);padding-right:var(--bui-space-11)}.xl\:bui-px-12{padding-left:var(--bui-space-12);padding-right:var(--bui-space-12)}.xl\:bui-px-13{padding-left:var(--bui-space-13);padding-right:var(--bui-space-13)}.xl\:bui-px-14{padding-left:var(--bui-space-14);padding-right:var(--bui-space-14)}}.bui-m{margin:var(--m)}.bui-m-0\.5{margin:var(--bui-space-0_5)}.bui-m-1{margin:var(--bui-space-1)}.bui-m-1\.5{margin:var(--bui-space-1_5)}.bui-m-2{margin:var(--bui-space-2)}.bui-m-3{margin:var(--bui-space-3)}.bui-m-4{margin:var(--bui-space-4)}.bui-m-5{margin:var(--bui-space-5)}.bui-m-6{margin:var(--bui-space-6)}.bui-m-7{margin:var(--bui-space-7)}.bui-m-8{margin:var(--bui-space-8)}.bui-m-9{margin:var(--bui-space-9)}.bui-m-10{margin:var(--bui-space-10)}.bui-m-11{margin:var(--bui-space-11)}.bui-m-12{margin:var(--bui-space-12)}.bui-m-13{margin:var(--bui-space-13)}.bui-m-14{margin:var(--bui-space-14)}@media (width>=640px){.xs\:bui-m{margin:var(--p-xs)}.xs\:bui-m-0\.5{margin:var(--bui-space-0_5)}.xs\:bui-m-1{margin:var(--bui-space-1)}.xs\:bui-m-1\.5{margin:var(--bui-space-1_5)}.xs\:bui-m-2{margin:var(--bui-space-2)}.xs\:bui-m-3{margin:var(--bui-space-3)}.xs\:bui-m-4{margin:var(--bui-space-4)}.xs\:bui-m-5{margin:var(--bui-space-5)}.xs\:bui-m-6{margin:var(--bui-space-6)}.xs\:bui-m-7{margin:var(--bui-space-7)}.xs\:bui-m-8{margin:var(--bui-space-8)}.xs\:bui-m-9{margin:var(--bui-space-9)}.xs\:bui-m-10{margin:var(--bui-space-10)}.xs\:bui-m-11{margin:var(--bui-space-11)}.xs\:bui-m-12{margin:var(--bui-space-12)}.xs\:bui-m-13{margin:var(--bui-space-13)}.xs\:bui-m-14{margin:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-m{margin:var(--p-sm)}.sm\:bui-m-0\.5{margin:var(--bui-space-0_5)}.sm\:bui-m-1{margin:var(--bui-space-1)}.sm\:bui-m-1\.5{margin:var(--bui-space-1_5)}.sm\:bui-m-2{margin:var(--bui-space-2)}.sm\:bui-m-3{margin:var(--bui-space-3)}.sm\:bui-m-4{margin:var(--bui-space-4)}.sm\:bui-m-5{margin:var(--bui-space-5)}.sm\:bui-m-6{margin:var(--bui-space-6)}.sm\:bui-m-7{margin:var(--bui-space-7)}.sm\:bui-m-8{margin:var(--bui-space-8)}.sm\:bui-m-9{margin:var(--bui-space-9)}.sm\:bui-m-10{margin:var(--bui-space-10)}.sm\:bui-m-11{margin:var(--bui-space-11)}.sm\:bui-m-12{margin:var(--bui-space-12)}.sm\:bui-m-13{margin:var(--bui-space-13)}.sm\:bui-m-14{margin:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-m{margin:var(--p-md)}.md\:bui-m-0\.5{margin:var(--bui-space-0_5)}.md\:bui-m-1{margin:var(--bui-space-1)}.md\:bui-m-1\.5{margin:var(--bui-space-1_5)}.md\:bui-m-2{margin:var(--bui-space-2)}.md\:bui-m-3{margin:var(--bui-space-3)}.md\:bui-m-4{margin:var(--bui-space-4)}.md\:bui-m-5{margin:var(--bui-space-5)}.md\:bui-m-6{margin:var(--bui-space-6)}.md\:bui-m-7{margin:var(--bui-space-7)}.md\:bui-m-8{margin:var(--bui-space-8)}.md\:bui-m-9{margin:var(--bui-space-9)}.md\:bui-m-10{margin:var(--bui-space-10)}.md\:bui-m-11{margin:var(--bui-space-11)}.md\:bui-m-12{margin:var(--bui-space-12)}.md\:bui-m-13{margin:var(--bui-space-13)}.md\:bui-m-14{margin:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-m{margin:var(--p-lg)}.lg\:bui-m-0\.5{margin:var(--bui-space-0_5)}.lg\:bui-m-1{margin:var(--bui-space-1)}.lg\:bui-m-1\.5{margin:var(--bui-space-1_5)}.lg\:bui-m-2{margin:var(--bui-space-2)}.lg\:bui-m-3{margin:var(--bui-space-3)}.lg\:bui-m-4{margin:var(--bui-space-4)}.lg\:bui-m-5{margin:var(--bui-space-5)}.lg\:bui-m-6{margin:var(--bui-space-6)}.lg\:bui-m-7{margin:var(--bui-space-7)}.lg\:bui-m-8{margin:var(--bui-space-8)}.lg\:bui-m-9{margin:var(--bui-space-9)}.lg\:bui-m-10{margin:var(--bui-space-10)}.lg\:bui-m-11{margin:var(--bui-space-11)}.lg\:bui-m-12{margin:var(--bui-space-12)}.lg\:bui-m-13{margin:var(--bui-space-13)}.lg\:bui-m-14{margin:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-m{margin:var(--p-xl)}.xl\:bui-m-0\.5{margin:var(--bui-space-0_5)}.xl\:bui-m-1{margin:var(--bui-space-1)}.xl\:bui-m-1\.5{margin:var(--bui-space-1_5)}.xl\:bui-m-2{margin:var(--bui-space-2)}.xl\:bui-m-3{margin:var(--bui-space-3)}.xl\:bui-m-4{margin:var(--bui-space-4)}.xl\:bui-m-5{margin:var(--bui-space-5)}.xl\:bui-m-6{margin:var(--bui-space-6)}.xl\:bui-m-7{margin:var(--bui-space-7)}.xl\:bui-m-8{margin:var(--bui-space-8)}.xl\:bui-m-9{margin:var(--bui-space-9)}.xl\:bui-m-10{margin:var(--bui-space-10)}.xl\:bui-m-11{margin:var(--bui-space-11)}.xl\:bui-m-12{margin:var(--bui-space-12)}.xl\:bui-m-13{margin:var(--bui-space-13)}.xl\:bui-m-14{margin:var(--bui-space-14)}}.bui-ml{margin-left:var(--ml)}.bui-ml-0\.5{margin-left:var(--bui-space-0_5)}.bui-ml-1{margin-left:var(--bui-space-1)}.bui-ml-1\.5{margin-left:var(--bui-space-1_5)}.bui-ml-2{margin-left:var(--bui-space-2)}.bui-ml-3{margin-left:var(--bui-space-3)}.bui-ml-4{margin-left:var(--bui-space-4)}.bui-ml-5{margin-left:var(--bui-space-5)}.bui-ml-6{margin-left:var(--bui-space-6)}.bui-ml-7{margin-left:var(--bui-space-7)}.bui-ml-8{margin-left:var(--bui-space-8)}.bui-ml-9{margin-left:var(--bui-space-9)}.bui-ml-10{margin-left:var(--bui-space-10)}.bui-ml-11{margin-left:var(--bui-space-11)}.bui-ml-12{margin-left:var(--bui-space-12)}.bui-ml-13{margin-left:var(--bui-space-13)}.bui-ml-14{margin-left:var(--bui-space-14)}@media (width>=640px){.xs\:bui-ml{margin-left:var(--ml-xs)}.xs\:bui-ml-0\.5{margin-left:var(--bui-space-0_5)}.xs\:bui-ml-1{margin-left:var(--bui-space-1)}.xs\:bui-ml-1\.5{margin-left:var(--bui-space-1_5)}.xs\:bui-ml-2{margin-left:var(--bui-space-2)}.xs\:bui-ml-3{margin-left:var(--bui-space-3)}.xs\:bui-ml-4{margin-left:var(--bui-space-4)}.xs\:bui-ml-5{margin-left:var(--bui-space-5)}.xs\:bui-ml-6{margin-left:var(--bui-space-6)}.xs\:bui-ml-7{margin-left:var(--bui-space-7)}.xs\:bui-ml-8{margin-left:var(--bui-space-8)}.xs\:bui-ml-9{margin-left:var(--bui-space-9)}.xs\:bui-ml-10{margin-left:var(--bui-space-10)}.xs\:bui-ml-11{margin-left:var(--bui-space-11)}.xs\:bui-ml-12{margin-left:var(--bui-space-12)}.xs\:bui-ml-13{margin-left:var(--bui-space-13)}.xs\:bui-ml-14{margin-left:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-ml{margin-left:var(--ml-sm)}.sm\:bui-ml-0\.5{margin-left:var(--bui-space-0_5)}.sm\:bui-ml-1{margin-left:var(--bui-space-1)}.sm\:bui-ml-1\.5{margin-left:var(--bui-space-1_5)}.sm\:bui-ml-2{margin-left:var(--bui-space-2)}.sm\:bui-ml-3{margin-left:var(--bui-space-3)}.sm\:bui-ml-4{margin-left:var(--bui-space-4)}.sm\:bui-ml-5{margin-left:var(--bui-space-5)}.sm\:bui-ml-6{margin-left:var(--bui-space-6)}.sm\:bui-ml-7{margin-left:var(--bui-space-7)}.sm\:bui-ml-8{margin-left:var(--bui-space-8)}.sm\:bui-ml-9{margin-left:var(--bui-space-9)}.sm\:bui-ml-10{margin-left:var(--bui-space-10)}.sm\:bui-ml-11{margin-left:var(--bui-space-11)}.sm\:bui-ml-12{margin-left:var(--bui-space-12)}.sm\:bui-ml-13{margin-left:var(--bui-space-13)}.sm\:bui-ml-14{margin-left:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-ml{margin-left:var(--ml-md)}.md\:bui-ml-0\.5{margin-left:var(--bui-space-0_5)}.md\:bui-ml-1{margin-left:var(--bui-space-1)}.md\:bui-ml-1\.5{margin-left:var(--bui-space-1_5)}.md\:bui-ml-2{margin-left:var(--bui-space-2)}.md\:bui-ml-3{margin-left:var(--bui-space-3)}.md\:bui-ml-4{margin-left:var(--bui-space-4)}.md\:bui-ml-5{margin-left:var(--bui-space-5)}.md\:bui-ml-6{margin-left:var(--bui-space-6)}.md\:bui-ml-7{margin-left:var(--bui-space-7)}.md\:bui-ml-8{margin-left:var(--bui-space-8)}.md\:bui-ml-9{margin-left:var(--bui-space-9)}.md\:bui-ml-10{margin-left:var(--bui-space-10)}.md\:bui-ml-11{margin-left:var(--bui-space-11)}.md\:bui-ml-12{margin-left:var(--bui-space-12)}.md\:bui-ml-13{margin-left:var(--bui-space-13)}.md\:bui-ml-14{margin-left:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-ml{margin-left:var(--ml-lg)}.lg\:bui-ml-0\.5{margin-left:var(--bui-space-0_5)}.lg\:bui-ml-1{margin-left:var(--bui-space-1)}.lg\:bui-ml-1\.5{margin-left:var(--bui-space-1_5)}.lg\:bui-ml-2{margin-left:var(--bui-space-2)}.lg\:bui-ml-3{margin-left:var(--bui-space-3)}.lg\:bui-ml-4{margin-left:var(--bui-space-4)}.lg\:bui-ml-5{margin-left:var(--bui-space-5)}.lg\:bui-ml-6{margin-left:var(--bui-space-6)}.lg\:bui-ml-7{margin-left:var(--bui-space-7)}.lg\:bui-ml-8{margin-left:var(--bui-space-8)}.lg\:bui-ml-9{margin-left:var(--bui-space-9)}.lg\:bui-ml-10{margin-left:var(--bui-space-10)}.lg\:bui-ml-11{margin-left:var(--bui-space-11)}.lg\:bui-ml-12{margin-left:var(--bui-space-12)}.lg\:bui-ml-13{margin-left:var(--bui-space-13)}.lg\:bui-ml-14{margin-left:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-ml{margin-left:var(--ml-xl)}.xl\:bui-ml-0\.5{margin-left:var(--bui-space-0_5)}.xl\:bui-ml-1{margin-left:var(--bui-space-1)}.xl\:bui-ml-1\.5{margin-left:var(--bui-space-1_5)}.xl\:bui-ml-2{margin-left:var(--bui-space-2)}.xl\:bui-ml-3{margin-left:var(--bui-space-3)}.xl\:bui-ml-4{margin-left:var(--bui-space-4)}.xl\:bui-ml-5{margin-left:var(--bui-space-5)}.xl\:bui-ml-6{margin-left:var(--bui-space-6)}.xl\:bui-ml-7{margin-left:var(--bui-space-7)}.xl\:bui-ml-8{margin-left:var(--bui-space-8)}.xl\:bui-ml-9{margin-left:var(--bui-space-9)}.xl\:bui-ml-10{margin-left:var(--bui-space-10)}.xl\:bui-ml-11{margin-left:var(--bui-space-11)}.xl\:bui-ml-12{margin-left:var(--bui-space-12)}.xl\:bui-ml-13{margin-left:var(--bui-space-13)}.xl\:bui-ml-14{margin-left:var(--bui-space-14)}}.bui-mr{margin-right:var(--mr)}.bui-mr-0\.5{margin-right:var(--bui-space-0_5)}.bui-mr-1{margin-right:var(--bui-space-1)}.bui-mr-1\.5{margin-right:var(--bui-space-1_5)}.bui-mr-2{margin-right:var(--bui-space-2)}.bui-mr-3{margin-right:var(--bui-space-3)}.bui-mr-4{margin-right:var(--bui-space-4)}.bui-mr-5{margin-right:var(--bui-space-5)}.bui-mr-6{margin-right:var(--bui-space-6)}.bui-mr-7{margin-right:var(--bui-space-7)}.bui-mr-8{margin-right:var(--bui-space-8)}.bui-mr-9{margin-right:var(--bui-space-9)}.bui-mr-10{margin-right:var(--bui-space-10)}.bui-mr-11{margin-right:var(--bui-space-11)}.bui-mr-12{margin-right:var(--bui-space-12)}.bui-mr-13{margin-right:var(--bui-space-13)}.bui-mr-14{margin-right:var(--bui-space-14)}@media (width>=640px){.xs\:bui-mr{margin-right:var(--mr-xs)}.xs\:bui-mr-0\.5{margin-right:var(--bui-space-0_5)}.xs\:bui-mr-1{margin-right:var(--bui-space-1)}.xs\:bui-mr-1\.5{margin-right:var(--bui-space-1_5)}.xs\:bui-mr-2{margin-right:var(--bui-space-2)}.xs\:bui-mr-3{margin-right:var(--bui-space-3)}.xs\:bui-mr-4{margin-right:var(--bui-space-4)}.xs\:bui-mr-5{margin-right:var(--bui-space-5)}.xs\:bui-mr-6{margin-right:var(--bui-space-6)}.xs\:bui-mr-7{margin-right:var(--bui-space-7)}.xs\:bui-mr-8{margin-right:var(--bui-space-8)}.xs\:bui-mr-9{margin-right:var(--bui-space-9)}.xs\:bui-mr-10{margin-right:var(--bui-space-10)}.xs\:bui-mr-11{margin-right:var(--bui-space-11)}.xs\:bui-mr-12{margin-right:var(--bui-space-12)}.xs\:bui-mr-13{margin-right:var(--bui-space-13)}.xs\:bui-mr-14{margin-right:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-mr{margin-right:var(--mr-sm)}.sm\:bui-mr-0\.5{margin-right:var(--bui-space-0_5)}.sm\:bui-mr-1{margin-right:var(--bui-space-1)}.sm\:bui-mr-1\.5{margin-right:var(--bui-space-1_5)}.sm\:bui-mr-2{margin-right:var(--bui-space-2)}.sm\:bui-mr-3{margin-right:var(--bui-space-3)}.sm\:bui-mr-4{margin-right:var(--bui-space-4)}.sm\:bui-mr-5{margin-right:var(--bui-space-5)}.sm\:bui-mr-6{margin-right:var(--bui-space-6)}.sm\:bui-mr-7{margin-right:var(--bui-space-7)}.sm\:bui-mr-8{margin-right:var(--bui-space-8)}.sm\:bui-mr-9{margin-right:var(--bui-space-9)}.sm\:bui-mr-10{margin-right:var(--bui-space-10)}.sm\:bui-mr-11{margin-right:var(--bui-space-11)}.sm\:bui-mr-12{margin-right:var(--bui-space-12)}.sm\:bui-mr-13{margin-right:var(--bui-space-13)}.sm\:bui-mr-14{margin-right:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-mr{margin-right:var(--mr-md)}.md\:bui-mr-0\.5{margin-right:var(--bui-space-0_5)}.md\:bui-mr-1{margin-right:var(--bui-space-1)}.md\:bui-mr-1\.5{margin-right:var(--bui-space-1_5)}.md\:bui-mr-2{margin-right:var(--bui-space-2)}.md\:bui-mr-3{margin-right:var(--bui-space-3)}.md\:bui-mr-4{margin-right:var(--bui-space-4)}.md\:bui-mr-5{margin-right:var(--bui-space-5)}.md\:bui-mr-6{margin-right:var(--bui-space-6)}.md\:bui-mr-7{margin-right:var(--bui-space-7)}.md\:bui-mr-8{margin-right:var(--bui-space-8)}.md\:bui-mr-9{margin-right:var(--bui-space-9)}.md\:bui-mr-10{margin-right:var(--bui-space-10)}.md\:bui-mr-11{margin-right:var(--bui-space-11)}.md\:bui-mr-12{margin-right:var(--bui-space-12)}.md\:bui-mr-13{margin-right:var(--bui-space-13)}.md\:bui-mr-14{margin-right:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-mr{margin-right:var(--mr-lg)}.lg\:bui-mr-0\.5{margin-right:var(--bui-space-0_5)}.lg\:bui-mr-1{margin-right:var(--bui-space-1)}.lg\:bui-mr-1\.5{margin-right:var(--bui-space-1_5)}.lg\:bui-mr-2{margin-right:var(--bui-space-2)}.lg\:bui-mr-3{margin-right:var(--bui-space-3)}.lg\:bui-mr-4{margin-right:var(--bui-space-4)}.lg\:bui-mr-5{margin-right:var(--bui-space-5)}.lg\:bui-mr-6{margin-right:var(--bui-space-6)}.lg\:bui-mr-7{margin-right:var(--bui-space-7)}.lg\:bui-mr-8{margin-right:var(--bui-space-8)}.lg\:bui-mr-9{margin-right:var(--bui-space-9)}.lg\:bui-mr-10{margin-right:var(--bui-space-10)}.lg\:bui-mr-11{margin-right:var(--bui-space-11)}.lg\:bui-mr-12{margin-right:var(--bui-space-12)}.lg\:bui-mr-13{margin-right:var(--bui-space-13)}.lg\:bui-mr-14{margin-right:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-mr{margin-right:var(--mr-xl)}.xl\:bui-mr-0\.5{margin-right:var(--bui-space-0_5)}.xl\:bui-mr-1{margin-right:var(--bui-space-1)}.xl\:bui-mr-1\.5{margin-right:var(--bui-space-1_5)}.xl\:bui-mr-2{margin-right:var(--bui-space-2)}.xl\:bui-mr-3{margin-right:var(--bui-space-3)}.xl\:bui-mr-4{margin-right:var(--bui-space-4)}.xl\:bui-mr-5{margin-right:var(--bui-space-5)}.xl\:bui-mr-6{margin-right:var(--bui-space-6)}.xl\:bui-mr-7{margin-right:var(--bui-space-7)}.xl\:bui-mr-8{margin-right:var(--bui-space-8)}.xl\:bui-mr-9{margin-right:var(--bui-space-9)}.xl\:bui-mr-10{margin-right:var(--bui-space-10)}.xl\:bui-mr-11{margin-right:var(--bui-space-11)}.xl\:bui-mr-12{margin-right:var(--bui-space-12)}.xl\:bui-mr-13{margin-right:var(--bui-space-13)}.xl\:bui-mr-14{margin-right:var(--bui-space-14)}}.bui-mt{margin-top:var(--mt)}.bui-mt-0\.5{margin-top:var(--bui-space-0_5)}.bui-mt-1{margin-top:var(--bui-space-1)}.bui-mt-1\.5{margin-top:var(--bui-space-1_5)}.bui-mt-2{margin-top:var(--bui-space-2)}.bui-mt-3{margin-top:var(--bui-space-3)}.bui-mt-4{margin-top:var(--bui-space-4)}.bui-mt-5{margin-top:var(--bui-space-5)}.bui-mt-6{margin-top:var(--bui-space-6)}.bui-mt-7{margin-top:var(--bui-space-7)}.bui-mt-8{margin-top:var(--bui-space-8)}.bui-mt-9{margin-top:var(--bui-space-9)}.bui-mt-10{margin-top:var(--bui-space-10)}.bui-mt-11{margin-top:var(--bui-space-11)}.bui-mt-12{margin-top:var(--bui-space-12)}.bui-mt-13{margin-top:var(--bui-space-13)}.bui-mt-14{margin-top:var(--bui-space-14)}@media (width>=640px){.xs\:bui-mt{margin-top:var(--mt-xs)}.xs\:bui-mt-0\.5{margin-top:var(--bui-space-0_5)}.xs\:bui-mt-1{margin-top:var(--bui-space-1)}.xs\:bui-mt-1\.5{margin-top:var(--bui-space-1_5)}.xs\:bui-mt-2{margin-top:var(--bui-space-2)}.xs\:bui-mt-3{margin-top:var(--bui-space-3)}.xs\:bui-mt-4{margin-top:var(--bui-space-4)}.xs\:bui-mt-5{margin-top:var(--bui-space-5)}.xs\:bui-mt-6{margin-top:var(--bui-space-6)}.xs\:bui-mt-7{margin-top:var(--bui-space-7)}.xs\:bui-mt-8{margin-top:var(--bui-space-8)}.xs\:bui-mt-9{margin-top:var(--bui-space-9)}.xs\:bui-mt-10{margin-top:var(--bui-space-10)}.xs\:bui-mt-11{margin-top:var(--bui-space-11)}.xs\:bui-mt-12{margin-top:var(--bui-space-12)}.xs\:bui-mt-13{margin-top:var(--bui-space-13)}.xs\:bui-mt-14{margin-top:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-mt{margin-top:var(--mt-sm)}.sm\:bui-mt-0\.5{margin-top:var(--bui-space-0_5)}.sm\:bui-mt-1{margin-top:var(--bui-space-1)}.sm\:bui-mt-1\.5{margin-top:var(--bui-space-1_5)}.sm\:bui-mt-2{margin-top:var(--bui-space-2)}.sm\:bui-mt-3{margin-top:var(--bui-space-3)}.sm\:bui-mt-4{margin-top:var(--bui-space-4)}.sm\:bui-mt-5{margin-top:var(--bui-space-5)}.sm\:bui-mt-6{margin-top:var(--bui-space-6)}.sm\:bui-mt-7{margin-top:var(--bui-space-7)}.sm\:bui-mt-8{margin-top:var(--bui-space-8)}.sm\:bui-mt-9{margin-top:var(--bui-space-9)}.sm\:bui-mt-10{margin-top:var(--bui-space-10)}.sm\:bui-mt-11{margin-top:var(--bui-space-11)}.sm\:bui-mt-12{margin-top:var(--bui-space-12)}.sm\:bui-mt-13{margin-top:var(--bui-space-13)}.sm\:bui-mt-14{margin-top:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-mt{margin-top:var(--mt-md)}.md\:bui-mt-0\.5{margin-top:var(--bui-space-0_5)}.md\:bui-mt-1{margin-top:var(--bui-space-1)}.md\:bui-mt-1\.5{margin-top:var(--bui-space-1_5)}.md\:bui-mt-2{margin-top:var(--bui-space-2)}.md\:bui-mt-3{margin-top:var(--bui-space-3)}.md\:bui-mt-4{margin-top:var(--bui-space-4)}.md\:bui-mt-5{margin-top:var(--bui-space-5)}.md\:bui-mt-6{margin-top:var(--bui-space-6)}.md\:bui-mt-7{margin-top:var(--bui-space-7)}.md\:bui-mt-8{margin-top:var(--bui-space-8)}.md\:bui-mt-9{margin-top:var(--bui-space-9)}.md\:bui-mt-10{margin-top:var(--bui-space-10)}.md\:bui-mt-11{margin-top:var(--bui-space-11)}.md\:bui-mt-12{margin-top:var(--bui-space-12)}.md\:bui-mt-13{margin-top:var(--bui-space-13)}.md\:bui-mt-14{margin-top:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-mt{margin-top:var(--mt-lg)}.lg\:bui-mt-0\.5{margin-top:var(--bui-space-0_5)}.lg\:bui-mt-1{margin-top:var(--bui-space-1)}.lg\:bui-mt-1\.5{margin-top:var(--bui-space-1_5)}.lg\:bui-mt-2{margin-top:var(--bui-space-2)}.lg\:bui-mt-3{margin-top:var(--bui-space-3)}.lg\:bui-mt-4{margin-top:var(--bui-space-4)}.lg\:bui-mt-5{margin-top:var(--bui-space-5)}.lg\:bui-mt-6{margin-top:var(--bui-space-6)}.lg\:bui-mt-7{margin-top:var(--bui-space-7)}.lg\:bui-mt-8{margin-top:var(--bui-space-8)}.lg\:bui-mt-9{margin-top:var(--bui-space-9)}.lg\:bui-mt-10{margin-top:var(--bui-space-10)}.lg\:bui-mt-11{margin-top:var(--bui-space-11)}.lg\:bui-mt-12{margin-top:var(--bui-space-12)}.lg\:bui-mt-13{margin-top:var(--bui-space-13)}.lg\:bui-mt-14{margin-top:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-mt{margin-top:var(--mt-xl)}.xl\:bui-mt-0\.5{margin-top:var(--bui-space-0_5)}.xl\:bui-mt-1{margin-top:var(--bui-space-1)}.xl\:bui-mt-1\.5{margin-top:var(--bui-space-1_5)}.xl\:bui-mt-2{margin-top:var(--bui-space-2)}.xl\:bui-mt-3{margin-top:var(--bui-space-3)}.xl\:bui-mt-4{margin-top:var(--bui-space-4)}.xl\:bui-mt-5{margin-top:var(--bui-space-5)}.xl\:bui-mt-6{margin-top:var(--bui-space-6)}.xl\:bui-mt-7{margin-top:var(--bui-space-7)}.xl\:bui-mt-8{margin-top:var(--bui-space-8)}.xl\:bui-mt-9{margin-top:var(--bui-space-9)}.xl\:bui-mt-10{margin-top:var(--bui-space-10)}.xl\:bui-mt-11{margin-top:var(--bui-space-11)}.xl\:bui-mt-12{margin-top:var(--bui-space-12)}.xl\:bui-mt-13{margin-top:var(--bui-space-13)}.xl\:bui-mt-14{margin-top:var(--bui-space-14)}}.bui-mb{margin-bottom:var(--mb)}.bui-mb-0\.5{margin-bottom:var(--bui-space-0_5)}.bui-mb-1{margin-bottom:var(--bui-space-1)}.bui-mb-1\.5{margin-bottom:var(--bui-space-1_5)}.bui-mb-2{margin-bottom:var(--bui-space-2)}.bui-mb-3{margin-bottom:var(--bui-space-3)}.bui-mb-4{margin-bottom:var(--bui-space-4)}.bui-mb-5{margin-bottom:var(--bui-space-5)}.bui-mb-6{margin-bottom:var(--bui-space-6)}.bui-mb-7{margin-bottom:var(--bui-space-7)}.bui-mb-8{margin-bottom:var(--bui-space-8)}.bui-mb-9{margin-bottom:var(--bui-space-9)}.bui-mb-10{margin-bottom:var(--bui-space-10)}.bui-mb-11{margin-bottom:var(--bui-space-11)}.bui-mb-12{margin-bottom:var(--bui-space-12)}.bui-mb-13{margin-bottom:var(--bui-space-13)}.bui-mb-14{margin-bottom:var(--bui-space-14)}@media (width>=640px){.xs\:bui-mb{margin-bottom:var(--mb-xs)}.xs\:bui-mb-0\.5{margin-bottom:var(--bui-space-0_5)}.xs\:bui-mb-1{margin-bottom:var(--bui-space-1)}.xs\:bui-mb-1\.5{margin-bottom:var(--bui-space-1_5)}.xs\:bui-mb-2{margin-bottom:var(--bui-space-2)}.xs\:bui-mb-3{margin-bottom:var(--bui-space-3)}.xs\:bui-mb-4{margin-bottom:var(--bui-space-4)}.xs\:bui-mb-5{margin-bottom:var(--bui-space-5)}.xs\:bui-mb-6{margin-bottom:var(--bui-space-6)}.xs\:bui-mb-7{margin-bottom:var(--bui-space-7)}.xs\:bui-mb-8{margin-bottom:var(--bui-space-8)}.xs\:bui-mb-9{margin-bottom:var(--bui-space-9)}.xs\:bui-mb-10{margin-bottom:var(--bui-space-10)}.xs\:bui-mb-11{margin-bottom:var(--bui-space-11)}.xs\:bui-mb-12{margin-bottom:var(--bui-space-12)}.xs\:bui-mb-13{margin-bottom:var(--bui-space-13)}.xs\:bui-mb-14{margin-bottom:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-mb{margin-bottom:var(--mb-sm)}.sm\:bui-mb-0\.5{margin-bottom:var(--bui-space-0_5)}.sm\:bui-mb-1{margin-bottom:var(--bui-space-1)}.sm\:bui-mb-1\.5{margin-bottom:var(--bui-space-1_5)}.sm\:bui-mb-2{margin-bottom:var(--bui-space-2)}.sm\:bui-mb-3{margin-bottom:var(--bui-space-3)}.sm\:bui-mb-4{margin-bottom:var(--bui-space-4)}.sm\:bui-mb-5{margin-bottom:var(--bui-space-5)}.sm\:bui-mb-6{margin-bottom:var(--bui-space-6)}.sm\:bui-mb-7{margin-bottom:var(--bui-space-7)}.sm\:bui-mb-8{margin-bottom:var(--bui-space-8)}.sm\:bui-mb-9{margin-bottom:var(--bui-space-9)}.sm\:bui-mb-10{margin-bottom:var(--bui-space-10)}.sm\:bui-mb-11{margin-bottom:var(--bui-space-11)}.sm\:bui-mb-12{margin-bottom:var(--bui-space-12)}.sm\:bui-mb-13{margin-bottom:var(--bui-space-13)}.sm\:bui-mb-14{margin-bottom:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-mb{margin-bottom:var(--mb-md)}.md\:bui-mb-0\.5{margin-bottom:var(--bui-space-0_5)}.md\:bui-mb-1{margin-bottom:var(--bui-space-1)}.md\:bui-mb-1\.5{margin-bottom:var(--bui-space-1_5)}.md\:bui-mb-2{margin-bottom:var(--bui-space-2)}.md\:bui-mb-3{margin-bottom:var(--bui-space-3)}.md\:bui-mb-4{margin-bottom:var(--bui-space-4)}.md\:bui-mb-5{margin-bottom:var(--bui-space-5)}.md\:bui-mb-6{margin-bottom:var(--bui-space-6)}.md\:bui-mb-7{margin-bottom:var(--bui-space-7)}.md\:bui-mb-8{margin-bottom:var(--bui-space-8)}.md\:bui-mb-9{margin-bottom:var(--bui-space-9)}.md\:bui-mb-10{margin-bottom:var(--bui-space-10)}.md\:bui-mb-11{margin-bottom:var(--bui-space-11)}.md\:bui-mb-12{margin-bottom:var(--bui-space-12)}.md\:bui-mb-13{margin-bottom:var(--bui-space-13)}.md\:bui-mb-14{margin-bottom:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-mb{margin-bottom:var(--mb-lg)}.lg\:bui-mb-0\.5{margin-bottom:var(--bui-space-0_5)}.lg\:bui-mb-1{margin-bottom:var(--bui-space-1)}.lg\:bui-mb-1\.5{margin-bottom:var(--bui-space-1_5)}.lg\:bui-mb-2{margin-bottom:var(--bui-space-2)}.lg\:bui-mb-3{margin-bottom:var(--bui-space-3)}.lg\:bui-mb-4{margin-bottom:var(--bui-space-4)}.lg\:bui-mb-5{margin-bottom:var(--bui-space-5)}.lg\:bui-mb-6{margin-bottom:var(--bui-space-6)}.lg\:bui-mb-7{margin-bottom:var(--bui-space-7)}.lg\:bui-mb-8{margin-bottom:var(--bui-space-8)}.lg\:bui-mb-9{margin-bottom:var(--bui-space-9)}.lg\:bui-mb-10{margin-bottom:var(--bui-space-10)}.lg\:bui-mb-11{margin-bottom:var(--bui-space-11)}.lg\:bui-mb-12{margin-bottom:var(--bui-space-12)}.lg\:bui-mb-13{margin-bottom:var(--bui-space-13)}.lg\:bui-mb-14{margin-bottom:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-mb{margin-bottom:var(--mb-xl)}.xl\:bui-mb-0\.5{margin-bottom:var(--bui-space-0_5)}.xl\:bui-mb-1{margin-bottom:var(--bui-space-1)}.xl\:bui-mb-1\.5{margin-bottom:var(--bui-space-1_5)}.xl\:bui-mb-2{margin-bottom:var(--bui-space-2)}.xl\:bui-mb-3{margin-bottom:var(--bui-space-3)}.xl\:bui-mb-4{margin-bottom:var(--bui-space-4)}.xl\:bui-mb-5{margin-bottom:var(--bui-space-5)}.xl\:bui-mb-6{margin-bottom:var(--bui-space-6)}.xl\:bui-mb-7{margin-bottom:var(--bui-space-7)}.xl\:bui-mb-8{margin-bottom:var(--bui-space-8)}.xl\:bui-mb-9{margin-bottom:var(--bui-space-9)}.xl\:bui-mb-10{margin-bottom:var(--bui-space-10)}.xl\:bui-mb-11{margin-bottom:var(--bui-space-11)}.xl\:bui-mb-12{margin-bottom:var(--bui-space-12)}.xl\:bui-mb-13{margin-bottom:var(--bui-space-13)}.xl\:bui-mb-14{margin-bottom:var(--bui-space-14)}}.bui-my{margin-top:var(--my);margin-bottom:var(--my)}.bui-my-0\.5{margin-top:var(--bui-space-0_5);margin-bottom:var(--bui-space-0_5)}.bui-my-1{margin-top:var(--bui-space-1);margin-bottom:var(--bui-space-1)}.bui-my-1\.5{margin-top:var(--bui-space-1_5);margin-bottom:var(--bui-space-1_5)}.bui-my-2{margin-top:var(--bui-space-2);margin-bottom:var(--bui-space-2)}.bui-my-3{margin-top:var(--bui-space-3);margin-bottom:var(--bui-space-3)}.bui-my-4{margin-top:var(--bui-space-4);margin-bottom:var(--bui-space-4)}.bui-my-5{margin-top:var(--bui-space-5);margin-bottom:var(--bui-space-5)}.bui-my-6{margin-top:var(--bui-space-6);margin-bottom:var(--bui-space-6)}.bui-my-7{margin-top:var(--bui-space-7);margin-bottom:var(--bui-space-7)}.bui-my-8{margin-top:var(--bui-space-8);margin-bottom:var(--bui-space-8)}.bui-my-9{margin-top:var(--bui-space-9);margin-bottom:var(--bui-space-9)}.bui-my-10{margin-top:var(--bui-space-10);margin-bottom:var(--bui-space-10)}.bui-my-11{margin-top:var(--bui-space-11);margin-bottom:var(--bui-space-11)}.bui-my-12{margin-top:var(--bui-space-12);margin-bottom:var(--bui-space-12)}.bui-my-13{margin-top:var(--bui-space-13);margin-bottom:var(--bui-space-13)}.bui-my-14{margin-top:var(--bui-space-14);margin-bottom:var(--bui-space-14)}@media (width>=640px){.xs\:bui-my{margin-top:var(--my-xs);margin-bottom:var(--my-xs)}.xs\:bui-my-0\.5{margin-top:var(--bui-space-0_5);margin-bottom:var(--bui-space-0_5)}.xs\:bui-my-1{margin-top:var(--bui-space-1);margin-bottom:var(--bui-space-1)}.xs\:bui-my-1\.5{margin-top:var(--bui-space-1_5);margin-bottom:var(--bui-space-1_5)}.xs\:bui-my-2{margin-top:var(--bui-space-2);margin-bottom:var(--bui-space-2)}.xs\:bui-my-3{margin-top:var(--bui-space-3);margin-bottom:var(--bui-space-3)}.xs\:bui-my-4{margin-top:var(--bui-space-4);margin-bottom:var(--bui-space-4)}.xs\:bui-my-5{margin-top:var(--bui-space-5);margin-bottom:var(--bui-space-5)}.xs\:bui-my-6{margin-top:var(--bui-space-6);margin-bottom:var(--bui-space-6)}.xs\:bui-my-7{margin-top:var(--bui-space-7);margin-bottom:var(--bui-space-7)}.xs\:bui-my-8{margin-top:var(--bui-space-8);margin-bottom:var(--bui-space-8)}.xs\:bui-my-9{margin-top:var(--bui-space-9);margin-bottom:var(--bui-space-9)}.xs\:bui-my-10{margin-top:var(--bui-space-10);margin-bottom:var(--bui-space-10)}.xs\:bui-my-11{margin-top:var(--bui-space-11);margin-bottom:var(--bui-space-11)}.xs\:bui-my-12{margin-top:var(--bui-space-12);margin-bottom:var(--bui-space-12)}.xs\:bui-my-13{margin-top:var(--bui-space-13);margin-bottom:var(--bui-space-13)}.xs\:bui-my-14{margin-top:var(--bui-space-14);margin-bottom:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-my{margin-top:var(--my-sm);margin-bottom:var(--my-sm)}.sm\:bui-my-0\.5{margin-top:var(--bui-space-0_5);margin-bottom:var(--bui-space-0_5)}.sm\:bui-my-1{margin-top:var(--bui-space-1);margin-bottom:var(--bui-space-1)}.sm\:bui-my-1\.5{margin-top:var(--bui-space-1_5);margin-bottom:var(--bui-space-1_5)}.sm\:bui-my-2{margin-top:var(--bui-space-2);margin-bottom:var(--bui-space-2)}.sm\:bui-my-3{margin-top:var(--bui-space-3);margin-bottom:var(--bui-space-3)}.sm\:bui-my-4{margin-top:var(--bui-space-4);margin-bottom:var(--bui-space-4)}.sm\:bui-my-5{margin-top:var(--bui-space-5);margin-bottom:var(--bui-space-5)}.sm\:bui-my-6{margin-top:var(--bui-space-6);margin-bottom:var(--bui-space-6)}.sm\:bui-my-7{margin-top:var(--bui-space-7);margin-bottom:var(--bui-space-7)}.sm\:bui-my-8{margin-top:var(--bui-space-8);margin-bottom:var(--bui-space-8)}.sm\:bui-my-9{margin-top:var(--bui-space-9);margin-bottom:var(--bui-space-9)}.sm\:bui-my-10{margin-top:var(--bui-space-10);margin-bottom:var(--bui-space-10)}.sm\:bui-my-11{margin-top:var(--bui-space-11);margin-bottom:var(--bui-space-11)}.sm\:bui-my-12{margin-top:var(--bui-space-12);margin-bottom:var(--bui-space-12)}.sm\:bui-my-13{margin-top:var(--bui-space-13);margin-bottom:var(--bui-space-13)}.sm\:bui-my-14{margin-top:var(--bui-space-14);margin-bottom:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-my{margin-top:var(--my-md);margin-bottom:var(--my-md)}.md\:bui-my-0\.5{margin-top:var(--bui-space-0_5);margin-bottom:var(--bui-space-0_5)}.md\:bui-my-1{margin-top:var(--bui-space-1);margin-bottom:var(--bui-space-1)}.md\:bui-my-1\.5{margin-top:var(--bui-space-1_5);margin-bottom:var(--bui-space-1_5)}.md\:bui-my-2{margin-top:var(--bui-space-2);margin-bottom:var(--bui-space-2)}.md\:bui-my-3{margin-top:var(--bui-space-3);margin-bottom:var(--bui-space-3)}.md\:bui-my-4{margin-top:var(--bui-space-4);margin-bottom:var(--bui-space-4)}.md\:bui-my-5{margin-top:var(--bui-space-5);margin-bottom:var(--bui-space-5)}.md\:bui-my-6{margin-top:var(--bui-space-6);margin-bottom:var(--bui-space-6)}.md\:bui-my-7{margin-top:var(--bui-space-7);margin-bottom:var(--bui-space-7)}.md\:bui-my-8{margin-top:var(--bui-space-8);margin-bottom:var(--bui-space-8)}.md\:bui-my-9{margin-top:var(--bui-space-9);margin-bottom:var(--bui-space-9)}.md\:bui-my-10{margin-top:var(--bui-space-10);margin-bottom:var(--bui-space-10)}.md\:bui-my-11{margin-top:var(--bui-space-11);margin-bottom:var(--bui-space-11)}.md\:bui-my-12{margin-top:var(--bui-space-12);margin-bottom:var(--bui-space-12)}.md\:bui-my-13{margin-top:var(--bui-space-13);margin-bottom:var(--bui-space-13)}.md\:bui-my-14{margin-top:var(--bui-space-14);margin-bottom:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-my{margin-top:var(--my-lg);margin-bottom:var(--my-lg)}.lg\:bui-my-0\.5{margin-top:var(--bui-space-0_5);margin-bottom:var(--bui-space-0_5)}.lg\:bui-my-1{margin-top:var(--bui-space-1);margin-bottom:var(--bui-space-1)}.lg\:bui-my-1\.5{margin-top:var(--bui-space-1_5);margin-bottom:var(--bui-space-1_5)}.lg\:bui-my-2{margin-top:var(--bui-space-2);margin-bottom:var(--bui-space-2)}.lg\:bui-my-3{margin-top:var(--bui-space-3);margin-bottom:var(--bui-space-3)}.lg\:bui-my-4{margin-top:var(--bui-space-4);margin-bottom:var(--bui-space-4)}.lg\:bui-my-5{margin-top:var(--bui-space-5);margin-bottom:var(--bui-space-5)}.lg\:bui-my-6{margin-top:var(--bui-space-6);margin-bottom:var(--bui-space-6)}.lg\:bui-my-7{margin-top:var(--bui-space-7);margin-bottom:var(--bui-space-7)}.lg\:bui-my-8{margin-top:var(--bui-space-8);margin-bottom:var(--bui-space-8)}.lg\:bui-my-9{margin-top:var(--bui-space-9);margin-bottom:var(--bui-space-9)}.lg\:bui-my-10{margin-top:var(--bui-space-10);margin-bottom:var(--bui-space-10)}.lg\:bui-my-11{margin-top:var(--bui-space-11);margin-bottom:var(--bui-space-11)}.lg\:bui-my-12{margin-top:var(--bui-space-12);margin-bottom:var(--bui-space-12)}.lg\:bui-my-13{margin-top:var(--bui-space-13);margin-bottom:var(--bui-space-13)}.lg\:bui-my-14{margin-top:var(--bui-space-14);margin-bottom:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-my{margin-top:var(--my-xl);margin-bottom:var(--my-xl)}.xl\:bui-my-0\.5{margin-top:var(--bui-space-0_5);margin-bottom:var(--bui-space-0_5)}.xl\:bui-my-1{margin-top:var(--bui-space-1);margin-bottom:var(--bui-space-1)}.xl\:bui-my-1\.5{margin-top:var(--bui-space-1_5);margin-bottom:var(--bui-space-1_5)}.xl\:bui-my-2{margin-top:var(--bui-space-2);margin-bottom:var(--bui-space-2)}.xl\:bui-my-3{margin-top:var(--bui-space-3);margin-bottom:var(--bui-space-3)}.xl\:bui-my-4{margin-top:var(--bui-space-4);margin-bottom:var(--bui-space-4)}.xl\:bui-my-5{margin-top:var(--bui-space-5);margin-bottom:var(--bui-space-5)}.xl\:bui-my-6{margin-top:var(--bui-space-6);margin-bottom:var(--bui-space-6)}.xl\:bui-my-7{margin-top:var(--bui-space-7);margin-bottom:var(--bui-space-7)}.xl\:bui-my-8{margin-top:var(--bui-space-8);margin-bottom:var(--bui-space-8)}.xl\:bui-my-9{margin-top:var(--bui-space-9);margin-bottom:var(--bui-space-9)}.xl\:bui-my-10{margin-top:var(--bui-space-10);margin-bottom:var(--bui-space-10)}.xl\:bui-my-11{margin-top:var(--bui-space-11);margin-bottom:var(--bui-space-11)}.xl\:bui-my-12{margin-top:var(--bui-space-12);margin-bottom:var(--bui-space-12)}.xl\:bui-my-13{margin-top:var(--bui-space-13);margin-bottom:var(--bui-space-13)}.xl\:bui-my-14{margin-top:var(--bui-space-14);margin-bottom:var(--bui-space-14)}}.bui-mx{margin-left:var(--mx);margin-right:var(--mx)}.bui-mx-0\.5{margin-left:var(--bui-space-0_5);margin-right:var(--bui-space-0_5)}.bui-mx-1{margin-left:var(--bui-space-1);margin-right:var(--bui-space-1)}.bui-mx-1\.5{margin-left:var(--bui-space-1_5);margin-right:var(--bui-space-1_5)}.bui-mx-2{margin-left:var(--bui-space-2);margin-right:var(--bui-space-2)}.bui-mx-3{margin-left:var(--bui-space-3);margin-right:var(--bui-space-3)}.bui-mx-4{margin-left:var(--bui-space-4);margin-right:var(--bui-space-4)}.bui-mx-5{margin-left:var(--bui-space-5);margin-right:var(--bui-space-5)}.bui-mx-6{margin-left:var(--bui-space-6);margin-right:var(--bui-space-6)}.bui-mx-7{margin-left:var(--bui-space-7);margin-right:var(--bui-space-7)}.bui-mx-8{margin-left:var(--bui-space-8);margin-right:var(--bui-space-8)}.bui-mx-9{margin-left:var(--bui-space-9);margin-right:var(--bui-space-9)}.bui-mx-10{margin-left:var(--bui-space-10);margin-right:var(--bui-space-10)}.bui-mx-11{margin-left:var(--bui-space-11);margin-right:var(--bui-space-11)}.bui-mx-12{margin-left:var(--bui-space-12);margin-right:var(--bui-space-12)}.bui-mx-13{margin-left:var(--bui-space-13);margin-right:var(--bui-space-13)}.bui-mx-14{margin-left:var(--bui-space-14);margin-right:var(--bui-space-14)}@media (width>=640px){.xs\:bui-mx{margin-left:var(--mx-xs);margin-right:var(--mx-xs)}.xs\:bui-mx-0\.5{margin-left:var(--bui-space-0_5);margin-right:var(--bui-space-0_5)}.xs\:bui-mx-1{margin-left:var(--bui-space-1);margin-right:var(--bui-space-1)}.xs\:bui-mx-1\.5{margin-left:var(--bui-space-1_5);margin-right:var(--bui-space-1_5)}.xs\:bui-mx-2{margin-left:var(--bui-space-2);margin-right:var(--bui-space-2)}.xs\:bui-mx-3{margin-left:var(--bui-space-3);margin-right:var(--bui-space-3)}.xs\:bui-mx-4{margin-left:var(--bui-space-4);margin-right:var(--bui-space-4)}.xs\:bui-mx-5{margin-left:var(--bui-space-5);margin-right:var(--bui-space-5)}.xs\:bui-mx-6{margin-left:var(--bui-space-6);margin-right:var(--bui-space-6)}.xs\:bui-mx-7{margin-left:var(--bui-space-7);margin-right:var(--bui-space-7)}.xs\:bui-mx-8{margin-left:var(--bui-space-8);margin-right:var(--bui-space-8)}.xs\:bui-mx-9{margin-left:var(--bui-space-9);margin-right:var(--bui-space-9)}.xs\:bui-mx-10{margin-left:var(--bui-space-10);margin-right:var(--bui-space-10)}.xs\:bui-mx-11{margin-left:var(--bui-space-11);margin-right:var(--bui-space-11)}.xs\:bui-mx-12{margin-left:var(--bui-space-12);margin-right:var(--bui-space-12)}.xs\:bui-mx-13{margin-left:var(--bui-space-13);margin-right:var(--bui-space-13)}.xs\:bui-mx-14{margin-left:var(--bui-space-14);margin-right:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-mx{margin-left:var(--mx-sm);margin-right:var(--mx-sm)}.sm\:bui-mx-0\.5{margin-left:var(--bui-space-0_5);margin-right:var(--bui-space-0_5)}.sm\:bui-mx-1{margin-left:var(--bui-space-1);margin-right:var(--bui-space-1)}.sm\:bui-mx-1\.5{margin-left:var(--bui-space-1_5);margin-right:var(--bui-space-1_5)}.sm\:bui-mx-2{margin-left:var(--bui-space-2);margin-right:var(--bui-space-2)}.sm\:bui-mx-3{margin-left:var(--bui-space-3);margin-right:var(--bui-space-3)}.sm\:bui-mx-4{margin-left:var(--bui-space-4);margin-right:var(--bui-space-4)}.sm\:bui-mx-5{margin-left:var(--bui-space-5);margin-right:var(--bui-space-5)}.sm\:bui-mx-6{margin-left:var(--bui-space-6);margin-right:var(--bui-space-6)}.sm\:bui-mx-7{margin-left:var(--bui-space-7);margin-right:var(--bui-space-7)}.sm\:bui-mx-8{margin-left:var(--bui-space-8);margin-right:var(--bui-space-8)}.sm\:bui-mx-9{margin-left:var(--bui-space-9);margin-right:var(--bui-space-9)}.sm\:bui-mx-10{margin-left:var(--bui-space-10);margin-right:var(--bui-space-10)}.sm\:bui-mx-11{margin-left:var(--bui-space-11);margin-right:var(--bui-space-11)}.sm\:bui-mx-12{margin-left:var(--bui-space-12);margin-right:var(--bui-space-12)}.sm\:bui-mx-13{margin-left:var(--bui-space-13);margin-right:var(--bui-space-13)}.sm\:bui-mx-14{margin-left:var(--bui-space-14);margin-right:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-mx{margin-left:var(--mx-md);margin-right:var(--mx-md)}.md\:bui-mx-0\.5{margin-left:var(--bui-space-0_5);margin-right:var(--bui-space-0_5)}.md\:bui-mx-1{margin-left:var(--bui-space-1);margin-right:var(--bui-space-1)}.md\:bui-mx-1\.5{margin-left:var(--bui-space-1_5);margin-right:var(--bui-space-1_5)}.md\:bui-mx-2{margin-left:var(--bui-space-2);margin-right:var(--bui-space-2)}.md\:bui-mx-3{margin-left:var(--bui-space-3);margin-right:var(--bui-space-3)}.md\:bui-mx-4{margin-left:var(--bui-space-4);margin-right:var(--bui-space-4)}.md\:bui-mx-5{margin-left:var(--bui-space-5);margin-right:var(--bui-space-5)}.md\:bui-mx-6{margin-left:var(--bui-space-6);margin-right:var(--bui-space-6)}.md\:bui-mx-7{margin-left:var(--bui-space-7);margin-right:var(--bui-space-7)}.md\:bui-mx-8{margin-left:var(--bui-space-8);margin-right:var(--bui-space-8)}.md\:bui-mx-9{margin-left:var(--bui-space-9);margin-right:var(--bui-space-9)}.md\:bui-mx-10{margin-left:var(--bui-space-10);margin-right:var(--bui-space-10)}.md\:bui-mx-11{margin-left:var(--bui-space-11);margin-right:var(--bui-space-11)}.md\:bui-mx-12{margin-left:var(--bui-space-12);margin-right:var(--bui-space-12)}.md\:bui-mx-13{margin-left:var(--bui-space-13);margin-right:var(--bui-space-13)}.md\:bui-mx-14{margin-left:var(--bui-space-14);margin-right:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-mx{margin-left:var(--mx-lg);margin-right:var(--mx-lg)}.lg\:bui-mx-0\.5{margin-left:var(--bui-space-0_5);margin-right:var(--bui-space-0_5)}.lg\:bui-mx-1{margin-left:var(--bui-space-1);margin-right:var(--bui-space-1)}.lg\:bui-mx-1\.5{margin-left:var(--bui-space-1_5);margin-right:var(--bui-space-1_5)}.lg\:bui-mx-2{margin-left:var(--bui-space-2);margin-right:var(--bui-space-2)}.lg\:bui-mx-3{margin-left:var(--bui-space-3);margin-right:var(--bui-space-3)}.lg\:bui-mx-4{margin-left:var(--bui-space-4);margin-right:var(--bui-space-4)}.lg\:bui-mx-5{margin-left:var(--bui-space-5);margin-right:var(--bui-space-5)}.lg\:bui-mx-6{margin-left:var(--bui-space-6);margin-right:var(--bui-space-6)}.lg\:bui-mx-7{margin-left:var(--bui-space-7);margin-right:var(--bui-space-7)}.lg\:bui-mx-8{margin-left:var(--bui-space-8);margin-right:var(--bui-space-8)}.lg\:bui-mx-9{margin-left:var(--bui-space-9);margin-right:var(--bui-space-9)}.lg\:bui-mx-10{margin-left:var(--bui-space-10);margin-right:var(--bui-space-10)}.lg\:bui-mx-11{margin-left:var(--bui-space-11);margin-right:var(--bui-space-11)}.lg\:bui-mx-12{margin-left:var(--bui-space-12);margin-right:var(--bui-space-12)}.lg\:bui-mx-13{margin-left:var(--bui-space-13);margin-right:var(--bui-space-13)}.lg\:bui-mx-14{margin-left:var(--bui-space-14);margin-right:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-mx{margin-left:var(--mx-xl);margin-right:var(--mx-xl)}.xl\:bui-mx-0\.5{margin-left:var(--bui-space-0_5);margin-right:var(--bui-space-0_5)}.xl\:bui-mx-1{margin-left:var(--bui-space-1);margin-right:var(--bui-space-1)}.xl\:bui-mx-1\.5{margin-left:var(--bui-space-1_5);margin-right:var(--bui-space-1_5)}.xl\:bui-mx-2{margin-left:var(--bui-space-2);margin-right:var(--bui-space-2)}.xl\:bui-mx-3{margin-left:var(--bui-space-3);margin-right:var(--bui-space-3)}.xl\:bui-mx-4{margin-left:var(--bui-space-4);margin-right:var(--bui-space-4)}.xl\:bui-mx-5{margin-left:var(--bui-space-5);margin-right:var(--bui-space-5)}.xl\:bui-mx-6{margin-left:var(--bui-space-6);margin-right:var(--bui-space-6)}.xl\:bui-mx-7{margin-left:var(--bui-space-7);margin-right:var(--bui-space-7)}.xl\:bui-mx-8{margin-left:var(--bui-space-8);margin-right:var(--bui-space-8)}.xl\:bui-mx-9{margin-left:var(--bui-space-9);margin-right:var(--bui-space-9)}.xl\:bui-mx-10{margin-left:var(--bui-space-10);margin-right:var(--bui-space-10)}.xl\:bui-mx-11{margin-left:var(--bui-space-11);margin-right:var(--bui-space-11)}.xl\:bui-mx-12{margin-left:var(--bui-space-12);margin-right:var(--bui-space-12)}.xl\:bui-mx-13{margin-left:var(--bui-space-13);margin-right:var(--bui-space-13)}.xl\:bui-mx-14{margin-left:var(--bui-space-14);margin-right:var(--bui-space-14)}}.bui-display-none{display:none}.bui-display-inline{display:inline}.bui-display-inline-block{display:inline-block}.bui-display-block{display:block}@media (width>=640px){.xs\:bui-display-none{display:none}.xs\:bui-display-inline{display:inline}.xs\:bui-display-inline-block{display:inline-block}.xs\:bui-display-block{display:block}}@media (width>=768px){.sm\:bui-display-none{display:none}.sm\:bui-display-inline{display:inline}.sm\:bui-display-inline-block{display:inline-block}.sm\:bui-display-block{display:block}}@media (width>=1024px){.md\:bui-display-none{display:none}.md\:bui-display-inline{display:inline}.md\:bui-display-inline-block{display:inline-block}.md\:bui-display-block{display:block}}@media (width>=1280px){.lg\:bui-display-none{display:none}.lg\:bui-display-inline{display:inline}.lg\:bui-display-inline-block{display:inline-block}.lg\:bui-display-block{display:block}}@media (width>=1536px){.xl\:bui-display-none{display:none}.xl\:bui-display-inline{display:inline}.xl\:bui-display-inline-block{display:inline-block}.xl\:bui-display-block{display:block}}.bui-w{width:var(--width)}.bui-min-w{min-width:var(--min-width)}.bui-max-w{max-width:var(--max-width)}@media (width>=640px){.xs\:bui-w{width:var(--width)}.xs\:bui-min-w{min-width:var(--min-width)}.xs\:bui-max-w{max-width:var(--max-width)}}@media (width>=768px){.sm\:bui-w{width:var(--width)}.sm\:bui-min-w{min-width:var(--min-width)}.sm\:bui-max-w{max-width:var(--max-width)}}@media (width>=1024px){.md\:bui-w{width:var(--width)}.md\:bui-min-w{min-width:var(--min-width)}.md\:bui-max-w{max-width:var(--max-width)}}@media (width>=1280px){.lg\:bui-w{width:var(--width)}.lg\:bui-min-w{min-width:var(--min-width)}.lg\:bui-max-w{max-width:var(--max-width)}}@media (width>=1536px){.xl\:bui-w{width:var(--width)}.xl\:bui-min-w{min-width:var(--min-width)}.xl\:bui-max-w{max-width:var(--max-width)}}.bui-h{height:var(--height)}.bui-min-h{min-height:var(--min-height)}.bui-max-h{max-height:var(--max-height)}@media (width>=640px){.xs\:bui-h{height:var(--height)}.xs\:bui-min-h{min-height:var(--min-height)}.xs\:bui-max-h{max-height:var(--max-height)}}@media (width>=768px){.sm\:bui-h{height:var(--height)}.sm\:bui-min-h{min-height:var(--min-height)}.sm\:bui-max-h{max-height:var(--max-height)}}@media (width>=1024px){.md\:bui-h{height:var(--height)}.md\:bui-min-h{min-height:var(--min-height)}.md\:bui-max-h{max-height:var(--max-height)}}@media (width>=1280px){.lg\:bui-h{height:var(--height)}.lg\:bui-min-h{min-height:var(--min-height)}.lg\:bui-max-h{max-height:var(--max-height)}}@media (width>=1536px){.xl\:bui-h{height:var(--height)}.xl\:bui-min-h{min-height:var(--min-height)}.xl\:bui-max-h{max-height:var(--max-height)}}.bui-position-absolute{position:absolute}.bui-position-fixed{position:fixed}.bui-position-sticky{position:sticky}.bui-position-relative{position:relative}.bui-position-static{position:static}@media (width>=640px){.xs\:bui-position-absolute{position:absolute}.xs\:bui-position-fixed{position:fixed}.xs\:bui-position-sticky{position:sticky}.xs\:bui-position-relative{position:relative}.xs\:bui-position-static{position:static}}@media (width>=768px){.sm\:bui-position-absolute{position:absolute}.sm\:bui-position-fixed{position:fixed}.sm\:bui-position-sticky{position:sticky}.sm\:bui-position-relative{position:relative}.sm\:bui-position-static{position:static}}@media (width>=1024px){.md\:bui-position-absolute{position:absolute}.md\:bui-position-fixed{position:fixed}.md\:bui-position-sticky{position:sticky}.md\:bui-position-relative{position:relative}.md\:bui-position-static{position:static}}@media (width>=1280px){.lg\:bui-position-absolute{position:absolute}.lg\:bui-position-fixed{position:fixed}.lg\:bui-position-sticky{position:sticky}.lg\:bui-position-relative{position:relative}.lg\:bui-position-static{position:static}}@media (width>=1536px){.xl\:bui-position-absolute{position:absolute}.xl\:bui-position-fixed{position:fixed}.xl\:bui-position-sticky{position:sticky}.xl\:bui-position-relative{position:relative}.xl\:bui-position-static{position:static}}.bui-columns-1{grid-template-columns:repeat(1,minmax(0,1fr))}.bui-columns-2{grid-template-columns:repeat(2,minmax(0,1fr))}.bui-columns-3{grid-template-columns:repeat(3,minmax(0,1fr))}.bui-columns-4{grid-template-columns:repeat(4,minmax(0,1fr))}.bui-columns-5{grid-template-columns:repeat(5,minmax(0,1fr))}.bui-columns-6{grid-template-columns:repeat(6,minmax(0,1fr))}.bui-columns-7{grid-template-columns:repeat(7,minmax(0,1fr))}.bui-columns-8{grid-template-columns:repeat(8,minmax(0,1fr))}.bui-columns-9{grid-template-columns:repeat(9,minmax(0,1fr))}.bui-columns-10{grid-template-columns:repeat(10,minmax(0,1fr))}.bui-columns-11{grid-template-columns:repeat(11,minmax(0,1fr))}.bui-columns-12{grid-template-columns:repeat(12,minmax(0,1fr))}.bui-columns-auto{grid-template-columns:repeat(auto-fit,minmax(0,1fr))}.bui-col-span-1{grid-column:span 1/span 1}.bui-col-span-2{grid-column:span 2/span 2}.bui-col-span-3{grid-column:span 3/span 3}.bui-col-span-4{grid-column:span 4/span 4}.bui-col-span-5{grid-column:span 5/span 5}.bui-col-span-6{grid-column:span 6/span 6}.bui-col-span-7{grid-column:span 7/span 7}.bui-col-span-8{grid-column:span 8/span 8}.bui-col-span-9{grid-column:span 9/span 9}.bui-col-span-10{grid-column:span 10/span 10}.bui-col-span-11{grid-column:span 11/span 11}.bui-col-span-12{grid-column:span 12/span 12}.bui-col-span-auto{grid-column:span auto/span auto}.bui-col-start-1{grid-column-start:1}.bui-col-start-2{grid-column-start:2}.bui-col-start-3{grid-column-start:3}.bui-col-start-4{grid-column-start:4}.bui-col-start-5{grid-column-start:5}.bui-col-start-6{grid-column-start:6}.bui-col-start-7{grid-column-start:7}.bui-col-start-8{grid-column-start:8}.bui-col-start-9{grid-column-start:9}.bui-col-start-10{grid-column-start:10}.bui-col-start-11{grid-column-start:11}.bui-col-start-12{grid-column-start:12}.bui-col-start-13{grid-column-start:13}.bui-col-start-auto{grid-column-start:auto}.bui-col-end-1{grid-column-end:1}.bui-col-end-2{grid-column-end:2}.bui-col-end-3{grid-column-end:3}.bui-col-end-4{grid-column-end:4}.bui-col-end-5{grid-column-end:5}.bui-col-end-6{grid-column-end:6}.bui-col-end-7{grid-column-end:7}.bui-col-end-8{grid-column-end:8}.bui-col-end-9{grid-column-end:9}.bui-col-end-10{grid-column-end:10}.bui-col-end-11{grid-column-end:11}.bui-col-end-12{grid-column-end:12}.bui-col-end-13{grid-column-end:13}.bui-col-end-auto{grid-column-end:auto}.bui-row-span-1{grid-row:span 1/span 1}.bui-row-span-2{grid-row:span 2/span 2}.bui-row-span-3{grid-row:span 3/span 3}.bui-row-span-4{grid-row:span 4/span 4}.bui-row-span-5{grid-row:span 5/span 5}.bui-row-span-6{grid-row:span 6/span 6}.bui-row-span-7{grid-row:span 7/span 7}.bui-row-span-8{grid-row:span 8/span 8}.bui-row-span-9{grid-row:span 9/span 9}.bui-row-span-10{grid-row:span 10/span 10}.bui-row-span-11{grid-row:span 11/span 11}.bui-row-span-12{grid-row:span 12/span 12}.bui-row-span-auto{grid-row:span auto/span auto}@media (width>=640px){.xs\:bui-columns-1{grid-template-columns:repeat(1,minmax(0,1fr))}.xs\:bui-columns-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xs\:bui-columns-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xs\:bui-columns-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xs\:bui-columns-5{grid-template-columns:repeat(5,minmax(0,1fr))}.xs\:bui-columns-6{grid-template-columns:repeat(6,minmax(0,1fr))}.xs\:bui-columns-7{grid-template-columns:repeat(7,minmax(0,1fr))}.xs\:bui-columns-8{grid-template-columns:repeat(8,minmax(0,1fr))}.xs\:bui-columns-9{grid-template-columns:repeat(9,minmax(0,1fr))}.xs\:bui-columns-10{grid-template-columns:repeat(10,minmax(0,1fr))}.xs\:bui-columns-11{grid-template-columns:repeat(11,minmax(0,1fr))}.xs\:bui-columns-12{grid-template-columns:repeat(12,minmax(0,1fr))}.xs\:bui-columns-auto{grid-template-columns:repeat(auto-fit,minmax(0,1fr))}.xs\:bui-col-span-1{grid-column:span 1/span 1}.xs\:bui-col-span-2{grid-column:span 2/span 2}.xs\:bui-col-span-3{grid-column:span 3/span 3}.xs\:bui-col-span-4{grid-column:span 4/span 4}.xs\:bui-col-span-5{grid-column:span 5/span 5}.xs\:bui-col-span-6{grid-column:span 6/span 6}.xs\:bui-col-span-7{grid-column:span 7/span 7}.xs\:bui-col-span-8{grid-column:span 8/span 8}.xs\:bui-col-span-9{grid-column:span 9/span 9}.xs\:bui-col-span-10{grid-column:span 10/span 10}.xs\:bui-col-span-11{grid-column:span 11/span 11}.xs\:bui-col-span-12{grid-column:span 12/span 12}.xs\:bui-col-span-auto{grid-column:span auto/span auto}.xs\:bui-col-start-1{grid-column-start:1}.xs\:bui-col-start-2{grid-column-start:2}.xs\:bui-col-start-3{grid-column-start:3}.xs\:bui-col-start-4{grid-column-start:4}.xs\:bui-col-start-5{grid-column-start:5}.xs\:bui-col-start-6{grid-column-start:6}.xs\:bui-col-start-7{grid-column-start:7}.xs\:bui-col-start-8{grid-column-start:8}.xs\:bui-col-start-9{grid-column-start:9}.xs\:bui-col-start-10{grid-column-start:10}.xs\:bui-col-start-11{grid-column-start:11}.xs\:bui-col-start-12{grid-column-start:12}.xs\:bui-col-start-13{grid-column-start:13}.xs\:bui-col-start-auto{grid-column-start:auto}.xs\:bui-col-end-1{grid-column-end:1}.xs\:bui-col-end-2{grid-column-end:2}.xs\:bui-col-end-3{grid-column-end:3}.xs\:bui-col-end-4{grid-column-end:4}.xs\:bui-col-end-5{grid-column-end:5}.xs\:bui-col-end-6{grid-column-end:6}.xs\:bui-col-end-7{grid-column-end:7}.xs\:bui-col-end-8{grid-column-end:8}.xs\:bui-col-end-9{grid-column-end:9}.xs\:bui-col-end-10{grid-column-end:10}.xs\:bui-col-end-11{grid-column-end:11}.xs\:bui-col-end-12{grid-column-end:12}.xs\:bui-col-end-13{grid-column-end:13}.xs\:bui-col-end-auto{grid-column-end:auto}.xs\:bui-row-span-1{grid-row:span 1/span 1}.xs\:bui-row-span-2{grid-row:span 2/span 2}.xs\:bui-row-span-3{grid-row:span 3/span 3}.xs\:bui-row-span-4{grid-row:span 4/span 4}.xs\:bui-row-span-5{grid-row:span 5/span 5}.xs\:bui-row-span-6{grid-row:span 6/span 6}.xs\:bui-row-span-7{grid-row:span 7/span 7}.xs\:bui-row-span-8{grid-row:span 8/span 8}.xs\:bui-row-span-9{grid-row:span 9/span 9}.xs\:bui-row-span-10{grid-row:span 10/span 10}.xs\:bui-row-span-11{grid-row:span 11/span 11}.xs\:bui-row-span-12{grid-row:span 12/span 12}.xs\:bui-row-span-auto{grid-row:span auto/span auto}}@media (width>=768px){.sm\:bui-columns-1{grid-template-columns:repeat(1,minmax(0,1fr))}.sm\:bui-columns-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:bui-columns-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:bui-columns-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:bui-columns-5{grid-template-columns:repeat(5,minmax(0,1fr))}.sm\:bui-columns-6{grid-template-columns:repeat(6,minmax(0,1fr))}.sm\:bui-columns-7{grid-template-columns:repeat(7,minmax(0,1fr))}.sm\:bui-columns-8{grid-template-columns:repeat(8,minmax(0,1fr))}.sm\:bui-columns-9{grid-template-columns:repeat(9,minmax(0,1fr))}.sm\:bui-columns-10{grid-template-columns:repeat(10,minmax(0,1fr))}.sm\:bui-columns-11{grid-template-columns:repeat(11,minmax(0,1fr))}.sm\:bui-columns-12{grid-template-columns:repeat(12,minmax(0,1fr))}.sm\:bui-columns-auto{grid-template-columns:repeat(auto-fit,minmax(0,1fr))}.sm\:bui-col-span-1{grid-column:span 1/span 1}.sm\:bui-col-span-2{grid-column:span 2/span 2}.sm\:bui-col-span-3{grid-column:span 3/span 3}.sm\:bui-col-span-4{grid-column:span 4/span 4}.sm\:bui-col-span-5{grid-column:span 5/span 5}.sm\:bui-col-span-6{grid-column:span 6/span 6}.sm\:bui-col-span-7{grid-column:span 7/span 7}.sm\:bui-col-span-8{grid-column:span 8/span 8}.sm\:bui-col-span-9{grid-column:span 9/span 9}.sm\:bui-col-span-10{grid-column:span 10/span 10}.sm\:bui-col-span-11{grid-column:span 11/span 11}.sm\:bui-col-span-12{grid-column:span 12/span 12}.sm\:bui-col-span-auto{grid-column:span auto/span auto}.sm\:bui-col-start-1{grid-column-start:1}.sm\:bui-col-start-2{grid-column-start:2}.sm\:bui-col-start-3{grid-column-start:3}.sm\:bui-col-start-4{grid-column-start:4}.sm\:bui-col-start-5{grid-column-start:5}.sm\:bui-col-start-6{grid-column-start:6}.sm\:bui-col-start-7{grid-column-start:7}.sm\:bui-col-start-8{grid-column-start:8}.sm\:bui-col-start-9{grid-column-start:9}.sm\:bui-col-start-10{grid-column-start:10}.sm\:bui-col-start-11{grid-column-start:11}.sm\:bui-col-start-12{grid-column-start:12}.sm\:bui-col-start-13{grid-column-start:13}.sm\:bui-col-start-auto{grid-column-start:auto}.sm\:bui-col-end-1{grid-column-end:1}.sm\:bui-col-end-2{grid-column-end:2}.sm\:bui-col-end-3{grid-column-end:3}.sm\:bui-col-end-4{grid-column-end:4}.sm\:bui-col-end-5{grid-column-end:5}.sm\:bui-col-end-6{grid-column-end:6}.sm\:bui-col-end-7{grid-column-end:7}.sm\:bui-col-end-8{grid-column-end:8}.sm\:bui-col-end-9{grid-column-end:9}.sm\:bui-col-end-10{grid-column-end:10}.sm\:bui-col-end-11{grid-column-end:11}.sm\:bui-col-end-12{grid-column-end:12}.sm\:bui-col-end-13{grid-column-end:13}.sm\:bui-col-end-auto{grid-column-end:auto}.sm\:bui-row-span-1{grid-row:span 1/span 1}.sm\:bui-row-span-2{grid-row:span 2/span 2}.sm\:bui-row-span-3{grid-row:span 3/span 3}.sm\:bui-row-span-4{grid-row:span 4/span 4}.sm\:bui-row-span-5{grid-row:span 5/span 5}.sm\:bui-row-span-6{grid-row:span 6/span 6}.sm\:bui-row-span-7{grid-row:span 7/span 7}.sm\:bui-row-span-8{grid-row:span 8/span 8}.sm\:bui-row-span-9{grid-row:span 9/span 9}.sm\:bui-row-span-10{grid-row:span 10/span 10}.sm\:bui-row-span-11{grid-row:span 11/span 11}.sm\:bui-row-span-12{grid-row:span 12/span 12}.sm\:bui-row-span-auto{grid-row:span auto/span auto}}@media (width>=1024px){.md\:bui-columns-1{grid-template-columns:repeat(1,minmax(0,1fr))}.md\:bui-columns-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:bui-columns-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:bui-columns-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:bui-columns-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\:bui-columns-6{grid-template-columns:repeat(6,minmax(0,1fr))}.md\:bui-columns-7{grid-template-columns:repeat(7,minmax(0,1fr))}.md\:bui-columns-8{grid-template-columns:repeat(8,minmax(0,1fr))}.md\:bui-columns-9{grid-template-columns:repeat(9,minmax(0,1fr))}.md\:bui-columns-10{grid-template-columns:repeat(10,minmax(0,1fr))}.md\:bui-columns-11{grid-template-columns:repeat(11,minmax(0,1fr))}.md\:bui-columns-12{grid-template-columns:repeat(12,minmax(0,1fr))}.md\:bui-columns-auto{grid-template-columns:repeat(auto-fit,minmax(0,1fr))}.md\:bui-col-span-1{grid-column:span 1/span 1}.md\:bui-col-span-2{grid-column:span 2/span 2}.md\:bui-col-span-3{grid-column:span 3/span 3}.md\:bui-col-span-4{grid-column:span 4/span 4}.md\:bui-col-span-5{grid-column:span 5/span 5}.md\:bui-col-span-6{grid-column:span 6/span 6}.md\:bui-col-span-7{grid-column:span 7/span 7}.md\:bui-col-span-8{grid-column:span 8/span 8}.md\:bui-col-span-9{grid-column:span 9/span 9}.md\:bui-col-span-10{grid-column:span 10/span 10}.md\:bui-col-span-11{grid-column:span 11/span 11}.md\:bui-col-span-12{grid-column:span 12/span 12}.md\:bui-col-span-auto{grid-column:span auto/span auto}.md\:bui-col-start-1{grid-column-start:1}.md\:bui-col-start-2{grid-column-start:2}.md\:bui-col-start-3{grid-column-start:3}.md\:bui-col-start-4{grid-column-start:4}.md\:bui-col-start-5{grid-column-start:5}.md\:bui-col-start-6{grid-column-start:6}.md\:bui-col-start-7{grid-column-start:7}.md\:bui-col-start-8{grid-column-start:8}.md\:bui-col-start-9{grid-column-start:9}.md\:bui-col-start-10{grid-column-start:10}.md\:bui-col-start-11{grid-column-start:11}.md\:bui-col-start-12{grid-column-start:12}.md\:bui-col-start-13{grid-column-start:13}.md\:bui-col-start-auto{grid-column-start:auto}.md\:bui-col-end-1{grid-column-end:1}.md\:bui-col-end-2{grid-column-end:2}.md\:bui-col-end-3{grid-column-end:3}.md\:bui-col-end-4{grid-column-end:4}.md\:bui-col-end-5{grid-column-end:5}.md\:bui-col-end-6{grid-column-end:6}.md\:bui-col-end-7{grid-column-end:7}.md\:bui-col-end-8{grid-column-end:8}.md\:bui-col-end-9{grid-column-end:9}.md\:bui-col-end-10{grid-column-end:10}.md\:bui-col-end-11{grid-column-end:11}.md\:bui-col-end-12{grid-column-end:12}.md\:bui-col-end-13{grid-column-end:13}.md\:bui-col-end-auto{grid-column-end:auto}.md\:bui-row-span-1{grid-row:span 1/span 1}.md\:bui-row-span-2{grid-row:span 2/span 2}.md\:bui-row-span-3{grid-row:span 3/span 3}.md\:bui-row-span-4{grid-row:span 4/span 4}.md\:bui-row-span-5{grid-row:span 5/span 5}.md\:bui-row-span-6{grid-row:span 6/span 6}.md\:bui-row-span-7{grid-row:span 7/span 7}.md\:bui-row-span-8{grid-row:span 8/span 8}.md\:bui-row-span-9{grid-row:span 9/span 9}.md\:bui-row-span-10{grid-row:span 10/span 10}.md\:bui-row-span-11{grid-row:span 11/span 11}.md\:bui-row-span-12{grid-row:span 12/span 12}.md\:bui-row-span-auto{grid-row:span auto/span auto}}@media (width>=1280px){.lg\:bui-columns-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lg\:bui-columns-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:bui-columns-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:bui-columns-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:bui-columns-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:bui-columns-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:bui-columns-7{grid-template-columns:repeat(7,minmax(0,1fr))}.lg\:bui-columns-8{grid-template-columns:repeat(8,minmax(0,1fr))}.lg\:bui-columns-9{grid-template-columns:repeat(9,minmax(0,1fr))}.lg\:bui-columns-10{grid-template-columns:repeat(10,minmax(0,1fr))}.lg\:bui-columns-11{grid-template-columns:repeat(11,minmax(0,1fr))}.lg\:bui-columns-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:bui-columns-auto{grid-template-columns:repeat(auto-fit,minmax(0,1fr))}.lg\:bui-col-span-1{grid-column:span 1/span 1}.lg\:bui-col-span-2{grid-column:span 2/span 2}.lg\:bui-col-span-3{grid-column:span 3/span 3}.lg\:bui-col-span-4{grid-column:span 4/span 4}.lg\:bui-col-span-5{grid-column:span 5/span 5}.lg\:bui-col-span-6{grid-column:span 6/span 6}.lg\:bui-col-span-7{grid-column:span 7/span 7}.lg\:bui-col-span-8{grid-column:span 8/span 8}.lg\:bui-col-span-9{grid-column:span 9/span 9}.lg\:bui-col-span-10{grid-column:span 10/span 10}.lg\:bui-col-span-11{grid-column:span 11/span 11}.lg\:bui-col-span-12{grid-column:span 12/span 12}.lg\:bui-col-span-auto{grid-column:span auto/span auto}.lg\:bui-col-start-1{grid-column-start:1}.lg\:bui-col-start-2{grid-column-start:2}.lg\:bui-col-start-3{grid-column-start:3}.lg\:bui-col-start-4{grid-column-start:4}.lg\:bui-col-start-5{grid-column-start:5}.lg\:bui-col-start-6{grid-column-start:6}.lg\:bui-col-start-7{grid-column-start:7}.lg\:bui-col-start-8{grid-column-start:8}.lg\:bui-col-start-9{grid-column-start:9}.lg\:bui-col-start-10{grid-column-start:10}.lg\:bui-col-start-11{grid-column-start:11}.lg\:bui-col-start-12{grid-column-start:12}.lg\:bui-col-start-13{grid-column-start:13}.lg\:bui-col-start-auto{grid-column-start:auto}.lg\:bui-col-end-1{grid-column-end:1}.lg\:bui-col-end-2{grid-column-end:2}.lg\:bui-col-end-3{grid-column-end:3}.lg\:bui-col-end-4{grid-column-end:4}.lg\:bui-col-end-5{grid-column-end:5}.lg\:bui-col-end-6{grid-column-end:6}.lg\:bui-col-end-7{grid-column-end:7}.lg\:bui-col-end-8{grid-column-end:8}.lg\:bui-col-end-9{grid-column-end:9}.lg\:bui-col-end-10{grid-column-end:10}.lg\:bui-col-end-11{grid-column-end:11}.lg\:bui-col-end-12{grid-column-end:12}.lg\:bui-col-end-13{grid-column-end:13}.lg\:bui-col-end-auto{grid-column-end:auto}.lg\:bui-row-span-1{grid-row:span 1/span 1}.lg\:bui-row-span-2{grid-row:span 2/span 2}.lg\:bui-row-span-3{grid-row:span 3/span 3}.lg\:bui-row-span-4{grid-row:span 4/span 4}.lg\:bui-row-span-5{grid-row:span 5/span 5}.lg\:bui-row-span-6{grid-row:span 6/span 6}.lg\:bui-row-span-7{grid-row:span 7/span 7}.lg\:bui-row-span-8{grid-row:span 8/span 8}.lg\:bui-row-span-9{grid-row:span 9/span 9}.lg\:bui-row-span-10{grid-row:span 10/span 10}.lg\:bui-row-span-11{grid-row:span 11/span 11}.lg\:bui-row-span-12{grid-row:span 12/span 12}.lg\:bui-row-span-auto{grid-row:span auto/span auto}}@media (width>=1536px){.xl\:bui-columns-1{grid-template-columns:repeat(1,minmax(0,1fr))}.xl\:bui-columns-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:bui-columns-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:bui-columns-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:bui-columns-5{grid-template-columns:repeat(5,minmax(0,1fr))}.xl\:bui-columns-6{grid-template-columns:repeat(6,minmax(0,1fr))}.xl\:bui-columns-7{grid-template-columns:repeat(7,minmax(0,1fr))}.xl\:bui-columns-8{grid-template-columns:repeat(8,minmax(0,1fr))}.xl\:bui-columns-9{grid-template-columns:repeat(9,minmax(0,1fr))}.xl\:bui-columns-10{grid-template-columns:repeat(10,minmax(0,1fr))}.xl\:bui-columns-11{grid-template-columns:repeat(11,minmax(0,1fr))}.xl\:bui-columns-12{grid-template-columns:repeat(12,minmax(0,1fr))}.xl\:bui-columns-auto{grid-template-columns:repeat(auto-fit,minmax(0,1fr))}.xl\:bui-col-span-1{grid-column:span 1/span 1}.xl\:bui-col-span-2{grid-column:span 2/span 2}.xl\:bui-col-span-3{grid-column:span 3/span 3}.xl\:bui-col-span-4{grid-column:span 4/span 4}.xl\:bui-col-span-5{grid-column:span 5/span 5}.xl\:bui-col-span-6{grid-column:span 6/span 6}.xl\:bui-col-span-7{grid-column:span 7/span 7}.xl\:bui-col-span-8{grid-column:span 8/span 8}.xl\:bui-col-span-9{grid-column:span 9/span 9}.xl\:bui-col-span-10{grid-column:span 10/span 10}.xl\:bui-col-span-11{grid-column:span 11/span 11}.xl\:bui-col-span-12{grid-column:span 12/span 12}.xl\:bui-col-span-auto{grid-column:span auto/span auto}.xl\:bui-col-start-1{grid-column-start:1}.xl\:bui-col-start-2{grid-column-start:2}.xl\:bui-col-start-3{grid-column-start:3}.xl\:bui-col-start-4{grid-column-start:4}.xl\:bui-col-start-5{grid-column-start:5}.xl\:bui-col-start-6{grid-column-start:6}.xl\:bui-col-start-7{grid-column-start:7}.xl\:bui-col-start-8{grid-column-start:8}.xl\:bui-col-start-9{grid-column-start:9}.xl\:bui-col-start-10{grid-column-start:10}.xl\:bui-col-start-11{grid-column-start:11}.xl\:bui-col-start-12{grid-column-start:12}.xl\:bui-col-start-13{grid-column-start:13}.xl\:bui-col-start-auto{grid-column-start:auto}.xl\:bui-col-end-1{grid-column-end:1}.xl\:bui-col-end-2{grid-column-end:2}.xl\:bui-col-end-3{grid-column-end:3}.xl\:bui-col-end-4{grid-column-end:4}.xl\:bui-col-end-5{grid-column-end:5}.xl\:bui-col-end-6{grid-column-end:6}.xl\:bui-col-end-7{grid-column-end:7}.xl\:bui-col-end-8{grid-column-end:8}.xl\:bui-col-end-9{grid-column-end:9}.xl\:bui-col-end-10{grid-column-end:10}.xl\:bui-col-end-11{grid-column-end:11}.xl\:bui-col-end-12{grid-column-end:12}.xl\:bui-col-end-13{grid-column-end:13}.xl\:bui-col-end-auto{grid-column-end:auto}.xl\:bui-row-span-1{grid-row:span 1/span 1}.xl\:bui-row-span-2{grid-row:span 2/span 2}.xl\:bui-row-span-3{grid-row:span 3/span 3}.xl\:bui-row-span-4{grid-row:span 4/span 4}.xl\:bui-row-span-5{grid-row:span 5/span 5}.xl\:bui-row-span-6{grid-row:span 6/span 6}.xl\:bui-row-span-7{grid-row:span 7/span 7}.xl\:bui-row-span-8{grid-row:span 8/span 8}.xl\:bui-row-span-9{grid-row:span 9/span 9}.xl\:bui-row-span-10{grid-row:span 10/span 10}.xl\:bui-row-span-11{grid-row:span 11/span 11}.xl\:bui-row-span-12{grid-row:span 12/span 12}.xl\:bui-row-span-auto{grid-row:span auto/span auto}}.bui-gap{gap:var(--gap)}.bui-gap-0\.5{gap:var(--bui-space-0_5)}.bui-gap-1{gap:var(--bui-space-1)}.bui-gap-1\.5{gap:var(--bui-space-1_5)}.bui-gap-2{gap:var(--bui-space-2)}.bui-gap-3{gap:var(--bui-space-3)}.bui-gap-4{gap:var(--bui-space-4)}.bui-gap-5{gap:var(--bui-space-5)}.bui-gap-6{gap:var(--bui-space-6)}.bui-gap-7{gap:var(--bui-space-7)}.bui-gap-8{gap:var(--bui-space-8)}.bui-gap-9{gap:var(--bui-space-9)}.bui-gap-10{gap:var(--bui-space-10)}.bui-gap-11{gap:var(--bui-space-11)}.bui-gap-12{gap:var(--bui-space-12)}.bui-gap-13{gap:var(--bui-space-13)}.bui-gap-14{gap:var(--bui-space-14)}@media (width>=640px){.xs\:bui-gap{gap:var(--gap-xs)}.xs\:bui-gap-0\.5{gap:var(--bui-space-0_5)}.xs\:bui-gap-1{gap:var(--bui-space-1)}.xs\:bui-gap-1\.5{gap:var(--bui-space-1_5)}.xs\:bui-gap-2{gap:var(--bui-space-2)}.xs\:bui-gap-3{gap:var(--bui-space-3)}.xs\:bui-gap-4{gap:var(--bui-space-4)}.xs\:bui-gap-5{gap:var(--bui-space-5)}.xs\:bui-gap-6{gap:var(--bui-space-6)}.xs\:bui-gap-7{gap:var(--bui-space-7)}.xs\:bui-gap-8{gap:var(--bui-space-8)}.xs\:bui-gap-9{gap:var(--bui-space-9)}.xs\:bui-gap-10{gap:var(--bui-space-10)}.xs\:bui-gap-11{gap:var(--bui-space-11)}.xs\:bui-gap-12{gap:var(--bui-space-12)}.xs\:bui-gap-13{gap:var(--bui-space-13)}.xs\:bui-gap-14{gap:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-gap{gap:var(--gap-sm)}.sm\:bui-gap-0\.5{gap:var(--bui-space-0_5)}.sm\:bui-gap-1{gap:var(--bui-space-1)}.sm\:bui-gap-1\.5{gap:var(--bui-space-1_5)}.sm\:bui-gap-2{gap:var(--bui-space-2)}.sm\:bui-gap-3{gap:var(--bui-space-3)}.sm\:bui-gap-4{gap:var(--bui-space-4)}.sm\:bui-gap-5{gap:var(--bui-space-5)}.sm\:bui-gap-6{gap:var(--bui-space-6)}.sm\:bui-gap-7{gap:var(--bui-space-7)}.sm\:bui-gap-8{gap:var(--bui-space-8)}.sm\:bui-gap-9{gap:var(--bui-space-9)}.sm\:bui-gap-10{gap:var(--bui-space-10)}.sm\:bui-gap-11{gap:var(--bui-space-11)}.sm\:bui-gap-12{gap:var(--bui-space-12)}.sm\:bui-gap-13{gap:var(--bui-space-13)}.sm\:bui-gap-14{gap:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-gap{gap:var(--gap-md)}.md\:bui-gap-0\.5{gap:var(--bui-space-0_5)}.md\:bui-gap-1{gap:var(--bui-space-1)}.md\:bui-gap-1\.5{gap:var(--bui-space-1_5)}.md\:bui-gap-2{gap:var(--bui-space-2)}.md\:bui-gap-3{gap:var(--bui-space-3)}.md\:bui-gap-4{gap:var(--bui-space-4)}.md\:bui-gap-5{gap:var(--bui-space-5)}.md\:bui-gap-6{gap:var(--bui-space-6)}.md\:bui-gap-7{gap:var(--bui-space-7)}.md\:bui-gap-8{gap:var(--bui-space-8)}.md\:bui-gap-9{gap:var(--bui-space-9)}.md\:bui-gap-10{gap:var(--bui-space-10)}.md\:bui-gap-11{gap:var(--bui-space-11)}.md\:bui-gap-12{gap:var(--bui-space-12)}.md\:bui-gap-13{gap:var(--bui-space-13)}.md\:bui-gap-14{gap:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-gap{gap:var(--gap-lg)}.lg\:bui-gap-0\.5{gap:var(--bui-space-0_5)}.lg\:bui-gap-1{gap:var(--bui-space-1)}.lg\:bui-gap-1\.5{gap:var(--bui-space-1_5)}.lg\:bui-gap-2{gap:var(--bui-space-2)}.lg\:bui-gap-3{gap:var(--bui-space-3)}.lg\:bui-gap-4{gap:var(--bui-space-4)}.lg\:bui-gap-5{gap:var(--bui-space-5)}.lg\:bui-gap-6{gap:var(--bui-space-6)}.lg\:bui-gap-7{gap:var(--bui-space-7)}.lg\:bui-gap-8{gap:var(--bui-space-8)}.lg\:bui-gap-9{gap:var(--bui-space-9)}.lg\:bui-gap-10{gap:var(--bui-space-10)}.lg\:bui-gap-11{gap:var(--bui-space-11)}.lg\:bui-gap-12{gap:var(--bui-space-12)}.lg\:bui-gap-13{gap:var(--bui-space-13)}.lg\:bui-gap-14{gap:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-gap{gap:var(--gap-xl)}.xl\:bui-gap-0\.5{gap:var(--bui-space-0_5)}.xl\:bui-gap-1{gap:var(--bui-space-1)}.xl\:bui-gap-1\.5{gap:var(--bui-space-1_5)}.xl\:bui-gap-2{gap:var(--bui-space-2)}.xl\:bui-gap-3{gap:var(--bui-space-3)}.xl\:bui-gap-4{gap:var(--bui-space-4)}.xl\:bui-gap-5{gap:var(--bui-space-5)}.xl\:bui-gap-6{gap:var(--bui-space-6)}.xl\:bui-gap-7{gap:var(--bui-space-7)}.xl\:bui-gap-8{gap:var(--bui-space-8)}.xl\:bui-gap-9{gap:var(--bui-space-9)}.xl\:bui-gap-10{gap:var(--bui-space-10)}.xl\:bui-gap-11{gap:var(--bui-space-11)}.xl\:bui-gap-12{gap:var(--bui-space-12)}.xl\:bui-gap-13{gap:var(--bui-space-13)}.xl\:bui-gap-14{gap:var(--bui-space-14)}}.bui-align-start{align-items:start}.bui-align-center{align-items:center}.bui-align-end{align-items:end}.bui-align-baseline{align-items:baseline}.bui-align-stretch{align-items:stretch}.bui-jc-start{justify-content:start}.bui-jc-center{justify-content:center}.bui-jc-end{justify-content:end}.bui-jc-between{justify-content:space-between}.bui-fd-row{flex-direction:row}.bui-fd-column{flex-direction:column}.bui-fd-row-reverse{flex-direction:row-reverse}.bui-fd-column-reverse{flex-direction:column-reverse}@media (width>=640px){.xs\:bui-align-start{align-items:start}.xs\:bui-align-center{align-items:center}.xs\:bui-align-end{align-items:end}.xs\:bui-align-stretch{align-items:stretch}.xs\:bui-jc-start{justify-content:start}.xs\:bui-jc-center{justify-content:center}.xs\:bui-jc-end{justify-content:end}.xs\:bui-jc-between{justify-content:space-between}.xs\:bui-fd-row{flex-direction:row}.xs\:bui-fd-column{flex-direction:column}.xs\:bui-fd-row-reverse{flex-direction:row-reverse}.xs\:bui-fd-column-reverse{flex-direction:column-reverse}}@media (width>=768px){.sm\:bui-align-start{align-items:start}.sm\:bui-align-center{align-items:center}.sm\:bui-align-end{align-items:end}.sm\:bui-align-stretch{align-items:stretch}.sm\:bui-jc-start{justify-content:start}.sm\:bui-jc-center{justify-content:center}.sm\:bui-jc-end{justify-content:end}.sm\:bui-jc-between{justify-content:space-between}.sm\:bui-fd-row{flex-direction:row}.sm\:bui-fd-column{flex-direction:column}.sm\:bui-fd-row-reverse{flex-direction:row-reverse}.sm\:bui-fd-column-reverse{flex-direction:column-reverse}}@media (width>=1024px){.md\:bui-align-start{align-items:start}.md\:bui-align-center{align-items:center}.md\:bui-align-end{align-items:end}.md\:bui-align-stretch{align-items:stretch}.md\:bui-jc-start{justify-content:start}.md\:bui-jc-center{justify-content:center}.md\:bui-jc-end{justify-content:end}.md\:bui-jc-between{justify-content:space-between}.md\:bui-fd-row{flex-direction:row}.md\:bui-fd-column{flex-direction:column}.md\:bui-fd-row-reverse{flex-direction:row-reverse}.md\:bui-fd-column-reverse{flex-direction:column-reverse}}@media (width>=1280px){.lg\:bui-align-start{align-items:start}.lg\:bui-align-center{align-items:center}.lg\:bui-align-end{align-items:end}.lg\:bui-align-stretch{align-items:stretch}.lg\:bui-jc-start{justify-content:start}.lg\:bui-jc-center{justify-content:center}.lg\:bui-jc-end{justify-content:end}.lg\:bui-jc-between{justify-content:space-between}.lg\:bui-fd-row{flex-direction:row}.lg\:bui-fd-column{flex-direction:column}.lg\:bui-fd-row-reverse{flex-direction:row-reverse}.lg\:bui-fd-column-reverse{flex-direction:column-reverse}}@media (width>=1536px){.xl\:bui-align-start{align-items:start}.xl\:bui-align-center{align-items:center}.xl\:bui-align-end{align-items:end}.xl\:bui-align-stretch{align-items:stretch}.xl\:bui-jc-start{justify-content:start}.xl\:bui-jc-center{justify-content:center}.xl\:bui-jc-end{justify-content:end}.xl\:bui-jc-between{justify-content:space-between}.xl\:bui-fd-row{flex-direction:row}.xl\:bui-fd-column{flex-direction:column}.xl\:bui-fd-row-reverse{flex-direction:row-reverse}.xl\:bui-fd-column-reverse{flex-direction:column-reverse}}}
\ No newline at end of file
+@layer tokens{:root{--bui-font-regular:system-ui;--bui-font-monospace:ui-monospace,"Menlo","Monaco","Consolas","Liberation Mono","Courier New",monospace;--bui-font-weight-regular:400;--bui-font-weight-bold:600;--bui-font-size-1:.625rem;--bui-font-size-2:.75rem;--bui-font-size-3:.875rem;--bui-font-size-4:1rem;--bui-font-size-5:1.25rem;--bui-font-size-6:1.5rem;--bui-font-size-7:2rem;--bui-font-size-8:3rem;--bui-font-size-9:4rem;--bui-font-size-10:5.75rem;--bui-space:.25rem;--bui-space-0_5:calc(var(--bui-space)*.5);--bui-space-1:var(--bui-space);--bui-space-1_5:calc(var(--bui-space)*1.5);--bui-space-2:calc(var(--bui-space)*2);--bui-space-3:calc(var(--bui-space)*3);--bui-space-4:calc(var(--bui-space)*4);--bui-space-5:calc(var(--bui-space)*5);--bui-space-6:calc(var(--bui-space)*6);--bui-space-7:calc(var(--bui-space)*7);--bui-space-8:calc(var(--bui-space)*8);--bui-space-9:calc(var(--bui-space)*9);--bui-space-10:calc(var(--bui-space)*10);--bui-space-11:calc(var(--bui-space)*11);--bui-space-12:calc(var(--bui-space)*12);--bui-space-13:calc(var(--bui-space)*13);--bui-space-14:calc(var(--bui-space)*14);--bui-radius-1:calc(.125rem);--bui-radius-2:calc(.25rem);--bui-radius-3:calc(.5rem);--bui-radius-4:calc(.75rem);--bui-radius-5:calc(1rem);--bui-radius-6:calc(1.25rem);--bui-radius-full:9999px;--bui-black:#000;--bui-white:#fff;--bui-gray-1:#f8f8f8;--bui-gray-2:#ececec;--bui-gray-3:#d9d9d9;--bui-gray-4:#c1c1c1;--bui-gray-5:#9e9e9e;--bui-gray-6:#8c8c8c;--bui-gray-7:#757575;--bui-gray-8:#595959;--bui-bg-surface-0:var(--bui-gray-1);--bui-bg-surface-1:var(--bui-white);--bui-bg-surface-2:var(--bui-gray-1);--bui-bg-surface-3:var(--bui-gray-2);--bui-bg-solid:#1f5493;--bui-bg-solid-hover:#163a66;--bui-bg-solid-pressed:#0f2b4e;--bui-bg-solid-disabled:#ebebeb;--bui-bg-tint:transparent;--bui-bg-tint-hover:#1f549366;--bui-bg-tint-pressed:#1f549399;--bui-bg-tint-disabled:#ebebeb;--bui-bg-danger:#feebe7;--bui-bg-warning:#fff2b2;--bui-bg-success:#e6f6eb;--bui-fg-primary:var(--bui-black);--bui-fg-secondary:var(--bui-gray-7);--bui-fg-link:#1f5493;--bui-fg-link-hover:#1f2d5c;--bui-fg-disabled:#9e9e9e;--bui-fg-solid:var(--bui-white);--bui-fg-solid-disabled:#9c9c9c;--bui-fg-tint:#1f5493;--bui-fg-tint-disabled:var(--bui-gray-5);--bui-fg-danger:#e22b2b;--bui-fg-warning:#e36d05;--bui-fg-success:#1db954;--bui-border:#0000001a;--bui-border-hover:#0003;--bui-border-pressed:#0006;--bui-border-disabled:#0000001a;--bui-border-danger:#f87a7a;--bui-border-warning:#e36d05;--bui-border-success:#53db83;--bui-ring:#1f5493;--bui-scrollbar:#a0a0a03b;--bui-scrollbar-thumb:#a0a0a0;--bui-animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite}[data-theme-mode=dark]{--bui-gray-1:#191919;--bui-gray-2:#242424;--bui-gray-3:#373737;--bui-gray-4:#464646;--bui-gray-5:#575757;--bui-gray-6:#7b7b7b;--bui-gray-7:#9e9e9e;--bui-gray-8:#b4b4b4;--bui-bg-surface-0:#333;--bui-bg-surface-1:var(--bui-gray-1);--bui-bg-surface-2:var(--bui-gray-2);--bui-bg-surface-3:var(--bui-gray-3);--bui-bg-solid:#9cc9ff;--bui-bg-solid-hover:#83b9fd;--bui-bg-solid-pressed:#83b9fd;--bui-bg-solid-disabled:#222;--bui-bg-tint:transparent;--bui-bg-tint-hover:#9cc9ff1f;--bui-bg-tint-pressed:#9cc9ff29;--bui-bg-tint-disabled:transparent;--bui-bg-danger:#3b1219;--bui-bg-warning:#302008;--bui-bg-success:#132d21;--bui-fg-primary:var(--bui-white);--bui-fg-secondary:var(--bui-gray-7);--bui-fg-link:#9cc9ff;--bui-fg-link-hover:#7eb5f7;--bui-fg-disabled:var(--bui-gray-7);--bui-fg-solid:#101821;--bui-fg-solid-disabled:var(--bui-gray-5);--bui-fg-tint:#9cc9ff;--bui-fg-tint-disabled:var(--bui-gray-5);--bui-fg-danger:#e22b2b;--bui-fg-warning:#e36d05;--bui-fg-success:#1db954;--bui-border:#ffffff1f;--bui-border-hover:#fff6;--bui-border-pressed:#ffffff80;--bui-border-disabled:#fff3;--bui-border-danger:#f87a7a;--bui-border-warning:#e36d05;--bui-border-success:#53db83;--bui-ring:#1f5493;--bui-scrollbar:#3636363a;--bui-scrollbar-thumb:#575757}}@layer base{*,:before,:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;tab-size:4;font-family:system-ui,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;line-height:1.15}body{margin:0}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{border-color:currentColor}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:100%;line-height:1.15}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}legend{padding:0}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}:where(a){color:inherit;text-decoration:none}@keyframes pulse{50%{opacity:.5}}body{background-color:var(--bui-bg-surface-0);color:var(--bui-fg-primary);font-family:var(--bui-font-regular);font-weight:var(--bui-font-weight-regular);font-size:var(--bui-font-size-3);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}[data-theme-mode=dark]{color-scheme:dark}[data-theme-mode=light]{color-scheme:light}}@layer components;@layer utilities{.bui-p{padding:var(--p)}.bui-p-0\.5{padding:var(--bui-space-0_5)}.bui-p-1{padding:var(--bui-space-1)}.bui-p-1\.5{padding:var(--bui-space-1_5)}.bui-p-2{padding:var(--bui-space-2)}.bui-p-3{padding:var(--bui-space-3)}.bui-p-4{padding:var(--bui-space-4)}.bui-p-5{padding:var(--bui-space-5)}.bui-p-6{padding:var(--bui-space-6)}.bui-p-7{padding:var(--bui-space-7)}.bui-p-8{padding:var(--bui-space-8)}.bui-p-9{padding:var(--bui-space-9)}.bui-p-10{padding:var(--bui-space-10)}.bui-p-11{padding:var(--bui-space-11)}.bui-p-12{padding:var(--bui-space-12)}.bui-p-13{padding:var(--bui-space-13)}.bui-p-14{padding:var(--bui-space-14)}@media (width>=640px){.xs\:bui-p{padding:var(--p-xs)}.xs\:bui-p-0\.5{padding:var(--bui-space-0_5)}.xs\:bui-p-1{padding:var(--bui-space-1)}.xs\:bui-p-1\.5{padding:var(--bui-space-1_5)}.xs\:bui-p-2{padding:var(--bui-space-2)}.xs\:bui-p-3{padding:var(--bui-space-3)}.xs\:bui-p-4{padding:var(--bui-space-4)}.xs\:bui-p-5{padding:var(--bui-space-5)}.xs\:bui-p-6{padding:var(--bui-space-6)}.xs\:bui-p-7{padding:var(--bui-space-7)}.xs\:bui-p-8{padding:var(--bui-space-8)}.xs\:bui-p-9{padding:var(--bui-space-9)}.xs\:bui-p-10{padding:var(--bui-space-10)}.xs\:bui-p-11{padding:var(--bui-space-11)}.xs\:bui-p-12{padding:var(--bui-space-12)}.xs\:bui-p-13{padding:var(--bui-space-13)}.xs\:bui-p-14{padding:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-p{padding:var(--p-sm)}.sm\:bui-p-0\.5{padding:var(--bui-space-0_5)}.sm\:bui-p-1{padding:var(--bui-space-1)}.sm\:bui-p-1\.5{padding:var(--bui-space-1_5)}.sm\:bui-p-2{padding:var(--bui-space-2)}.sm\:bui-p-3{padding:var(--bui-space-3)}.sm\:bui-p-4{padding:var(--bui-space-4)}.sm\:bui-p-5{padding:var(--bui-space-5)}.sm\:bui-p-6{padding:var(--bui-space-6)}.sm\:bui-p-7{padding:var(--bui-space-7)}.sm\:bui-p-8{padding:var(--bui-space-8)}.sm\:bui-p-9{padding:var(--bui-space-9)}.sm\:bui-p-10{padding:var(--bui-space-10)}.sm\:bui-p-11{padding:var(--bui-space-11)}.sm\:bui-p-12{padding:var(--bui-space-12)}.sm\:bui-p-13{padding:var(--bui-space-13)}.sm\:bui-p-14{padding:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-p{padding:var(--p-md)}.md\:bui-p-0\.5{padding:var(--bui-space-0_5)}.md\:bui-p-1{padding:var(--bui-space-1)}.md\:bui-p-1\.5{padding:var(--bui-space-1_5)}.md\:bui-p-2{padding:var(--bui-space-2)}.md\:bui-p-3{padding:var(--bui-space-3)}.md\:bui-p-4{padding:var(--bui-space-4)}.md\:bui-p-5{padding:var(--bui-space-5)}.md\:bui-p-6{padding:var(--bui-space-6)}.md\:bui-p-7{padding:var(--bui-space-7)}.md\:bui-p-8{padding:var(--bui-space-8)}.md\:bui-p-9{padding:var(--bui-space-9)}.md\:bui-p-10{padding:var(--bui-space-10)}.md\:bui-p-11{padding:var(--bui-space-11)}.md\:bui-p-12{padding:var(--bui-space-12)}.md\:bui-p-13{padding:var(--bui-space-13)}.md\:bui-p-14{padding:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-p{padding:var(--p-lg)}.lg\:bui-p-0\.5{padding:var(--bui-space-0_5)}.lg\:bui-p-1{padding:var(--bui-space-1)}.lg\:bui-p-1\.5{padding:var(--bui-space-1_5)}.lg\:bui-p-2{padding:var(--bui-space-2)}.lg\:bui-p-3{padding:var(--bui-space-3)}.lg\:bui-p-4{padding:var(--bui-space-4)}.lg\:bui-p-5{padding:var(--bui-space-5)}.lg\:bui-p-6{padding:var(--bui-space-6)}.lg\:bui-p-7{padding:var(--bui-space-7)}.lg\:bui-p-8{padding:var(--bui-space-8)}.lg\:bui-p-9{padding:var(--bui-space-9)}.lg\:bui-p-10{padding:var(--bui-space-10)}.lg\:bui-p-11{padding:var(--bui-space-11)}.lg\:bui-p-12{padding:var(--bui-space-12)}.lg\:bui-p-13{padding:var(--bui-space-13)}.lg\:bui-p-14{padding:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-p{padding:var(--p-xl)}.xl\:bui-p-0\.5{padding:var(--bui-space-0_5)}.xl\:bui-p-1{padding:var(--bui-space-1)}.xl\:bui-p-1\.5{padding:var(--bui-space-1_5)}.xl\:bui-p-2{padding:var(--bui-space-2)}.xl\:bui-p-3{padding:var(--bui-space-3)}.xl\:bui-p-4{padding:var(--bui-space-4)}.xl\:bui-p-5{padding:var(--bui-space-5)}.xl\:bui-p-6{padding:var(--bui-space-6)}.xl\:bui-p-7{padding:var(--bui-space-7)}.xl\:bui-p-8{padding:var(--bui-space-8)}.xl\:bui-p-9{padding:var(--bui-space-9)}.xl\:bui-p-10{padding:var(--bui-space-10)}.xl\:bui-p-11{padding:var(--bui-space-11)}.xl\:bui-p-12{padding:var(--bui-space-12)}.xl\:bui-p-13{padding:var(--bui-space-13)}.xl\:bui-p-14{padding:var(--bui-space-14)}}.bui-pl{padding-left:var(--pl)}.bui-pl-0\.5{padding-left:var(--bui-space-0_5)}.bui-pl-1{padding-left:var(--bui-space-1)}.bui-pl-1\.5{padding-left:var(--bui-space-1_5)}.bui-pl-2{padding-left:var(--bui-space-2)}.bui-pl-3{padding-left:var(--bui-space-3)}.bui-pl-4{padding-left:var(--bui-space-4)}.bui-pl-5{padding-left:var(--bui-space-5)}.bui-pl-6{padding-left:var(--bui-space-6)}.bui-pl-7{padding-left:var(--bui-space-7)}.bui-pl-8{padding-left:var(--bui-space-8)}.bui-pl-9{padding-left:var(--bui-space-9)}.bui-pl-10{padding-left:var(--bui-space-10)}.bui-pl-11{padding-left:var(--bui-space-11)}.bui-pl-12{padding-left:var(--bui-space-12)}.bui-pl-13{padding-left:var(--bui-space-13)}.bui-pl-14{padding-left:var(--bui-space-14)}@media (width>=640px){.xs\:bui-pl{padding-left:var(--pl-xs)}.xs\:bui-pl-0\.5{padding-left:var(--bui-space-0_5)}.xs\:bui-pl-1{padding-left:var(--bui-space-1)}.xs\:bui-pl-1\.5{padding-left:var(--bui-space-1_5)}.xs\:bui-pl-2{padding-left:var(--bui-space-2)}.xs\:bui-pl-3{padding-left:var(--bui-space-3)}.xs\:bui-pl-4{padding-left:var(--bui-space-4)}.xs\:bui-pl-5{padding-left:var(--bui-space-5)}.xs\:bui-pl-6{padding-left:var(--bui-space-6)}.xs\:bui-pl-7{padding-left:var(--bui-space-7)}.xs\:bui-pl-8{padding-left:var(--bui-space-8)}.xs\:bui-pl-9{padding-left:var(--bui-space-9)}.xs\:bui-pl-10{padding-left:var(--bui-space-10)}.xs\:bui-pl-11{padding-left:var(--bui-space-11)}.xs\:bui-pl-12{padding-left:var(--bui-space-12)}.xs\:bui-pl-13{padding-left:var(--bui-space-13)}.xs\:bui-pl-14{padding-left:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-pl{padding-left:var(--pl-sm)}.sm\:bui-pl-0\.5{padding-left:var(--bui-space-0_5)}.sm\:bui-pl-1{padding-left:var(--bui-space-1)}.sm\:bui-pl-1\.5{padding-left:var(--bui-space-1_5)}.sm\:bui-pl-2{padding-left:var(--bui-space-2)}.sm\:bui-pl-3{padding-left:var(--bui-space-3)}.sm\:bui-pl-4{padding-left:var(--bui-space-4)}.sm\:bui-pl-5{padding-left:var(--bui-space-5)}.sm\:bui-pl-6{padding-left:var(--bui-space-6)}.sm\:bui-pl-7{padding-left:var(--bui-space-7)}.sm\:bui-pl-8{padding-left:var(--bui-space-8)}.sm\:bui-pl-9{padding-left:var(--bui-space-9)}.sm\:bui-pl-10{padding-left:var(--bui-space-10)}.sm\:bui-pl-11{padding-left:var(--bui-space-11)}.sm\:bui-pl-12{padding-left:var(--bui-space-12)}.sm\:bui-pl-13{padding-left:var(--bui-space-13)}.sm\:bui-pl-14{padding-left:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-pl{padding-left:var(--pl-md)}.md\:bui-pl-0\.5{padding-left:var(--bui-space-0_5)}.md\:bui-pl-1{padding-left:var(--bui-space-1)}.md\:bui-pl-1\.5{padding-left:var(--bui-space-1_5)}.md\:bui-pl-2{padding-left:var(--bui-space-2)}.md\:bui-pl-3{padding-left:var(--bui-space-3)}.md\:bui-pl-4{padding-left:var(--bui-space-4)}.md\:bui-pl-5{padding-left:var(--bui-space-5)}.md\:bui-pl-6{padding-left:var(--bui-space-6)}.md\:bui-pl-7{padding-left:var(--bui-space-7)}.md\:bui-pl-8{padding-left:var(--bui-space-8)}.md\:bui-pl-9{padding-left:var(--bui-space-9)}.md\:bui-pl-10{padding-left:var(--bui-space-10)}.md\:bui-pl-11{padding-left:var(--bui-space-11)}.md\:bui-pl-12{padding-left:var(--bui-space-12)}.md\:bui-pl-13{padding-left:var(--bui-space-13)}.md\:bui-pl-14{padding-left:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-pl{padding-left:var(--pl-lg)}.lg\:bui-pl-0\.5{padding-left:var(--bui-space-0_5)}.lg\:bui-pl-1{padding-left:var(--bui-space-1)}.lg\:bui-pl-1\.5{padding-left:var(--bui-space-1_5)}.lg\:bui-pl-2{padding-left:var(--bui-space-2)}.lg\:bui-pl-3{padding-left:var(--bui-space-3)}.lg\:bui-pl-4{padding-left:var(--bui-space-4)}.lg\:bui-pl-5{padding-left:var(--bui-space-5)}.lg\:bui-pl-6{padding-left:var(--bui-space-6)}.lg\:bui-pl-7{padding-left:var(--bui-space-7)}.lg\:bui-pl-8{padding-left:var(--bui-space-8)}.lg\:bui-pl-9{padding-left:var(--bui-space-9)}.lg\:bui-pl-10{padding-left:var(--bui-space-10)}.lg\:bui-pl-11{padding-left:var(--bui-space-11)}.lg\:bui-pl-12{padding-left:var(--bui-space-12)}.lg\:bui-pl-13{padding-left:var(--bui-space-13)}.lg\:bui-pl-14{padding-left:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-pl{padding-left:var(--pl-xl)}.xl\:bui-pl-0\.5{padding-left:var(--bui-space-0_5)}.xl\:bui-pl-1{padding-left:var(--bui-space-1)}.xl\:bui-pl-1\.5{padding-left:var(--bui-space-1_5)}.xl\:bui-pl-2{padding-left:var(--bui-space-2)}.xl\:bui-pl-3{padding-left:var(--bui-space-3)}.xl\:bui-pl-4{padding-left:var(--bui-space-4)}.xl\:bui-pl-5{padding-left:var(--bui-space-5)}.xl\:bui-pl-6{padding-left:var(--bui-space-6)}.xl\:bui-pl-7{padding-left:var(--bui-space-7)}.xl\:bui-pl-8{padding-left:var(--bui-space-8)}.xl\:bui-pl-9{padding-left:var(--bui-space-9)}.xl\:bui-pl-10{padding-left:var(--bui-space-10)}.xl\:bui-pl-11{padding-left:var(--bui-space-11)}.xl\:bui-pl-12{padding-left:var(--bui-space-12)}.xl\:bui-pl-13{padding-left:var(--bui-space-13)}.xl\:bui-pl-14{padding-left:var(--bui-space-14)}}.bui-pr{padding-right:var(--pr)}.bui-pr-0\.5{padding-right:var(--bui-space-0_5)}.bui-pr-1{padding-right:var(--bui-space-1)}.bui-pr-1\.5{padding-right:var(--bui-space-1_5)}.bui-pr-2{padding-right:var(--bui-space-2)}.bui-pr-3{padding-right:var(--bui-space-3)}.bui-pr-4{padding-right:var(--bui-space-4)}.bui-pr-5{padding-right:var(--bui-space-5)}.bui-pr-6{padding-right:var(--bui-space-6)}.bui-pr-7{padding-right:var(--bui-space-7)}.bui-pr-8{padding-right:var(--bui-space-8)}.bui-pr-9{padding-right:var(--bui-space-9)}.bui-pr-10{padding-right:var(--bui-space-10)}.bui-pr-11{padding-right:var(--bui-space-11)}.bui-pr-12{padding-right:var(--bui-space-12)}.bui-pr-13{padding-right:var(--bui-space-13)}.bui-pr-14{padding-right:var(--bui-space-14)}@media (width>=640px){.xs\:bui-pr{padding-right:var(--pr-xs)}.xs\:bui-pr-0\.5{padding-right:var(--bui-space-0_5)}.xs\:bui-pr-1{padding-right:var(--bui-space-1)}.xs\:bui-pr-1\.5{padding-right:var(--bui-space-1_5)}.xs\:bui-pr-2{padding-right:var(--bui-space-2)}.xs\:bui-pr-3{padding-right:var(--bui-space-3)}.xs\:bui-pr-4{padding-right:var(--bui-space-4)}.xs\:bui-pr-5{padding-right:var(--bui-space-5)}.xs\:bui-pr-6{padding-right:var(--bui-space-6)}.xs\:bui-pr-7{padding-right:var(--bui-space-7)}.xs\:bui-pr-8{padding-right:var(--bui-space-8)}.xs\:bui-pr-9{padding-right:var(--bui-space-9)}.xs\:bui-pr-10{padding-right:var(--bui-space-10)}.xs\:bui-pr-11{padding-right:var(--bui-space-11)}.xs\:bui-pr-12{padding-right:var(--bui-space-12)}.xs\:bui-pr-13{padding-right:var(--bui-space-13)}.xs\:bui-pr-14{padding-right:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-pr{padding-right:var(--pr-sm)}.sm\:bui-pr-0\.5{padding-right:var(--bui-space-0_5)}.sm\:bui-pr-1{padding-right:var(--bui-space-1)}.sm\:bui-pr-1\.5{padding-right:var(--bui-space-1_5)}.sm\:bui-pr-2{padding-right:var(--bui-space-2)}.sm\:bui-pr-3{padding-right:var(--bui-space-3)}.sm\:bui-pr-4{padding-right:var(--bui-space-4)}.sm\:bui-pr-5{padding-right:var(--bui-space-5)}.sm\:bui-pr-6{padding-right:var(--bui-space-6)}.sm\:bui-pr-7{padding-right:var(--bui-space-7)}.sm\:bui-pr-8{padding-right:var(--bui-space-8)}.sm\:bui-pr-9{padding-right:var(--bui-space-9)}.sm\:bui-pr-10{padding-right:var(--bui-space-10)}.sm\:bui-pr-11{padding-right:var(--bui-space-11)}.sm\:bui-pr-12{padding-right:var(--bui-space-12)}.sm\:bui-pr-13{padding-right:var(--bui-space-13)}.sm\:bui-pr-14{padding-right:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-pr{padding-right:var(--pr-md)}.md\:bui-pr-0\.5{padding-right:var(--bui-space-0_5)}.md\:bui-pr-1{padding-right:var(--bui-space-1)}.md\:bui-pr-1\.5{padding-right:var(--bui-space-1_5)}.md\:bui-pr-2{padding-right:var(--bui-space-2)}.md\:bui-pr-3{padding-right:var(--bui-space-3)}.md\:bui-pr-4{padding-right:var(--bui-space-4)}.md\:bui-pr-5{padding-right:var(--bui-space-5)}.md\:bui-pr-6{padding-right:var(--bui-space-6)}.md\:bui-pr-7{padding-right:var(--bui-space-7)}.md\:bui-pr-8{padding-right:var(--bui-space-8)}.md\:bui-pr-9{padding-right:var(--bui-space-9)}.md\:bui-pr-10{padding-right:var(--bui-space-10)}.md\:bui-pr-11{padding-right:var(--bui-space-11)}.md\:bui-pr-12{padding-right:var(--bui-space-12)}.md\:bui-pr-13{padding-right:var(--bui-space-13)}.md\:bui-pr-14{padding-right:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-pr{padding-right:var(--pr-lg)}.lg\:bui-pr-0\.5{padding-right:var(--bui-space-0_5)}.lg\:bui-pr-1{padding-right:var(--bui-space-1)}.lg\:bui-pr-1\.5{padding-right:var(--bui-space-1_5)}.lg\:bui-pr-2{padding-right:var(--bui-space-2)}.lg\:bui-pr-3{padding-right:var(--bui-space-3)}.lg\:bui-pr-4{padding-right:var(--bui-space-4)}.lg\:bui-pr-5{padding-right:var(--bui-space-5)}.lg\:bui-pr-6{padding-right:var(--bui-space-6)}.lg\:bui-pr-7{padding-right:var(--bui-space-7)}.lg\:bui-pr-8{padding-right:var(--bui-space-8)}.lg\:bui-pr-9{padding-right:var(--bui-space-9)}.lg\:bui-pr-10{padding-right:var(--bui-space-10)}.lg\:bui-pr-11{padding-right:var(--bui-space-11)}.lg\:bui-pr-12{padding-right:var(--bui-space-12)}.lg\:bui-pr-13{padding-right:var(--bui-space-13)}.lg\:bui-pr-14{padding-right:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-pr{padding-right:var(--pr-xl)}.xl\:bui-pr-0\.5{padding-right:var(--bui-space-0_5)}.xl\:bui-pr-1{padding-right:var(--bui-space-1)}.xl\:bui-pr-1\.5{padding-right:var(--bui-space-1_5)}.xl\:bui-pr-2{padding-right:var(--bui-space-2)}.xl\:bui-pr-3{padding-right:var(--bui-space-3)}.xl\:bui-pr-4{padding-right:var(--bui-space-4)}.xl\:bui-pr-5{padding-right:var(--bui-space-5)}.xl\:bui-pr-6{padding-right:var(--bui-space-6)}.xl\:bui-pr-7{padding-right:var(--bui-space-7)}.xl\:bui-pr-8{padding-right:var(--bui-space-8)}.xl\:bui-pr-9{padding-right:var(--bui-space-9)}.xl\:bui-pr-10{padding-right:var(--bui-space-10)}.xl\:bui-pr-11{padding-right:var(--bui-space-11)}.xl\:bui-pr-12{padding-right:var(--bui-space-12)}.xl\:bui-pr-13{padding-right:var(--bui-space-13)}.xl\:bui-pr-14{padding-right:var(--bui-space-14)}}.bui-pt{padding-top:var(--pt)}.bui-pt-0\.5{padding-top:var(--bui-space-0_5)}.bui-pt-1{padding-top:var(--bui-space-1)}.bui-pt-1\.5{padding-top:var(--bui-space-1_5)}.bui-pt-2{padding-top:var(--bui-space-2)}.bui-pt-3{padding-top:var(--bui-space-3)}.bui-pt-4{padding-top:var(--bui-space-4)}.bui-pt-5{padding-top:var(--bui-space-5)}.bui-pt-6{padding-top:var(--bui-space-6)}.bui-pt-7{padding-top:var(--bui-space-7)}.bui-pt-8{padding-top:var(--bui-space-8)}.bui-pt-9{padding-top:var(--bui-space-9)}.bui-pt-10{padding-top:var(--bui-space-10)}.bui-pt-11{padding-top:var(--bui-space-11)}.bui-pt-12{padding-top:var(--bui-space-12)}.bui-pt-13{padding-top:var(--bui-space-13)}.bui-pt-14{padding-top:var(--bui-space-14)}@media (width>=640px){.xs\:bui-pt{padding-top:var(--pt-xs)}.xs\:bui-pt-0\.5{padding-top:var(--bui-space-0_5)}.xs\:bui-pt-1{padding-top:var(--bui-space-1)}.xs\:bui-pt-1\.5{padding-top:var(--bui-space-1_5)}.xs\:bui-pt-2{padding-top:var(--bui-space-2)}.xs\:bui-pt-3{padding-top:var(--bui-space-3)}.xs\:bui-pt-4{padding-top:var(--bui-space-4)}.xs\:bui-pt-5{padding-top:var(--bui-space-5)}.xs\:bui-pt-6{padding-top:var(--bui-space-6)}.xs\:bui-pt-7{padding-top:var(--bui-space-7)}.xs\:bui-pt-8{padding-top:var(--bui-space-8)}.xs\:bui-pt-9{padding-top:var(--bui-space-9)}.xs\:bui-pt-10{padding-top:var(--bui-space-10)}.xs\:bui-pt-11{padding-top:var(--bui-space-11)}.xs\:bui-pt-12{padding-top:var(--bui-space-12)}.xs\:bui-pt-13{padding-top:var(--bui-space-13)}.xs\:bui-pt-14{padding-top:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-pt{padding-top:var(--pt-sm)}.sm\:bui-pt-0\.5{padding-top:var(--bui-space-0_5)}.sm\:bui-pt-1{padding-top:var(--bui-space-1)}.sm\:bui-pt-1\.5{padding-top:var(--bui-space-1_5)}.sm\:bui-pt-2{padding-top:var(--bui-space-2)}.sm\:bui-pt-3{padding-top:var(--bui-space-3)}.sm\:bui-pt-4{padding-top:var(--bui-space-4)}.sm\:bui-pt-5{padding-top:var(--bui-space-5)}.sm\:bui-pt-6{padding-top:var(--bui-space-6)}.sm\:bui-pt-7{padding-top:var(--bui-space-7)}.sm\:bui-pt-8{padding-top:var(--bui-space-8)}.sm\:bui-pt-9{padding-top:var(--bui-space-9)}.sm\:bui-pt-10{padding-top:var(--bui-space-10)}.sm\:bui-pt-11{padding-top:var(--bui-space-11)}.sm\:bui-pt-12{padding-top:var(--bui-space-12)}.sm\:bui-pt-13{padding-top:var(--bui-space-13)}.sm\:bui-pt-14{padding-top:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-pt{padding-top:var(--pt-md)}.md\:bui-pt-0\.5{padding-top:var(--bui-space-0_5)}.md\:bui-pt-1{padding-top:var(--bui-space-1)}.md\:bui-pt-1\.5{padding-top:var(--bui-space-1_5)}.md\:bui-pt-2{padding-top:var(--bui-space-2)}.md\:bui-pt-3{padding-top:var(--bui-space-3)}.md\:bui-pt-4{padding-top:var(--bui-space-4)}.md\:bui-pt-5{padding-top:var(--bui-space-5)}.md\:bui-pt-6{padding-top:var(--bui-space-6)}.md\:bui-pt-7{padding-top:var(--bui-space-7)}.md\:bui-pt-8{padding-top:var(--bui-space-8)}.md\:bui-pt-9{padding-top:var(--bui-space-9)}.md\:bui-pt-10{padding-top:var(--bui-space-10)}.md\:bui-pt-11{padding-top:var(--bui-space-11)}.md\:bui-pt-12{padding-top:var(--bui-space-12)}.md\:bui-pt-13{padding-top:var(--bui-space-13)}.md\:bui-pt-14{padding-top:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-pt{padding-top:var(--pt-lg)}.lg\:bui-pt-0\.5{padding-top:var(--bui-space-0_5)}.lg\:bui-pt-1{padding-top:var(--bui-space-1)}.lg\:bui-pt-1\.5{padding-top:var(--bui-space-1_5)}.lg\:bui-pt-2{padding-top:var(--bui-space-2)}.lg\:bui-pt-3{padding-top:var(--bui-space-3)}.lg\:bui-pt-4{padding-top:var(--bui-space-4)}.lg\:bui-pt-5{padding-top:var(--bui-space-5)}.lg\:bui-pt-6{padding-top:var(--bui-space-6)}.lg\:bui-pt-7{padding-top:var(--bui-space-7)}.lg\:bui-pt-8{padding-top:var(--bui-space-8)}.lg\:bui-pt-9{padding-top:var(--bui-space-9)}.lg\:bui-pt-10{padding-top:var(--bui-space-10)}.lg\:bui-pt-11{padding-top:var(--bui-space-11)}.lg\:bui-pt-12{padding-top:var(--bui-space-12)}.lg\:bui-pt-13{padding-top:var(--bui-space-13)}.lg\:bui-pt-14{padding-top:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-pt{padding-top:var(--pt-xl)}.xl\:bui-pt-0\.5{padding-top:var(--bui-space-0_5)}.xl\:bui-pt-1{padding-top:var(--bui-space-1)}.xl\:bui-pt-1\.5{padding-top:var(--bui-space-1_5)}.xl\:bui-pt-2{padding-top:var(--bui-space-2)}.xl\:bui-pt-3{padding-top:var(--bui-space-3)}.xl\:bui-pt-4{padding-top:var(--bui-space-4)}.xl\:bui-pt-5{padding-top:var(--bui-space-5)}.xl\:bui-pt-6{padding-top:var(--bui-space-6)}.xl\:bui-pt-7{padding-top:var(--bui-space-7)}.xl\:bui-pt-8{padding-top:var(--bui-space-8)}.xl\:bui-pt-9{padding-top:var(--bui-space-9)}.xl\:bui-pt-10{padding-top:var(--bui-space-10)}.xl\:bui-pt-11{padding-top:var(--bui-space-11)}.xl\:bui-pt-12{padding-top:var(--bui-space-12)}.xl\:bui-pt-13{padding-top:var(--bui-space-13)}.xl\:bui-pt-14{padding-top:var(--bui-space-14)}}.bui-pb{padding-bottom:var(--pb)}.bui-pb-0\.5{padding-bottom:var(--bui-space-0_5)}.bui-pb-1{padding-bottom:var(--bui-space-1)}.bui-pb-1\.5{padding-bottom:var(--bui-space-1_5)}.bui-pb-2{padding-bottom:var(--bui-space-2)}.bui-pb-3{padding-bottom:var(--bui-space-3)}.bui-pb-4{padding-bottom:var(--bui-space-4)}.bui-pb-5{padding-bottom:var(--bui-space-5)}.bui-pb-6{padding-bottom:var(--bui-space-6)}.bui-pb-7{padding-bottom:var(--bui-space-7)}.bui-pb-8{padding-bottom:var(--bui-space-8)}.bui-pb-9{padding-bottom:var(--bui-space-9)}.bui-pb-10{padding-bottom:var(--bui-space-10)}.bui-pb-11{padding-bottom:var(--bui-space-11)}.bui-pb-12{padding-bottom:var(--bui-space-12)}.bui-pb-13{padding-bottom:var(--bui-space-13)}.bui-pb-14{padding-bottom:var(--bui-space-14)}@media (width>=640px){.xs\:bui-pb{padding-bottom:var(--pb-xs)}.xs\:bui-pb-0\.5{padding-bottom:var(--bui-space-0_5)}.xs\:bui-pb-1{padding-bottom:var(--bui-space-1)}.xs\:bui-pb-1\.5{padding-bottom:var(--bui-space-1_5)}.xs\:bui-pb-2{padding-bottom:var(--bui-space-2)}.xs\:bui-pb-3{padding-bottom:var(--bui-space-3)}.xs\:bui-pb-4{padding-bottom:var(--bui-space-4)}.xs\:bui-pb-5{padding-bottom:var(--bui-space-5)}.xs\:bui-pb-6{padding-bottom:var(--bui-space-6)}.xs\:bui-pb-7{padding-bottom:var(--bui-space-7)}.xs\:bui-pb-8{padding-bottom:var(--bui-space-8)}.xs\:bui-pb-9{padding-bottom:var(--bui-space-9)}.xs\:bui-pb-10{padding-bottom:var(--bui-space-10)}.xs\:bui-pb-11{padding-bottom:var(--bui-space-11)}.xs\:bui-pb-12{padding-bottom:var(--bui-space-12)}.xs\:bui-pb-13{padding-bottom:var(--bui-space-13)}.xs\:bui-pb-14{padding-bottom:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-pb{padding-bottom:var(--pb-sm)}.sm\:bui-pb-0\.5{padding-bottom:var(--bui-space-0_5)}.sm\:bui-pb-1{padding-bottom:var(--bui-space-1)}.sm\:bui-pb-1\.5{padding-bottom:var(--bui-space-1_5)}.sm\:bui-pb-2{padding-bottom:var(--bui-space-2)}.sm\:bui-pb-3{padding-bottom:var(--bui-space-3)}.sm\:bui-pb-4{padding-bottom:var(--bui-space-4)}.sm\:bui-pb-5{padding-bottom:var(--bui-space-5)}.sm\:bui-pb-6{padding-bottom:var(--bui-space-6)}.sm\:bui-pb-7{padding-bottom:var(--bui-space-7)}.sm\:bui-pb-8{padding-bottom:var(--bui-space-8)}.sm\:bui-pb-9{padding-bottom:var(--bui-space-9)}.sm\:bui-pb-10{padding-bottom:var(--bui-space-10)}.sm\:bui-pb-11{padding-bottom:var(--bui-space-11)}.sm\:bui-pb-12{padding-bottom:var(--bui-space-12)}.sm\:bui-pb-13{padding-bottom:var(--bui-space-13)}.sm\:bui-pb-14{padding-bottom:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-pb{padding-bottom:var(--pb-md)}.md\:bui-pb-0\.5{padding-bottom:var(--bui-space-0_5)}.md\:bui-pb-1{padding-bottom:var(--bui-space-1)}.md\:bui-pb-1\.5{padding-bottom:var(--bui-space-1_5)}.md\:bui-pb-2{padding-bottom:var(--bui-space-2)}.md\:bui-pb-3{padding-bottom:var(--bui-space-3)}.md\:bui-pb-4{padding-bottom:var(--bui-space-4)}.md\:bui-pb-5{padding-bottom:var(--bui-space-5)}.md\:bui-pb-6{padding-bottom:var(--bui-space-6)}.md\:bui-pb-7{padding-bottom:var(--bui-space-7)}.md\:bui-pb-8{padding-bottom:var(--bui-space-8)}.md\:bui-pb-9{padding-bottom:var(--bui-space-9)}.md\:bui-pb-10{padding-bottom:var(--bui-space-10)}.md\:bui-pb-11{padding-bottom:var(--bui-space-11)}.md\:bui-pb-12{padding-bottom:var(--bui-space-12)}.md\:bui-pb-13{padding-bottom:var(--bui-space-13)}.md\:bui-pb-14{padding-bottom:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-pb{padding-bottom:var(--pb-lg)}.lg\:bui-pb-0\.5{padding-bottom:var(--bui-space-0_5)}.lg\:bui-pb-1{padding-bottom:var(--bui-space-1)}.lg\:bui-pb-1\.5{padding-bottom:var(--bui-space-1_5)}.lg\:bui-pb-2{padding-bottom:var(--bui-space-2)}.lg\:bui-pb-3{padding-bottom:var(--bui-space-3)}.lg\:bui-pb-4{padding-bottom:var(--bui-space-4)}.lg\:bui-pb-5{padding-bottom:var(--bui-space-5)}.lg\:bui-pb-6{padding-bottom:var(--bui-space-6)}.lg\:bui-pb-7{padding-bottom:var(--bui-space-7)}.lg\:bui-pb-8{padding-bottom:var(--bui-space-8)}.lg\:bui-pb-9{padding-bottom:var(--bui-space-9)}.lg\:bui-pb-10{padding-bottom:var(--bui-space-10)}.lg\:bui-pb-11{padding-bottom:var(--bui-space-11)}.lg\:bui-pb-12{padding-bottom:var(--bui-space-12)}.lg\:bui-pb-13{padding-bottom:var(--bui-space-13)}.lg\:bui-pb-14{padding-bottom:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-pb{padding-bottom:var(--pb-xl)}.xl\:bui-pb-0\.5{padding-bottom:var(--bui-space-0_5)}.xl\:bui-pb-1{padding-bottom:var(--bui-space-1)}.xl\:bui-pb-1\.5{padding-bottom:var(--bui-space-1_5)}.xl\:bui-pb-2{padding-bottom:var(--bui-space-2)}.xl\:bui-pb-3{padding-bottom:var(--bui-space-3)}.xl\:bui-pb-4{padding-bottom:var(--bui-space-4)}.xl\:bui-pb-5{padding-bottom:var(--bui-space-5)}.xl\:bui-pb-6{padding-bottom:var(--bui-space-6)}.xl\:bui-pb-7{padding-bottom:var(--bui-space-7)}.xl\:bui-pb-8{padding-bottom:var(--bui-space-8)}.xl\:bui-pb-9{padding-bottom:var(--bui-space-9)}.xl\:bui-pb-10{padding-bottom:var(--bui-space-10)}.xl\:bui-pb-11{padding-bottom:var(--bui-space-11)}.xl\:bui-pb-12{padding-bottom:var(--bui-space-12)}.xl\:bui-pb-13{padding-bottom:var(--bui-space-13)}.xl\:bui-pb-14{padding-bottom:var(--bui-space-14)}}.bui-py{padding-top:var(--py);padding-bottom:var(--py)}.bui-py-0\.5{padding-top:var(--bui-space-0_5);padding-bottom:var(--bui-space-0_5)}.bui-py-1{padding-top:var(--bui-space-1);padding-bottom:var(--bui-space-1)}.bui-py-1\.5{padding-top:var(--bui-space-1_5);padding-bottom:var(--bui-space-1_5)}.bui-py-2{padding-top:var(--bui-space-2);padding-bottom:var(--bui-space-2)}.bui-py-3{padding-top:var(--bui-space-3);padding-bottom:var(--bui-space-3)}.bui-py-4{padding-top:var(--bui-space-4);padding-bottom:var(--bui-space-4)}.bui-py-5{padding-top:var(--bui-space-5);padding-bottom:var(--bui-space-5)}.bui-py-6{padding-top:var(--bui-space-6);padding-bottom:var(--bui-space-6)}.bui-py-7{padding-top:var(--bui-space-7);padding-bottom:var(--bui-space-7)}.bui-py-8{padding-top:var(--bui-space-8);padding-bottom:var(--bui-space-8)}.bui-py-9{padding-top:var(--bui-space-9);padding-bottom:var(--bui-space-9)}.bui-py-10{padding-top:var(--bui-space-10);padding-bottom:var(--bui-space-10)}.bui-py-11{padding-top:var(--bui-space-11);padding-bottom:var(--bui-space-11)}.bui-py-12{padding-top:var(--bui-space-12);padding-bottom:var(--bui-space-12)}.bui-py-13{padding-top:var(--bui-space-13);padding-bottom:var(--bui-space-13)}.bui-py-14{padding-top:var(--bui-space-14);padding-bottom:var(--bui-space-14)}@media (width>=640px){.xs\:bui-py{padding-top:var(--py-xs);padding-bottom:var(--py-xs)}.xs\:bui-py-0\.5{padding-top:var(--bui-space-0_5);padding-bottom:var(--bui-space-0_5)}.xs\:bui-py-1{padding-top:var(--bui-space-1);padding-bottom:var(--bui-space-1)}.xs\:bui-py-1\.5{padding-top:var(--bui-space-1_5);padding-bottom:var(--bui-space-1_5)}.xs\:bui-py-2{padding-top:var(--bui-space-2);padding-bottom:var(--bui-space-2)}.xs\:bui-py-3{padding-top:var(--bui-space-3);padding-bottom:var(--bui-space-3)}.xs\:bui-py-4{padding-top:var(--bui-space-4);padding-bottom:var(--bui-space-4)}.xs\:bui-py-5{padding-top:var(--bui-space-5);padding-bottom:var(--bui-space-5)}.xs\:bui-py-6{padding-top:var(--bui-space-6);padding-bottom:var(--bui-space-6)}.xs\:bui-py-7{padding-top:var(--bui-space-7);padding-bottom:var(--bui-space-7)}.xs\:bui-py-8{padding-top:var(--bui-space-8);padding-bottom:var(--bui-space-8)}.xs\:bui-py-9{padding-top:var(--bui-space-9);padding-bottom:var(--bui-space-9)}.xs\:bui-py-10{padding-top:var(--bui-space-10);padding-bottom:var(--bui-space-10)}.xs\:bui-py-11{padding-top:var(--bui-space-11);padding-bottom:var(--bui-space-11)}.xs\:bui-py-12{padding-top:var(--bui-space-12);padding-bottom:var(--bui-space-12)}.xs\:bui-py-13{padding-top:var(--bui-space-13);padding-bottom:var(--bui-space-13)}.xs\:bui-py-14{padding-top:var(--bui-space-14);padding-bottom:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-py{padding-top:var(--py-sm);padding-bottom:var(--py-sm)}.sm\:bui-py-0\.5{padding-top:var(--bui-space-0_5);padding-bottom:var(--bui-space-0_5)}.sm\:bui-py-1{padding-top:var(--bui-space-1);padding-bottom:var(--bui-space-1)}.sm\:bui-py-1\.5{padding-top:var(--bui-space-1_5);padding-bottom:var(--bui-space-1_5)}.sm\:bui-py-2{padding-top:var(--bui-space-2);padding-bottom:var(--bui-space-2)}.sm\:bui-py-3{padding-top:var(--bui-space-3);padding-bottom:var(--bui-space-3)}.sm\:bui-py-4{padding-top:var(--bui-space-4);padding-bottom:var(--bui-space-4)}.sm\:bui-py-5{padding-top:var(--bui-space-5);padding-bottom:var(--bui-space-5)}.sm\:bui-py-6{padding-top:var(--bui-space-6);padding-bottom:var(--bui-space-6)}.sm\:bui-py-7{padding-top:var(--bui-space-7);padding-bottom:var(--bui-space-7)}.sm\:bui-py-8{padding-top:var(--bui-space-8);padding-bottom:var(--bui-space-8)}.sm\:bui-py-9{padding-top:var(--bui-space-9);padding-bottom:var(--bui-space-9)}.sm\:bui-py-10{padding-top:var(--bui-space-10);padding-bottom:var(--bui-space-10)}.sm\:bui-py-11{padding-top:var(--bui-space-11);padding-bottom:var(--bui-space-11)}.sm\:bui-py-12{padding-top:var(--bui-space-12);padding-bottom:var(--bui-space-12)}.sm\:bui-py-13{padding-top:var(--bui-space-13);padding-bottom:var(--bui-space-13)}.sm\:bui-py-14{padding-top:var(--bui-space-14);padding-bottom:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-py{padding-top:var(--py-md);padding-bottom:var(--py-md)}.md\:bui-py-0\.5{padding-top:var(--bui-space-0_5);padding-bottom:var(--bui-space-0_5)}.md\:bui-py-1{padding-top:var(--bui-space-1);padding-bottom:var(--bui-space-1)}.md\:bui-py-1\.5{padding-top:var(--bui-space-1_5);padding-bottom:var(--bui-space-1_5)}.md\:bui-py-2{padding-top:var(--bui-space-2);padding-bottom:var(--bui-space-2)}.md\:bui-py-3{padding-top:var(--bui-space-3);padding-bottom:var(--bui-space-3)}.md\:bui-py-4{padding-top:var(--bui-space-4);padding-bottom:var(--bui-space-4)}.md\:bui-py-5{padding-top:var(--bui-space-5);padding-bottom:var(--bui-space-5)}.md\:bui-py-6{padding-top:var(--bui-space-6);padding-bottom:var(--bui-space-6)}.md\:bui-py-7{padding-top:var(--bui-space-7);padding-bottom:var(--bui-space-7)}.md\:bui-py-8{padding-top:var(--bui-space-8);padding-bottom:var(--bui-space-8)}.md\:bui-py-9{padding-top:var(--bui-space-9);padding-bottom:var(--bui-space-9)}.md\:bui-py-10{padding-top:var(--bui-space-10);padding-bottom:var(--bui-space-10)}.md\:bui-py-11{padding-top:var(--bui-space-11);padding-bottom:var(--bui-space-11)}.md\:bui-py-12{padding-top:var(--bui-space-12);padding-bottom:var(--bui-space-12)}.md\:bui-py-13{padding-top:var(--bui-space-13);padding-bottom:var(--bui-space-13)}.md\:bui-py-14{padding-top:var(--bui-space-14);padding-bottom:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-py{padding-top:var(--py-lg);padding-bottom:var(--py-lg)}.lg\:bui-py-0\.5{padding-top:var(--bui-space-0_5);padding-bottom:var(--bui-space-0_5)}.lg\:bui-py-1{padding-top:var(--bui-space-1);padding-bottom:var(--bui-space-1)}.lg\:bui-py-1\.5{padding-top:var(--bui-space-1_5);padding-bottom:var(--bui-space-1_5)}.lg\:bui-py-2{padding-top:var(--bui-space-2);padding-bottom:var(--bui-space-2)}.lg\:bui-py-3{padding-top:var(--bui-space-3);padding-bottom:var(--bui-space-3)}.lg\:bui-py-4{padding-top:var(--bui-space-4);padding-bottom:var(--bui-space-4)}.lg\:bui-py-5{padding-top:var(--bui-space-5);padding-bottom:var(--bui-space-5)}.lg\:bui-py-6{padding-top:var(--bui-space-6);padding-bottom:var(--bui-space-6)}.lg\:bui-py-7{padding-top:var(--bui-space-7);padding-bottom:var(--bui-space-7)}.lg\:bui-py-8{padding-top:var(--bui-space-8);padding-bottom:var(--bui-space-8)}.lg\:bui-py-9{padding-top:var(--bui-space-9);padding-bottom:var(--bui-space-9)}.lg\:bui-py-10{padding-top:var(--bui-space-10);padding-bottom:var(--bui-space-10)}.lg\:bui-py-11{padding-top:var(--bui-space-11);padding-bottom:var(--bui-space-11)}.lg\:bui-py-12{padding-top:var(--bui-space-12);padding-bottom:var(--bui-space-12)}.lg\:bui-py-13{padding-top:var(--bui-space-13);padding-bottom:var(--bui-space-13)}.lg\:bui-py-14{padding-top:var(--bui-space-14);padding-bottom:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-py{padding-top:var(--py-xl);padding-bottom:var(--py-xl)}.xl\:bui-py-0\.5{padding-top:var(--bui-space-0_5);padding-bottom:var(--bui-space-0_5)}.xl\:bui-py-1{padding-top:var(--bui-space-1);padding-bottom:var(--bui-space-1)}.xl\:bui-py-1\.5{padding-top:var(--bui-space-1_5);padding-bottom:var(--bui-space-1_5)}.xl\:bui-py-2{padding-top:var(--bui-space-2);padding-bottom:var(--bui-space-2)}.xl\:bui-py-3{padding-top:var(--bui-space-3);padding-bottom:var(--bui-space-3)}.xl\:bui-py-4{padding-top:var(--bui-space-4);padding-bottom:var(--bui-space-4)}.xl\:bui-py-5{padding-top:var(--bui-space-5);padding-bottom:var(--bui-space-5)}.xl\:bui-py-6{padding-top:var(--bui-space-6);padding-bottom:var(--bui-space-6)}.xl\:bui-py-7{padding-top:var(--bui-space-7);padding-bottom:var(--bui-space-7)}.xl\:bui-py-8{padding-top:var(--bui-space-8);padding-bottom:var(--bui-space-8)}.xl\:bui-py-9{padding-top:var(--bui-space-9);padding-bottom:var(--bui-space-9)}.xl\:bui-py-10{padding-top:var(--bui-space-10);padding-bottom:var(--bui-space-10)}.xl\:bui-py-11{padding-top:var(--bui-space-11);padding-bottom:var(--bui-space-11)}.xl\:bui-py-12{padding-top:var(--bui-space-12);padding-bottom:var(--bui-space-12)}.xl\:bui-py-13{padding-top:var(--bui-space-13);padding-bottom:var(--bui-space-13)}.xl\:bui-py-14{padding-top:var(--bui-space-14);padding-bottom:var(--bui-space-14)}}.bui-px{padding-left:var(--px);padding-right:var(--px)}.bui-px-0\.5{padding-left:var(--bui-space-0_5);padding-right:var(--bui-space-0_5)}.bui-px-1{padding-left:var(--bui-space-1);padding-right:var(--bui-space-1)}.bui-px-1\.5{padding-left:var(--bui-space-1_5);padding-right:var(--bui-space-1_5)}.bui-px-2{padding-left:var(--bui-space-2);padding-right:var(--bui-space-2)}.bui-px-3{padding-left:var(--bui-space-3);padding-right:var(--bui-space-3)}.bui-px-4{padding-left:var(--bui-space-4);padding-right:var(--bui-space-4)}.bui-px-5{padding-left:var(--bui-space-5);padding-right:var(--bui-space-5)}.bui-px-6{padding-left:var(--bui-space-6);padding-right:var(--bui-space-6)}.bui-px-7{padding-left:var(--bui-space-7);padding-right:var(--bui-space-7)}.bui-px-8{padding-left:var(--bui-space-8);padding-right:var(--bui-space-8)}.bui-px-9{padding-left:var(--bui-space-9);padding-right:var(--bui-space-9)}.bui-px-10{padding-left:var(--bui-space-10);padding-right:var(--bui-space-10)}.bui-px-11{padding-left:var(--bui-space-11);padding-right:var(--bui-space-11)}.bui-px-12{padding-left:var(--bui-space-12);padding-right:var(--bui-space-12)}.bui-px-13{padding-left:var(--bui-space-13);padding-right:var(--bui-space-13)}.bui-px-14{padding-left:var(--bui-space-14);padding-right:var(--bui-space-14)}@media (width>=640px){.xs\:bui-px{padding-left:var(--px-xs);padding-right:var(--px-xs)}.xs\:bui-px-0\.5{padding-left:var(--bui-space-0_5);padding-right:var(--bui-space-0_5)}.xs\:bui-px-1{padding-left:var(--bui-space-1);padding-right:var(--bui-space-1)}.xs\:bui-px-1\.5{padding-left:var(--bui-space-1_5);padding-right:var(--bui-space-1_5)}.xs\:bui-px-2{padding-left:var(--bui-space-2);padding-right:var(--bui-space-2)}.xs\:bui-px-3{padding-left:var(--bui-space-3);padding-right:var(--bui-space-3)}.xs\:bui-px-4{padding-left:var(--bui-space-4);padding-right:var(--bui-space-4)}.xs\:bui-px-5{padding-left:var(--bui-space-5);padding-right:var(--bui-space-5)}.xs\:bui-px-6{padding-left:var(--bui-space-6);padding-right:var(--bui-space-6)}.xs\:bui-px-7{padding-left:var(--bui-space-7);padding-right:var(--bui-space-7)}.xs\:bui-px-8{padding-left:var(--bui-space-8);padding-right:var(--bui-space-8)}.xs\:bui-px-9{padding-left:var(--bui-space-9);padding-right:var(--bui-space-9)}.xs\:bui-px-10{padding-left:var(--bui-space-10);padding-right:var(--bui-space-10)}.xs\:bui-px-11{padding-left:var(--bui-space-11);padding-right:var(--bui-space-11)}.xs\:bui-px-12{padding-left:var(--bui-space-12);padding-right:var(--bui-space-12)}.xs\:bui-px-13{padding-left:var(--bui-space-13);padding-right:var(--bui-space-13)}.xs\:bui-px-14{padding-left:var(--bui-space-14);padding-right:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-px{padding-left:var(--px-sm);padding-right:var(--px-sm)}.sm\:bui-px-0\.5{padding-left:var(--bui-space-0_5);padding-right:var(--bui-space-0_5)}.sm\:bui-px-1{padding-left:var(--bui-space-1);padding-right:var(--bui-space-1)}.sm\:bui-px-1\.5{padding-left:var(--bui-space-1_5);padding-right:var(--bui-space-1_5)}.sm\:bui-px-2{padding-left:var(--bui-space-2);padding-right:var(--bui-space-2)}.sm\:bui-px-3{padding-left:var(--bui-space-3);padding-right:var(--bui-space-3)}.sm\:bui-px-4{padding-left:var(--bui-space-4);padding-right:var(--bui-space-4)}.sm\:bui-px-5{padding-left:var(--bui-space-5);padding-right:var(--bui-space-5)}.sm\:bui-px-6{padding-left:var(--bui-space-6);padding-right:var(--bui-space-6)}.sm\:bui-px-7{padding-left:var(--bui-space-7);padding-right:var(--bui-space-7)}.sm\:bui-px-8{padding-left:var(--bui-space-8);padding-right:var(--bui-space-8)}.sm\:bui-px-9{padding-left:var(--bui-space-9);padding-right:var(--bui-space-9)}.sm\:bui-px-10{padding-left:var(--bui-space-10);padding-right:var(--bui-space-10)}.sm\:bui-px-11{padding-left:var(--bui-space-11);padding-right:var(--bui-space-11)}.sm\:bui-px-12{padding-left:var(--bui-space-12);padding-right:var(--bui-space-12)}.sm\:bui-px-13{padding-left:var(--bui-space-13);padding-right:var(--bui-space-13)}.sm\:bui-px-14{padding-left:var(--bui-space-14);padding-right:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-px{padding-left:var(--px-md);padding-right:var(--px-md)}.md\:bui-px-0\.5{padding-left:var(--bui-space-0_5);padding-right:var(--bui-space-0_5)}.md\:bui-px-1{padding-left:var(--bui-space-1);padding-right:var(--bui-space-1)}.md\:bui-px-1\.5{padding-left:var(--bui-space-1_5);padding-right:var(--bui-space-1_5)}.md\:bui-px-2{padding-left:var(--bui-space-2);padding-right:var(--bui-space-2)}.md\:bui-px-3{padding-left:var(--bui-space-3);padding-right:var(--bui-space-3)}.md\:bui-px-4{padding-left:var(--bui-space-4);padding-right:var(--bui-space-4)}.md\:bui-px-5{padding-left:var(--bui-space-5);padding-right:var(--bui-space-5)}.md\:bui-px-6{padding-left:var(--bui-space-6);padding-right:var(--bui-space-6)}.md\:bui-px-7{padding-left:var(--bui-space-7);padding-right:var(--bui-space-7)}.md\:bui-px-8{padding-left:var(--bui-space-8);padding-right:var(--bui-space-8)}.md\:bui-px-9{padding-left:var(--bui-space-9);padding-right:var(--bui-space-9)}.md\:bui-px-10{padding-left:var(--bui-space-10);padding-right:var(--bui-space-10)}.md\:bui-px-11{padding-left:var(--bui-space-11);padding-right:var(--bui-space-11)}.md\:bui-px-12{padding-left:var(--bui-space-12);padding-right:var(--bui-space-12)}.md\:bui-px-13{padding-left:var(--bui-space-13);padding-right:var(--bui-space-13)}.md\:bui-px-14{padding-left:var(--bui-space-14);padding-right:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-px{padding-left:var(--px-lg);padding-right:var(--px-lg)}.lg\:bui-px-0\.5{padding-left:var(--bui-space-0_5);padding-right:var(--bui-space-0_5)}.lg\:bui-px-1{padding-left:var(--bui-space-1);padding-right:var(--bui-space-1)}.lg\:bui-px-1\.5{padding-left:var(--bui-space-1_5);padding-right:var(--bui-space-1_5)}.lg\:bui-px-2{padding-left:var(--bui-space-2);padding-right:var(--bui-space-2)}.lg\:bui-px-3{padding-left:var(--bui-space-3);padding-right:var(--bui-space-3)}.lg\:bui-px-4{padding-left:var(--bui-space-4);padding-right:var(--bui-space-4)}.lg\:bui-px-5{padding-left:var(--bui-space-5);padding-right:var(--bui-space-5)}.lg\:bui-px-6{padding-left:var(--bui-space-6);padding-right:var(--bui-space-6)}.lg\:bui-px-7{padding-left:var(--bui-space-7);padding-right:var(--bui-space-7)}.lg\:bui-px-8{padding-left:var(--bui-space-8);padding-right:var(--bui-space-8)}.lg\:bui-px-9{padding-left:var(--bui-space-9);padding-right:var(--bui-space-9)}.lg\:bui-px-10{padding-left:var(--bui-space-10);padding-right:var(--bui-space-10)}.lg\:bui-px-11{padding-left:var(--bui-space-11);padding-right:var(--bui-space-11)}.lg\:bui-px-12{padding-left:var(--bui-space-12);padding-right:var(--bui-space-12)}.lg\:bui-px-13{padding-left:var(--bui-space-13);padding-right:var(--bui-space-13)}.lg\:bui-px-14{padding-left:var(--bui-space-14);padding-right:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-px{padding-left:var(--px-xl);padding-right:var(--px-xl)}.xl\:bui-px-0\.5{padding-left:var(--bui-space-0_5);padding-right:var(--bui-space-0_5)}.xl\:bui-px-1{padding-left:var(--bui-space-1);padding-right:var(--bui-space-1)}.xl\:bui-px-1\.5{padding-left:var(--bui-space-1_5);padding-right:var(--bui-space-1_5)}.xl\:bui-px-2{padding-left:var(--bui-space-2);padding-right:var(--bui-space-2)}.xl\:bui-px-3{padding-left:var(--bui-space-3);padding-right:var(--bui-space-3)}.xl\:bui-px-4{padding-left:var(--bui-space-4);padding-right:var(--bui-space-4)}.xl\:bui-px-5{padding-left:var(--bui-space-5);padding-right:var(--bui-space-5)}.xl\:bui-px-6{padding-left:var(--bui-space-6);padding-right:var(--bui-space-6)}.xl\:bui-px-7{padding-left:var(--bui-space-7);padding-right:var(--bui-space-7)}.xl\:bui-px-8{padding-left:var(--bui-space-8);padding-right:var(--bui-space-8)}.xl\:bui-px-9{padding-left:var(--bui-space-9);padding-right:var(--bui-space-9)}.xl\:bui-px-10{padding-left:var(--bui-space-10);padding-right:var(--bui-space-10)}.xl\:bui-px-11{padding-left:var(--bui-space-11);padding-right:var(--bui-space-11)}.xl\:bui-px-12{padding-left:var(--bui-space-12);padding-right:var(--bui-space-12)}.xl\:bui-px-13{padding-left:var(--bui-space-13);padding-right:var(--bui-space-13)}.xl\:bui-px-14{padding-left:var(--bui-space-14);padding-right:var(--bui-space-14)}}.bui-m{margin:var(--m)}.bui-m-0\.5{margin:var(--bui-space-0_5)}.bui-m-1{margin:var(--bui-space-1)}.bui-m-1\.5{margin:var(--bui-space-1_5)}.bui-m-2{margin:var(--bui-space-2)}.bui-m-3{margin:var(--bui-space-3)}.bui-m-4{margin:var(--bui-space-4)}.bui-m-5{margin:var(--bui-space-5)}.bui-m-6{margin:var(--bui-space-6)}.bui-m-7{margin:var(--bui-space-7)}.bui-m-8{margin:var(--bui-space-8)}.bui-m-9{margin:var(--bui-space-9)}.bui-m-10{margin:var(--bui-space-10)}.bui-m-11{margin:var(--bui-space-11)}.bui-m-12{margin:var(--bui-space-12)}.bui-m-13{margin:var(--bui-space-13)}.bui-m-14{margin:var(--bui-space-14)}@media (width>=640px){.xs\:bui-m{margin:var(--p-xs)}.xs\:bui-m-0\.5{margin:var(--bui-space-0_5)}.xs\:bui-m-1{margin:var(--bui-space-1)}.xs\:bui-m-1\.5{margin:var(--bui-space-1_5)}.xs\:bui-m-2{margin:var(--bui-space-2)}.xs\:bui-m-3{margin:var(--bui-space-3)}.xs\:bui-m-4{margin:var(--bui-space-4)}.xs\:bui-m-5{margin:var(--bui-space-5)}.xs\:bui-m-6{margin:var(--bui-space-6)}.xs\:bui-m-7{margin:var(--bui-space-7)}.xs\:bui-m-8{margin:var(--bui-space-8)}.xs\:bui-m-9{margin:var(--bui-space-9)}.xs\:bui-m-10{margin:var(--bui-space-10)}.xs\:bui-m-11{margin:var(--bui-space-11)}.xs\:bui-m-12{margin:var(--bui-space-12)}.xs\:bui-m-13{margin:var(--bui-space-13)}.xs\:bui-m-14{margin:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-m{margin:var(--p-sm)}.sm\:bui-m-0\.5{margin:var(--bui-space-0_5)}.sm\:bui-m-1{margin:var(--bui-space-1)}.sm\:bui-m-1\.5{margin:var(--bui-space-1_5)}.sm\:bui-m-2{margin:var(--bui-space-2)}.sm\:bui-m-3{margin:var(--bui-space-3)}.sm\:bui-m-4{margin:var(--bui-space-4)}.sm\:bui-m-5{margin:var(--bui-space-5)}.sm\:bui-m-6{margin:var(--bui-space-6)}.sm\:bui-m-7{margin:var(--bui-space-7)}.sm\:bui-m-8{margin:var(--bui-space-8)}.sm\:bui-m-9{margin:var(--bui-space-9)}.sm\:bui-m-10{margin:var(--bui-space-10)}.sm\:bui-m-11{margin:var(--bui-space-11)}.sm\:bui-m-12{margin:var(--bui-space-12)}.sm\:bui-m-13{margin:var(--bui-space-13)}.sm\:bui-m-14{margin:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-m{margin:var(--p-md)}.md\:bui-m-0\.5{margin:var(--bui-space-0_5)}.md\:bui-m-1{margin:var(--bui-space-1)}.md\:bui-m-1\.5{margin:var(--bui-space-1_5)}.md\:bui-m-2{margin:var(--bui-space-2)}.md\:bui-m-3{margin:var(--bui-space-3)}.md\:bui-m-4{margin:var(--bui-space-4)}.md\:bui-m-5{margin:var(--bui-space-5)}.md\:bui-m-6{margin:var(--bui-space-6)}.md\:bui-m-7{margin:var(--bui-space-7)}.md\:bui-m-8{margin:var(--bui-space-8)}.md\:bui-m-9{margin:var(--bui-space-9)}.md\:bui-m-10{margin:var(--bui-space-10)}.md\:bui-m-11{margin:var(--bui-space-11)}.md\:bui-m-12{margin:var(--bui-space-12)}.md\:bui-m-13{margin:var(--bui-space-13)}.md\:bui-m-14{margin:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-m{margin:var(--p-lg)}.lg\:bui-m-0\.5{margin:var(--bui-space-0_5)}.lg\:bui-m-1{margin:var(--bui-space-1)}.lg\:bui-m-1\.5{margin:var(--bui-space-1_5)}.lg\:bui-m-2{margin:var(--bui-space-2)}.lg\:bui-m-3{margin:var(--bui-space-3)}.lg\:bui-m-4{margin:var(--bui-space-4)}.lg\:bui-m-5{margin:var(--bui-space-5)}.lg\:bui-m-6{margin:var(--bui-space-6)}.lg\:bui-m-7{margin:var(--bui-space-7)}.lg\:bui-m-8{margin:var(--bui-space-8)}.lg\:bui-m-9{margin:var(--bui-space-9)}.lg\:bui-m-10{margin:var(--bui-space-10)}.lg\:bui-m-11{margin:var(--bui-space-11)}.lg\:bui-m-12{margin:var(--bui-space-12)}.lg\:bui-m-13{margin:var(--bui-space-13)}.lg\:bui-m-14{margin:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-m{margin:var(--p-xl)}.xl\:bui-m-0\.5{margin:var(--bui-space-0_5)}.xl\:bui-m-1{margin:var(--bui-space-1)}.xl\:bui-m-1\.5{margin:var(--bui-space-1_5)}.xl\:bui-m-2{margin:var(--bui-space-2)}.xl\:bui-m-3{margin:var(--bui-space-3)}.xl\:bui-m-4{margin:var(--bui-space-4)}.xl\:bui-m-5{margin:var(--bui-space-5)}.xl\:bui-m-6{margin:var(--bui-space-6)}.xl\:bui-m-7{margin:var(--bui-space-7)}.xl\:bui-m-8{margin:var(--bui-space-8)}.xl\:bui-m-9{margin:var(--bui-space-9)}.xl\:bui-m-10{margin:var(--bui-space-10)}.xl\:bui-m-11{margin:var(--bui-space-11)}.xl\:bui-m-12{margin:var(--bui-space-12)}.xl\:bui-m-13{margin:var(--bui-space-13)}.xl\:bui-m-14{margin:var(--bui-space-14)}}.bui-ml{margin-left:var(--ml)}.bui-ml-0\.5{margin-left:var(--bui-space-0_5)}.bui-ml-1{margin-left:var(--bui-space-1)}.bui-ml-1\.5{margin-left:var(--bui-space-1_5)}.bui-ml-2{margin-left:var(--bui-space-2)}.bui-ml-3{margin-left:var(--bui-space-3)}.bui-ml-4{margin-left:var(--bui-space-4)}.bui-ml-5{margin-left:var(--bui-space-5)}.bui-ml-6{margin-left:var(--bui-space-6)}.bui-ml-7{margin-left:var(--bui-space-7)}.bui-ml-8{margin-left:var(--bui-space-8)}.bui-ml-9{margin-left:var(--bui-space-9)}.bui-ml-10{margin-left:var(--bui-space-10)}.bui-ml-11{margin-left:var(--bui-space-11)}.bui-ml-12{margin-left:var(--bui-space-12)}.bui-ml-13{margin-left:var(--bui-space-13)}.bui-ml-14{margin-left:var(--bui-space-14)}@media (width>=640px){.xs\:bui-ml{margin-left:var(--ml-xs)}.xs\:bui-ml-0\.5{margin-left:var(--bui-space-0_5)}.xs\:bui-ml-1{margin-left:var(--bui-space-1)}.xs\:bui-ml-1\.5{margin-left:var(--bui-space-1_5)}.xs\:bui-ml-2{margin-left:var(--bui-space-2)}.xs\:bui-ml-3{margin-left:var(--bui-space-3)}.xs\:bui-ml-4{margin-left:var(--bui-space-4)}.xs\:bui-ml-5{margin-left:var(--bui-space-5)}.xs\:bui-ml-6{margin-left:var(--bui-space-6)}.xs\:bui-ml-7{margin-left:var(--bui-space-7)}.xs\:bui-ml-8{margin-left:var(--bui-space-8)}.xs\:bui-ml-9{margin-left:var(--bui-space-9)}.xs\:bui-ml-10{margin-left:var(--bui-space-10)}.xs\:bui-ml-11{margin-left:var(--bui-space-11)}.xs\:bui-ml-12{margin-left:var(--bui-space-12)}.xs\:bui-ml-13{margin-left:var(--bui-space-13)}.xs\:bui-ml-14{margin-left:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-ml{margin-left:var(--ml-sm)}.sm\:bui-ml-0\.5{margin-left:var(--bui-space-0_5)}.sm\:bui-ml-1{margin-left:var(--bui-space-1)}.sm\:bui-ml-1\.5{margin-left:var(--bui-space-1_5)}.sm\:bui-ml-2{margin-left:var(--bui-space-2)}.sm\:bui-ml-3{margin-left:var(--bui-space-3)}.sm\:bui-ml-4{margin-left:var(--bui-space-4)}.sm\:bui-ml-5{margin-left:var(--bui-space-5)}.sm\:bui-ml-6{margin-left:var(--bui-space-6)}.sm\:bui-ml-7{margin-left:var(--bui-space-7)}.sm\:bui-ml-8{margin-left:var(--bui-space-8)}.sm\:bui-ml-9{margin-left:var(--bui-space-9)}.sm\:bui-ml-10{margin-left:var(--bui-space-10)}.sm\:bui-ml-11{margin-left:var(--bui-space-11)}.sm\:bui-ml-12{margin-left:var(--bui-space-12)}.sm\:bui-ml-13{margin-left:var(--bui-space-13)}.sm\:bui-ml-14{margin-left:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-ml{margin-left:var(--ml-md)}.md\:bui-ml-0\.5{margin-left:var(--bui-space-0_5)}.md\:bui-ml-1{margin-left:var(--bui-space-1)}.md\:bui-ml-1\.5{margin-left:var(--bui-space-1_5)}.md\:bui-ml-2{margin-left:var(--bui-space-2)}.md\:bui-ml-3{margin-left:var(--bui-space-3)}.md\:bui-ml-4{margin-left:var(--bui-space-4)}.md\:bui-ml-5{margin-left:var(--bui-space-5)}.md\:bui-ml-6{margin-left:var(--bui-space-6)}.md\:bui-ml-7{margin-left:var(--bui-space-7)}.md\:bui-ml-8{margin-left:var(--bui-space-8)}.md\:bui-ml-9{margin-left:var(--bui-space-9)}.md\:bui-ml-10{margin-left:var(--bui-space-10)}.md\:bui-ml-11{margin-left:var(--bui-space-11)}.md\:bui-ml-12{margin-left:var(--bui-space-12)}.md\:bui-ml-13{margin-left:var(--bui-space-13)}.md\:bui-ml-14{margin-left:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-ml{margin-left:var(--ml-lg)}.lg\:bui-ml-0\.5{margin-left:var(--bui-space-0_5)}.lg\:bui-ml-1{margin-left:var(--bui-space-1)}.lg\:bui-ml-1\.5{margin-left:var(--bui-space-1_5)}.lg\:bui-ml-2{margin-left:var(--bui-space-2)}.lg\:bui-ml-3{margin-left:var(--bui-space-3)}.lg\:bui-ml-4{margin-left:var(--bui-space-4)}.lg\:bui-ml-5{margin-left:var(--bui-space-5)}.lg\:bui-ml-6{margin-left:var(--bui-space-6)}.lg\:bui-ml-7{margin-left:var(--bui-space-7)}.lg\:bui-ml-8{margin-left:var(--bui-space-8)}.lg\:bui-ml-9{margin-left:var(--bui-space-9)}.lg\:bui-ml-10{margin-left:var(--bui-space-10)}.lg\:bui-ml-11{margin-left:var(--bui-space-11)}.lg\:bui-ml-12{margin-left:var(--bui-space-12)}.lg\:bui-ml-13{margin-left:var(--bui-space-13)}.lg\:bui-ml-14{margin-left:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-ml{margin-left:var(--ml-xl)}.xl\:bui-ml-0\.5{margin-left:var(--bui-space-0_5)}.xl\:bui-ml-1{margin-left:var(--bui-space-1)}.xl\:bui-ml-1\.5{margin-left:var(--bui-space-1_5)}.xl\:bui-ml-2{margin-left:var(--bui-space-2)}.xl\:bui-ml-3{margin-left:var(--bui-space-3)}.xl\:bui-ml-4{margin-left:var(--bui-space-4)}.xl\:bui-ml-5{margin-left:var(--bui-space-5)}.xl\:bui-ml-6{margin-left:var(--bui-space-6)}.xl\:bui-ml-7{margin-left:var(--bui-space-7)}.xl\:bui-ml-8{margin-left:var(--bui-space-8)}.xl\:bui-ml-9{margin-left:var(--bui-space-9)}.xl\:bui-ml-10{margin-left:var(--bui-space-10)}.xl\:bui-ml-11{margin-left:var(--bui-space-11)}.xl\:bui-ml-12{margin-left:var(--bui-space-12)}.xl\:bui-ml-13{margin-left:var(--bui-space-13)}.xl\:bui-ml-14{margin-left:var(--bui-space-14)}}.bui-mr{margin-right:var(--mr)}.bui-mr-0\.5{margin-right:var(--bui-space-0_5)}.bui-mr-1{margin-right:var(--bui-space-1)}.bui-mr-1\.5{margin-right:var(--bui-space-1_5)}.bui-mr-2{margin-right:var(--bui-space-2)}.bui-mr-3{margin-right:var(--bui-space-3)}.bui-mr-4{margin-right:var(--bui-space-4)}.bui-mr-5{margin-right:var(--bui-space-5)}.bui-mr-6{margin-right:var(--bui-space-6)}.bui-mr-7{margin-right:var(--bui-space-7)}.bui-mr-8{margin-right:var(--bui-space-8)}.bui-mr-9{margin-right:var(--bui-space-9)}.bui-mr-10{margin-right:var(--bui-space-10)}.bui-mr-11{margin-right:var(--bui-space-11)}.bui-mr-12{margin-right:var(--bui-space-12)}.bui-mr-13{margin-right:var(--bui-space-13)}.bui-mr-14{margin-right:var(--bui-space-14)}@media (width>=640px){.xs\:bui-mr{margin-right:var(--mr-xs)}.xs\:bui-mr-0\.5{margin-right:var(--bui-space-0_5)}.xs\:bui-mr-1{margin-right:var(--bui-space-1)}.xs\:bui-mr-1\.5{margin-right:var(--bui-space-1_5)}.xs\:bui-mr-2{margin-right:var(--bui-space-2)}.xs\:bui-mr-3{margin-right:var(--bui-space-3)}.xs\:bui-mr-4{margin-right:var(--bui-space-4)}.xs\:bui-mr-5{margin-right:var(--bui-space-5)}.xs\:bui-mr-6{margin-right:var(--bui-space-6)}.xs\:bui-mr-7{margin-right:var(--bui-space-7)}.xs\:bui-mr-8{margin-right:var(--bui-space-8)}.xs\:bui-mr-9{margin-right:var(--bui-space-9)}.xs\:bui-mr-10{margin-right:var(--bui-space-10)}.xs\:bui-mr-11{margin-right:var(--bui-space-11)}.xs\:bui-mr-12{margin-right:var(--bui-space-12)}.xs\:bui-mr-13{margin-right:var(--bui-space-13)}.xs\:bui-mr-14{margin-right:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-mr{margin-right:var(--mr-sm)}.sm\:bui-mr-0\.5{margin-right:var(--bui-space-0_5)}.sm\:bui-mr-1{margin-right:var(--bui-space-1)}.sm\:bui-mr-1\.5{margin-right:var(--bui-space-1_5)}.sm\:bui-mr-2{margin-right:var(--bui-space-2)}.sm\:bui-mr-3{margin-right:var(--bui-space-3)}.sm\:bui-mr-4{margin-right:var(--bui-space-4)}.sm\:bui-mr-5{margin-right:var(--bui-space-5)}.sm\:bui-mr-6{margin-right:var(--bui-space-6)}.sm\:bui-mr-7{margin-right:var(--bui-space-7)}.sm\:bui-mr-8{margin-right:var(--bui-space-8)}.sm\:bui-mr-9{margin-right:var(--bui-space-9)}.sm\:bui-mr-10{margin-right:var(--bui-space-10)}.sm\:bui-mr-11{margin-right:var(--bui-space-11)}.sm\:bui-mr-12{margin-right:var(--bui-space-12)}.sm\:bui-mr-13{margin-right:var(--bui-space-13)}.sm\:bui-mr-14{margin-right:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-mr{margin-right:var(--mr-md)}.md\:bui-mr-0\.5{margin-right:var(--bui-space-0_5)}.md\:bui-mr-1{margin-right:var(--bui-space-1)}.md\:bui-mr-1\.5{margin-right:var(--bui-space-1_5)}.md\:bui-mr-2{margin-right:var(--bui-space-2)}.md\:bui-mr-3{margin-right:var(--bui-space-3)}.md\:bui-mr-4{margin-right:var(--bui-space-4)}.md\:bui-mr-5{margin-right:var(--bui-space-5)}.md\:bui-mr-6{margin-right:var(--bui-space-6)}.md\:bui-mr-7{margin-right:var(--bui-space-7)}.md\:bui-mr-8{margin-right:var(--bui-space-8)}.md\:bui-mr-9{margin-right:var(--bui-space-9)}.md\:bui-mr-10{margin-right:var(--bui-space-10)}.md\:bui-mr-11{margin-right:var(--bui-space-11)}.md\:bui-mr-12{margin-right:var(--bui-space-12)}.md\:bui-mr-13{margin-right:var(--bui-space-13)}.md\:bui-mr-14{margin-right:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-mr{margin-right:var(--mr-lg)}.lg\:bui-mr-0\.5{margin-right:var(--bui-space-0_5)}.lg\:bui-mr-1{margin-right:var(--bui-space-1)}.lg\:bui-mr-1\.5{margin-right:var(--bui-space-1_5)}.lg\:bui-mr-2{margin-right:var(--bui-space-2)}.lg\:bui-mr-3{margin-right:var(--bui-space-3)}.lg\:bui-mr-4{margin-right:var(--bui-space-4)}.lg\:bui-mr-5{margin-right:var(--bui-space-5)}.lg\:bui-mr-6{margin-right:var(--bui-space-6)}.lg\:bui-mr-7{margin-right:var(--bui-space-7)}.lg\:bui-mr-8{margin-right:var(--bui-space-8)}.lg\:bui-mr-9{margin-right:var(--bui-space-9)}.lg\:bui-mr-10{margin-right:var(--bui-space-10)}.lg\:bui-mr-11{margin-right:var(--bui-space-11)}.lg\:bui-mr-12{margin-right:var(--bui-space-12)}.lg\:bui-mr-13{margin-right:var(--bui-space-13)}.lg\:bui-mr-14{margin-right:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-mr{margin-right:var(--mr-xl)}.xl\:bui-mr-0\.5{margin-right:var(--bui-space-0_5)}.xl\:bui-mr-1{margin-right:var(--bui-space-1)}.xl\:bui-mr-1\.5{margin-right:var(--bui-space-1_5)}.xl\:bui-mr-2{margin-right:var(--bui-space-2)}.xl\:bui-mr-3{margin-right:var(--bui-space-3)}.xl\:bui-mr-4{margin-right:var(--bui-space-4)}.xl\:bui-mr-5{margin-right:var(--bui-space-5)}.xl\:bui-mr-6{margin-right:var(--bui-space-6)}.xl\:bui-mr-7{margin-right:var(--bui-space-7)}.xl\:bui-mr-8{margin-right:var(--bui-space-8)}.xl\:bui-mr-9{margin-right:var(--bui-space-9)}.xl\:bui-mr-10{margin-right:var(--bui-space-10)}.xl\:bui-mr-11{margin-right:var(--bui-space-11)}.xl\:bui-mr-12{margin-right:var(--bui-space-12)}.xl\:bui-mr-13{margin-right:var(--bui-space-13)}.xl\:bui-mr-14{margin-right:var(--bui-space-14)}}.bui-mt{margin-top:var(--mt)}.bui-mt-0\.5{margin-top:var(--bui-space-0_5)}.bui-mt-1{margin-top:var(--bui-space-1)}.bui-mt-1\.5{margin-top:var(--bui-space-1_5)}.bui-mt-2{margin-top:var(--bui-space-2)}.bui-mt-3{margin-top:var(--bui-space-3)}.bui-mt-4{margin-top:var(--bui-space-4)}.bui-mt-5{margin-top:var(--bui-space-5)}.bui-mt-6{margin-top:var(--bui-space-6)}.bui-mt-7{margin-top:var(--bui-space-7)}.bui-mt-8{margin-top:var(--bui-space-8)}.bui-mt-9{margin-top:var(--bui-space-9)}.bui-mt-10{margin-top:var(--bui-space-10)}.bui-mt-11{margin-top:var(--bui-space-11)}.bui-mt-12{margin-top:var(--bui-space-12)}.bui-mt-13{margin-top:var(--bui-space-13)}.bui-mt-14{margin-top:var(--bui-space-14)}@media (width>=640px){.xs\:bui-mt{margin-top:var(--mt-xs)}.xs\:bui-mt-0\.5{margin-top:var(--bui-space-0_5)}.xs\:bui-mt-1{margin-top:var(--bui-space-1)}.xs\:bui-mt-1\.5{margin-top:var(--bui-space-1_5)}.xs\:bui-mt-2{margin-top:var(--bui-space-2)}.xs\:bui-mt-3{margin-top:var(--bui-space-3)}.xs\:bui-mt-4{margin-top:var(--bui-space-4)}.xs\:bui-mt-5{margin-top:var(--bui-space-5)}.xs\:bui-mt-6{margin-top:var(--bui-space-6)}.xs\:bui-mt-7{margin-top:var(--bui-space-7)}.xs\:bui-mt-8{margin-top:var(--bui-space-8)}.xs\:bui-mt-9{margin-top:var(--bui-space-9)}.xs\:bui-mt-10{margin-top:var(--bui-space-10)}.xs\:bui-mt-11{margin-top:var(--bui-space-11)}.xs\:bui-mt-12{margin-top:var(--bui-space-12)}.xs\:bui-mt-13{margin-top:var(--bui-space-13)}.xs\:bui-mt-14{margin-top:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-mt{margin-top:var(--mt-sm)}.sm\:bui-mt-0\.5{margin-top:var(--bui-space-0_5)}.sm\:bui-mt-1{margin-top:var(--bui-space-1)}.sm\:bui-mt-1\.5{margin-top:var(--bui-space-1_5)}.sm\:bui-mt-2{margin-top:var(--bui-space-2)}.sm\:bui-mt-3{margin-top:var(--bui-space-3)}.sm\:bui-mt-4{margin-top:var(--bui-space-4)}.sm\:bui-mt-5{margin-top:var(--bui-space-5)}.sm\:bui-mt-6{margin-top:var(--bui-space-6)}.sm\:bui-mt-7{margin-top:var(--bui-space-7)}.sm\:bui-mt-8{margin-top:var(--bui-space-8)}.sm\:bui-mt-9{margin-top:var(--bui-space-9)}.sm\:bui-mt-10{margin-top:var(--bui-space-10)}.sm\:bui-mt-11{margin-top:var(--bui-space-11)}.sm\:bui-mt-12{margin-top:var(--bui-space-12)}.sm\:bui-mt-13{margin-top:var(--bui-space-13)}.sm\:bui-mt-14{margin-top:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-mt{margin-top:var(--mt-md)}.md\:bui-mt-0\.5{margin-top:var(--bui-space-0_5)}.md\:bui-mt-1{margin-top:var(--bui-space-1)}.md\:bui-mt-1\.5{margin-top:var(--bui-space-1_5)}.md\:bui-mt-2{margin-top:var(--bui-space-2)}.md\:bui-mt-3{margin-top:var(--bui-space-3)}.md\:bui-mt-4{margin-top:var(--bui-space-4)}.md\:bui-mt-5{margin-top:var(--bui-space-5)}.md\:bui-mt-6{margin-top:var(--bui-space-6)}.md\:bui-mt-7{margin-top:var(--bui-space-7)}.md\:bui-mt-8{margin-top:var(--bui-space-8)}.md\:bui-mt-9{margin-top:var(--bui-space-9)}.md\:bui-mt-10{margin-top:var(--bui-space-10)}.md\:bui-mt-11{margin-top:var(--bui-space-11)}.md\:bui-mt-12{margin-top:var(--bui-space-12)}.md\:bui-mt-13{margin-top:var(--bui-space-13)}.md\:bui-mt-14{margin-top:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-mt{margin-top:var(--mt-lg)}.lg\:bui-mt-0\.5{margin-top:var(--bui-space-0_5)}.lg\:bui-mt-1{margin-top:var(--bui-space-1)}.lg\:bui-mt-1\.5{margin-top:var(--bui-space-1_5)}.lg\:bui-mt-2{margin-top:var(--bui-space-2)}.lg\:bui-mt-3{margin-top:var(--bui-space-3)}.lg\:bui-mt-4{margin-top:var(--bui-space-4)}.lg\:bui-mt-5{margin-top:var(--bui-space-5)}.lg\:bui-mt-6{margin-top:var(--bui-space-6)}.lg\:bui-mt-7{margin-top:var(--bui-space-7)}.lg\:bui-mt-8{margin-top:var(--bui-space-8)}.lg\:bui-mt-9{margin-top:var(--bui-space-9)}.lg\:bui-mt-10{margin-top:var(--bui-space-10)}.lg\:bui-mt-11{margin-top:var(--bui-space-11)}.lg\:bui-mt-12{margin-top:var(--bui-space-12)}.lg\:bui-mt-13{margin-top:var(--bui-space-13)}.lg\:bui-mt-14{margin-top:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-mt{margin-top:var(--mt-xl)}.xl\:bui-mt-0\.5{margin-top:var(--bui-space-0_5)}.xl\:bui-mt-1{margin-top:var(--bui-space-1)}.xl\:bui-mt-1\.5{margin-top:var(--bui-space-1_5)}.xl\:bui-mt-2{margin-top:var(--bui-space-2)}.xl\:bui-mt-3{margin-top:var(--bui-space-3)}.xl\:bui-mt-4{margin-top:var(--bui-space-4)}.xl\:bui-mt-5{margin-top:var(--bui-space-5)}.xl\:bui-mt-6{margin-top:var(--bui-space-6)}.xl\:bui-mt-7{margin-top:var(--bui-space-7)}.xl\:bui-mt-8{margin-top:var(--bui-space-8)}.xl\:bui-mt-9{margin-top:var(--bui-space-9)}.xl\:bui-mt-10{margin-top:var(--bui-space-10)}.xl\:bui-mt-11{margin-top:var(--bui-space-11)}.xl\:bui-mt-12{margin-top:var(--bui-space-12)}.xl\:bui-mt-13{margin-top:var(--bui-space-13)}.xl\:bui-mt-14{margin-top:var(--bui-space-14)}}.bui-mb{margin-bottom:var(--mb)}.bui-mb-0\.5{margin-bottom:var(--bui-space-0_5)}.bui-mb-1{margin-bottom:var(--bui-space-1)}.bui-mb-1\.5{margin-bottom:var(--bui-space-1_5)}.bui-mb-2{margin-bottom:var(--bui-space-2)}.bui-mb-3{margin-bottom:var(--bui-space-3)}.bui-mb-4{margin-bottom:var(--bui-space-4)}.bui-mb-5{margin-bottom:var(--bui-space-5)}.bui-mb-6{margin-bottom:var(--bui-space-6)}.bui-mb-7{margin-bottom:var(--bui-space-7)}.bui-mb-8{margin-bottom:var(--bui-space-8)}.bui-mb-9{margin-bottom:var(--bui-space-9)}.bui-mb-10{margin-bottom:var(--bui-space-10)}.bui-mb-11{margin-bottom:var(--bui-space-11)}.bui-mb-12{margin-bottom:var(--bui-space-12)}.bui-mb-13{margin-bottom:var(--bui-space-13)}.bui-mb-14{margin-bottom:var(--bui-space-14)}@media (width>=640px){.xs\:bui-mb{margin-bottom:var(--mb-xs)}.xs\:bui-mb-0\.5{margin-bottom:var(--bui-space-0_5)}.xs\:bui-mb-1{margin-bottom:var(--bui-space-1)}.xs\:bui-mb-1\.5{margin-bottom:var(--bui-space-1_5)}.xs\:bui-mb-2{margin-bottom:var(--bui-space-2)}.xs\:bui-mb-3{margin-bottom:var(--bui-space-3)}.xs\:bui-mb-4{margin-bottom:var(--bui-space-4)}.xs\:bui-mb-5{margin-bottom:var(--bui-space-5)}.xs\:bui-mb-6{margin-bottom:var(--bui-space-6)}.xs\:bui-mb-7{margin-bottom:var(--bui-space-7)}.xs\:bui-mb-8{margin-bottom:var(--bui-space-8)}.xs\:bui-mb-9{margin-bottom:var(--bui-space-9)}.xs\:bui-mb-10{margin-bottom:var(--bui-space-10)}.xs\:bui-mb-11{margin-bottom:var(--bui-space-11)}.xs\:bui-mb-12{margin-bottom:var(--bui-space-12)}.xs\:bui-mb-13{margin-bottom:var(--bui-space-13)}.xs\:bui-mb-14{margin-bottom:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-mb{margin-bottom:var(--mb-sm)}.sm\:bui-mb-0\.5{margin-bottom:var(--bui-space-0_5)}.sm\:bui-mb-1{margin-bottom:var(--bui-space-1)}.sm\:bui-mb-1\.5{margin-bottom:var(--bui-space-1_5)}.sm\:bui-mb-2{margin-bottom:var(--bui-space-2)}.sm\:bui-mb-3{margin-bottom:var(--bui-space-3)}.sm\:bui-mb-4{margin-bottom:var(--bui-space-4)}.sm\:bui-mb-5{margin-bottom:var(--bui-space-5)}.sm\:bui-mb-6{margin-bottom:var(--bui-space-6)}.sm\:bui-mb-7{margin-bottom:var(--bui-space-7)}.sm\:bui-mb-8{margin-bottom:var(--bui-space-8)}.sm\:bui-mb-9{margin-bottom:var(--bui-space-9)}.sm\:bui-mb-10{margin-bottom:var(--bui-space-10)}.sm\:bui-mb-11{margin-bottom:var(--bui-space-11)}.sm\:bui-mb-12{margin-bottom:var(--bui-space-12)}.sm\:bui-mb-13{margin-bottom:var(--bui-space-13)}.sm\:bui-mb-14{margin-bottom:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-mb{margin-bottom:var(--mb-md)}.md\:bui-mb-0\.5{margin-bottom:var(--bui-space-0_5)}.md\:bui-mb-1{margin-bottom:var(--bui-space-1)}.md\:bui-mb-1\.5{margin-bottom:var(--bui-space-1_5)}.md\:bui-mb-2{margin-bottom:var(--bui-space-2)}.md\:bui-mb-3{margin-bottom:var(--bui-space-3)}.md\:bui-mb-4{margin-bottom:var(--bui-space-4)}.md\:bui-mb-5{margin-bottom:var(--bui-space-5)}.md\:bui-mb-6{margin-bottom:var(--bui-space-6)}.md\:bui-mb-7{margin-bottom:var(--bui-space-7)}.md\:bui-mb-8{margin-bottom:var(--bui-space-8)}.md\:bui-mb-9{margin-bottom:var(--bui-space-9)}.md\:bui-mb-10{margin-bottom:var(--bui-space-10)}.md\:bui-mb-11{margin-bottom:var(--bui-space-11)}.md\:bui-mb-12{margin-bottom:var(--bui-space-12)}.md\:bui-mb-13{margin-bottom:var(--bui-space-13)}.md\:bui-mb-14{margin-bottom:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-mb{margin-bottom:var(--mb-lg)}.lg\:bui-mb-0\.5{margin-bottom:var(--bui-space-0_5)}.lg\:bui-mb-1{margin-bottom:var(--bui-space-1)}.lg\:bui-mb-1\.5{margin-bottom:var(--bui-space-1_5)}.lg\:bui-mb-2{margin-bottom:var(--bui-space-2)}.lg\:bui-mb-3{margin-bottom:var(--bui-space-3)}.lg\:bui-mb-4{margin-bottom:var(--bui-space-4)}.lg\:bui-mb-5{margin-bottom:var(--bui-space-5)}.lg\:bui-mb-6{margin-bottom:var(--bui-space-6)}.lg\:bui-mb-7{margin-bottom:var(--bui-space-7)}.lg\:bui-mb-8{margin-bottom:var(--bui-space-8)}.lg\:bui-mb-9{margin-bottom:var(--bui-space-9)}.lg\:bui-mb-10{margin-bottom:var(--bui-space-10)}.lg\:bui-mb-11{margin-bottom:var(--bui-space-11)}.lg\:bui-mb-12{margin-bottom:var(--bui-space-12)}.lg\:bui-mb-13{margin-bottom:var(--bui-space-13)}.lg\:bui-mb-14{margin-bottom:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-mb{margin-bottom:var(--mb-xl)}.xl\:bui-mb-0\.5{margin-bottom:var(--bui-space-0_5)}.xl\:bui-mb-1{margin-bottom:var(--bui-space-1)}.xl\:bui-mb-1\.5{margin-bottom:var(--bui-space-1_5)}.xl\:bui-mb-2{margin-bottom:var(--bui-space-2)}.xl\:bui-mb-3{margin-bottom:var(--bui-space-3)}.xl\:bui-mb-4{margin-bottom:var(--bui-space-4)}.xl\:bui-mb-5{margin-bottom:var(--bui-space-5)}.xl\:bui-mb-6{margin-bottom:var(--bui-space-6)}.xl\:bui-mb-7{margin-bottom:var(--bui-space-7)}.xl\:bui-mb-8{margin-bottom:var(--bui-space-8)}.xl\:bui-mb-9{margin-bottom:var(--bui-space-9)}.xl\:bui-mb-10{margin-bottom:var(--bui-space-10)}.xl\:bui-mb-11{margin-bottom:var(--bui-space-11)}.xl\:bui-mb-12{margin-bottom:var(--bui-space-12)}.xl\:bui-mb-13{margin-bottom:var(--bui-space-13)}.xl\:bui-mb-14{margin-bottom:var(--bui-space-14)}}.bui-my{margin-top:var(--my);margin-bottom:var(--my)}.bui-my-0\.5{margin-top:var(--bui-space-0_5);margin-bottom:var(--bui-space-0_5)}.bui-my-1{margin-top:var(--bui-space-1);margin-bottom:var(--bui-space-1)}.bui-my-1\.5{margin-top:var(--bui-space-1_5);margin-bottom:var(--bui-space-1_5)}.bui-my-2{margin-top:var(--bui-space-2);margin-bottom:var(--bui-space-2)}.bui-my-3{margin-top:var(--bui-space-3);margin-bottom:var(--bui-space-3)}.bui-my-4{margin-top:var(--bui-space-4);margin-bottom:var(--bui-space-4)}.bui-my-5{margin-top:var(--bui-space-5);margin-bottom:var(--bui-space-5)}.bui-my-6{margin-top:var(--bui-space-6);margin-bottom:var(--bui-space-6)}.bui-my-7{margin-top:var(--bui-space-7);margin-bottom:var(--bui-space-7)}.bui-my-8{margin-top:var(--bui-space-8);margin-bottom:var(--bui-space-8)}.bui-my-9{margin-top:var(--bui-space-9);margin-bottom:var(--bui-space-9)}.bui-my-10{margin-top:var(--bui-space-10);margin-bottom:var(--bui-space-10)}.bui-my-11{margin-top:var(--bui-space-11);margin-bottom:var(--bui-space-11)}.bui-my-12{margin-top:var(--bui-space-12);margin-bottom:var(--bui-space-12)}.bui-my-13{margin-top:var(--bui-space-13);margin-bottom:var(--bui-space-13)}.bui-my-14{margin-top:var(--bui-space-14);margin-bottom:var(--bui-space-14)}@media (width>=640px){.xs\:bui-my{margin-top:var(--my-xs);margin-bottom:var(--my-xs)}.xs\:bui-my-0\.5{margin-top:var(--bui-space-0_5);margin-bottom:var(--bui-space-0_5)}.xs\:bui-my-1{margin-top:var(--bui-space-1);margin-bottom:var(--bui-space-1)}.xs\:bui-my-1\.5{margin-top:var(--bui-space-1_5);margin-bottom:var(--bui-space-1_5)}.xs\:bui-my-2{margin-top:var(--bui-space-2);margin-bottom:var(--bui-space-2)}.xs\:bui-my-3{margin-top:var(--bui-space-3);margin-bottom:var(--bui-space-3)}.xs\:bui-my-4{margin-top:var(--bui-space-4);margin-bottom:var(--bui-space-4)}.xs\:bui-my-5{margin-top:var(--bui-space-5);margin-bottom:var(--bui-space-5)}.xs\:bui-my-6{margin-top:var(--bui-space-6);margin-bottom:var(--bui-space-6)}.xs\:bui-my-7{margin-top:var(--bui-space-7);margin-bottom:var(--bui-space-7)}.xs\:bui-my-8{margin-top:var(--bui-space-8);margin-bottom:var(--bui-space-8)}.xs\:bui-my-9{margin-top:var(--bui-space-9);margin-bottom:var(--bui-space-9)}.xs\:bui-my-10{margin-top:var(--bui-space-10);margin-bottom:var(--bui-space-10)}.xs\:bui-my-11{margin-top:var(--bui-space-11);margin-bottom:var(--bui-space-11)}.xs\:bui-my-12{margin-top:var(--bui-space-12);margin-bottom:var(--bui-space-12)}.xs\:bui-my-13{margin-top:var(--bui-space-13);margin-bottom:var(--bui-space-13)}.xs\:bui-my-14{margin-top:var(--bui-space-14);margin-bottom:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-my{margin-top:var(--my-sm);margin-bottom:var(--my-sm)}.sm\:bui-my-0\.5{margin-top:var(--bui-space-0_5);margin-bottom:var(--bui-space-0_5)}.sm\:bui-my-1{margin-top:var(--bui-space-1);margin-bottom:var(--bui-space-1)}.sm\:bui-my-1\.5{margin-top:var(--bui-space-1_5);margin-bottom:var(--bui-space-1_5)}.sm\:bui-my-2{margin-top:var(--bui-space-2);margin-bottom:var(--bui-space-2)}.sm\:bui-my-3{margin-top:var(--bui-space-3);margin-bottom:var(--bui-space-3)}.sm\:bui-my-4{margin-top:var(--bui-space-4);margin-bottom:var(--bui-space-4)}.sm\:bui-my-5{margin-top:var(--bui-space-5);margin-bottom:var(--bui-space-5)}.sm\:bui-my-6{margin-top:var(--bui-space-6);margin-bottom:var(--bui-space-6)}.sm\:bui-my-7{margin-top:var(--bui-space-7);margin-bottom:var(--bui-space-7)}.sm\:bui-my-8{margin-top:var(--bui-space-8);margin-bottom:var(--bui-space-8)}.sm\:bui-my-9{margin-top:var(--bui-space-9);margin-bottom:var(--bui-space-9)}.sm\:bui-my-10{margin-top:var(--bui-space-10);margin-bottom:var(--bui-space-10)}.sm\:bui-my-11{margin-top:var(--bui-space-11);margin-bottom:var(--bui-space-11)}.sm\:bui-my-12{margin-top:var(--bui-space-12);margin-bottom:var(--bui-space-12)}.sm\:bui-my-13{margin-top:var(--bui-space-13);margin-bottom:var(--bui-space-13)}.sm\:bui-my-14{margin-top:var(--bui-space-14);margin-bottom:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-my{margin-top:var(--my-md);margin-bottom:var(--my-md)}.md\:bui-my-0\.5{margin-top:var(--bui-space-0_5);margin-bottom:var(--bui-space-0_5)}.md\:bui-my-1{margin-top:var(--bui-space-1);margin-bottom:var(--bui-space-1)}.md\:bui-my-1\.5{margin-top:var(--bui-space-1_5);margin-bottom:var(--bui-space-1_5)}.md\:bui-my-2{margin-top:var(--bui-space-2);margin-bottom:var(--bui-space-2)}.md\:bui-my-3{margin-top:var(--bui-space-3);margin-bottom:var(--bui-space-3)}.md\:bui-my-4{margin-top:var(--bui-space-4);margin-bottom:var(--bui-space-4)}.md\:bui-my-5{margin-top:var(--bui-space-5);margin-bottom:var(--bui-space-5)}.md\:bui-my-6{margin-top:var(--bui-space-6);margin-bottom:var(--bui-space-6)}.md\:bui-my-7{margin-top:var(--bui-space-7);margin-bottom:var(--bui-space-7)}.md\:bui-my-8{margin-top:var(--bui-space-8);margin-bottom:var(--bui-space-8)}.md\:bui-my-9{margin-top:var(--bui-space-9);margin-bottom:var(--bui-space-9)}.md\:bui-my-10{margin-top:var(--bui-space-10);margin-bottom:var(--bui-space-10)}.md\:bui-my-11{margin-top:var(--bui-space-11);margin-bottom:var(--bui-space-11)}.md\:bui-my-12{margin-top:var(--bui-space-12);margin-bottom:var(--bui-space-12)}.md\:bui-my-13{margin-top:var(--bui-space-13);margin-bottom:var(--bui-space-13)}.md\:bui-my-14{margin-top:var(--bui-space-14);margin-bottom:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-my{margin-top:var(--my-lg);margin-bottom:var(--my-lg)}.lg\:bui-my-0\.5{margin-top:var(--bui-space-0_5);margin-bottom:var(--bui-space-0_5)}.lg\:bui-my-1{margin-top:var(--bui-space-1);margin-bottom:var(--bui-space-1)}.lg\:bui-my-1\.5{margin-top:var(--bui-space-1_5);margin-bottom:var(--bui-space-1_5)}.lg\:bui-my-2{margin-top:var(--bui-space-2);margin-bottom:var(--bui-space-2)}.lg\:bui-my-3{margin-top:var(--bui-space-3);margin-bottom:var(--bui-space-3)}.lg\:bui-my-4{margin-top:var(--bui-space-4);margin-bottom:var(--bui-space-4)}.lg\:bui-my-5{margin-top:var(--bui-space-5);margin-bottom:var(--bui-space-5)}.lg\:bui-my-6{margin-top:var(--bui-space-6);margin-bottom:var(--bui-space-6)}.lg\:bui-my-7{margin-top:var(--bui-space-7);margin-bottom:var(--bui-space-7)}.lg\:bui-my-8{margin-top:var(--bui-space-8);margin-bottom:var(--bui-space-8)}.lg\:bui-my-9{margin-top:var(--bui-space-9);margin-bottom:var(--bui-space-9)}.lg\:bui-my-10{margin-top:var(--bui-space-10);margin-bottom:var(--bui-space-10)}.lg\:bui-my-11{margin-top:var(--bui-space-11);margin-bottom:var(--bui-space-11)}.lg\:bui-my-12{margin-top:var(--bui-space-12);margin-bottom:var(--bui-space-12)}.lg\:bui-my-13{margin-top:var(--bui-space-13);margin-bottom:var(--bui-space-13)}.lg\:bui-my-14{margin-top:var(--bui-space-14);margin-bottom:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-my{margin-top:var(--my-xl);margin-bottom:var(--my-xl)}.xl\:bui-my-0\.5{margin-top:var(--bui-space-0_5);margin-bottom:var(--bui-space-0_5)}.xl\:bui-my-1{margin-top:var(--bui-space-1);margin-bottom:var(--bui-space-1)}.xl\:bui-my-1\.5{margin-top:var(--bui-space-1_5);margin-bottom:var(--bui-space-1_5)}.xl\:bui-my-2{margin-top:var(--bui-space-2);margin-bottom:var(--bui-space-2)}.xl\:bui-my-3{margin-top:var(--bui-space-3);margin-bottom:var(--bui-space-3)}.xl\:bui-my-4{margin-top:var(--bui-space-4);margin-bottom:var(--bui-space-4)}.xl\:bui-my-5{margin-top:var(--bui-space-5);margin-bottom:var(--bui-space-5)}.xl\:bui-my-6{margin-top:var(--bui-space-6);margin-bottom:var(--bui-space-6)}.xl\:bui-my-7{margin-top:var(--bui-space-7);margin-bottom:var(--bui-space-7)}.xl\:bui-my-8{margin-top:var(--bui-space-8);margin-bottom:var(--bui-space-8)}.xl\:bui-my-9{margin-top:var(--bui-space-9);margin-bottom:var(--bui-space-9)}.xl\:bui-my-10{margin-top:var(--bui-space-10);margin-bottom:var(--bui-space-10)}.xl\:bui-my-11{margin-top:var(--bui-space-11);margin-bottom:var(--bui-space-11)}.xl\:bui-my-12{margin-top:var(--bui-space-12);margin-bottom:var(--bui-space-12)}.xl\:bui-my-13{margin-top:var(--bui-space-13);margin-bottom:var(--bui-space-13)}.xl\:bui-my-14{margin-top:var(--bui-space-14);margin-bottom:var(--bui-space-14)}}.bui-mx{margin-left:var(--mx);margin-right:var(--mx)}.bui-mx-0\.5{margin-left:var(--bui-space-0_5);margin-right:var(--bui-space-0_5)}.bui-mx-1{margin-left:var(--bui-space-1);margin-right:var(--bui-space-1)}.bui-mx-1\.5{margin-left:var(--bui-space-1_5);margin-right:var(--bui-space-1_5)}.bui-mx-2{margin-left:var(--bui-space-2);margin-right:var(--bui-space-2)}.bui-mx-3{margin-left:var(--bui-space-3);margin-right:var(--bui-space-3)}.bui-mx-4{margin-left:var(--bui-space-4);margin-right:var(--bui-space-4)}.bui-mx-5{margin-left:var(--bui-space-5);margin-right:var(--bui-space-5)}.bui-mx-6{margin-left:var(--bui-space-6);margin-right:var(--bui-space-6)}.bui-mx-7{margin-left:var(--bui-space-7);margin-right:var(--bui-space-7)}.bui-mx-8{margin-left:var(--bui-space-8);margin-right:var(--bui-space-8)}.bui-mx-9{margin-left:var(--bui-space-9);margin-right:var(--bui-space-9)}.bui-mx-10{margin-left:var(--bui-space-10);margin-right:var(--bui-space-10)}.bui-mx-11{margin-left:var(--bui-space-11);margin-right:var(--bui-space-11)}.bui-mx-12{margin-left:var(--bui-space-12);margin-right:var(--bui-space-12)}.bui-mx-13{margin-left:var(--bui-space-13);margin-right:var(--bui-space-13)}.bui-mx-14{margin-left:var(--bui-space-14);margin-right:var(--bui-space-14)}@media (width>=640px){.xs\:bui-mx{margin-left:var(--mx-xs);margin-right:var(--mx-xs)}.xs\:bui-mx-0\.5{margin-left:var(--bui-space-0_5);margin-right:var(--bui-space-0_5)}.xs\:bui-mx-1{margin-left:var(--bui-space-1);margin-right:var(--bui-space-1)}.xs\:bui-mx-1\.5{margin-left:var(--bui-space-1_5);margin-right:var(--bui-space-1_5)}.xs\:bui-mx-2{margin-left:var(--bui-space-2);margin-right:var(--bui-space-2)}.xs\:bui-mx-3{margin-left:var(--bui-space-3);margin-right:var(--bui-space-3)}.xs\:bui-mx-4{margin-left:var(--bui-space-4);margin-right:var(--bui-space-4)}.xs\:bui-mx-5{margin-left:var(--bui-space-5);margin-right:var(--bui-space-5)}.xs\:bui-mx-6{margin-left:var(--bui-space-6);margin-right:var(--bui-space-6)}.xs\:bui-mx-7{margin-left:var(--bui-space-7);margin-right:var(--bui-space-7)}.xs\:bui-mx-8{margin-left:var(--bui-space-8);margin-right:var(--bui-space-8)}.xs\:bui-mx-9{margin-left:var(--bui-space-9);margin-right:var(--bui-space-9)}.xs\:bui-mx-10{margin-left:var(--bui-space-10);margin-right:var(--bui-space-10)}.xs\:bui-mx-11{margin-left:var(--bui-space-11);margin-right:var(--bui-space-11)}.xs\:bui-mx-12{margin-left:var(--bui-space-12);margin-right:var(--bui-space-12)}.xs\:bui-mx-13{margin-left:var(--bui-space-13);margin-right:var(--bui-space-13)}.xs\:bui-mx-14{margin-left:var(--bui-space-14);margin-right:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-mx{margin-left:var(--mx-sm);margin-right:var(--mx-sm)}.sm\:bui-mx-0\.5{margin-left:var(--bui-space-0_5);margin-right:var(--bui-space-0_5)}.sm\:bui-mx-1{margin-left:var(--bui-space-1);margin-right:var(--bui-space-1)}.sm\:bui-mx-1\.5{margin-left:var(--bui-space-1_5);margin-right:var(--bui-space-1_5)}.sm\:bui-mx-2{margin-left:var(--bui-space-2);margin-right:var(--bui-space-2)}.sm\:bui-mx-3{margin-left:var(--bui-space-3);margin-right:var(--bui-space-3)}.sm\:bui-mx-4{margin-left:var(--bui-space-4);margin-right:var(--bui-space-4)}.sm\:bui-mx-5{margin-left:var(--bui-space-5);margin-right:var(--bui-space-5)}.sm\:bui-mx-6{margin-left:var(--bui-space-6);margin-right:var(--bui-space-6)}.sm\:bui-mx-7{margin-left:var(--bui-space-7);margin-right:var(--bui-space-7)}.sm\:bui-mx-8{margin-left:var(--bui-space-8);margin-right:var(--bui-space-8)}.sm\:bui-mx-9{margin-left:var(--bui-space-9);margin-right:var(--bui-space-9)}.sm\:bui-mx-10{margin-left:var(--bui-space-10);margin-right:var(--bui-space-10)}.sm\:bui-mx-11{margin-left:var(--bui-space-11);margin-right:var(--bui-space-11)}.sm\:bui-mx-12{margin-left:var(--bui-space-12);margin-right:var(--bui-space-12)}.sm\:bui-mx-13{margin-left:var(--bui-space-13);margin-right:var(--bui-space-13)}.sm\:bui-mx-14{margin-left:var(--bui-space-14);margin-right:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-mx{margin-left:var(--mx-md);margin-right:var(--mx-md)}.md\:bui-mx-0\.5{margin-left:var(--bui-space-0_5);margin-right:var(--bui-space-0_5)}.md\:bui-mx-1{margin-left:var(--bui-space-1);margin-right:var(--bui-space-1)}.md\:bui-mx-1\.5{margin-left:var(--bui-space-1_5);margin-right:var(--bui-space-1_5)}.md\:bui-mx-2{margin-left:var(--bui-space-2);margin-right:var(--bui-space-2)}.md\:bui-mx-3{margin-left:var(--bui-space-3);margin-right:var(--bui-space-3)}.md\:bui-mx-4{margin-left:var(--bui-space-4);margin-right:var(--bui-space-4)}.md\:bui-mx-5{margin-left:var(--bui-space-5);margin-right:var(--bui-space-5)}.md\:bui-mx-6{margin-left:var(--bui-space-6);margin-right:var(--bui-space-6)}.md\:bui-mx-7{margin-left:var(--bui-space-7);margin-right:var(--bui-space-7)}.md\:bui-mx-8{margin-left:var(--bui-space-8);margin-right:var(--bui-space-8)}.md\:bui-mx-9{margin-left:var(--bui-space-9);margin-right:var(--bui-space-9)}.md\:bui-mx-10{margin-left:var(--bui-space-10);margin-right:var(--bui-space-10)}.md\:bui-mx-11{margin-left:var(--bui-space-11);margin-right:var(--bui-space-11)}.md\:bui-mx-12{margin-left:var(--bui-space-12);margin-right:var(--bui-space-12)}.md\:bui-mx-13{margin-left:var(--bui-space-13);margin-right:var(--bui-space-13)}.md\:bui-mx-14{margin-left:var(--bui-space-14);margin-right:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-mx{margin-left:var(--mx-lg);margin-right:var(--mx-lg)}.lg\:bui-mx-0\.5{margin-left:var(--bui-space-0_5);margin-right:var(--bui-space-0_5)}.lg\:bui-mx-1{margin-left:var(--bui-space-1);margin-right:var(--bui-space-1)}.lg\:bui-mx-1\.5{margin-left:var(--bui-space-1_5);margin-right:var(--bui-space-1_5)}.lg\:bui-mx-2{margin-left:var(--bui-space-2);margin-right:var(--bui-space-2)}.lg\:bui-mx-3{margin-left:var(--bui-space-3);margin-right:var(--bui-space-3)}.lg\:bui-mx-4{margin-left:var(--bui-space-4);margin-right:var(--bui-space-4)}.lg\:bui-mx-5{margin-left:var(--bui-space-5);margin-right:var(--bui-space-5)}.lg\:bui-mx-6{margin-left:var(--bui-space-6);margin-right:var(--bui-space-6)}.lg\:bui-mx-7{margin-left:var(--bui-space-7);margin-right:var(--bui-space-7)}.lg\:bui-mx-8{margin-left:var(--bui-space-8);margin-right:var(--bui-space-8)}.lg\:bui-mx-9{margin-left:var(--bui-space-9);margin-right:var(--bui-space-9)}.lg\:bui-mx-10{margin-left:var(--bui-space-10);margin-right:var(--bui-space-10)}.lg\:bui-mx-11{margin-left:var(--bui-space-11);margin-right:var(--bui-space-11)}.lg\:bui-mx-12{margin-left:var(--bui-space-12);margin-right:var(--bui-space-12)}.lg\:bui-mx-13{margin-left:var(--bui-space-13);margin-right:var(--bui-space-13)}.lg\:bui-mx-14{margin-left:var(--bui-space-14);margin-right:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-mx{margin-left:var(--mx-xl);margin-right:var(--mx-xl)}.xl\:bui-mx-0\.5{margin-left:var(--bui-space-0_5);margin-right:var(--bui-space-0_5)}.xl\:bui-mx-1{margin-left:var(--bui-space-1);margin-right:var(--bui-space-1)}.xl\:bui-mx-1\.5{margin-left:var(--bui-space-1_5);margin-right:var(--bui-space-1_5)}.xl\:bui-mx-2{margin-left:var(--bui-space-2);margin-right:var(--bui-space-2)}.xl\:bui-mx-3{margin-left:var(--bui-space-3);margin-right:var(--bui-space-3)}.xl\:bui-mx-4{margin-left:var(--bui-space-4);margin-right:var(--bui-space-4)}.xl\:bui-mx-5{margin-left:var(--bui-space-5);margin-right:var(--bui-space-5)}.xl\:bui-mx-6{margin-left:var(--bui-space-6);margin-right:var(--bui-space-6)}.xl\:bui-mx-7{margin-left:var(--bui-space-7);margin-right:var(--bui-space-7)}.xl\:bui-mx-8{margin-left:var(--bui-space-8);margin-right:var(--bui-space-8)}.xl\:bui-mx-9{margin-left:var(--bui-space-9);margin-right:var(--bui-space-9)}.xl\:bui-mx-10{margin-left:var(--bui-space-10);margin-right:var(--bui-space-10)}.xl\:bui-mx-11{margin-left:var(--bui-space-11);margin-right:var(--bui-space-11)}.xl\:bui-mx-12{margin-left:var(--bui-space-12);margin-right:var(--bui-space-12)}.xl\:bui-mx-13{margin-left:var(--bui-space-13);margin-right:var(--bui-space-13)}.xl\:bui-mx-14{margin-left:var(--bui-space-14);margin-right:var(--bui-space-14)}}.bui-display-none{display:none}.bui-display-inline{display:inline}.bui-display-inline-block{display:inline-block}.bui-display-block{display:block}@media (width>=640px){.xs\:bui-display-none{display:none}.xs\:bui-display-inline{display:inline}.xs\:bui-display-inline-block{display:inline-block}.xs\:bui-display-block{display:block}}@media (width>=768px){.sm\:bui-display-none{display:none}.sm\:bui-display-inline{display:inline}.sm\:bui-display-inline-block{display:inline-block}.sm\:bui-display-block{display:block}}@media (width>=1024px){.md\:bui-display-none{display:none}.md\:bui-display-inline{display:inline}.md\:bui-display-inline-block{display:inline-block}.md\:bui-display-block{display:block}}@media (width>=1280px){.lg\:bui-display-none{display:none}.lg\:bui-display-inline{display:inline}.lg\:bui-display-inline-block{display:inline-block}.lg\:bui-display-block{display:block}}@media (width>=1536px){.xl\:bui-display-none{display:none}.xl\:bui-display-inline{display:inline}.xl\:bui-display-inline-block{display:inline-block}.xl\:bui-display-block{display:block}}.bui-w{width:var(--width)}.bui-min-w{min-width:var(--min-width)}.bui-max-w{max-width:var(--max-width)}@media (width>=640px){.xs\:bui-w{width:var(--width)}.xs\:bui-min-w{min-width:var(--min-width)}.xs\:bui-max-w{max-width:var(--max-width)}}@media (width>=768px){.sm\:bui-w{width:var(--width)}.sm\:bui-min-w{min-width:var(--min-width)}.sm\:bui-max-w{max-width:var(--max-width)}}@media (width>=1024px){.md\:bui-w{width:var(--width)}.md\:bui-min-w{min-width:var(--min-width)}.md\:bui-max-w{max-width:var(--max-width)}}@media (width>=1280px){.lg\:bui-w{width:var(--width)}.lg\:bui-min-w{min-width:var(--min-width)}.lg\:bui-max-w{max-width:var(--max-width)}}@media (width>=1536px){.xl\:bui-w{width:var(--width)}.xl\:bui-min-w{min-width:var(--min-width)}.xl\:bui-max-w{max-width:var(--max-width)}}.bui-h{height:var(--height)}.bui-min-h{min-height:var(--min-height)}.bui-max-h{max-height:var(--max-height)}@media (width>=640px){.xs\:bui-h{height:var(--height)}.xs\:bui-min-h{min-height:var(--min-height)}.xs\:bui-max-h{max-height:var(--max-height)}}@media (width>=768px){.sm\:bui-h{height:var(--height)}.sm\:bui-min-h{min-height:var(--min-height)}.sm\:bui-max-h{max-height:var(--max-height)}}@media (width>=1024px){.md\:bui-h{height:var(--height)}.md\:bui-min-h{min-height:var(--min-height)}.md\:bui-max-h{max-height:var(--max-height)}}@media (width>=1280px){.lg\:bui-h{height:var(--height)}.lg\:bui-min-h{min-height:var(--min-height)}.lg\:bui-max-h{max-height:var(--max-height)}}@media (width>=1536px){.xl\:bui-h{height:var(--height)}.xl\:bui-min-h{min-height:var(--min-height)}.xl\:bui-max-h{max-height:var(--max-height)}}.bui-position-absolute{position:absolute}.bui-position-fixed{position:fixed}.bui-position-sticky{position:sticky}.bui-position-relative{position:relative}.bui-position-static{position:static}@media (width>=640px){.xs\:bui-position-absolute{position:absolute}.xs\:bui-position-fixed{position:fixed}.xs\:bui-position-sticky{position:sticky}.xs\:bui-position-relative{position:relative}.xs\:bui-position-static{position:static}}@media (width>=768px){.sm\:bui-position-absolute{position:absolute}.sm\:bui-position-fixed{position:fixed}.sm\:bui-position-sticky{position:sticky}.sm\:bui-position-relative{position:relative}.sm\:bui-position-static{position:static}}@media (width>=1024px){.md\:bui-position-absolute{position:absolute}.md\:bui-position-fixed{position:fixed}.md\:bui-position-sticky{position:sticky}.md\:bui-position-relative{position:relative}.md\:bui-position-static{position:static}}@media (width>=1280px){.lg\:bui-position-absolute{position:absolute}.lg\:bui-position-fixed{position:fixed}.lg\:bui-position-sticky{position:sticky}.lg\:bui-position-relative{position:relative}.lg\:bui-position-static{position:static}}@media (width>=1536px){.xl\:bui-position-absolute{position:absolute}.xl\:bui-position-fixed{position:fixed}.xl\:bui-position-sticky{position:sticky}.xl\:bui-position-relative{position:relative}.xl\:bui-position-static{position:static}}.bui-columns-1{grid-template-columns:repeat(1,minmax(0,1fr))}.bui-columns-2{grid-template-columns:repeat(2,minmax(0,1fr))}.bui-columns-3{grid-template-columns:repeat(3,minmax(0,1fr))}.bui-columns-4{grid-template-columns:repeat(4,minmax(0,1fr))}.bui-columns-5{grid-template-columns:repeat(5,minmax(0,1fr))}.bui-columns-6{grid-template-columns:repeat(6,minmax(0,1fr))}.bui-columns-7{grid-template-columns:repeat(7,minmax(0,1fr))}.bui-columns-8{grid-template-columns:repeat(8,minmax(0,1fr))}.bui-columns-9{grid-template-columns:repeat(9,minmax(0,1fr))}.bui-columns-10{grid-template-columns:repeat(10,minmax(0,1fr))}.bui-columns-11{grid-template-columns:repeat(11,minmax(0,1fr))}.bui-columns-12{grid-template-columns:repeat(12,minmax(0,1fr))}.bui-columns-auto{grid-template-columns:repeat(auto-fit,minmax(0,1fr))}.bui-col-span-1{grid-column:span 1/span 1}.bui-col-span-2{grid-column:span 2/span 2}.bui-col-span-3{grid-column:span 3/span 3}.bui-col-span-4{grid-column:span 4/span 4}.bui-col-span-5{grid-column:span 5/span 5}.bui-col-span-6{grid-column:span 6/span 6}.bui-col-span-7{grid-column:span 7/span 7}.bui-col-span-8{grid-column:span 8/span 8}.bui-col-span-9{grid-column:span 9/span 9}.bui-col-span-10{grid-column:span 10/span 10}.bui-col-span-11{grid-column:span 11/span 11}.bui-col-span-12{grid-column:span 12/span 12}.bui-col-span-auto{grid-column:span auto/span auto}.bui-col-start-1{grid-column-start:1}.bui-col-start-2{grid-column-start:2}.bui-col-start-3{grid-column-start:3}.bui-col-start-4{grid-column-start:4}.bui-col-start-5{grid-column-start:5}.bui-col-start-6{grid-column-start:6}.bui-col-start-7{grid-column-start:7}.bui-col-start-8{grid-column-start:8}.bui-col-start-9{grid-column-start:9}.bui-col-start-10{grid-column-start:10}.bui-col-start-11{grid-column-start:11}.bui-col-start-12{grid-column-start:12}.bui-col-start-13{grid-column-start:13}.bui-col-start-auto{grid-column-start:auto}.bui-col-end-1{grid-column-end:1}.bui-col-end-2{grid-column-end:2}.bui-col-end-3{grid-column-end:3}.bui-col-end-4{grid-column-end:4}.bui-col-end-5{grid-column-end:5}.bui-col-end-6{grid-column-end:6}.bui-col-end-7{grid-column-end:7}.bui-col-end-8{grid-column-end:8}.bui-col-end-9{grid-column-end:9}.bui-col-end-10{grid-column-end:10}.bui-col-end-11{grid-column-end:11}.bui-col-end-12{grid-column-end:12}.bui-col-end-13{grid-column-end:13}.bui-col-end-auto{grid-column-end:auto}.bui-row-span-1{grid-row:span 1/span 1}.bui-row-span-2{grid-row:span 2/span 2}.bui-row-span-3{grid-row:span 3/span 3}.bui-row-span-4{grid-row:span 4/span 4}.bui-row-span-5{grid-row:span 5/span 5}.bui-row-span-6{grid-row:span 6/span 6}.bui-row-span-7{grid-row:span 7/span 7}.bui-row-span-8{grid-row:span 8/span 8}.bui-row-span-9{grid-row:span 9/span 9}.bui-row-span-10{grid-row:span 10/span 10}.bui-row-span-11{grid-row:span 11/span 11}.bui-row-span-12{grid-row:span 12/span 12}.bui-row-span-auto{grid-row:span auto/span auto}@media (width>=640px){.xs\:bui-columns-1{grid-template-columns:repeat(1,minmax(0,1fr))}.xs\:bui-columns-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xs\:bui-columns-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xs\:bui-columns-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xs\:bui-columns-5{grid-template-columns:repeat(5,minmax(0,1fr))}.xs\:bui-columns-6{grid-template-columns:repeat(6,minmax(0,1fr))}.xs\:bui-columns-7{grid-template-columns:repeat(7,minmax(0,1fr))}.xs\:bui-columns-8{grid-template-columns:repeat(8,minmax(0,1fr))}.xs\:bui-columns-9{grid-template-columns:repeat(9,minmax(0,1fr))}.xs\:bui-columns-10{grid-template-columns:repeat(10,minmax(0,1fr))}.xs\:bui-columns-11{grid-template-columns:repeat(11,minmax(0,1fr))}.xs\:bui-columns-12{grid-template-columns:repeat(12,minmax(0,1fr))}.xs\:bui-columns-auto{grid-template-columns:repeat(auto-fit,minmax(0,1fr))}.xs\:bui-col-span-1{grid-column:span 1/span 1}.xs\:bui-col-span-2{grid-column:span 2/span 2}.xs\:bui-col-span-3{grid-column:span 3/span 3}.xs\:bui-col-span-4{grid-column:span 4/span 4}.xs\:bui-col-span-5{grid-column:span 5/span 5}.xs\:bui-col-span-6{grid-column:span 6/span 6}.xs\:bui-col-span-7{grid-column:span 7/span 7}.xs\:bui-col-span-8{grid-column:span 8/span 8}.xs\:bui-col-span-9{grid-column:span 9/span 9}.xs\:bui-col-span-10{grid-column:span 10/span 10}.xs\:bui-col-span-11{grid-column:span 11/span 11}.xs\:bui-col-span-12{grid-column:span 12/span 12}.xs\:bui-col-span-auto{grid-column:span auto/span auto}.xs\:bui-col-start-1{grid-column-start:1}.xs\:bui-col-start-2{grid-column-start:2}.xs\:bui-col-start-3{grid-column-start:3}.xs\:bui-col-start-4{grid-column-start:4}.xs\:bui-col-start-5{grid-column-start:5}.xs\:bui-col-start-6{grid-column-start:6}.xs\:bui-col-start-7{grid-column-start:7}.xs\:bui-col-start-8{grid-column-start:8}.xs\:bui-col-start-9{grid-column-start:9}.xs\:bui-col-start-10{grid-column-start:10}.xs\:bui-col-start-11{grid-column-start:11}.xs\:bui-col-start-12{grid-column-start:12}.xs\:bui-col-start-13{grid-column-start:13}.xs\:bui-col-start-auto{grid-column-start:auto}.xs\:bui-col-end-1{grid-column-end:1}.xs\:bui-col-end-2{grid-column-end:2}.xs\:bui-col-end-3{grid-column-end:3}.xs\:bui-col-end-4{grid-column-end:4}.xs\:bui-col-end-5{grid-column-end:5}.xs\:bui-col-end-6{grid-column-end:6}.xs\:bui-col-end-7{grid-column-end:7}.xs\:bui-col-end-8{grid-column-end:8}.xs\:bui-col-end-9{grid-column-end:9}.xs\:bui-col-end-10{grid-column-end:10}.xs\:bui-col-end-11{grid-column-end:11}.xs\:bui-col-end-12{grid-column-end:12}.xs\:bui-col-end-13{grid-column-end:13}.xs\:bui-col-end-auto{grid-column-end:auto}.xs\:bui-row-span-1{grid-row:span 1/span 1}.xs\:bui-row-span-2{grid-row:span 2/span 2}.xs\:bui-row-span-3{grid-row:span 3/span 3}.xs\:bui-row-span-4{grid-row:span 4/span 4}.xs\:bui-row-span-5{grid-row:span 5/span 5}.xs\:bui-row-span-6{grid-row:span 6/span 6}.xs\:bui-row-span-7{grid-row:span 7/span 7}.xs\:bui-row-span-8{grid-row:span 8/span 8}.xs\:bui-row-span-9{grid-row:span 9/span 9}.xs\:bui-row-span-10{grid-row:span 10/span 10}.xs\:bui-row-span-11{grid-row:span 11/span 11}.xs\:bui-row-span-12{grid-row:span 12/span 12}.xs\:bui-row-span-auto{grid-row:span auto/span auto}}@media (width>=768px){.sm\:bui-columns-1{grid-template-columns:repeat(1,minmax(0,1fr))}.sm\:bui-columns-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:bui-columns-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:bui-columns-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:bui-columns-5{grid-template-columns:repeat(5,minmax(0,1fr))}.sm\:bui-columns-6{grid-template-columns:repeat(6,minmax(0,1fr))}.sm\:bui-columns-7{grid-template-columns:repeat(7,minmax(0,1fr))}.sm\:bui-columns-8{grid-template-columns:repeat(8,minmax(0,1fr))}.sm\:bui-columns-9{grid-template-columns:repeat(9,minmax(0,1fr))}.sm\:bui-columns-10{grid-template-columns:repeat(10,minmax(0,1fr))}.sm\:bui-columns-11{grid-template-columns:repeat(11,minmax(0,1fr))}.sm\:bui-columns-12{grid-template-columns:repeat(12,minmax(0,1fr))}.sm\:bui-columns-auto{grid-template-columns:repeat(auto-fit,minmax(0,1fr))}.sm\:bui-col-span-1{grid-column:span 1/span 1}.sm\:bui-col-span-2{grid-column:span 2/span 2}.sm\:bui-col-span-3{grid-column:span 3/span 3}.sm\:bui-col-span-4{grid-column:span 4/span 4}.sm\:bui-col-span-5{grid-column:span 5/span 5}.sm\:bui-col-span-6{grid-column:span 6/span 6}.sm\:bui-col-span-7{grid-column:span 7/span 7}.sm\:bui-col-span-8{grid-column:span 8/span 8}.sm\:bui-col-span-9{grid-column:span 9/span 9}.sm\:bui-col-span-10{grid-column:span 10/span 10}.sm\:bui-col-span-11{grid-column:span 11/span 11}.sm\:bui-col-span-12{grid-column:span 12/span 12}.sm\:bui-col-span-auto{grid-column:span auto/span auto}.sm\:bui-col-start-1{grid-column-start:1}.sm\:bui-col-start-2{grid-column-start:2}.sm\:bui-col-start-3{grid-column-start:3}.sm\:bui-col-start-4{grid-column-start:4}.sm\:bui-col-start-5{grid-column-start:5}.sm\:bui-col-start-6{grid-column-start:6}.sm\:bui-col-start-7{grid-column-start:7}.sm\:bui-col-start-8{grid-column-start:8}.sm\:bui-col-start-9{grid-column-start:9}.sm\:bui-col-start-10{grid-column-start:10}.sm\:bui-col-start-11{grid-column-start:11}.sm\:bui-col-start-12{grid-column-start:12}.sm\:bui-col-start-13{grid-column-start:13}.sm\:bui-col-start-auto{grid-column-start:auto}.sm\:bui-col-end-1{grid-column-end:1}.sm\:bui-col-end-2{grid-column-end:2}.sm\:bui-col-end-3{grid-column-end:3}.sm\:bui-col-end-4{grid-column-end:4}.sm\:bui-col-end-5{grid-column-end:5}.sm\:bui-col-end-6{grid-column-end:6}.sm\:bui-col-end-7{grid-column-end:7}.sm\:bui-col-end-8{grid-column-end:8}.sm\:bui-col-end-9{grid-column-end:9}.sm\:bui-col-end-10{grid-column-end:10}.sm\:bui-col-end-11{grid-column-end:11}.sm\:bui-col-end-12{grid-column-end:12}.sm\:bui-col-end-13{grid-column-end:13}.sm\:bui-col-end-auto{grid-column-end:auto}.sm\:bui-row-span-1{grid-row:span 1/span 1}.sm\:bui-row-span-2{grid-row:span 2/span 2}.sm\:bui-row-span-3{grid-row:span 3/span 3}.sm\:bui-row-span-4{grid-row:span 4/span 4}.sm\:bui-row-span-5{grid-row:span 5/span 5}.sm\:bui-row-span-6{grid-row:span 6/span 6}.sm\:bui-row-span-7{grid-row:span 7/span 7}.sm\:bui-row-span-8{grid-row:span 8/span 8}.sm\:bui-row-span-9{grid-row:span 9/span 9}.sm\:bui-row-span-10{grid-row:span 10/span 10}.sm\:bui-row-span-11{grid-row:span 11/span 11}.sm\:bui-row-span-12{grid-row:span 12/span 12}.sm\:bui-row-span-auto{grid-row:span auto/span auto}}@media (width>=1024px){.md\:bui-columns-1{grid-template-columns:repeat(1,minmax(0,1fr))}.md\:bui-columns-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:bui-columns-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:bui-columns-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:bui-columns-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\:bui-columns-6{grid-template-columns:repeat(6,minmax(0,1fr))}.md\:bui-columns-7{grid-template-columns:repeat(7,minmax(0,1fr))}.md\:bui-columns-8{grid-template-columns:repeat(8,minmax(0,1fr))}.md\:bui-columns-9{grid-template-columns:repeat(9,minmax(0,1fr))}.md\:bui-columns-10{grid-template-columns:repeat(10,minmax(0,1fr))}.md\:bui-columns-11{grid-template-columns:repeat(11,minmax(0,1fr))}.md\:bui-columns-12{grid-template-columns:repeat(12,minmax(0,1fr))}.md\:bui-columns-auto{grid-template-columns:repeat(auto-fit,minmax(0,1fr))}.md\:bui-col-span-1{grid-column:span 1/span 1}.md\:bui-col-span-2{grid-column:span 2/span 2}.md\:bui-col-span-3{grid-column:span 3/span 3}.md\:bui-col-span-4{grid-column:span 4/span 4}.md\:bui-col-span-5{grid-column:span 5/span 5}.md\:bui-col-span-6{grid-column:span 6/span 6}.md\:bui-col-span-7{grid-column:span 7/span 7}.md\:bui-col-span-8{grid-column:span 8/span 8}.md\:bui-col-span-9{grid-column:span 9/span 9}.md\:bui-col-span-10{grid-column:span 10/span 10}.md\:bui-col-span-11{grid-column:span 11/span 11}.md\:bui-col-span-12{grid-column:span 12/span 12}.md\:bui-col-span-auto{grid-column:span auto/span auto}.md\:bui-col-start-1{grid-column-start:1}.md\:bui-col-start-2{grid-column-start:2}.md\:bui-col-start-3{grid-column-start:3}.md\:bui-col-start-4{grid-column-start:4}.md\:bui-col-start-5{grid-column-start:5}.md\:bui-col-start-6{grid-column-start:6}.md\:bui-col-start-7{grid-column-start:7}.md\:bui-col-start-8{grid-column-start:8}.md\:bui-col-start-9{grid-column-start:9}.md\:bui-col-start-10{grid-column-start:10}.md\:bui-col-start-11{grid-column-start:11}.md\:bui-col-start-12{grid-column-start:12}.md\:bui-col-start-13{grid-column-start:13}.md\:bui-col-start-auto{grid-column-start:auto}.md\:bui-col-end-1{grid-column-end:1}.md\:bui-col-end-2{grid-column-end:2}.md\:bui-col-end-3{grid-column-end:3}.md\:bui-col-end-4{grid-column-end:4}.md\:bui-col-end-5{grid-column-end:5}.md\:bui-col-end-6{grid-column-end:6}.md\:bui-col-end-7{grid-column-end:7}.md\:bui-col-end-8{grid-column-end:8}.md\:bui-col-end-9{grid-column-end:9}.md\:bui-col-end-10{grid-column-end:10}.md\:bui-col-end-11{grid-column-end:11}.md\:bui-col-end-12{grid-column-end:12}.md\:bui-col-end-13{grid-column-end:13}.md\:bui-col-end-auto{grid-column-end:auto}.md\:bui-row-span-1{grid-row:span 1/span 1}.md\:bui-row-span-2{grid-row:span 2/span 2}.md\:bui-row-span-3{grid-row:span 3/span 3}.md\:bui-row-span-4{grid-row:span 4/span 4}.md\:bui-row-span-5{grid-row:span 5/span 5}.md\:bui-row-span-6{grid-row:span 6/span 6}.md\:bui-row-span-7{grid-row:span 7/span 7}.md\:bui-row-span-8{grid-row:span 8/span 8}.md\:bui-row-span-9{grid-row:span 9/span 9}.md\:bui-row-span-10{grid-row:span 10/span 10}.md\:bui-row-span-11{grid-row:span 11/span 11}.md\:bui-row-span-12{grid-row:span 12/span 12}.md\:bui-row-span-auto{grid-row:span auto/span auto}}@media (width>=1280px){.lg\:bui-columns-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lg\:bui-columns-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:bui-columns-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:bui-columns-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:bui-columns-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:bui-columns-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:bui-columns-7{grid-template-columns:repeat(7,minmax(0,1fr))}.lg\:bui-columns-8{grid-template-columns:repeat(8,minmax(0,1fr))}.lg\:bui-columns-9{grid-template-columns:repeat(9,minmax(0,1fr))}.lg\:bui-columns-10{grid-template-columns:repeat(10,minmax(0,1fr))}.lg\:bui-columns-11{grid-template-columns:repeat(11,minmax(0,1fr))}.lg\:bui-columns-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:bui-columns-auto{grid-template-columns:repeat(auto-fit,minmax(0,1fr))}.lg\:bui-col-span-1{grid-column:span 1/span 1}.lg\:bui-col-span-2{grid-column:span 2/span 2}.lg\:bui-col-span-3{grid-column:span 3/span 3}.lg\:bui-col-span-4{grid-column:span 4/span 4}.lg\:bui-col-span-5{grid-column:span 5/span 5}.lg\:bui-col-span-6{grid-column:span 6/span 6}.lg\:bui-col-span-7{grid-column:span 7/span 7}.lg\:bui-col-span-8{grid-column:span 8/span 8}.lg\:bui-col-span-9{grid-column:span 9/span 9}.lg\:bui-col-span-10{grid-column:span 10/span 10}.lg\:bui-col-span-11{grid-column:span 11/span 11}.lg\:bui-col-span-12{grid-column:span 12/span 12}.lg\:bui-col-span-auto{grid-column:span auto/span auto}.lg\:bui-col-start-1{grid-column-start:1}.lg\:bui-col-start-2{grid-column-start:2}.lg\:bui-col-start-3{grid-column-start:3}.lg\:bui-col-start-4{grid-column-start:4}.lg\:bui-col-start-5{grid-column-start:5}.lg\:bui-col-start-6{grid-column-start:6}.lg\:bui-col-start-7{grid-column-start:7}.lg\:bui-col-start-8{grid-column-start:8}.lg\:bui-col-start-9{grid-column-start:9}.lg\:bui-col-start-10{grid-column-start:10}.lg\:bui-col-start-11{grid-column-start:11}.lg\:bui-col-start-12{grid-column-start:12}.lg\:bui-col-start-13{grid-column-start:13}.lg\:bui-col-start-auto{grid-column-start:auto}.lg\:bui-col-end-1{grid-column-end:1}.lg\:bui-col-end-2{grid-column-end:2}.lg\:bui-col-end-3{grid-column-end:3}.lg\:bui-col-end-4{grid-column-end:4}.lg\:bui-col-end-5{grid-column-end:5}.lg\:bui-col-end-6{grid-column-end:6}.lg\:bui-col-end-7{grid-column-end:7}.lg\:bui-col-end-8{grid-column-end:8}.lg\:bui-col-end-9{grid-column-end:9}.lg\:bui-col-end-10{grid-column-end:10}.lg\:bui-col-end-11{grid-column-end:11}.lg\:bui-col-end-12{grid-column-end:12}.lg\:bui-col-end-13{grid-column-end:13}.lg\:bui-col-end-auto{grid-column-end:auto}.lg\:bui-row-span-1{grid-row:span 1/span 1}.lg\:bui-row-span-2{grid-row:span 2/span 2}.lg\:bui-row-span-3{grid-row:span 3/span 3}.lg\:bui-row-span-4{grid-row:span 4/span 4}.lg\:bui-row-span-5{grid-row:span 5/span 5}.lg\:bui-row-span-6{grid-row:span 6/span 6}.lg\:bui-row-span-7{grid-row:span 7/span 7}.lg\:bui-row-span-8{grid-row:span 8/span 8}.lg\:bui-row-span-9{grid-row:span 9/span 9}.lg\:bui-row-span-10{grid-row:span 10/span 10}.lg\:bui-row-span-11{grid-row:span 11/span 11}.lg\:bui-row-span-12{grid-row:span 12/span 12}.lg\:bui-row-span-auto{grid-row:span auto/span auto}}@media (width>=1536px){.xl\:bui-columns-1{grid-template-columns:repeat(1,minmax(0,1fr))}.xl\:bui-columns-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:bui-columns-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:bui-columns-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:bui-columns-5{grid-template-columns:repeat(5,minmax(0,1fr))}.xl\:bui-columns-6{grid-template-columns:repeat(6,minmax(0,1fr))}.xl\:bui-columns-7{grid-template-columns:repeat(7,minmax(0,1fr))}.xl\:bui-columns-8{grid-template-columns:repeat(8,minmax(0,1fr))}.xl\:bui-columns-9{grid-template-columns:repeat(9,minmax(0,1fr))}.xl\:bui-columns-10{grid-template-columns:repeat(10,minmax(0,1fr))}.xl\:bui-columns-11{grid-template-columns:repeat(11,minmax(0,1fr))}.xl\:bui-columns-12{grid-template-columns:repeat(12,minmax(0,1fr))}.xl\:bui-columns-auto{grid-template-columns:repeat(auto-fit,minmax(0,1fr))}.xl\:bui-col-span-1{grid-column:span 1/span 1}.xl\:bui-col-span-2{grid-column:span 2/span 2}.xl\:bui-col-span-3{grid-column:span 3/span 3}.xl\:bui-col-span-4{grid-column:span 4/span 4}.xl\:bui-col-span-5{grid-column:span 5/span 5}.xl\:bui-col-span-6{grid-column:span 6/span 6}.xl\:bui-col-span-7{grid-column:span 7/span 7}.xl\:bui-col-span-8{grid-column:span 8/span 8}.xl\:bui-col-span-9{grid-column:span 9/span 9}.xl\:bui-col-span-10{grid-column:span 10/span 10}.xl\:bui-col-span-11{grid-column:span 11/span 11}.xl\:bui-col-span-12{grid-column:span 12/span 12}.xl\:bui-col-span-auto{grid-column:span auto/span auto}.xl\:bui-col-start-1{grid-column-start:1}.xl\:bui-col-start-2{grid-column-start:2}.xl\:bui-col-start-3{grid-column-start:3}.xl\:bui-col-start-4{grid-column-start:4}.xl\:bui-col-start-5{grid-column-start:5}.xl\:bui-col-start-6{grid-column-start:6}.xl\:bui-col-start-7{grid-column-start:7}.xl\:bui-col-start-8{grid-column-start:8}.xl\:bui-col-start-9{grid-column-start:9}.xl\:bui-col-start-10{grid-column-start:10}.xl\:bui-col-start-11{grid-column-start:11}.xl\:bui-col-start-12{grid-column-start:12}.xl\:bui-col-start-13{grid-column-start:13}.xl\:bui-col-start-auto{grid-column-start:auto}.xl\:bui-col-end-1{grid-column-end:1}.xl\:bui-col-end-2{grid-column-end:2}.xl\:bui-col-end-3{grid-column-end:3}.xl\:bui-col-end-4{grid-column-end:4}.xl\:bui-col-end-5{grid-column-end:5}.xl\:bui-col-end-6{grid-column-end:6}.xl\:bui-col-end-7{grid-column-end:7}.xl\:bui-col-end-8{grid-column-end:8}.xl\:bui-col-end-9{grid-column-end:9}.xl\:bui-col-end-10{grid-column-end:10}.xl\:bui-col-end-11{grid-column-end:11}.xl\:bui-col-end-12{grid-column-end:12}.xl\:bui-col-end-13{grid-column-end:13}.xl\:bui-col-end-auto{grid-column-end:auto}.xl\:bui-row-span-1{grid-row:span 1/span 1}.xl\:bui-row-span-2{grid-row:span 2/span 2}.xl\:bui-row-span-3{grid-row:span 3/span 3}.xl\:bui-row-span-4{grid-row:span 4/span 4}.xl\:bui-row-span-5{grid-row:span 5/span 5}.xl\:bui-row-span-6{grid-row:span 6/span 6}.xl\:bui-row-span-7{grid-row:span 7/span 7}.xl\:bui-row-span-8{grid-row:span 8/span 8}.xl\:bui-row-span-9{grid-row:span 9/span 9}.xl\:bui-row-span-10{grid-row:span 10/span 10}.xl\:bui-row-span-11{grid-row:span 11/span 11}.xl\:bui-row-span-12{grid-row:span 12/span 12}.xl\:bui-row-span-auto{grid-row:span auto/span auto}}.bui-gap{gap:var(--gap)}.bui-gap-0\.5{gap:var(--bui-space-0_5)}.bui-gap-1{gap:var(--bui-space-1)}.bui-gap-1\.5{gap:var(--bui-space-1_5)}.bui-gap-2{gap:var(--bui-space-2)}.bui-gap-3{gap:var(--bui-space-3)}.bui-gap-4{gap:var(--bui-space-4)}.bui-gap-5{gap:var(--bui-space-5)}.bui-gap-6{gap:var(--bui-space-6)}.bui-gap-7{gap:var(--bui-space-7)}.bui-gap-8{gap:var(--bui-space-8)}.bui-gap-9{gap:var(--bui-space-9)}.bui-gap-10{gap:var(--bui-space-10)}.bui-gap-11{gap:var(--bui-space-11)}.bui-gap-12{gap:var(--bui-space-12)}.bui-gap-13{gap:var(--bui-space-13)}.bui-gap-14{gap:var(--bui-space-14)}@media (width>=640px){.xs\:bui-gap{gap:var(--gap-xs)}.xs\:bui-gap-0\.5{gap:var(--bui-space-0_5)}.xs\:bui-gap-1{gap:var(--bui-space-1)}.xs\:bui-gap-1\.5{gap:var(--bui-space-1_5)}.xs\:bui-gap-2{gap:var(--bui-space-2)}.xs\:bui-gap-3{gap:var(--bui-space-3)}.xs\:bui-gap-4{gap:var(--bui-space-4)}.xs\:bui-gap-5{gap:var(--bui-space-5)}.xs\:bui-gap-6{gap:var(--bui-space-6)}.xs\:bui-gap-7{gap:var(--bui-space-7)}.xs\:bui-gap-8{gap:var(--bui-space-8)}.xs\:bui-gap-9{gap:var(--bui-space-9)}.xs\:bui-gap-10{gap:var(--bui-space-10)}.xs\:bui-gap-11{gap:var(--bui-space-11)}.xs\:bui-gap-12{gap:var(--bui-space-12)}.xs\:bui-gap-13{gap:var(--bui-space-13)}.xs\:bui-gap-14{gap:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-gap{gap:var(--gap-sm)}.sm\:bui-gap-0\.5{gap:var(--bui-space-0_5)}.sm\:bui-gap-1{gap:var(--bui-space-1)}.sm\:bui-gap-1\.5{gap:var(--bui-space-1_5)}.sm\:bui-gap-2{gap:var(--bui-space-2)}.sm\:bui-gap-3{gap:var(--bui-space-3)}.sm\:bui-gap-4{gap:var(--bui-space-4)}.sm\:bui-gap-5{gap:var(--bui-space-5)}.sm\:bui-gap-6{gap:var(--bui-space-6)}.sm\:bui-gap-7{gap:var(--bui-space-7)}.sm\:bui-gap-8{gap:var(--bui-space-8)}.sm\:bui-gap-9{gap:var(--bui-space-9)}.sm\:bui-gap-10{gap:var(--bui-space-10)}.sm\:bui-gap-11{gap:var(--bui-space-11)}.sm\:bui-gap-12{gap:var(--bui-space-12)}.sm\:bui-gap-13{gap:var(--bui-space-13)}.sm\:bui-gap-14{gap:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-gap{gap:var(--gap-md)}.md\:bui-gap-0\.5{gap:var(--bui-space-0_5)}.md\:bui-gap-1{gap:var(--bui-space-1)}.md\:bui-gap-1\.5{gap:var(--bui-space-1_5)}.md\:bui-gap-2{gap:var(--bui-space-2)}.md\:bui-gap-3{gap:var(--bui-space-3)}.md\:bui-gap-4{gap:var(--bui-space-4)}.md\:bui-gap-5{gap:var(--bui-space-5)}.md\:bui-gap-6{gap:var(--bui-space-6)}.md\:bui-gap-7{gap:var(--bui-space-7)}.md\:bui-gap-8{gap:var(--bui-space-8)}.md\:bui-gap-9{gap:var(--bui-space-9)}.md\:bui-gap-10{gap:var(--bui-space-10)}.md\:bui-gap-11{gap:var(--bui-space-11)}.md\:bui-gap-12{gap:var(--bui-space-12)}.md\:bui-gap-13{gap:var(--bui-space-13)}.md\:bui-gap-14{gap:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-gap{gap:var(--gap-lg)}.lg\:bui-gap-0\.5{gap:var(--bui-space-0_5)}.lg\:bui-gap-1{gap:var(--bui-space-1)}.lg\:bui-gap-1\.5{gap:var(--bui-space-1_5)}.lg\:bui-gap-2{gap:var(--bui-space-2)}.lg\:bui-gap-3{gap:var(--bui-space-3)}.lg\:bui-gap-4{gap:var(--bui-space-4)}.lg\:bui-gap-5{gap:var(--bui-space-5)}.lg\:bui-gap-6{gap:var(--bui-space-6)}.lg\:bui-gap-7{gap:var(--bui-space-7)}.lg\:bui-gap-8{gap:var(--bui-space-8)}.lg\:bui-gap-9{gap:var(--bui-space-9)}.lg\:bui-gap-10{gap:var(--bui-space-10)}.lg\:bui-gap-11{gap:var(--bui-space-11)}.lg\:bui-gap-12{gap:var(--bui-space-12)}.lg\:bui-gap-13{gap:var(--bui-space-13)}.lg\:bui-gap-14{gap:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-gap{gap:var(--gap-xl)}.xl\:bui-gap-0\.5{gap:var(--bui-space-0_5)}.xl\:bui-gap-1{gap:var(--bui-space-1)}.xl\:bui-gap-1\.5{gap:var(--bui-space-1_5)}.xl\:bui-gap-2{gap:var(--bui-space-2)}.xl\:bui-gap-3{gap:var(--bui-space-3)}.xl\:bui-gap-4{gap:var(--bui-space-4)}.xl\:bui-gap-5{gap:var(--bui-space-5)}.xl\:bui-gap-6{gap:var(--bui-space-6)}.xl\:bui-gap-7{gap:var(--bui-space-7)}.xl\:bui-gap-8{gap:var(--bui-space-8)}.xl\:bui-gap-9{gap:var(--bui-space-9)}.xl\:bui-gap-10{gap:var(--bui-space-10)}.xl\:bui-gap-11{gap:var(--bui-space-11)}.xl\:bui-gap-12{gap:var(--bui-space-12)}.xl\:bui-gap-13{gap:var(--bui-space-13)}.xl\:bui-gap-14{gap:var(--bui-space-14)}}.bui-align-start{align-items:start}.bui-align-center{align-items:center}.bui-align-end{align-items:end}.bui-align-baseline{align-items:baseline}.bui-align-stretch{align-items:stretch}.bui-jc-start{justify-content:start}.bui-jc-center{justify-content:center}.bui-jc-end{justify-content:end}.bui-jc-between{justify-content:space-between}.bui-fd-row{flex-direction:row}.bui-fd-column{flex-direction:column}.bui-fd-row-reverse{flex-direction:row-reverse}.bui-fd-column-reverse{flex-direction:column-reverse}@media (width>=640px){.xs\:bui-align-start{align-items:start}.xs\:bui-align-center{align-items:center}.xs\:bui-align-end{align-items:end}.xs\:bui-align-stretch{align-items:stretch}.xs\:bui-jc-start{justify-content:start}.xs\:bui-jc-center{justify-content:center}.xs\:bui-jc-end{justify-content:end}.xs\:bui-jc-between{justify-content:space-between}.xs\:bui-fd-row{flex-direction:row}.xs\:bui-fd-column{flex-direction:column}.xs\:bui-fd-row-reverse{flex-direction:row-reverse}.xs\:bui-fd-column-reverse{flex-direction:column-reverse}}@media (width>=768px){.sm\:bui-align-start{align-items:start}.sm\:bui-align-center{align-items:center}.sm\:bui-align-end{align-items:end}.sm\:bui-align-stretch{align-items:stretch}.sm\:bui-jc-start{justify-content:start}.sm\:bui-jc-center{justify-content:center}.sm\:bui-jc-end{justify-content:end}.sm\:bui-jc-between{justify-content:space-between}.sm\:bui-fd-row{flex-direction:row}.sm\:bui-fd-column{flex-direction:column}.sm\:bui-fd-row-reverse{flex-direction:row-reverse}.sm\:bui-fd-column-reverse{flex-direction:column-reverse}}@media (width>=1024px){.md\:bui-align-start{align-items:start}.md\:bui-align-center{align-items:center}.md\:bui-align-end{align-items:end}.md\:bui-align-stretch{align-items:stretch}.md\:bui-jc-start{justify-content:start}.md\:bui-jc-center{justify-content:center}.md\:bui-jc-end{justify-content:end}.md\:bui-jc-between{justify-content:space-between}.md\:bui-fd-row{flex-direction:row}.md\:bui-fd-column{flex-direction:column}.md\:bui-fd-row-reverse{flex-direction:row-reverse}.md\:bui-fd-column-reverse{flex-direction:column-reverse}}@media (width>=1280px){.lg\:bui-align-start{align-items:start}.lg\:bui-align-center{align-items:center}.lg\:bui-align-end{align-items:end}.lg\:bui-align-stretch{align-items:stretch}.lg\:bui-jc-start{justify-content:start}.lg\:bui-jc-center{justify-content:center}.lg\:bui-jc-end{justify-content:end}.lg\:bui-jc-between{justify-content:space-between}.lg\:bui-fd-row{flex-direction:row}.lg\:bui-fd-column{flex-direction:column}.lg\:bui-fd-row-reverse{flex-direction:row-reverse}.lg\:bui-fd-column-reverse{flex-direction:column-reverse}}@media (width>=1536px){.xl\:bui-align-start{align-items:start}.xl\:bui-align-center{align-items:center}.xl\:bui-align-end{align-items:end}.xl\:bui-align-stretch{align-items:stretch}.xl\:bui-jc-start{justify-content:start}.xl\:bui-jc-center{justify-content:center}.xl\:bui-jc-end{justify-content:end}.xl\:bui-jc-between{justify-content:space-between}.xl\:bui-fd-row{flex-direction:row}.xl\:bui-fd-column{flex-direction:column}.xl\:bui-fd-row-reverse{flex-direction:row-reverse}.xl\:bui-fd-column-reverse{flex-direction:column-reverse}}}
\ No newline at end of file
diff --git a/docs-ui/public/theme-spotify.css b/docs-ui/public/theme-spotify.css
index b0bf517701..0f2ecc6081 100644
--- a/docs-ui/public/theme-spotify.css
+++ b/docs-ui/public/theme-spotify.css
@@ -1 +1 @@
-@font-face{font-family:CircularSpTitle;font-weight:900;font-display:swap;unicode-range:U+0,U+D,U+20-7E,U+A0-17E,U+18F,U+192,U+1A0-1A1,U+1AF-1B0,U+1B5-1B6,U+1C4-1C6,U+1F1-1F3,U+1FA-1FF,U+218-21B,U+237,U+259,U+2BB-2BC,U+2C6-2C7,U+2C9,U+2D8-2DD,U+300-301,U+303,U+309,U+323,U+394,U+3A9,U+3BC,U+3C0,U+1E80-1E85,U+1E8A-1E8B,U+1EA0-1EF9,U+1FD6,U+2007-2008,U+200B,U+2010-2011,U+2013-2014,U+2018-201A,U+201C-201E,U+2020-2022,U+2026,U+2030,U+2032-2033,U+2039-203A,U+2042,U+2044,U+2051,U+2070,U+2074-2079,U+2080-2089,U+20AB-20AC,U+2113,U+2117,U+2122,U+2126,U+2160-2169,U+216C-216F,U+2190-2193,U+2196-2199,U+21A9,U+21B0-21B5,U+21C6,U+2202,U+2206,U+220F,U+2211-2212,U+2215,U+2219-221A,U+221E,U+222B,U+2248,U+2260,U+2264-2265,U+22C5,U+24C5,U+25A0-25A1,U+25AF,U+25B2-25B3,U+25CA-25CB,U+25CF,U+262E,U+2713,U+2715,U+2780-2788,U+E000,U+E002,U+F6C3,U+FB00-FB04,U+FEFF,U+FF0C,U+FF0E,U+FF1A-FF1B,U+FFFF;src:url(https://encore.scdn.co/fonts/CircularSpTitle-Black-4588c99025b967475c31695b0743dd1a.woff2)format("woff2"),url(https://encore.scdn.co/fonts/CircularSpTitle-Black-506746f387a26f25aa3d023b3e501d34.woff)format("woff")}@font-face{font-family:CircularSpTitle;font-weight:700;font-display:swap;unicode-range:U+0,U+D,U+20-7E,U+A0-17E,U+18F,U+192,U+1A0-1A1,U+1AF-1B0,U+1B5-1B6,U+1C4-1C6,U+1F1-1F3,U+1FA-1FF,U+218-21B,U+237,U+259,U+2BB-2BC,U+2C6-2C7,U+2C9,U+2D8-2DD,U+300-301,U+303,U+309,U+323,U+394,U+3A9,U+3BC,U+3C0,U+1E80-1E85,U+1E8A-1E8B,U+1EA0-1EF9,U+1FD6,U+2007-2008,U+200B,U+2010-2011,U+2013-2014,U+2018-201A,U+201C-201E,U+2020-2022,U+2026,U+2030,U+2032-2033,U+2039-203A,U+2042,U+2044,U+2051,U+2070,U+2074-2079,U+2080-2089,U+20AB-20AC,U+2113,U+2117,U+2122,U+2126,U+2160-2169,U+216C-216F,U+2190-2193,U+2196-2199,U+21A9,U+21B0-21B5,U+21C6,U+2202,U+2206,U+220F,U+2211-2212,U+2215,U+2219-221A,U+221E,U+222B,U+2248,U+2260,U+2264-2265,U+22C5,U+24C5,U+25A0-25A1,U+25AF,U+25B2-25B3,U+25CA-25CB,U+25CF,U+262E,U+2713,U+2715,U+2780-2788,U+E000,U+E002,U+F6C3,U+FB00-FB04,U+FEFF,U+FF0C,U+FF0E,U+FF1A-FF1B,U+FFFF;src:url(https://encore.scdn.co/fonts/CircularSpTitle-Bold-b2586b06a2e1522e9d879d84c2792a58.woff2)format("woff2"),url(https://encore.scdn.co/fonts/CircularSpTitle-Bold-1624fb2df28c20d7203d7fb86ce8b481.woff)format("woff")}@font-face{font-family:CircularSp;font-weight:700;font-display:swap;unicode-range:U+0,U+D,U+20-7E,U+A0-17E,U+18F,U+192,U+1A0-1A1,U+1AF-1B0,U+1B5-1B6,U+1C4-1C6,U+1F1-1F3,U+1FA-1FF,U+218-21B,U+237,U+259,U+2BB-2BC,U+2C6-2C7,U+2C9,U+2D8-2DD,U+300-301,U+303,U+309,U+323,U+394,U+3A9,U+3BC,U+3C0,U+1E80-1E85,U+1E8A-1E8B,U+1EA0-1EF9,U+1FD6,U+2007-2008,U+200B,U+2010-2011,U+2013-2014,U+2018-201A,U+201C-201E,U+2020-2022,U+2026,U+2030,U+2032-2033,U+2039-203A,U+2042,U+2044,U+2051,U+2070,U+2074-2079,U+2080-2089,U+20AB-20AC,U+2113,U+2117,U+2122,U+2126,U+2160-2169,U+216C-216F,U+2190-2193,U+2196-2199,U+21A9,U+21B0-21B5,U+21C6,U+2202,U+2206,U+220F,U+2211-2212,U+2215,U+2219-221A,U+221E,U+222B,U+2248,U+2260,U+2264-2265,U+22C5,U+24C5,U+25A0-25A1,U+25AF,U+25B2-25B3,U+25CA-25CB,U+25CF,U+262E,U+2713,U+2715,U+2780-2788,U+E000,U+E002,U+F6C3,U+FB00-FB04,U+FEFF,U+FF0C,U+FF0E,U+FF1A-FF1B,U+FFFF;src:url(https://encore.scdn.co/fonts/CircularSp-Bold-602e7aefc706aa36c6ec1324b9bbc461.woff2)format("woff2"),url(https://encore.scdn.co/fonts/CircularSp-Bold-856afe2da4ba4e61239b129e2c16d633.woff)format("woff")}@font-face{font-family:CircularSp;font-weight:400;font-display:swap;unicode-range:U+0,U+D,U+20-7E,U+A0-17E,U+18F,U+192,U+1A0-1A1,U+1AF-1B0,U+1B5-1B6,U+1C4-1C6,U+1F1-1F3,U+1FA-1FF,U+218-21B,U+237,U+259,U+2BB-2BC,U+2C6-2C7,U+2C9,U+2D8-2DD,U+300-301,U+303,U+309,U+323,U+394,U+3A9,U+3BC,U+3C0,U+1E80-1E85,U+1E8A-1E8B,U+1EA0-1EF9,U+1FD6,U+2007-2008,U+200B,U+2010-2011,U+2013-2014,U+2018-201A,U+201C-201E,U+2020-2022,U+2026,U+2030,U+2032-2033,U+2039-203A,U+2042,U+2044,U+2051,U+2070,U+2074-2079,U+2080-2089,U+20AB-20AC,U+2113,U+2117,U+2122,U+2126,U+2160-2169,U+216C-216F,U+2190-2193,U+2196-2199,U+21A9,U+21B0-21B5,U+21C6,U+2202,U+2206,U+220F,U+2211-2212,U+2215,U+2219-221A,U+221E,U+222B,U+2248,U+2260,U+2264-2265,U+22C5,U+24C5,U+25A0-25A1,U+25AF,U+25B2-25B3,U+25CA-25CB,U+25CF,U+262E,U+2713,U+2715,U+2780-2788,U+E000,U+E002,U+F6C3,U+FB00-FB04,U+FEFF,U+FF0C,U+FF0E,U+FF1A-FF1B,U+FFFF;src:url(https://encore.scdn.co/fonts/CircularSp-Book-a00e99ef9996a3a157fb6b746856d04f.woff2)format("woff2"),url(https://encore.scdn.co/fonts/CircularSp-Book-3f73da7d35bd81c706bce7bbb84964de.woff)format("woff")}@font-face{font-family:CircularSp;font-weight:700;font-display:swap;unicode-range:U+0,U+D,U+20-7E,U+A0-17E,U+18F,U+192,U+1A0-1A1,U+1AF-1B0,U+1B5-1B6,U+1C4-1C6,U+1F1-1F3,U+1FA-1FF,U+218-21B,U+237,U+259,U+2BB-2BC,U+2C6-2C7,U+2C9,U+2D8-2DD,U+300-301,U+303,U+309,U+323,U+394,U+3A9,U+3BC,U+3C0,U+1E80-1E85,U+1E8A-1E8B,U+1EA0-1EF9,U+1FD6,U+2007-2008,U+200B,U+2010-2011,U+2013-2014,U+2018-201A,U+201C-201E,U+2020-2022,U+2026,U+2030,U+2032-2033,U+2039-203A,U+2042,U+2044,U+2051,U+2070,U+2074-2079,U+2080-2089,U+20AB-20AC,U+2113,U+2117,U+2122,U+2126,U+2160-2169,U+216C-216F,U+2190-2193,U+2196-2199,U+21A9,U+21B0-21B5,U+21C6,U+2202,U+2206,U+220F,U+2211-2212,U+2215,U+2219-221A,U+221E,U+222B,U+2248,U+2260,U+2264-2265,U+22C5,U+24C5,U+25A0-25A1,U+25AF,U+25B2-25B3,U+25CA-25CB,U+25CF,U+262E,U+2713,U+2715,U+2780-2788,U+E000,U+E002,U+F6C3,U+FB00-FB04,U+FEFF,U+FF0C,U+FF0E,U+FF1A-FF1B,U+FFFF;src:url(https://encore.scdn.co/fonts/CircularSp-Bold-602e7aefc706aa36c6ec1324b9bbc461.woff2)format("woff2"),url(https://encore.scdn.co/fonts/CircularSp-Bold-856afe2da4ba4e61239b129e2c16d633.woff)format("woff")}[data-theme-name=spotify]{--bui-font-text:CircularSp,CircularSp-Arab,CircularSp-Hebr,CircularSp-Cyrl,CircularSp-Grek,CircularSp-Deva;--bui-font-title:CircularSpTitle,CircularSp-Arab,CircularSp-Hebr,CircularSp-Cyrl,CircularSp-Grek,CircularSp-Deva;--bui-font-regular:CircularSp,CircularSp-Arab,CircularSp-Hebr,CircularSp-Cyrl,CircularSp-Grek,CircularSp-Deva;& .bui-Button{border-radius:var(--bui-radius-3);padding-inline:var(--bui-space-3)}& .bui-ButtonIcon{padding:0}& .bui-MenuPopup{box-sizing:border-box;max-width:21.25rem}& .bui-MenuSubmenuTrigger,& .bui-MenuItem{height:auto;min-height:2rem}& .bui-Text{font-family:var(--bui-font-text)}& .bui-Heading{font-family:var(--bui-font-title)}& .bui-TableRow{border-radius:var(--bui-radius-4);border:none}& .bui-TableRow:hover td:first-child{border-top-left-radius:var(--bui-radius-2);border-bottom-left-radius:var(--bui-radius-2)}& .bui-TableRow:hover td:last-child{border-top-right-radius:var(--bui-radius-2);border-bottom-right-radius:var(--bui-radius-2)}& .bui-TableBody:before,& .bui-TableBody:after{line-height:var(--bui-space-1);content:"";display:block}& .bui-TableHeader .bui-TableRow{border-bottom:1px solid var(--bui-border)}& .bui-TableHead{font-size:var(--bui-font-size-2);color:var(--bui-fg-secondary);font-weight:var(--bui-font-weight-regular)}& .bui-HeaderToolbar{padding-top:var(--bui-space-2);padding-inline:var(--bui-space-2)}& .bui-HeaderToolbarWrapper{border-radius:var(--bui-radius-3);padding-inline:var(--bui-space-3);border:none}& .bui-HeaderToolbarControls{right:calc(var(--bui-space-3) - 1px)}& .bui-HeaderTabsWrapper{margin-top:var(--bui-space-2);margin-inline:var(--bui-space-2);border-radius:var(--bui-radius-3);padding-inline:var(--bui-space-1);border:none}& .bui-Input{border-radius:var(--bui-radius-3)}& .bui-Tag{border-radius:var(--bui-radius-full)}}[data-theme-mode=light][data-theme-name=spotify]{--bui-bg:var(--bui-gray-1);--bui-bg-surface-1:var(--bui-white);--bui-bg-surface-2:var(--bui-gray-2);--bui-bg-solid:#1ed760;--bui-bg-solid-hover:#3be477;--bui-bg-solid-pressed:#1abc54;--bui-bg-solid-disabled:var(--bui-gray-2);--bui-fg-primary:var(--bui-black);--bui-fg-secondary:var(--bui-gray-7);--bui-fg-solid:var(--bui-black);--bui-border:var(--bui-gray-3);--bui-border-hover:#0000004d;--bui-border-pressed:#00000080;--bui-border-disabled:#0000001a;--bui-border-danger:#f87a7a;--bui-border-warning:#e36d05;--bui-border-success:#53db83;--bui-ring:#0003;& .bui-HeaderToolbarWrapper,& .bui-HeaderTabsWrapper{border:1px solid var(--bui-border)}}[data-theme-mode=dark][data-theme-name=spotify]{--bui-bg:var(--bui-black);--bui-bg-surface-1:var(--bui-gray-1);--bui-bg-surface-2:var(--bui-gray-2);--bui-bg-solid:#1ed760;--bui-bg-solid-hover:#3be477;--bui-bg-solid-pressed:#1abc54;--bui-bg-solid-disabled:#0f6c30;--bui-bg-tint:#242424;--bui-bg-tint-hover:#202020;--bui-bg-tint-pressed:#292929;--bui-bg-tint-disabled:#fffc;--bui-bg-danger:#3b1219;--bui-bg-warning:#302008;--bui-bg-success:#132d21;--bui-fg-primary:var(--bui-white);--bui-fg-secondary:var(--bui-gray-7);--bui-fg-link:var(--bui-white);--bui-fg-link-hover:var(--bui-white);--bui-fg-disabled:var(--bui-gray-5);--bui-fg-solid:var(--bui-black);--bui-fg-solid-disabled:#083618;--bui-fg-tint:var(--bui-white);--bui-fg-tint-disabled:var(--bui-gray-5);--bui-fg-danger:#e22b2b;--bui-fg-warning:#e36d05;--bui-fg-success:#1db954;--bui-border:var(--bui-gray-3);--bui-border-hover:#fff6;--bui-border-pressed:#ffffff80;--bui-border-disabled:#fff3;--bui-border-danger:#f87a7a;--bui-border-warning:#e36d05;--bui-border-success:#53db83;--bui-ring:#fff3}
\ No newline at end of file
+@font-face{font-family:CircularSpTitle;font-weight:900;font-display:swap;unicode-range:U+0,U+D,U+20-7E,U+A0-17E,U+18F,U+192,U+1A0-1A1,U+1AF-1B0,U+1B5-1B6,U+1C4-1C6,U+1F1-1F3,U+1FA-1FF,U+218-21B,U+237,U+259,U+2BB-2BC,U+2C6-2C7,U+2C9,U+2D8-2DD,U+300-301,U+303,U+309,U+323,U+394,U+3A9,U+3BC,U+3C0,U+1E80-1E85,U+1E8A-1E8B,U+1EA0-1EF9,U+1FD6,U+2007-2008,U+200B,U+2010-2011,U+2013-2014,U+2018-201A,U+201C-201E,U+2020-2022,U+2026,U+2030,U+2032-2033,U+2039-203A,U+2042,U+2044,U+2051,U+2070,U+2074-2079,U+2080-2089,U+20AB-20AC,U+2113,U+2117,U+2122,U+2126,U+2160-2169,U+216C-216F,U+2190-2193,U+2196-2199,U+21A9,U+21B0-21B5,U+21C6,U+2202,U+2206,U+220F,U+2211-2212,U+2215,U+2219-221A,U+221E,U+222B,U+2248,U+2260,U+2264-2265,U+22C5,U+24C5,U+25A0-25A1,U+25AF,U+25B2-25B3,U+25CA-25CB,U+25CF,U+262E,U+2713,U+2715,U+2780-2788,U+E000,U+E002,U+F6C3,U+FB00-FB04,U+FEFF,U+FF0C,U+FF0E,U+FF1A-FF1B,U+FFFF;src:url(https://encore.scdn.co/fonts/CircularSpTitle-Black-4588c99025b967475c31695b0743dd1a.woff2)format("woff2"),url(https://encore.scdn.co/fonts/CircularSpTitle-Black-506746f387a26f25aa3d023b3e501d34.woff)format("woff")}@font-face{font-family:CircularSpTitle;font-weight:700;font-display:swap;unicode-range:U+0,U+D,U+20-7E,U+A0-17E,U+18F,U+192,U+1A0-1A1,U+1AF-1B0,U+1B5-1B6,U+1C4-1C6,U+1F1-1F3,U+1FA-1FF,U+218-21B,U+237,U+259,U+2BB-2BC,U+2C6-2C7,U+2C9,U+2D8-2DD,U+300-301,U+303,U+309,U+323,U+394,U+3A9,U+3BC,U+3C0,U+1E80-1E85,U+1E8A-1E8B,U+1EA0-1EF9,U+1FD6,U+2007-2008,U+200B,U+2010-2011,U+2013-2014,U+2018-201A,U+201C-201E,U+2020-2022,U+2026,U+2030,U+2032-2033,U+2039-203A,U+2042,U+2044,U+2051,U+2070,U+2074-2079,U+2080-2089,U+20AB-20AC,U+2113,U+2117,U+2122,U+2126,U+2160-2169,U+216C-216F,U+2190-2193,U+2196-2199,U+21A9,U+21B0-21B5,U+21C6,U+2202,U+2206,U+220F,U+2211-2212,U+2215,U+2219-221A,U+221E,U+222B,U+2248,U+2260,U+2264-2265,U+22C5,U+24C5,U+25A0-25A1,U+25AF,U+25B2-25B3,U+25CA-25CB,U+25CF,U+262E,U+2713,U+2715,U+2780-2788,U+E000,U+E002,U+F6C3,U+FB00-FB04,U+FEFF,U+FF0C,U+FF0E,U+FF1A-FF1B,U+FFFF;src:url(https://encore.scdn.co/fonts/CircularSpTitle-Bold-b2586b06a2e1522e9d879d84c2792a58.woff2)format("woff2"),url(https://encore.scdn.co/fonts/CircularSpTitle-Bold-1624fb2df28c20d7203d7fb86ce8b481.woff)format("woff")}@font-face{font-family:CircularSp;font-weight:700;font-display:swap;unicode-range:U+0,U+D,U+20-7E,U+A0-17E,U+18F,U+192,U+1A0-1A1,U+1AF-1B0,U+1B5-1B6,U+1C4-1C6,U+1F1-1F3,U+1FA-1FF,U+218-21B,U+237,U+259,U+2BB-2BC,U+2C6-2C7,U+2C9,U+2D8-2DD,U+300-301,U+303,U+309,U+323,U+394,U+3A9,U+3BC,U+3C0,U+1E80-1E85,U+1E8A-1E8B,U+1EA0-1EF9,U+1FD6,U+2007-2008,U+200B,U+2010-2011,U+2013-2014,U+2018-201A,U+201C-201E,U+2020-2022,U+2026,U+2030,U+2032-2033,U+2039-203A,U+2042,U+2044,U+2051,U+2070,U+2074-2079,U+2080-2089,U+20AB-20AC,U+2113,U+2117,U+2122,U+2126,U+2160-2169,U+216C-216F,U+2190-2193,U+2196-2199,U+21A9,U+21B0-21B5,U+21C6,U+2202,U+2206,U+220F,U+2211-2212,U+2215,U+2219-221A,U+221E,U+222B,U+2248,U+2260,U+2264-2265,U+22C5,U+24C5,U+25A0-25A1,U+25AF,U+25B2-25B3,U+25CA-25CB,U+25CF,U+262E,U+2713,U+2715,U+2780-2788,U+E000,U+E002,U+F6C3,U+FB00-FB04,U+FEFF,U+FF0C,U+FF0E,U+FF1A-FF1B,U+FFFF;src:url(https://encore.scdn.co/fonts/CircularSp-Bold-602e7aefc706aa36c6ec1324b9bbc461.woff2)format("woff2"),url(https://encore.scdn.co/fonts/CircularSp-Bold-856afe2da4ba4e61239b129e2c16d633.woff)format("woff")}@font-face{font-family:CircularSp;font-weight:400;font-display:swap;unicode-range:U+0,U+D,U+20-7E,U+A0-17E,U+18F,U+192,U+1A0-1A1,U+1AF-1B0,U+1B5-1B6,U+1C4-1C6,U+1F1-1F3,U+1FA-1FF,U+218-21B,U+237,U+259,U+2BB-2BC,U+2C6-2C7,U+2C9,U+2D8-2DD,U+300-301,U+303,U+309,U+323,U+394,U+3A9,U+3BC,U+3C0,U+1E80-1E85,U+1E8A-1E8B,U+1EA0-1EF9,U+1FD6,U+2007-2008,U+200B,U+2010-2011,U+2013-2014,U+2018-201A,U+201C-201E,U+2020-2022,U+2026,U+2030,U+2032-2033,U+2039-203A,U+2042,U+2044,U+2051,U+2070,U+2074-2079,U+2080-2089,U+20AB-20AC,U+2113,U+2117,U+2122,U+2126,U+2160-2169,U+216C-216F,U+2190-2193,U+2196-2199,U+21A9,U+21B0-21B5,U+21C6,U+2202,U+2206,U+220F,U+2211-2212,U+2215,U+2219-221A,U+221E,U+222B,U+2248,U+2260,U+2264-2265,U+22C5,U+24C5,U+25A0-25A1,U+25AF,U+25B2-25B3,U+25CA-25CB,U+25CF,U+262E,U+2713,U+2715,U+2780-2788,U+E000,U+E002,U+F6C3,U+FB00-FB04,U+FEFF,U+FF0C,U+FF0E,U+FF1A-FF1B,U+FFFF;src:url(https://encore.scdn.co/fonts/CircularSp-Book-a00e99ef9996a3a157fb6b746856d04f.woff2)format("woff2"),url(https://encore.scdn.co/fonts/CircularSp-Book-3f73da7d35bd81c706bce7bbb84964de.woff)format("woff")}@font-face{font-family:CircularSp;font-weight:700;font-display:swap;unicode-range:U+0,U+D,U+20-7E,U+A0-17E,U+18F,U+192,U+1A0-1A1,U+1AF-1B0,U+1B5-1B6,U+1C4-1C6,U+1F1-1F3,U+1FA-1FF,U+218-21B,U+237,U+259,U+2BB-2BC,U+2C6-2C7,U+2C9,U+2D8-2DD,U+300-301,U+303,U+309,U+323,U+394,U+3A9,U+3BC,U+3C0,U+1E80-1E85,U+1E8A-1E8B,U+1EA0-1EF9,U+1FD6,U+2007-2008,U+200B,U+2010-2011,U+2013-2014,U+2018-201A,U+201C-201E,U+2020-2022,U+2026,U+2030,U+2032-2033,U+2039-203A,U+2042,U+2044,U+2051,U+2070,U+2074-2079,U+2080-2089,U+20AB-20AC,U+2113,U+2117,U+2122,U+2126,U+2160-2169,U+216C-216F,U+2190-2193,U+2196-2199,U+21A9,U+21B0-21B5,U+21C6,U+2202,U+2206,U+220F,U+2211-2212,U+2215,U+2219-221A,U+221E,U+222B,U+2248,U+2260,U+2264-2265,U+22C5,U+24C5,U+25A0-25A1,U+25AF,U+25B2-25B3,U+25CA-25CB,U+25CF,U+262E,U+2713,U+2715,U+2780-2788,U+E000,U+E002,U+F6C3,U+FB00-FB04,U+FEFF,U+FF0C,U+FF0E,U+FF1A-FF1B,U+FFFF;src:url(https://encore.scdn.co/fonts/CircularSp-Bold-602e7aefc706aa36c6ec1324b9bbc461.woff2)format("woff2"),url(https://encore.scdn.co/fonts/CircularSp-Bold-856afe2da4ba4e61239b129e2c16d633.woff)format("woff")}[data-theme-name=spotify]{--bui-font-text:CircularSp,CircularSp-Arab,CircularSp-Hebr,CircularSp-Cyrl,CircularSp-Grek,CircularSp-Deva;--bui-font-title:CircularSpTitle,CircularSp-Arab,CircularSp-Hebr,CircularSp-Cyrl,CircularSp-Grek,CircularSp-Deva;--bui-font-regular:CircularSp,CircularSp-Arab,CircularSp-Hebr,CircularSp-Cyrl,CircularSp-Grek,CircularSp-Deva;& .bui-Button{border-radius:var(--bui-radius-3);padding-inline:var(--bui-space-3)}& .bui-ButtonIcon{padding:0}& .bui-MenuPopup{box-sizing:border-box;max-width:21.25rem}& .bui-MenuSubmenuTrigger,& .bui-MenuItem{height:auto;min-height:2rem}& .bui-Text{font-family:var(--bui-font-text)}& .bui-Heading{font-family:var(--bui-font-title)}& .bui-TableRow{border-radius:var(--bui-radius-4);border:none}& .bui-TableRow:hover td:first-child{border-top-left-radius:var(--bui-radius-2);border-bottom-left-radius:var(--bui-radius-2)}& .bui-TableRow:hover td:last-child{border-top-right-radius:var(--bui-radius-2);border-bottom-right-radius:var(--bui-radius-2)}& .bui-TableBody:before,& .bui-TableBody:after{line-height:var(--bui-space-1);content:"";display:block}& .bui-TableHeader .bui-TableRow{border-bottom:1px solid var(--bui-border)}& .bui-TableHead{font-size:var(--bui-font-size-2);color:var(--bui-fg-secondary);font-weight:var(--bui-font-weight-regular)}& .bui-HeaderToolbar{padding-top:var(--bui-space-2);padding-inline:var(--bui-space-2)}& .bui-HeaderToolbarWrapper{border-radius:var(--bui-radius-3);padding-inline:var(--bui-space-3);border:none}& .bui-HeaderToolbarControls{right:calc(var(--bui-space-3) - 1px)}& .bui-HeaderTabsWrapper{margin-top:var(--bui-space-2);margin-inline:var(--bui-space-2);border-radius:var(--bui-radius-3);padding-inline:var(--bui-space-1);border:none}& .bui-Input{border-radius:var(--bui-radius-3)}& .bui-Tag{border-radius:var(--bui-radius-full)}}[data-theme-mode=light][data-theme-name=spotify]{--bui-bg-solid:#1ed760;--bui-bg-solid-hover:#3be477;--bui-bg-solid-pressed:#1abc54;--bui-bg-solid-disabled:var(--bui-gray-2);--bui-fg-primary:var(--bui-black);--bui-fg-secondary:var(--bui-gray-7);--bui-fg-solid:var(--bui-black);--bui-border:var(--bui-gray-3);--bui-border-hover:#0000004d;--bui-border-pressed:#00000080;--bui-border-disabled:#0000001a;--bui-border-danger:#f87a7a;--bui-border-warning:#e36d05;--bui-border-success:#53db83;--bui-ring:#0003;& .bui-HeaderToolbarWrapper,& .bui-HeaderTabsWrapper{border:1px solid var(--bui-border)}}[data-theme-mode=dark][data-theme-name=spotify]{--bui-bg-surface-0:var(--bui-black);--bui-bg-solid:#1ed760;--bui-bg-solid-hover:#3be477;--bui-bg-solid-pressed:#1abc54;--bui-bg-solid-disabled:#0f6c30;--bui-bg-tint:#242424;--bui-bg-tint-hover:#202020;--bui-bg-tint-pressed:#292929;--bui-bg-tint-disabled:#fffc;--bui-bg-danger:#3b1219;--bui-bg-warning:#302008;--bui-bg-success:#132d21;--bui-fg-primary:var(--bui-white);--bui-fg-secondary:var(--bui-gray-7);--bui-fg-link:var(--bui-white);--bui-fg-link-hover:var(--bui-white);--bui-fg-disabled:var(--bui-gray-5);--bui-fg-solid:var(--bui-black);--bui-fg-solid-disabled:#083618;--bui-fg-tint:var(--bui-white);--bui-fg-tint-disabled:var(--bui-gray-5);--bui-fg-danger:#e22b2b;--bui-fg-warning:#e36d05;--bui-fg-success:#1db954;--bui-border:var(--bui-gray-3);--bui-border-hover:#fff6;--bui-border-pressed:#ffffff80;--bui-border-disabled:#fff3;--bui-border-danger:#f87a7a;--bui-border-warning:#e36d05;--bui-border-success:#53db83;--bui-ring:#fff3}
\ No newline at end of file
diff --git a/docs-ui/src/app/tokens/page.mdx b/docs-ui/src/app/tokens/page.mdx
index 8e9031c81c..97266afbf4 100644
--- a/docs-ui/src/app/tokens/page.mdx
+++ b/docs-ui/src/app/tokens/page.mdx
@@ -187,7 +187,7 @@ These colors are used for special purposes like ring, scrollbar, ...
## Core background colors
These colors are used for the background of your application. We are mostly using for now a
-single elevated background for panels. `--bui-bg` should mostly use as the main background
+single elevated background for panels. `--bui-bg-surface-0` should mostly use as the main background
color of your app.
@@ -200,7 +200,7 @@ color of your app.
- --bui-bg
+ --bui-bg-surface-0The background color of your Backstage instance.
diff --git a/docs-ui/src/components/Snippet/styles.module.css b/docs-ui/src/components/Snippet/styles.module.css
index 3141564293..ed5bd22def 100644
--- a/docs-ui/src/components/Snippet/styles.module.css
+++ b/docs-ui/src/components/Snippet/styles.module.css
@@ -7,7 +7,7 @@
.preview {
border-radius: 8px;
box-shadow: inset 0 0 0 1px var(--border);
- background-color: var(--bui-bg);
+ background-color: var(--bui-bg-surface-0);
padding: 1px;
position: relative;
}
diff --git a/docs-ui/src/snippets/code-snippets.ts b/docs-ui/src/snippets/code-snippets.ts
index 1a22a24340..57169ae32a 100644
--- a/docs-ui/src/snippets/code-snippets.ts
+++ b/docs-ui/src/snippets/code-snippets.ts
@@ -4,7 +4,7 @@ export const customTheme = `:root {
--bui-font-regular: system-ui;
--bui-font-weight-regular: 400;
--bui-font-weight-bold: 600;
- --bui-bg: #f8f8f8;
+ --bui-bg-surface-0: #f8f8f8;
--bui-bg-surface-1: #fff;
/* ... other CSS variables */
@@ -19,7 +19,7 @@ export const customTheme = `:root {
--bui-font-regular: system-ui;
--bui-font-weight-regular: 400;
--bui-font-weight-bold: 600;
- --bui-bg: #f8f8f8;
+ --bui-bg-surface-0: #f8f8f8;
--bui-bg-surface-1: #fff;
/* ... other CSS variables */
diff --git a/docs-ui/yarn.lock b/docs-ui/yarn.lock
index 7d22bb8977..755b88ec09 100644
--- a/docs-ui/yarn.lock
+++ b/docs-ui/yarn.lock
@@ -1240,11 +1240,11 @@ __metadata:
languageName: node
linkType: hard
-"@storybook/core@npm:8.6.14":
- version: 8.6.14
- resolution: "@storybook/core@npm:8.6.14"
+"@storybook/core@npm:8.6.15":
+ version: 8.6.15
+ resolution: "@storybook/core@npm:8.6.15"
dependencies:
- "@storybook/theming": "npm:8.6.14"
+ "@storybook/theming": "npm:8.6.15"
better-opn: "npm:^3.0.2"
browser-assert: "npm:^1.2.1"
esbuild: "npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0"
@@ -1260,7 +1260,7 @@ __metadata:
peerDependenciesMeta:
prettier:
optional: true
- checksum: 10/8f8c811edd4ea8dcedcc63a79b3168dc83aa0401e3760990cb5995ea6beaac4026c6ccc1046182f41eed7c09333005f3348d8b42f89fc5dd5b2ce011a9d2a48f
+ checksum: 10/d268d6fa00c38b35e5c363ee33779c2e087ab8e4681e0e205baa2fdb2780ea9feda3c9f6db35d60092778878d2782b2093c744bdf1af173c5688c3e1e0e960ac
languageName: node
linkType: hard
@@ -1334,6 +1334,15 @@ __metadata:
languageName: node
linkType: hard
+"@storybook/theming@npm:8.6.15":
+ version: 8.6.15
+ resolution: "@storybook/theming@npm:8.6.15"
+ peerDependencies:
+ storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
+ checksum: 10/f02760831a13d7af9dbfeb6feea949f4c13c897861cbc75253a6776d133891567889c8d99c7e91a99124d0772c3bde1f978984c83b19117d1d7c908ed7eb8409
+ languageName: node
+ linkType: hard
+
"@swc/helpers@npm:0.5.15":
version: 0.5.15
resolution: "@swc/helpers@npm:0.5.15"
@@ -1618,8 +1627,8 @@ __metadata:
linkType: hard
"@uiw/codemirror-themes@npm:^4.23.7":
- version: 4.25.3
- resolution: "@uiw/codemirror-themes@npm:4.25.3"
+ version: 4.25.4
+ resolution: "@uiw/codemirror-themes@npm:4.25.4"
dependencies:
"@codemirror/language": "npm:^6.0.0"
"@codemirror/state": "npm:^6.0.0"
@@ -1628,7 +1637,7 @@ __metadata:
"@codemirror/language": ">=6.0.0"
"@codemirror/state": ">=6.0.0"
"@codemirror/view": ">=6.0.0"
- checksum: 10/f808ac3c4763f623ed6ea6215cc1421bb87234e0a05e7b6d9e917ab304fc6a4977c238996ca538e22093af8136c02bb27512aeeac653cb8fe82b4917ba1668a3
+ checksum: 10/aab62e2c16a10dbde4592cef704d386c1a9e3caece4ff0eed85e9d9a5acdeaf3fd8717e2cb6a6795e12e890b8600956effb52d453aacbc618934e7ae8c3e59e3
languageName: node
linkType: hard
@@ -2188,9 +2197,9 @@ __metadata:
linkType: hard
"caniuse-lite@npm:^1.0.30001579":
- version: 1.0.30001735
- resolution: "caniuse-lite@npm:1.0.30001735"
- checksum: 10/4b404ed363a5ccf3ec07144c2360106aa47dcec1f896ea6705a2773c6977e9ffb19a2b58be9492462733170e29b4823211533b0986d5a25f0f65f7ff702470ab
+ version: 1.0.30001760
+ resolution: "caniuse-lite@npm:1.0.30001760"
+ checksum: 10/ac5c13d00b946c3ace331d25379ed9d85743b1028aba79ae80402cb128b4b491122585144898fefb836d4d9879c13c717a081ae241a00420cbbc7e1b934ec685
languageName: node
linkType: hard
@@ -2539,7 +2548,7 @@ __metadata:
react: "npm:19.1.1"
react-dom: "npm:19.1.1"
shiki: "npm:^3.13.0"
- storybook: "npm:^8.6.12"
+ storybook: "npm:^8.6.15"
typescript: "npm:^5"
unified: "npm:^11.0.4"
languageName: unknown
@@ -3451,9 +3460,9 @@ __metadata:
languageName: node
linkType: hard
-"framer-motion@npm:^12.23.25":
- version: 12.23.25
- resolution: "framer-motion@npm:12.23.25"
+"framer-motion@npm:^12.23.26":
+ version: 12.23.26
+ resolution: "framer-motion@npm:12.23.26"
dependencies:
motion-dom: "npm:^12.23.23"
motion-utils: "npm:^12.23.6"
@@ -3469,7 +3478,7 @@ __metadata:
optional: true
react-dom:
optional: true
- checksum: 10/0b55dc0a5319cd923cdddcb42726352f0d74a8160f5222a3f090af53bbb2ed0d93c8482da41c9ffa875a3f7f666586e43be7594dca3612e70a1dea6bfbefebb4
+ checksum: 10/29d51ac57ce8c2599664bf706d7a83c2aba4fe1dee1c0c7d75d5c45c120b1c2ca5d257c3ff608992b26bf8e9cf258cacf231b0873d7b16f01c5eeb42b9831f78
languageName: node
linkType: hard
@@ -5265,10 +5274,10 @@ __metadata:
linkType: hard
"motion@npm:^12.4.1":
- version: 12.23.25
- resolution: "motion@npm:12.23.25"
+ version: 12.23.26
+ resolution: "motion@npm:12.23.26"
dependencies:
- framer-motion: "npm:^12.23.25"
+ framer-motion: "npm:^12.23.26"
tslib: "npm:^2.4.0"
peerDependencies:
"@emotion/is-prop-valid": "*"
@@ -5281,7 +5290,7 @@ __metadata:
optional: true
react-dom:
optional: true
- checksum: 10/67e86dd3c695362812fd86d06e82bb53173900212a78802c94adbcff947e70316141ec6e2908fb3ebf70d3686578bb7fbe7a820a359ce553cd2d79ff77fc1428
+ checksum: 10/c5e683d2c67e55816587cbbd451c5600dc0602aa04108ab0bf8d4472befd490e90b3177362dbc8b9f96316ec16383924cc574eb7c9e031540f1e88e64a2704ae
languageName: node
linkType: hard
@@ -6473,11 +6482,11 @@ __metadata:
languageName: node
linkType: hard
-"storybook@npm:^8.6.12":
- version: 8.6.14
- resolution: "storybook@npm:8.6.14"
+"storybook@npm:^8.6.15":
+ version: 8.6.15
+ resolution: "storybook@npm:8.6.15"
dependencies:
- "@storybook/core": "npm:8.6.14"
+ "@storybook/core": "npm:8.6.15"
peerDependencies:
prettier: ^2 || ^3
peerDependenciesMeta:
@@ -6487,7 +6496,7 @@ __metadata:
getstorybook: ./bin/index.cjs
sb: ./bin/index.cjs
storybook: ./bin/index.cjs
- checksum: 10/104932fe29ebf49bef24c90285741cec964d1c36b3f0b38da1dace31ac664be457f2a510e41ba69fe8aa0d90c20e3446fec27d1ced41e5eefb3a9ca713d99e79
+ checksum: 10/15762c79ec8444a46bc14cddfadbdd54dfd379828acd38555887a246c01e7c9ebb61e4eafafe04efb3ddf6278fb47035216e7f7d9f94fc205da148870173abdf
languageName: node
linkType: hard
diff --git a/docs/api/utility-apis.md b/docs/api/utility-apis.md
index 3e60124775..8d882227ec 100644
--- a/docs/api/utility-apis.md
+++ b/docs/api/utility-apis.md
@@ -10,31 +10,31 @@ Backstage plugins strive to be self-contained, with as much functionality as pos
Backstage provides two primary methods for plugins to communicate across their
boundaries in client-side code. The first one being the
-[`createPlugin`](../reference/core-plugin-api.createplugin.md) API along with the
+[`createPlugin`](https://backstage.io/api/stable/functions/_backstage_core-plugin-api.index.createPlugin.html) API along with the
extensions that it can provide, and the second one being Utility APIs. While the
-[`createPlugin`](../reference/core-plugin-api.createplugin.md) API is focused on
+[`createPlugin`](https://backstage.io/api/stable/functions/_backstage_core-plugin-api.index.createPlugin.html) API is focused on
the initialization plugins and the app, the Utility APIs provide ways for
plugins to communicate during their entire life cycle.
## Consuming APIs
-Each Utility API is tied to an [`ApiRef`](../reference/frontend-plugin-api.apiref.md)
+Each Utility API is tied to an [`ApiRef`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiRef.html)
instance, which is a global singleton object without any additional state or
functionality, its only purpose is to reference Utility APIs.
-[`ApiRef`](../reference/frontend-plugin-api.apiref.md)s are created using
-[`createApiRef`](../reference/frontend-plugin-api.createapiref.md), which is exported
-by [`@backstage/core-plugin-api`](../reference/core-plugin-api.md). There are also
+[`ApiRef`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiRef.html)s are created using
+[`createApiRef`](https://backstage.io/api/stable/functions/_backstage_frontend-plugin-api.createApiRef.html), which is exported
+by [`@backstage/core-plugin-api`](https://backstage.io/api/stable/modules/_backstage_core-plugin-api.html). There are also
many predefined Utility APIs in
-[`@backstage/core-plugin-api`](../reference/core-plugin-api.md), and they're all
+[`@backstage/core-plugin-api`](https://backstage.io/api/stable/modules/_backstage_core-plugin-api.html), and they're all
exported with a name of the pattern `*ApiRef`, for example
-[`errorApiRef`](../reference/frontend-plugin-api.errorapiref.md).
+[`errorApiRef`](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.errorApiRef.html).
To access one of the Utility APIs inside a React component, use the
-[`useApi`](../reference/frontend-plugin-api.useapi.md) hook exported by
-[`@backstage/core-plugin-api`](../reference/core-plugin-api.md), or the
-[`withApis`](../reference/frontend-plugin-api.withapis.md) HOC if you prefer class
+[`useApi`](https://backstage.io/api/stable/functions/_backstage_frontend-plugin-api.useApi.html) hook exported by
+[`@backstage/core-plugin-api`](https://backstage.io/api/stable/modules/_backstage_core-plugin-api.html), or the
+[`withApis`](https://backstage.io/api/stable/functions/_backstage_frontend-plugin-api.withApis.html) HOC if you prefer class
components. For example, the
-[`ErrorApi`](../reference/frontend-plugin-api.errorapi.md) can be accessed like this:
+[`ErrorApi`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ErrorApi.html) can be accessed like this:
```tsx
import { useApi, errorApiRef } from '@backstage/core-plugin-api';
@@ -52,14 +52,14 @@ export const MyComponent = () => {
```
Note that there is no explicit type given for
-[`ErrorApi`](../reference/frontend-plugin-api.errorapi.md). This is because the
-[`errorApiRef`](../reference/frontend-plugin-api.errorapiref.md) has the type
-embedded, and [`useApi`](../reference/frontend-plugin-api.useapi.md) is able to infer
+[`ErrorApi`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ErrorApi.html). This is because the
+[`errorApiRef`](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.errorApiRef.html) has the type
+embedded, and [`useApi`](https://backstage.io/api/stable/functions/_backstage_frontend-plugin-api.useApi.html) is able to infer
the type.
Also note that consuming Utility APIs is not limited to plugins; it can be done
from any component inside Backstage, including the ones in
-[`@backstage/core-plugin-api`](../reference/core-plugin-api.md). The only
+[`@backstage/core-plugin-api`](https://backstage.io/api/stable/modules/_backstage_core-plugin-api.html). The only
requirement is that they are beneath the `AppProvider` in the react tree.
## Supplying APIs
@@ -67,15 +67,15 @@ requirement is that they are beneath the `AppProvider` in the react tree.
### API Factories
APIs are registered in the form of
-[`ApiFactory`](../reference/frontend-plugin-api.apifactory.md) instances, which encapsulate
+[`ApiFactory`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiFactory.html) instances, which encapsulate
the process of instantiating an API. It is a collection of three things: the
-[`ApiRef`](../reference/frontend-plugin-api.apiref.md) of the API to instantiate, a
+[`ApiRef`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiRef.html) of the API to instantiate, a
list of all required dependencies, and a factory function that returns a new API
instance.
For example, this is the default
-[`ApiFactory`](../reference/frontend-plugin-api.apifactory.md) for the
-[`ErrorApi`](../reference/frontend-plugin-api.errorapi.md):
+[`ApiFactory`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiFactory.html) for the
+[`ErrorApi`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ErrorApi.html):
```ts
createApiFactory({
@@ -89,25 +89,25 @@ createApiFactory({
});
```
-In this example, the [`errorApiRef`](../reference/frontend-plugin-api.errorapiref.md)
+In this example, the [`errorApiRef`](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.errorApiRef.html)
is our API, which encapsulates the
-[`ErrorApi`](../reference/frontend-plugin-api.errorapi.md) type. The
-[`alertApiRef`](../reference/frontend-plugin-api.alertapiref.md) is our single
+[`ErrorApi`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ErrorApi.html) type. The
+[`alertApiRef`](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.alertApiRef.html) is our single
dependency, which we give the name `alertApi`, and is then passed on to the
factory function, which returns an implementation of the
-[`ErrorApi`](../reference/frontend-plugin-api.errorapi.md).
+[`ErrorApi`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ErrorApi.html).
-The [`createApiFactory`](../reference/frontend-plugin-api.createapifactory.md)
+The [`createApiFactory`](https://backstage.io/api/stable/functions/_backstage_frontend-plugin-api.createApiFactory.html)
function is a thin wrapper that enables TypeScript type inference. You may
notice that there are no type annotations in the above example, and that is
because we're able to infer all types from the
-[`ApiRef`](../reference/frontend-plugin-api.apiref.md)s. TypeScript will make sure
+[`ApiRef`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiRef.html)s. TypeScript will make sure
that the return value of the `factory` function matches the type embedded in
-`api`'s [`ApiRef`](../reference/frontend-plugin-api.apiref.md), in this case the
-[`ErrorApi`](../reference/frontend-plugin-api.errorapi.md). It will also match the
+`api`'s [`ApiRef`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiRef.html), in this case the
+[`ErrorApi`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ErrorApi.html). It will also match the
types between the `deps` and the parameters of the `factory` function, again
using the type embedded within the
-[`ApiRef`](../reference/frontend-plugin-api.apiref.md)s.
+[`ApiRef`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiRef.html)s.
## Registering API Factories
@@ -119,13 +119,13 @@ app, and the app itself.
Starting with the Backstage core library, it provides implementations for all of
the core APIs. The core APIs are the ones exported by
-[`@backstage/core-plugin-api`](../reference/core-plugin-api.md), such as the
-[`errorApiRef`](../reference/frontend-plugin-api.errorapiref.md) and
-[`configApiRef`](../reference/frontend-plugin-api.configapiref.md).
+[`@backstage/core-plugin-api`](https://backstage.io/api/stable/modules/_backstage_core-plugin-api.html), such as the
+[`errorApiRef`](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.errorApiRef.html) and
+[`configApiRef`](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.configApiRef.html).
The core APIs are loaded for any app created with
-[`createApp`](../reference/app-defaults.createapp.md) from
-[`@backstage/core-plugin-api`](../reference/app-defaults.md), which means that
+[`createApp`](https://backstage.io/api/stable/functions/_backstage_app-defaults.createApp.html) from
+[`@backstage/core-plugin-api`](https://backstage.io/api/stable/modules/_backstage_core-plugin-api.html), which means that
there is no step that needs to be taken to include these APIs in an app.
### Plugin APIs
@@ -133,13 +133,13 @@ there is no step that needs to be taken to include these APIs in an app.
In addition to the core APIs, plugins can define and export their own APIs.
While doing so, they should usually also provide default implementations of their
own APIs; for example, the `catalog` plugin exports `catalogApiRef` and also
-supplies a default [`ApiFactory`](../reference/frontend-plugin-api.apifactory.md) of
+supplies a default [`ApiFactory`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiFactory.html) of
that API using the `CatalogClient`. There is one restriction to plugin-provided
API Factories: plugins may not supply factories for core APIs; trying to do so
will cause the app to refuse to start.
Plugins supply their APIs through the `apis` option of
-[`createPlugin`](../reference/core-plugin-api.createplugin.md), for example:
+[`createPlugin`](https://backstage.io/api/stable/functions/_backstage_core-plugin-api.index.createPlugin.html), for example:
```ts
export const techdocsPlugin = createPlugin({
@@ -164,7 +164,7 @@ Lastly, the app itself is the final point where APIs can be added, and what has
the final say in what APIs will be loaded at runtime? The app may override the
factories for any of the core or plugin APIs, with the exception of the config,
app theme, and identity APIs. These are static APIs that are tied into the
-[`createApp`](../reference/app-defaults.createapp.md) implementation and
+[`createApp`](https://backstage.io/api/stable/functions/_backstage_app-defaults.createApp.html) implementation and
therefore, not possible to override.
Overriding APIs is useful for apps that want to switch out behavior to tailor it
@@ -227,33 +227,33 @@ const app = createApp({
```
Note that the above line will cause an error if `IgnoreErrorApi` does not fully
-implement the [`ErrorApi`](../reference/frontend-plugin-api.errorapi.md), as it is
+implement the [`ErrorApi`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ErrorApi.html), as it is
checked by the type embedded in the
-[`errorApiRef`](../reference/frontend-plugin-api.errorapiref.md) at compile time.
+[`errorApiRef`](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.errorApiRef.html) at compile time.
## Defining custom Utility APIs
Plugins are free to define their own Utility APIs. Simply define the TypeScript
interface for the API and create an
-[`ApiRef`](../reference/frontend-plugin-api.apiref.md) using
-[`createApiRef`](../reference/frontend-plugin-api.createapiref.md) exported from
-[`@backstage/core-plugin-api`](../reference/core-plugin-api.md). Also, be sure to
+[`ApiRef`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiRef.html) using
+[`createApiRef`](https://backstage.io/api/stable/functions/_backstage_frontend-plugin-api.createApiRef.html) exported from
+[`@backstage/core-plugin-api`](https://backstage.io/api/stable/modules/_backstage_core-plugin-api.html). Also, be sure to
provide at least one implementation of the API and to declare a default factory
-for the API in [`createPlugin`](../reference/core-plugin-api.createplugin.md).
+for the API in [`createPlugin`](https://backstage.io/api/stable/functions/_backstage_core-plugin-api.index.createPlugin.html).
Custom Utility APIs can be either public or private, which is up to the plugin to choose. Private APIs do not expose an external API surface, and it's therefore possible to make breaking changes to the API without affecting other users of the plugin. If an API is made public, however, it opens up for other plugins to make use of the API, and it also makes it possible for users for your plugin to override the API in the app. It is, however, important to maintain backward compatibility of public APIs, as you may otherwise break apps that are using your plugin.
To make an API public, simply export the
-[`ApiRef`](../reference/frontend-plugin-api.apiref.md) of the API, and any associated
+[`ApiRef`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiRef.html) of the API, and any associated
types. To make an API private, just avoid exporting the
-[`ApiRef`](../reference/frontend-plugin-api.apiref.md), but still be sure to supply a
-default factory to [`createPlugin`](../reference/core-plugin-api.createplugin.md).
+[`ApiRef`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiRef.html), but still be sure to supply a
+default factory to [`createPlugin`](https://backstage.io/api/stable/functions/_backstage_core-plugin-api.index.createPlugin.html).
Private APIs are useful for plugins that want to depend on other APIs outside of
React components, but not have to expose an entire API surface to maintain. When
using private APIs, it is fine to use the `typeof` of an implementing class as
the type parameter passed to
-[`createApiRef`](../reference/frontend-plugin-api.createapiref.md), while public APIs
+[`createApiRef`](https://backstage.io/api/stable/functions/_backstage_frontend-plugin-api.createApiRef.html), while public APIs
should always define a separate TypeScript interface type.
Plugins may depend on APIs from other plugins, both in React components and as
@@ -262,13 +262,13 @@ dependencies between plugins.
## Architecture
-The [`ApiRef`](../reference/frontend-plugin-api.apiref.md) instances mentioned above
+The [`ApiRef`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiRef.html) instances mentioned above
provide a point of indirection between consumers and producers of Utility APIs.
It allows for plugins and components to depend on APIs in a type-safe way,
without having a direct reference to a concrete implementation of the APIs. The
Apps are also given a lot of flexibility in what implementations to provide. As
long as they adhere to the contract established by an
-[`ApiRef`](../reference/frontend-plugin-api.apiref.md), they are free to choose any
+[`ApiRef`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiRef.html), they are free to choose any
implementation they want.
The figure below shows the relationship between
@@ -291,16 +291,16 @@ The indirection provided by Utility APIs also makes it straightforward to test
components that depend on APIs, and to provide a standard common development
environment for plugins. A proper test wrapper with mocked API implementations
is not yet ready, but it will be provided as a part of
-[`@backstage/test-utils`](../reference/test-utils.md). It will provide mocked
+[`@backstage/test-utils`](https://backstage.io/api/stable/modules/_backstage_test-utils.html). It will provide mocked
variants of APIs, with additional methods for asserting a component's
interaction with the API.
The common development environment for plugins is included in
-[`@backstage/dev-utils`](../reference/dev-utils.md), where the exported
-[`createDevApp`](../reference/dev-utils.createdevapp.md) function creates an
+[`@backstage/dev-utils`](https://backstage.io/api/stable/modules/_backstage_dev-utils.html), where the exported
+[`createDevApp`](https://backstage.io/api/stable/functions/_backstage_dev-utils.createDevApp.html) function creates an
application with implementations for all core APIs already present. Contrary to
the method for wiring up Utility API implementations in an app created with
-[`createApp`](../reference/app-defaults.createapp.md),
-[`createDevApp`](../reference/dev-utils.createdevapp.md) uses automatic dependency
+[`createApp`](https://backstage.io/api/stable/functions/_backstage_app-defaults.createApp.html),
+[`createDevApp`](https://backstage.io/api/stable/functions/_backstage_dev-utils.createDevApp.html) uses automatic dependency
injection. This is to make it possible to replace any API implementation, and
having that be reflected in dependents of that API.
diff --git a/docs/assets/getting-started/create-app-output.png b/docs/assets/getting-started/create-app-output.png
index 1987ea41e1..305f2e001a 100644
Binary files a/docs/assets/getting-started/create-app-output.png and b/docs/assets/getting-started/create-app-output.png differ
diff --git a/docs/assets/getting-started/login-to-app-as-guest-user.png b/docs/assets/getting-started/login-to-app-as-guest-user.png
new file mode 100644
index 0000000000..79c897dcb6
Binary files /dev/null and b/docs/assets/getting-started/login-to-app-as-guest-user.png differ
diff --git a/docs/assets/getting-started/portal.png b/docs/assets/getting-started/portal.png
index b3133f2278..fd7d52d193 100644
Binary files a/docs/assets/getting-started/portal.png and b/docs/assets/getting-started/portal.png differ
diff --git a/docs/auth/index.md b/docs/auth/index.md
index a3141d0434..1d668f6961 100644
--- a/docs/auth/index.md
+++ b/docs/auth/index.md
@@ -340,7 +340,7 @@ The method with which frontend plugins request access to third-party services is
through [Utility APIs](../api/utility-apis.md) for each service provider. These
are all suffixed with `*AuthApiRef`, for example `githubAuthApiRef`. For a
full list of providers, see the
-[@backstage/core-plugin-api](../reference/core-plugin-api.md#variables) reference.
+[@backstage/core-plugin-api](https://backstage.io/api/stable/modules/_backstage_core-plugin-api.index.html#alertapiref) reference.
## Custom Authentication Provider
diff --git a/docs/auth/oidc.md b/docs/auth/oidc.md
index 7c4b09d9bf..55827ab1dc 100644
--- a/docs/auth/oidc.md
+++ b/docs/auth/oidc.md
@@ -241,6 +241,12 @@ These parameters have implicit default values. Don't override them unless you kn
- `prompt`: Recommended to use `auto` so the browser will request sign-in to the IDP if the
user has no active session.
- `sessionDuration`: Lifespan of the user session.
+- `startUrlSearchParams`: This is a dictionary of search (query) parameters for the OIDC
+ authorization start URL. Don't define it unless you want to change the identity
+ provider's behavior. (For example, you could set the `organization` parameter to guide
+ users towards a particular sign-in option that your organization prefers.) **Note:** the
+ start URL is controlled by the browser, so this feature is only for improving the
+ Backstage user experience.
:::note Config Reloading
Backstage does not yet support hot reloading of auth provider configuration. Any changes to this YAML file require a restart of Backstage.
diff --git a/docs/backend-system/core-services/cache.md b/docs/backend-system/core-services/cache.md
index ad4d04b50a..a23332409b 100644
--- a/docs/backend-system/core-services/cache.md
+++ b/docs/backend-system/core-services/cache.md
@@ -11,24 +11,84 @@ This service lets your plugin interact with a cache. It is bound to your plugin
The cache service can be configured using the `backend.cache` section in your `app-config.yaml`:
+### In-Memory (default)
+
```yaml
backend:
cache:
- store: redis # or 'valkey', 'memcache', 'memory'
+ store: memory
+```
+
+### Memcache
+
+```yaml
+backend:
+ cache:
+ store: memcache
+ connection: user:pass@cache.example.com:11211
+```
+
+### Redis
+
+```yaml
+backend:
+ cache:
+ store: redis
connection: redis://localhost:6379
- # Store-specific configuration (Redis/Valkey only)
+ # Store-specific configuration (optional)
redis:
client:
- # Optional: Global namespace prefix for all cache keys
+ # Global namespace prefix for all cache keys
namespace: 'my-app'
- # Optional: Separator used between namespace and plugin ID (default: ':')
+ # Separator used between namespace and plugin ID (default: ':')
keyPrefixSeparator: ':'
# Other Redis-specific options...
clearBatchSize: 1000
useUnlink: false
```
+### Valkey
+
+```yaml
+backend:
+ cache:
+ store: valkey
+ connection: redis://localhost:6379
+
+ # Store-specific configuration (optional)
+ valkey:
+ # Global namespace prefix for all cache keys (including separator used between namespace and plugin ID)
+ keyPrefix: 'my-app:'
+```
+
+### Infinispan
+
+```yaml
+backend:
+ cache:
+ store: infinispan
+
+ # Store-specific configuration (optional)
+ infinispan:
+ servers:
+ # IP address or hostname of the server (default: '127.0.0.1')
+ - host: 127.0.0.1
+ # Port number of the server (default: '11222')
+ port: 11222
+ # Name of the cache (default: 'cache')
+ cacheName: cache
+ mediaType: application/json
+ authentication:
+ # Whether authentication is enabled (default: 'false')
+ enabled: true
+ userName: yourusername
+ password: yourpassword
+ saslMechanism: PLAIN
+```
+
+A full list of configuration items is available [here](https://docs.jboss.org/infinispan/hotrod-clients/javascript/1.0/apidocs/module-infinispan.html), including support for backup clusters.
+
### Namespace Configuration
For Redis and Valkey stores, you can configure a global namespace that will be prefixed to all cache keys:
@@ -36,9 +96,10 @@ For Redis and Valkey stores, you can configure a global namespace that will be p
- **Without namespace**: Cache keys use only the plugin ID (e.g., `catalog:some-key`)
- **With namespace**: Cache keys use the format `namespace:pluginId:key` (e.g., `my-app:catalog:some-key`)
-The `keyPrefixSeparator` controls what character is used between the namespace and plugin ID (defaults to `:`).
+For **Redis**, `keyPrefixSeparator` controls what character is used between the namespace and plugin ID (defaults to `:`).
+For **Valkey**, you set the full `keyPrefix` including the separator.
-**Note**: Memory and Memcache stores do not support namespace configuration and will always use the plugin ID directly.
+**Note**: In-memory, Memcache and Infinispan stores do not support namespace configuration and will always use the plugin ID directly.
## Using the service
diff --git a/docs/conf/reading.md b/docs/conf/reading.md
index a565f3a8a3..b6119b0da9 100644
--- a/docs/conf/reading.md
+++ b/docs/conf/reading.md
@@ -7,7 +7,7 @@ description: Documentation on Reading Backstage Configuration
## Config API
There's a common configuration API for by both frontend and backend plugins. An
-API reference can be found [here](../reference/config.config.md).
+API reference can be found [here](https://backstage.io/api/stable/types/_backstage_config.Config.html).
The configuration API is tailored towards failing fast in case of missing or bad
config. That's because configuration errors can always be considered programming
@@ -115,7 +115,7 @@ example `getString`. These will throw an error if there is no value available.
## Accessing ConfigApi in Frontend Plugins
-The [ConfigApi](../reference/frontend-plugin-api.configapi.md) in the frontend is a
+The [ConfigApi](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ConfigApi.html) in the frontend is a
[UtilityApi](../api/utility-apis.md). It's accessible as usual via the
`configApiRef` exported from `@backstage/core-plugin-api`:
diff --git a/docs/conf/user-interface/index.md b/docs/conf/user-interface/index.md
index 81acfdf720..e0fb645d78 100644
--- a/docs/conf/user-interface/index.md
+++ b/docs/conf/user-interface/index.md
@@ -103,13 +103,13 @@ Backstage UI is using light by default under `:root` but you can target it more
[data-theme-mode='light'] {
/* Light theme specific styles */
- --bui-bg: #f8f8f8;
+ --bui-bg-surface-0: #f8f8f8;
--bui-fg-primary: #000;
}
[data-theme-mode='dark'] {
/* Dark theme specific styles */
- --bui-bg: #333333;
+ --bui-bg-surface-0: #333333;
--bui-fg-primary: #fff;
}
```
@@ -122,18 +122,18 @@ We recommend starting with a core set of CSS variables to quickly achieve a bran
And if you’d like to go even further, you can target specific component class names for advanced customization.
-| Token Name | Description |
-| -------------------- | ----------------------------------------------------------------------------------- |
-| `--bui-bg` | This is used to define the background color of your app. It will only be used once. |
-| `--bui-bg-surface-1` | We ar using this color to sit on top of `--bui-bg` mostly for `Card`, `Dialog`, ... |
-| `--bui-bg-surface-2` | This is for content inside elevated components. This colour is less common. |
-| `--bui-bg-solid` | This is used for main actions like primary buttons. |
-| `--bui-fg-solid` | This is for texts or icons on top of a solid backgrounds. |
-| `--bui-fg-primary` | Your primary text or icon colours. |
-| `--bui-fg-secondary` | Your secondary text or icon colours. |
-| `--bui-fg-link` | Used for links. |
-| `--bui-border` | Main borders around surfaces like `Card`, `Dialog`, ... |
-| `--bui-font-regular` | The main font of your app. |
+| Token Name | Description |
+| -------------------- | --------------------------------------------------------------------------------------------- |
+| `--bui-bg-surface-0` | This is used to define the background color of your app. It will only be used once. |
+| `--bui-bg-surface-1` | We ar using this color to sit on top of `--bui-bg-surface-0` mostly for `Card`, `Dialog`, ... |
+| `--bui-bg-surface-2` | This is for content inside elevated components. This colour is less common. |
+| `--bui-bg-solid` | This is used for main actions like primary buttons. |
+| `--bui-fg-solid` | This is for texts or icons on top of a solid backgrounds. |
+| `--bui-fg-primary` | Your primary text or icon colours. |
+| `--bui-fg-secondary` | Your secondary text or icon colours. |
+| `--bui-fg-link` | Used for links. |
+| `--bui-border` | Main borders around surfaces like `Card`, `Dialog`, ... |
+| `--bui-font-regular` | The main font of your app. |
All available CSS variables
@@ -157,13 +157,14 @@ These colors are used for special purposes like ring, scrollbar, ...
#### Core background colors
-These colors are used for the background of your application. We are mostly using for now a single elevated background for panels. `--bui-bg` should mostly use as the main background color of your app.
+These colors are used for the background of your application. We are mostly using for now a single elevated background for panels. `--bui-bg-surface-0` should mostly use as the main background color of your app.
| Token Name | Description |
| ------------------------- | ------------------------------------------------ |
-| `--bui-bg` | The background color of your Backstage instance. |
+| `--bui-bg-surface-0` | The background color of your Backstage instance. |
| `--bui-bg-surface-1` | Use for any panels or elevated surfaces. |
| `--bui-bg-surface-2` | Use for any panels or elevated surfaces. |
+| `--bui-bg-surface-3` | Use for any panels or elevated surfaces. |
| `--bui-bg-solid` | Used for solid background colors. |
| `--bui-bg-solid-hover` | Used for solid background colors when hovered. |
| `--bui-bg-solid-pressed` | Used for solid background colors when pressed. |
diff --git a/docs/deployment/scaling.md b/docs/deployment/scaling.md
index 2c3b687f67..dd765d3c1a 100644
--- a/docs/deployment/scaling.md
+++ b/docs/deployment/scaling.md
@@ -17,7 +17,7 @@ into multiple different services, each running a different set of plugins. This
is a more advanced approach and requires you to be able to route requests to
the appropriate backends based on the plugin ID. Both for ingress, but also
internal traffic between Backstage backends, which is done by creating a custom
-implementation of the [DiscoveryService](../reference/backend-plugin-api.discoveryservice.md) interface. See the [backend system docs](../backend-system/building-backends/01-index.md#split-into-multiple-backends) for more details on how to separate your deployment into multiple backend instances.
+implementation of the [DiscoveryService](https://backstage.io/api/stable/interfaces/_backstage_backend-plugin-api.index.DiscoveryService.html) interface. See the [backend system docs](../backend-system/building-backends/01-index.md#split-into-multiple-backends) for more details on how to separate your deployment into multiple backend instances.
Lastly, you can also replicate the Backstage deployments across multiple regions.
This is not a pattern that there is built-in support for and typically only makes
diff --git a/docs/features/software-templates/ui-options-examples.md b/docs/features/software-templates/ui-options-examples.md
index 1a024569a6..845da8e60b 100644
--- a/docs/features/software-templates/ui-options-examples.md
+++ b/docs/features/software-templates/ui-options-examples.md
@@ -468,3 +468,59 @@ repoUrl:
The supported `additionalScopes` values are `gerrit`, `github`, `gitlab`, `bitbucket`, and `azure`.
If you're also using the `RepoUrlPicker` field extension, you should simply duplicate this part from there.
+
+## RepoOwnerPicker
+
+The input props that can be specified under `ui:options` for the `RepoOwnerPicker` field extension.
+
+### `host`
+
+The SCM integration host that owners should be fetched from for autocompletion.
+
+- Fetch owners from `github.com`
+
+```yaml
+repoUrl:
+ title: Repository Owner
+ type: string
+ ui:field: RepoOwnerPicker
+ ui:options:
+ host: github.com
+```
+
+### `excludedOwners`
+
+List of owners that should be excluded from autocompletion.
+
+- Exclude owner `owner_1` from autocompletion
+
+```yaml
+repoUrl:
+ title: Repository Owner
+ type: string
+ ui:field: RepoOwnerPicker
+ ui:options:
+ excludedOwners:
+ - owner_1
+```
+
+### `requestUserCredentials`
+
+If defined will request user credentials to auth against the given SCM platform.
+
+```yaml
+repoUrl:
+ title: Repository Owner
+ type: string
+ ui:field: RepoOwnerPicker
+ ui:options:
+ requestUserCredentials:
+ secretsKey: USER_OAUTH_TOKEN
+ additionalScopes:
+ github:
+ - workflow:write
+```
+
+`secretsKey` is the key used within the template secrets context to store the credential and `additionalScopes` is any additional permission scopes to request.
+
+The supported `additionalScopes` values are `gerrit`, `github`, `gitlab`, `bitbucket`, and `azure`.
diff --git a/docs/features/software-templates/writing-templates.md b/docs/features/software-templates/writing-templates.md
index 32f17f945f..5d9fcba603 100644
--- a/docs/features/software-templates/writing-templates.md
+++ b/docs/features/software-templates/writing-templates.md
@@ -555,6 +555,35 @@ The `RepoBranchPicker` is a custom field that we provide part of the
`plugin-scaffolder`. You can provide your own custom fields by
[writing your own Custom Field Extensions](./writing-custom-field-extensions.md)
+### The Repository Owner Picker
+
+Similar to the repository picker, there is a picker for owners to support autocompletion. A full example could look like this:
+
+```yaml
+- title: Choose an owner
+ required:
+ - repoOwner
+ properties:
+ repoOwner:
+ title: Repository Owner
+ type: string
+ ui:field: RepoOwnerPicker
+ ui:options:
+ host: github.com
+ excludedOwners:
+ - backstage
+ requestUserCredentials:
+ secretsKey: USER_OAUTH_TOKEN
+```
+
+Passing the `requestUserCredentials` and `host` properties is required for autocompletion to work. For more information regarding the `requestUserCredentials` object, please refer to the [Using the Users `oauth` token](#using-the-users-oauth-token) section under [The Repository Picker](#the-repository-picker).
+
+For a list of all possible `ui:options` input props for `RepoOwnerPicker`, please visit [here](./ui-options-examples.md#repoownerpicker).
+
+The `RepoOwnerPicker` is a custom field that we provide part of the
+`plugin-scaffolder`. You can provide your own custom fields by
+[writing your own Custom Field Extensions](./writing-custom-field-extensions.md)
+
### Accessing the signed-in users details
Sometimes when authoring templates, you'll want to access the user that is running the template, and get details from the profile or the users `Entity` in the Catalog.
diff --git a/docs/frontend-system/building-apps/08-migrating.md b/docs/frontend-system/building-apps/08-migrating.md
index 1fd74becfc..88dff704c4 100644
--- a/docs/frontend-system/building-apps/08-migrating.md
+++ b/docs/frontend-system/building-apps/08-migrating.md
@@ -698,16 +698,16 @@ import { SidebarContent } from './Sidebar';
export const navModule = createFrontendModule({
pluginId: 'app',
- extensions: [sidebarContent],
+ extensions: [SidebarContent],
});
```
-Then in the actual implementation for the `sidebarContent` extension, you can provide something like the following, where you implement the entire `Sidebar` component.
+Then in the actual implementation for the `SidebarContent` extension, you can provide something like the following, where you implement the entire `Sidebar` component.
```tsx title="in packages/app/src/modules/nav/Sidebar.tsx"
import { NavContentBlueprint } from '@backstage/frontend-plugin-api';
-export const sidebarContent = NavContentBlueprint.make({
+export const SidebarContent = NavContentBlueprint.make({
params: {
component: ({ items }) => (
diff --git a/docs/frontend-system/building-plugins/01-index.md b/docs/frontend-system/building-plugins/01-index.md
index 283c162fa7..fd88478b37 100644
--- a/docs/frontend-system/building-plugins/01-index.md
+++ b/docs/frontend-system/building-plugins/01-index.md
@@ -220,6 +220,6 @@ export const examplePlugin = createFrontendPlugin({
});
```
-The `ExampleEntityContent` itself is again a regular React component where you can implement any functionality you want. To access the entity that the content is being rendered for, you can use the `useEntity` hook from `@backstage/plugin-catalog-react`. You can see a full list of APIs provided by the catalog React library in [the API reference](../../reference/plugin-catalog-react.md).
+The `ExampleEntityContent` itself is again a regular React component where you can implement any functionality you want. To access the entity that the content is being rendered for, you can use the `useEntity` hook from `@backstage/plugin-catalog-react`. You can see a full list of APIs provided by the catalog React library in [the API reference](https://backstage.io/api/stable/modules/_backstage_plugin-catalog-react.index.html).
For a more complete list of the different kinds of extensions that you can create for your plugin, see the [extension blueprints](./03-common-extension-blueprints.md) section.
diff --git a/docs/frontend-system/building-plugins/03-common-extension-blueprints.md b/docs/frontend-system/building-plugins/03-common-extension-blueprints.md
index 71989e898f..abac1f03f5 100644
--- a/docs/frontend-system/building-plugins/03-common-extension-blueprints.md
+++ b/docs/frontend-system/building-plugins/03-common-extension-blueprints.md
@@ -11,35 +11,35 @@ This section covers many of the [extension blueprints](../architecture/23-extens
These are the [extension blueprints](../architecture/23-extension-blueprints.md) provided by the Backstage frontend framework itself.
-### Api - [Reference](../../reference/frontend-plugin-api.apiblueprint.md)
+### Api - [Reference](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.ApiBlueprint.html)
An API extension is used to add or override [Utility API factories](../utility-apis/01-index.md) in the app. They are commonly used by plugins for both internal and shared APIs. There are also many built-in Api extensions provided by the framework that you are able to override.
-### NavItem - [Reference](../../reference/frontend-plugin-api.navitemblueprint.md)
+### NavItem - [Reference](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.NavItemBlueprint.html)
Navigation item extensions are used to provide menu items that link to different parts of the app. By default nav items are attached to the app nav extension, which by default is rendered as the left sidebar in the app.
-### Page - [Reference](../../reference/frontend-plugin-api.pageblueprint.md)
+### Page - [Reference](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.PageBlueprint.html)
Page extensions provide content for a particular route in the app. By default pages are attached to the app routes extensions, which renders the root routes.
-### SignInPage - [Reference](../../reference/frontend-plugin-api.signinpageblueprint.md)
+### SignInPage - [Reference](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.SignInPageBlueprint.html)
Sign-in page extension have a single purpose - to implement a custom sign-in page. They are always attached to the app root extension and are rendered before the rest of the app until the user is signed in.
-### SwappableComponent - [Reference](../../reference/frontend-plugin-api.swappablecomponentblueprint.md)
+### SwappableComponent - [Reference](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.SwappableComponentBlueprint.html)
Swappable Components are extensions that are used to replace the implementations of components in the app and plugins.
-### Theme - [Reference](../../reference/frontend-plugin-api.themeblueprint.md)
+### Theme - [Reference](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.ThemeBlueprint.html)
Theme extensions provide custom themes for the app. They are always attached to the app extension and you can have any number of themes extensions installed in an app at once, letting the user choose which theme to use.
-### Icons - [Reference](../../reference/frontend-plugin-api.iconbundleblueprint.md)
+### Icons - [Reference](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.IconBundleBlueprint.html)
Icon bundle extensions provide the ability to replace or provide new icons to the app. You can use the above blueprint to make new extension instances which can be installed into the app.
-### Translation - [Reference](../../reference/frontend-plugin-api.translationblueprint.md)
+### Translation - [Reference](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.TranslationBlueprint.html)
Translation extension provide custom translation messages for the app. They can be used both to override the default english messages to custom ones, as well as provide translations for additional languages.
diff --git a/docs/getting-started/index.md b/docs/getting-started/index.md
index 876af4f0a5..9075afb82c 100644
--- a/docs/getting-started/index.md
+++ b/docs/getting-started/index.md
@@ -1,8 +1,8 @@
---
id: index
-title: Creating your Backstage App
-sidebar_label: Introduction
-description: How to install Backstage for your own use.
+title: Standalone Installation
+sidebar_label: Standalone Installation
+description: How to create and run a Standalone Backstage.
---
Audience: Developers and Admins
@@ -11,11 +11,11 @@ Audience: Developers and Admins
It is not required, although recommended to have a basic understanding of [Yarn](https://www.pluralsight.com/guides/yarn-a-package-manager-for-node-js) and [npm](https://docs.npmjs.com/about-npm) before starting this guide.
:::
-## Summary
+## Overview
-This guide walks through how to get started creating your very own Backstage customizable app. This is the first step in evaluating, developing on, or demoing Backstage.
+This guide walks through how to create your own Backstage customizable app. This is the first step in evaluating, developing on, or demoing Backstage.
-By the end of this guide, you will have a standalone Backstage installation running locally with a `SQLite` database and demo content. To be clear, this is not a production-ready installation, and it does not contain information specific to your organization.
+By the end of this guide, you will have a standalone Backstage installation running locally with an in-memory `SQLite` database and demo content. To be clear, this is not a production-ready installation, and it does not contain information specific to your organization until you set up integrations with your specific data sources!
:::note Contributors
@@ -23,46 +23,9 @@ If you are planning to contribute a new feature or bug fix to the Backstage proj
:::
-## Prerequisites
+The instructions make use of `npx`. `npx` is a tool that comes preinstalled with Node.js and lets you run commands straight from `npm` or other registries.
-This guide also assumes a basic understanding of working on a Linux based operating system and have some experience with the terminal, specifically, these commands: `npm`, `yarn`.
-
-- Access to a Unix-based operating system, such as Linux, macOS or
- [Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/)
-- A GNU-like build environment available at the command line.
- For example, on Debian/Ubuntu you will want to have the `make` and `build-essential` packages installed.
- On macOS, you will want to run `xcode-select --install` to get the XCode command line build tooling in place.
-- An account with elevated rights to install the dependencies
-- `curl` or `wget` installed
-- Node.js [Active LTS Release](../overview/versioning-policy.md#nodejs-releases) installed using one of these
- methods:
- - Using `nvm` (recommended)
- - [Installing nvm](https://github.com/nvm-sh/nvm#install--update-script)
- - [Install and change Node version with nvm](https://nodejs.org/en/download/package-manager/#nvm)
- - Node 20 is a good starting point, this can be installed using `nvm install lts/iron`
- - [Binary Download](https://nodejs.org/en/download/)
- - [Package manager](https://nodejs.org/en/download/package-manager/)
- - [Using NodeSource packages](https://github.com/nodesource/distributions/blob/master/README.md)
-- `yarn` [Installation](https://yarnpkg.com/getting-started/install)
- - Backstage currently uses Yarn 4.4.1, once you've ran `corepack enable` you'll want to then run `yarn set version 4.4.1`
-- `docker` [installation](https://docs.docker.com/engine/install/)
-- `git` [installation](https://github.com/git-guides/install-git)
-- If the system is not directly accessible over your network the following ports
- need to be opened: 3000, 7007. This is quite uncommon, unless you're installing in a container, VM or remote system.
-
-## 1. Create your Backstage App
-
-:::caution
-
-The Backstage app we'll be creating will only have demo data until we set up integrations with your specific data sources!
-
-:::
-
-To install the Backstage Standalone app, we will make use of `npx`. `npx` is a tool that comes preinstalled with Node.js and lets you run commands straight from `npm` or other registries. Before we run the command, let's discuss what it does.
-
-This command will create a new directory with a Backstage app inside. The wizard will ask you for the name of the app. This name will be created as subdirectory in your current working directory.
-
-
+This command creates a new directory with a Backstage app inside. The wizard will ask you for the name of the app. This name will be created as a subdirectory in your current working directory.
Inside that directory, it will generate all the files and folder structure
needed for you to run your app.
@@ -100,65 +63,122 @@ app
and [TechDocs](https://backstage.io/docs/features/techdocs/)
amongst other things.
-Now, that we know what it does, let's run it!
+## Prerequisites
-```bash
-npx @backstage/create-app@latest
-```
+This guide also assumes a basic understanding of working on a Linux based operating system and have some experience with the terminal, specifically, these commands: `npm`, `yarn`.
+
+- A minimum of 20 GB disk space to run the standalone Backstage application with demo data. NOTE: As you add more modules and plugins to an installation, the disk space requirements will increase, accordingly.
+- A minimum of 6 GB memory.
+- Access to a Unix-based operating system, such as Linux, macOS or
+ [Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/). The Linux version must support the required Node.js version.
+- A GNU-like build environment available at the command line.
+ For example, on Debian/Ubuntu you will want to have the `make` and `build-essential` packages installed.
+ On macOS, you will want to run `xcode-select --install` to get the XCode command line build tooling in place.
+- An account with elevated rights to install the dependencies
+- `curl` or `wget` installed
+- Node.js [Active LTS Release](../overview/versioning-policy.md#nodejs-releases) installed using one of these
+ methods:
+ - Using `nvm` (recommended)
+ - [Installing nvm](https://github.com/nvm-sh/nvm#install--update-script)
+ - [Install and change Node version with nvm](https://nodejs.org/en/download/package-manager/#nvm)
+ - Node 20 is a good starting point, this can be installed using `nvm install lts/iron`
+ - [Binary Download](https://nodejs.org/en/download/)
+ - [Package manager](https://nodejs.org/en/download/package-manager/)
+ - [Using NodeSource packages](https://github.com/nodesource/distributions/blob/master/README.md)
+- Install the `isolated-vm` module, following their [requirements section](https://github.com/laverdet/isolated-vm#requirements).
+- `yarn` [Installation](https://yarnpkg.com/getting-started/install)
+ - Backstage currently uses Yarn 4.4.1, once you've ran `corepack enable` you'll want to then run `yarn set version 4.4.1`
+- `docker` [installation](https://docs.docker.com/engine/install/)
+- `git` [installation](https://github.com/git-guides/install-git)
+- If the system is not directly accessible over your network the following ports
+ need to be opened: 3000, 7007. This is quite uncommon, unless you're installing in a container, VM or remote system.
+
+## Creating and running a Backstage application
This may take a few minutes to fully install everything. Don't stress if the loading seems to be spinning nonstop, there's a lot going on in the background.
-:::note
+To create the application:
-If this fails on the `yarn install` step, it's likely that you will need to install some additional dependencies which are used to configure `isolated-vm`. You can find out more in their [requirements section](https://github.com/laverdet/isolated-vm#requirements), and then run `yarn install` manually again after you've completed those steps.
+1. Type the following command to install the Backstage application.
-:::
+```bash
+ npx @backstage/create-app@latest
+```
-## 2. Run the Backstage app
+2. If this is the first time that you are installing a Backstage application on this device, the following question is displayed. Enter `y` and select `Enter` to proceed with the installation.
+
+```
+ Need to install the following packages:
+ @backstage/create-app@0.7.4
+ ok to proceed? (y)
+```
+
+3. Enter the name for your application and select `Enter`. This is the root directory of your application. In this example, the name is set to `my-backstage-app`.
+
+ 
Your Backstage app is fully installed and ready to be run! Now that the installation is complete, you can go to the application directory and start the app using the `yarn start` command. The `yarn start` command will run both the frontend and backend as separate processes (named `[0]` and `[1]`) in the same window.
-```bash
-cd my-backstage-app # your app name
-yarn start
+To run the application:
+
+1. Change to the root directory of your Backstage app. This is the same as the name of your application that you provided during the installation. In this example, it is `my-backstage-app`.
+
+ ```bash
+ cd my-backstage-app
+ ```
+
+2. Start the Backstage application.
+
+ ```bash
+ yarn start
+ ```
+
+As the frontend and backend are starting, you will see output similar to the following. The output shows that the app and backend are starting up with the configuration coming from `app-config.yaml`. You will see the plugins being initialized, and authorization and permissions being setup. In addition you will see a series of REST API calls for those plugins that use a service backend, such as the service catalog.
+
+```
+Starting app, backend
+Loaded config from app-config.yaml
+.
+.
+2025-10-15T12:26:41.564Z backstage info Plugin initialization started: 'app', 'proxy', 'scaffolder', 'techdocs', 'auth', 'catalog', 'permission', 'search', 'kubernetes', 'notifications', 'signals' type="initialization"
+Rspack compiled successfully
+.
+.
+2025-10-15T15:17:21.130Z auth info Created new signing key eec1a9e4-4395-4698-9a9f-f1b5cbcf152b component="token-factory"
+2025-10-15T15:17:21.139Z auth info Issuing token for user:development/guest, with entities user:development/guest component="token-factory"
+2025-10-15T15:17:21.223Z rootHttpRouter info [2025-10-15T15:17:21.223Z] "GET /api/auth/guest/refresh HTTP/1.1" 200 802 "http://localhost:3000/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:143.0) Gecko/20100101 Firefox/143.0" type="incomingRequest" date="2025-10-15T15:17:21.223Z" method="GET" url="/api/auth/guest/refresh" status=200 httpVersion="1.1" userAgent="Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:143.0) Gecko/20100101 Firefox/143.0" contentLength=802 referrer="http://localhost:3000/"
+.
+.
+2025-10-15T15:17:24.051Z rootHttpRouter info [2025-10-15T15:17:24.051Z] "GET /api/catalog/entities?fields=metadata,kind,spec.profile&filter=kind%3Dgroup%2Crelations.hasMember%3Duser%3Adevelopment%2Fguest HTTP/1.1" 304 0 "http://localhost:3000/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:143.0) Gecko/20100101 Firefox/143.0" type="incomingRequest" date="2025-10-15T15:17:24.051Z" method="GET" url="/api/catalog/entities?fields=metadata,kind,spec.profile&filter=kind%3Dgroup%2Crelations.hasMember%3Duser%3Adevelopment%2Fguest" status=304 httpVersion="1.1" userAgent="Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:143.0) Gecko/20100101 Firefox/143.0" referrer="http://localhost:3000/"
+.
+.
```
-
+Once the Backstage UI is displayed, you can start exploring the demo immediately.
-Here again, there's a small wait for the frontend to start up. Once the frontend is built, your browser window should automatically open.
+:::tip Browser window didn't open with yarn start
-:::tip Browser window didn't open
-
-When you see the message `[0] webpack compiled successfully`, you can navigate directly to `http://localhost:3000` to see your Backstage app.
+When you see the message `Rspack compiled successfully`, you can navigate directly to `http://localhost:3000` to see your Backstage app.
:::
-You can start exploring the demo immediately.
-

-## Recap
-
-This tutorial walked through how to deploy Backstage using the `npx @backstage/create-app@latest` command. That command created a new directory that holds your new Backstage app. That app is currently only configured for development purposes, as it is using an in-memory database and contains demo data.
-
## Next steps
Choose the correct next steps for your user role, if you're likely to be deploying and managing a Backstage instance for your organization, look through the [Admin](#admin) section. If you're likely to be developing on/for Backstage, take a look through the [Developer](#developer) section.
### Admin
-- Deploying to production
-
+- Configuring Backstage
- [Setting up authentication](./config/authentication.md)
- [Configuring a database](./config/database.md)
- - [Deploying with Docker](../deployment/docker.md)
- - [Deploying with Kubernetes](../deployment/k8s.md)
-
-- Configuring Backstage
-
- [Adding plugins](./configure-app-with-plugins.md)
- [Customizing Your App's UI](../conf/user-interface/index.md)
- [Populating the homepage](./homepage.md)
+- Deploying to production
+ - [Deploying with Docker](../deployment/docker.md)
+ - [Deploying with Kubernetes](../deployment/k8s.md)
### Developer
@@ -171,8 +191,4 @@ Share your experiences, comments, or suggestions with us:
[on discord](https://discord.gg/backstage-687207715902193673), file issues for any
[feature](https://github.com/backstage/backstage/issues/new?labels=help+wanted&template=feature_template.md)
or
-[plugin suggestions](https://github.com/backstage/community-plugins/issues/new/choose),
-or
-[bugs](https://github.com/backstage/backstage/issues/new?labels=bug&template=bug_template.md)
-you have, and feel free to
-[contribute](https://github.com/backstage/backstage/blob/master/CONTRIBUTING.md)!
+[plugin suggestions](https://github.com/backstage/community-plugins/issues/new/choose)
diff --git a/docs/integrations/bitbucketCloud/locations.md b/docs/integrations/bitbucketCloud/locations.md
index 6b735171a4..807076c9e9 100644
--- a/docs/integrations/bitbucketCloud/locations.md
+++ b/docs/integrations/bitbucketCloud/locations.md
@@ -32,6 +32,15 @@ integrations:
appPassword: my-password
```
+OAuth 2.0 client credentials flow:
+
+```yaml
+integrations:
+ bitbucketCloud:
+ - clientId: client-id
+ clientSecret: client-secret
+```
+
:::note Note
A public Bitbucket Cloud provider is added automatically at startup for
@@ -41,7 +50,7 @@ convenience, so you only need to list it if you want to supply credentials.
:::note Note
-The credential required for this type is either an [Api token](https://support.atlassian.com/bitbucket-cloud/docs/using-api-tokens/) or an [App Password](https://support.atlassian.com/bitbucket-cloud/docs/app-passwords/). An Atlassian Account API key will not work.
+The credential required for this type is either an [Api token](https://support.atlassian.com/bitbucket-cloud/docs/using-api-tokens/), an [App Password](https://support.atlassian.com/bitbucket-cloud/docs/app-passwords/) or an [OAuth 2.0 client credentials](https://support.atlassian.com/bitbucket-cloud/docs/use-oauth-on-bitbucket-cloud/). An Atlassian Account API key will not work.
:::
@@ -55,3 +64,5 @@ This one entry will have the following elements:
neither a username nor token are supplied, anonymous access will be used.
- `token`: The token used to authenticate requests.
- `appPassword`: The app password for the Bitbucket Cloud user.
+- `clientId`: The OAuth client ID for Bitbucket Cloud (used with `clientSecret` for OAuth 2.0 client credentials flow).
+- `clientSecret`: The OAuth client secret for Bitbucket Cloud (used with `clientId` for OAuth 2.0 client credentials flow).
diff --git a/docs/notifications/processors.md b/docs/notifications/processors.md
index 7ae98a528c..af0b9f8f93 100644
--- a/docs/notifications/processors.md
+++ b/docs/notifications/processors.md
@@ -156,6 +156,56 @@ notifications:
Multiple instances can be added in the `slack` array, allowing you to have multiple configurations if you need to send
messages to more than one Slack workspace. Org-Wide App installation is not currently supported.
+### Broadcast Channel Routing
+
+For more granular control over where broadcast notifications are sent, you can use `broadcastRoutes` to route notifications to different Slack channels based on their origin and/or topic. This is useful when you want different types of notifications to go to different channels.
+
+```yaml
+notifications:
+ processors:
+ slack:
+ - token: xoxb-XXXXXXXXX
+ # Legacy option - used as fallback when no routes match
+ broadcastChannels:
+ - general-notifications
+ # Route broadcasts based on origin and/or topic
+ broadcastRoutes:
+ # Most specific: matches both origin AND topic
+ - origin: plugin:catalog
+ topic: alerts
+ channel: catalog-alerts
+ # Origin only: all notifications from this origin
+ - origin: plugin:catalog
+ channel: catalog-updates
+ # Topic only: all notifications with this topic (any origin)
+ - topic: security
+ channel: security-team
+ # Multiple channels: send to several channels at once
+ - origin: external:monitoring
+ channel:
+ - ops-team
+ - on-call-alerts
+```
+
+#### Route Matching Precedence
+
+Routes are evaluated in the following order of priority:
+
+1. **Origin + Topic match** (most specific) - A route that specifies both `origin` and `topic` will match first
+2. **Origin-only match** - A route with only `origin` specified (no `topic`)
+3. **Topic-only match** - A route with only `topic` specified (no `origin`)
+4. **Default fallback** - If no routes match, falls back to `broadcastChannels`
+
+The first matching route wins. If no routes match and no `broadcastChannels` are configured, the broadcast notification will not be sent to Slack.
+
+#### Configuration Options
+
+| Property | Type | Description |
+| --------- | ---------------------- | ------------------------------------------------------------------------------------------ |
+| `origin` | `string` | Optional. The notification origin to match (e.g., `plugin:catalog`, `external:my-service`) |
+| `topic` | `string` | Optional. The notification topic to match (e.g., `alerts`, `updates`, `security`) |
+| `channel` | `string` or `string[]` | Required. The Slack channel(s) to send to. Can be channel IDs, channel names, or user IDs |
+
### Entity Requirements
Entities must be annotated with the following annotation:
diff --git a/docs/plugins/integrating-plugin-into-software-catalog.md b/docs/plugins/integrating-plugin-into-software-catalog.md
index ed2e25c601..3542e073cb 100644
--- a/docs/plugins/integrating-plugin-into-software-catalog.md
+++ b/docs/plugins/integrating-plugin-into-software-catalog.md
@@ -32,7 +32,7 @@ Creating the plugin...
### Reading entities from within your plugin
You can access the currently selected entity using the backstage api
-[`useEntity`](../reference/plugin-catalog-react.useentity.md). For example,
+[`useEntity`](https://backstage.io/api/stable/functions/_backstage_plugin-catalog-react.index.useEntity.html). For example,
```tsx
import { useEntity } from '@backstage/plugin-catalog-react';
diff --git a/docs/plugins/structure-of-a-plugin.md b/docs/plugins/structure-of-a-plugin.md
index 8412ead179..7cfaca4561 100644
--- a/docs/plugins/structure-of-a-plugin.md
+++ b/docs/plugins/structure-of-a-plugin.md
@@ -82,7 +82,7 @@ export const ExamplePage = examplePlugin.provide(
This is where the plugin is created and where it creates and exports extensions
that can be imported and used in the app. See reference docs for
-[`createPlugin`](../reference/core-plugin-api.createplugin.md) or introduction to
+[`createPlugin`](https://backstage.io/api/stable/functions/_backstage_core-plugin-api.index.createPlugin.html) or introduction to
the new [Composability System](./composability.md).
## Components
diff --git a/docs/releases/v1.46.0-changelog.md b/docs/releases/v1.46.0-changelog.md
new file mode 100644
index 0000000000..22e6e39dab
--- /dev/null
+++ b/docs/releases/v1.46.0-changelog.md
@@ -0,0 +1,2369 @@
+# Release v1.46.0
+
+Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.46.0](https://backstage.github.io/upgrade-helper/?to=1.46.0)
+
+## @backstage/plugin-techdocs-addons-test-utils@2.0.0
+
+### Major Changes
+
+- 8d6709e: **BREAKING**: `TechDocsAddonTester.renderWithEffects()` no longer returns a screen; this means that you can no longer grab assertions such as `getByText` from its return value.
+
+ Newer versions of `@testing-library` recommends using the `screen` export for assertions - and removing this from the addon tester contract allows us to more freely iterate on which underlying version of the testing library is being used.
+
+ One notable effect of this, however, is that the `@testing-library` `screen` does NOT support assertions on the shadow DOM, which techdocs relies on. You will therefore want to add a dependency on [the `shadow-dom-testing-library` package](https://github.com/konnorrogers/shadow-dom-testing-library/) in your tests, and using its `screen` and its dedicated `*Shadow*` methods. As an example, if you keep doing `getByText` you will not get matches inside the shadow DOM - switch to `getByShadowText` instead.
+
+ ```ts
+ import { screen } from 'shadow-dom-testing-library';
+
+ // ... render the addon ...
+ await TechDocsAddonTester.buildAddonsInTechDocs([])
+ .withDom(TEST_CONTENT)
+ .renderWithEffects();
+
+ expect(screen.getByShadowText('TEST_CONTENT')).toBeInTheDocument();
+ ```
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.19.3
+ - @backstage/plugin-techdocs@1.16.1
+ - @backstage/plugin-catalog@1.32.1
+ - @backstage/plugin-catalog-react@1.21.4
+ - @backstage/plugin-search-react@1.10.1
+ - @backstage/test-utils@1.7.14
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/integration-react@1.2.13
+ - @backstage/plugin-techdocs-react@1.3.6
+
+## @backstage/backend-app-api@1.4.0
+
+### Minor Changes
+
+- 5a2d538: Introduced backend startup result tracking and error handling. The `Backend.start()` method now returns a `BackendStartupResult` with detailed success/failure status and timing information for all plugins and modules. When startup fails, a `BackendStartupError` is thrown that includes the complete startup results, making it easier to diagnose which plugins or modules failed.
+
+ This also improves the default error message when backend startup fails, and of course makes it possible to craft your own custom error reporting based on the startup results.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/backend-defaults@0.14.0
+
+### Minor Changes
+
+- fa43826: Move `better-sqlite3` from dependencies to peer dependencies
+- 2bc4e02: **BREAKING** The correct configuration options for Valkey are now being used.
+
+ These changes are **required** to `app-config.yaml`:
+
+ ```diff
+ backend:
+ cache:
+ store: valkey
+ connection: ...
+ client:
+ - namespace: 'my-app'
+ - keyPrefixSeparator: ':'
+ + keyPrefix: 'my-app:'
+ - clearBatchSize: 1000
+ - useUnlink: false
+ ```
+
+ In comparison to Redis, Valkey requires the full `keyPrefix` including the separator to be specified instead of separate `namespace` and `keyPrefixSeparator` options. Also, Valkey does not support the `clearBatchSize` and `useUnlink` options.
+
+### Patch Changes
+
+- 37fba1d: Added support for Bitbucket Cloud OAuth. This introduces an alternative authentication method using a workspace OAuth consumer, alongside App Passwords (deprecated) and API tokens. OAuth does not require a bot or service account and avoids token expiry issues.
+
+ **BREAKING CHANGES**
+
+ - **@backstage/integration** (`src/bitbucketCloud/core.ts`)
+
+ - `getBitbucketCloudRequestOptions` now returns a `Promise` and **must** be awaited.
+
+ - **@backstage/plugin-scaffolder-backend-module-bitbucket-cloud** (`src/actions/helpers.ts`)
+ - `getBitbucketClient` now returns a `Promise` and **must** be awaited.
+ - `getAuthorizationHeader` now returns a `Promise` and **must** be awaited.
+
+ **OAuth usage example**
+
+ ```yaml
+ integrations:
+ bitbucketCloud:
+ - clientId: client-id
+ clientSecret: client-secret
+ ```
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+
+- aa79251: build(deps): bump `node-forge` from 1.3.1 to 1.3.2
+
+- f96edff: Allow configuration of the `referrerPolicy`
+
+- fb029b6: Updated luxon types
+
+- d9759a1: **BREAKING ALPHA**: The old `instanceMetadataService` has been removed from alpha. Please switch over to using the stable `coreServices.rootInstanceMetadata` and related types instead, available from `@backstage/backend-plugin-api`.
+
+- 847a330: Fix for `jose` types
+
+- 25b560e: Internal change to support new versions of the `logform` library
+
+- 2a0c4b0: Adds a new experimental `RootSystemMetadataService` for tracking the collection of Backstage instances that may be deployed at any one time. It currently offers a single API, `getInstalledPlugins` that returns a list of installed plugins based on config you have set up in `discovery.endpoints` as well as the plugins installed on the instance you're calling the API with. It does not handle wildcard values or fallback values. The intention is for this plugin to provide plugin authors with a simple interface to fetch a trustworthy list of all installed plugins.
+
+- 3016a79: Updated dependency `@types/archiver` to `^7.0.0`.
+
+- 42db6a6: Don't warn when parsing `storeOptions` for `memory` cache
+
+- Updated dependencies
+ - @backstage/cli-node@0.2.16
+ - @backstage/integration@1.19.0
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/plugin-permission-node@0.10.7
+ - @backstage/backend-app-api@1.4.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/config-loader@1.10.7
+ - @backstage/backend-dev-utils@0.1.6
+
+## @backstage/backend-plugin-api@1.6.0
+
+### Minor Changes
+
+- 2a0c4b0: Adds a new experimental `RootSystemMetadataService` for tracking the collection of Backstage instances that may be deployed at any one time. It currently offers a single API, `getInstalledPlugins` that returns a list of installed plugins based on config you have set up in `discovery.endpoints` as well as the plugins installed on the instance you're calling the API with. It does not handle wildcard values or fallback values. The intention is for this plugin to provide plugin authors with a simple interface to fetch a trustworthy list of all installed plugins.
+
+### Patch Changes
+
+- d9759a1: **BREAKING ALPHA**: The old `instanceMetadataService` has been removed from alpha. Please switch over to using the stable `coreServices.rootInstanceMetadata` and related types instead, available from `@backstage/backend-plugin-api`.
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/plugin-permission-node@0.10.7
+ - @backstage/cli-common@0.1.16
+
+## @backstage/cli@0.35.0
+
+### Minor Changes
+
+- f6f22a9: Provide `--no-node-snapshot` by default when running the `package start` or `package test`. You can disable this behavior by providing `NODE_OPTIONS='--node-snapshot'`.
+
+- f8dff94: Switched the default module resolution to `bundler` and the `module` setting to `ES2020`.
+
+ You may need to bump some dependencies as part of this change and fix imports in code. The most common source of this is that type checking will now consider the `exports` field in `package.json` when resolving imports. This in turn can break older versions of packages that had incompatible `exports` fields. Generally these issues will have already been fixed in the upstream packages.
+
+ You might be tempted to use `--skipLibCheck` to hide issues due to this change, but it will weaken the type safety of your project. If you run into a large number of issues and want to keep the old behavior, you can reset the `moduleResolution` and `module` settings your own `tsconfig.json` file to `node` and `ESNext` respectively. But keep in mind that the `node` option will be removed in future versions of TypeScript.
+
+ A future version of Backstage will make these new settings mandatory, as we move to rely on the `exports` field for type resolution in packages, rather than the `typesVersions` field.
+
+- cd0b8a1: **BREAKING**: `jest` is now a peer dependency. If you run tests using Backstage CLI, you must add Jest and its environment dependencies as `devDependencies` in your project.
+
+ You can choose to install either Jest 29 or Jest 30. The built-in Jest version before this change was Jest 29, however, we recommend that you switch to Jest 30. Upgrading will solve the `Could not parse CSS stylesheet` errors, allow you to use MSW v2 in web packages, and ensure that you remain compatible with future versions of the Backstage CLI. Support for Jest 29 is temporary, with the purpose of allowing you to upgrade at your own pace, but it will eventually be removed.
+
+ - **Jest 29**: Install `jest@^29` and `jest-environment-jsdom@^29`. No migration needed, but you may see `Could not parse CSS stylesheet` warnings/errors when testing components from `@backstage/ui` or other packages using CSS `@layer` declarations.
+ - **Jest 30**: Install `jest@^30`, `@jest/environment-jsdom-abstract@^30`, and `jsdom@^27`. Fixes the stylesheet parsing warnings/errors, but requires migration steps.
+
+ See the [Jest 30 migration guide](https://backstage.io/docs/tutorials/jest30-migration) for detailed migration instructions.
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+
+- e7db290: Add missing peer/dev dependencies to the frontend plugin template.
+
+ `react-dom` was not declared as a peer dependency, causing module resolution
+ errors when generating plugins outside a Backstage monorepo. This adds
+ `react-dom` to `peerDependencies` (for consuming apps) and `devDependencies`
+ (for local development). `react-router-dom` is also added to `peerDependencies` (for consuming apps) and `devDependencies`
+ to support routing during plugin development.
+
+ Fixes:
+
+ - Module not found: Can't resolve 'react-dom'
+ - Module not found: Can't resolve 'react-router-dom'
+
+- 1226647: Updated dependency `esbuild` to `^0.27.0`.
+
+- f89a074: Updated dependency `@pmmmwh/react-refresh-webpack-plugin` to `^0.6.0`.
+
+- 2b81751: Updated dependency `webpack` to `~5.103.0`.
+
+- fafd9e1: Fixed internal usage of `yargs`.
+
+- c8c2329: Add proxy configuration from env-vars to create-app tasks
+
+- 2bae83a: Switched compilation target to ES2022 in order to match the new set of supported Node.js versions, which are 22 and 24.
+
+ The TypeScript compilation target has been set to ES2022, because setting it to a higher target will break projects on older TypeScript versions. If you use a newer TypeScript version in your own project, you can bump `compilerOptions.target` to ES2023 or ES2024 in your own `tsconfig.json` file.
+
+- 7fbac5c: Updated to use new utilities from `@backstage/cli-common`.
+
+- 2bae83a: Bumped dev dependencies `@types/node`
+
+- Updated dependencies
+ - @backstage/cli-node@0.2.16
+ - @backstage/integration@1.19.0
+ - @backstage/cli-common@0.1.16
+ - @backstage/config-loader@1.10.7
+
+## @backstage/integration@1.19.0
+
+### Minor Changes
+
+- 37fba1d: Added support for Bitbucket Cloud OAuth. This introduces an alternative authentication method using a workspace OAuth consumer, alongside App Passwords (deprecated) and API tokens. OAuth does not require a bot or service account and avoids token expiry issues.
+
+ **BREAKING CHANGES**
+
+ - **@backstage/integration** (`src/bitbucketCloud/core.ts`)
+
+ - `getBitbucketCloudRequestOptions` now returns a `Promise` and **must** be awaited.
+
+ - **@backstage/plugin-scaffolder-backend-module-bitbucket-cloud** (`src/actions/helpers.ts`)
+ - `getBitbucketClient` now returns a `Promise` and **must** be awaited.
+ - `getAuthorizationHeader` now returns a `Promise` and **must** be awaited.
+
+ **OAuth usage example**
+
+ ```yaml
+ integrations:
+ bitbucketCloud:
+ - clientId: client-id
+ clientSecret: client-secret
+ ```
+
+### Patch Changes
+
+- a26a322: Added support for using a GitHub App installation to generate tokens for public repository access when the `publicAccess` option is enabled. When all other authentication methods fail (e.g., the app is not installed in that organization), the provider will now use an available installation to generate a token that can be used to access public repositories as read only.
+- fb029b6: Updated luxon types
+- e15fdae: Made the github urls case insensitive.
+
+## @backstage/ui@0.10.0
+
+### Minor Changes
+
+- 16543fa: **Breaking change** The `Cell` component has been refactored to be a generic wrapper component that accepts `children` for custom cell content. The text-specific functionality (previously part of `Cell`) has been moved to a new `CellText` component.
+
+ ### Migration Guide
+
+ If you were using `Cell` with text-specific props (`title`, `description`, `leadingIcon`, `href`), you need to update your code to use `CellText` instead:
+
+ **Before:**
+
+ ```tsx
+ }
+ href="/path"
+ />
+ ```
+
+ **After:**
+
+ ```tsx
+ }
+ href="/path"
+ />
+ ```
+
+ For custom cell content, use the new generic `Cell` component:
+
+ ```tsx
+ {/* Your custom content */}
+ ```
+
+### Patch Changes
+
+- 50b7927: Fixed Checkbox indicator showing checkmark color when unchecked.
+
+ Affected components: Checkbox
+
+- 5bacf55: Fixed `ButtonIcon` incorrectly applying `className` to inner elements instead of only the root element.
+
+ Affected components: ButtonIcon
+
+- b3ad928: Fixed Table Row component to correctly handle cases where no `href` is provided, preventing unnecessary router provider wrapping and fixing the cursor incorrectly showing as a pointer despite the element not being a link.
+
+ Affected components: Row
+
+- a20d317: Added row selection support with visual state styling for hover, selected, and pressed states. Fixed checkbox rendering to only show for multi-select toggle mode.
+
+ Affected components: Table, TableHeader, Row, Column
+
+- fe7c751: Fixed `useTable` hook to prioritize `providedRowCount` over data length for accurate row count in server-side pagination scenarios.
+
+- c145031: Fixed Table column sorting indicator to show up arrow when no sort is active, correctly indicating that clicking will sort ascending.
+
+ Affected components: Column
+
+## @backstage/plugin-auth-backend-module-github-provider@0.4.0
+
+### Minor Changes
+
+- b3286d5: Added the `github.com/user-id` annotation to store GitHub's user ID (immutable) in user entities. Also includes addition of the `userIdMatchingUserEntityAnnotation` sign-in resolver that matches users by the new ID.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-catalog-backend@3.3.0
+
+### Minor Changes
+
+- dce1824: Added `ActionsRegistry` actions for `register-entity` and `unregister-entity`
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- 8101ec1: Fixed default refresh service to go through the whole ancestry of the entity.
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/backend-openapi-utils@0.6.4
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/plugin-permission-node@0.10.7
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-catalog-node@1.20.1
+
+## @backstage/plugin-catalog-backend-module-github@0.12.0
+
+### Minor Changes
+
+- b3286d5: Added the `github.com/user-id` annotation to store GitHub's user ID (immutable) in user entities. Also includes addition of the `userIdMatchingUserEntityAnnotation` sign-in resolver that matches users by the new ID.
+
+### Patch Changes
+
+- ed5a7a3: Introduce new configuration option to exclude suspended users from GitHub Enterprise instances.
+
+ When it’s set to true, suspended users won’t be returned when querying the organization users for GitHub Enterprise instances.
+ Note that this option should be used only against GitHub Enterprise instances, the property does not exist in the github.com GraphQL schema, setting it will cause a schema validation error and the syncing of users will fail.
+
+- a413977: Added configurable `pageSizes` option to `GithubOrgEntityProvider` for GitHub GraphQL API queries to prevent `RESOURCE_LIMITS_EXCEEDED` errors with organizations with large number of teams and members. This aligns the configuration options with `GithubMultiOrgEntityProvider`.
+
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-catalog-node@1.20.1
+
+## @backstage/plugin-events-backend-module-kafka@0.2.0
+
+### Minor Changes
+
+- 2c74ea9: Added support for multiple named instances in `kafkaConsumingEventPublisher` configuration. The previous single configuration format is still supported for backward compatibility.
+- 2c74ea9: Added `KafkaPublishingEventConsumer` to support sending Backstage events to Kafka topics.
+
+ This addition enables Backstage to publish events to external Kafka systems, complementing the existing ability to receive events from Kafka. This allows for better integration with external systems that rely on Kafka for event streaming.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-kubernetes-backend@0.21.0
+
+### Minor Changes
+
+- 7f9846f: Add possibility to extends Kubernetes REST API. Add fetcher to parameters for custom objects provider
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- fb029b6: Updated luxon types
+- e9589d9: Replace `@aws-sdk/signature-v4` with `@smithy/signature-v4`,
+ as stated in the [package documentation](https://www.npmjs.com/package/@aws-sdk/signature-v4?activeTab=readme)
+- 8fa8d87: Add Kubernetes Plugin Secrets Accordion with masked secret datas
+- Updated dependencies
+ - @backstage/plugin-permission-node@0.10.7
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-kubernetes-node@0.4.0
+ - @backstage/plugin-kubernetes-common@0.9.9
+ - @backstage/plugin-catalog-node@1.20.1
+
+## @backstage/plugin-kubernetes-node@0.4.0
+
+### Minor Changes
+
+- 7f9846f: Add possibility to extends Kubernetes REST API. Add fetcher to parameters for custom objects provider
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-kubernetes-common@0.9.9
+
+## @backstage/plugin-notifications-backend-module-slack@0.3.0
+
+### Minor Changes
+
+- f95a516: Enables optional routes to Slack channels for broadcast notifications based on origin and/or topics.
+
+### Patch Changes
+
+- b80857a: Slack notification handler throttling can now be configured with the `concurrencyLimit` and `throttleInterval` options.
+- f8230e4: Updated dependency `@faker-js/faker` to `^10.0.0`.
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-catalog-node@1.20.1
+ - @backstage/plugin-notifications-node@0.2.22
+
+## @backstage/plugin-scaffolder@1.35.0
+
+### Minor Changes
+
+- dab3d3f: Added field extension `RepoOwnerPicker` for retrieving GitHub repository owners.
+
+### Patch Changes
+
+- d02db50: Remove unnecessary use of `compatWrapper` and `convertLegacyRouteRef`(s) for the new frontend system.
+- be21c5c: Updated dependency `@rjsf/utils` to `5.24.13`.
+ Updated dependency `@rjsf/core` to `5.24.13`.
+ Updated dependency `@rjsf/material-ui` to `5.24.13`.
+ Updated dependency `@rjsf/validator-ajv8` to `5.24.13`.
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/plugin-scaffolder-react@1.19.4
+ - @backstage/core-components@0.18.4
+ - @backstage/plugin-catalog-react@1.21.4
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/integration-react@1.2.13
+ - @backstage/plugin-permission-react@0.4.39
+ - @backstage/plugin-scaffolder-common@1.7.4
+ - @backstage/plugin-techdocs-react@1.3.6
+
+## @backstage/plugin-scaffolder-backend@3.1.0
+
+### Minor Changes
+
+- a4cd405: Add `defaultEnvironment` config to scaffolder to enable more flexible and custom templates. Now it's possible enable access to default parameters and secrets in templates, improving security and reducing complexity.
+
+### Patch Changes
+
+- be5972b: Fixed a bug where config was not passed to NunjucksWorkflowRunner, causing defaultEnvironment to be undefined
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- 2bae83a: Updated `isolated-vm` to `6.0.1`
+- 25b560e: Internal change to support new versions of the `logform` library
+- 8f4aded: Fixing OpenAPI definition
+- 1226647: Updated dependency `esbuild` to `^0.27.0`.
+- Updated dependencies
+ - @backstage/plugin-scaffolder-backend-module-gitlab@0.11.0
+ - @backstage/integration@1.19.0
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.3.0
+ - @backstage/plugin-bitbucket-cloud-common@0.3.5
+ - @backstage/backend-defaults@0.14.0
+ - @backstage/backend-openapi-utils@0.6.4
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/plugin-permission-node@0.10.7
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-scaffolder-backend-module-github@0.9.3
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.16
+ - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.17
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.15
+ - @backstage/plugin-catalog-node@1.20.1
+ - @backstage/plugin-scaffolder-backend-module-azure@0.2.16
+ - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.16
+ - @backstage/plugin-scaffolder-backend-module-gitea@0.2.16
+ - @backstage/plugin-scaffolder-common@1.7.4
+ - @backstage/plugin-scaffolder-node@0.12.2
+
+## @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.3.0
+
+### Minor Changes
+
+- 37fba1d: Added support for Bitbucket Cloud OAuth. This introduces an alternative authentication method using a workspace OAuth consumer, alongside App Passwords (deprecated) and API tokens. OAuth does not require a bot or service account and avoids token expiry issues.
+
+ **BREAKING CHANGES**
+
+ - **@backstage/integration** (`src/bitbucketCloud/core.ts`)
+
+ - `getBitbucketCloudRequestOptions` now returns a `Promise` and **must** be awaited.
+
+ - **@backstage/plugin-scaffolder-backend-module-bitbucket-cloud** (`src/actions/helpers.ts`)
+ - `getBitbucketClient` now returns a `Promise` and **must** be awaited.
+ - `getAuthorizationHeader` now returns a `Promise` and **must** be awaited.
+
+ **OAuth usage example**
+
+ ```yaml
+ integrations:
+ bitbucketCloud:
+ - clientId: client-id
+ clientSecret: client-secret
+ ```
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/plugin-bitbucket-cloud-common@0.3.5
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-scaffolder-node@0.12.2
+
+## @backstage/plugin-scaffolder-backend-module-gitlab@0.11.0
+
+### Minor Changes
+
+- f2d034b: In the `gitlabRepoPush` action, add 'auto' possibility for `commitAction` input.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-scaffolder-node@0.12.2
+
+## @backstage/plugin-search-backend-node@1.4.0
+
+### Minor Changes
+
+- 4d3ddb9: Improving method that search tokenizer breaks apart entity names
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/app-defaults@1.7.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.19.3
+ - @backstage/core-components@0.18.4
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/theme@0.7.1
+ - @backstage/plugin-permission-react@0.4.39
+
+## @backstage/backend-dev-utils@0.1.6
+
+### Patch Changes
+
+- 2bae83a: Internal update for Node.js v24 support.
+
+## @backstage/backend-dynamic-feature-service@0.7.7
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/cli-node@0.2.16
+ - @backstage/plugin-search-backend-node@1.4.0
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/backend-defaults@0.14.0
+ - @backstage/backend-openapi-utils@0.6.4
+ - @backstage/plugin-app-node@0.1.40
+ - @backstage/plugin-catalog-backend@3.3.0
+ - @backstage/plugin-events-backend@0.5.9
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/plugin-permission-node@0.10.7
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/cli-common@0.1.16
+ - @backstage/config-loader@1.10.7
+ - @backstage/plugin-scaffolder-node@0.12.2
+
+## @backstage/backend-openapi-utils@0.6.4
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/backend-test-utils@1.10.2
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- 8be23a4: Switched `textextensions` dependency for `text-extensions`.
+- 5a737e1: Fix PostgreSQL 18 `TestDatabases` by pinning the data directory
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/backend-defaults@0.14.0
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/backend-app-api@1.4.0
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/cli-common@0.1.16
+
+### Patch Changes
+
+- 5cfb2a4: Added new `run`, `runOutput`, and `runCheck` utilities to help run child processes in a safe and portable way.
+- c8c2329: Add proxy configuration from env-vars to create-app tasks
+- 2bae83a: Bumped dev dependencies `@types/node`
+
+## @backstage/cli-node@0.2.16
+
+### Patch Changes
+
+- 4e8c726: Updated to use new utilities from `@backstage/cli-common`.
+- Updated dependencies
+ - @backstage/cli-common@0.1.16
+
+## @backstage/codemods@0.1.53
+
+### Patch Changes
+
+- 688f070: Updated to use new utilities from `@backstage/cli-common`.
+- 2bae83a: Bumped dev dependencies `@types/node`
+- Updated dependencies
+ - @backstage/cli-common@0.1.16
+
+## @backstage/config-loader@1.10.7
+
+### Patch Changes
+
+- 741c47a: Updated dependency `typescript-json-schema` to `^0.67.0`.
+- Updated dependencies
+ - @backstage/cli-common@0.1.16
+
+## @backstage/core-app-api@1.19.3
+
+### Patch Changes
+
+- 75683ed: Added replay functionality to `AlertApiForwarder` to buffer and replay recent alerts to new subscribers, preventing missed alerts that were posted before subscription.
+- 97cd16f: Internal update of translation imports.
+- Updated dependencies
+ - @backstage/core-plugin-api@1.12.1
+
+## @backstage/core-compat-api@0.5.5
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/plugin-catalog-react@1.21.4
+ - @backstage/core-plugin-api@1.12.1
+
+## @backstage/core-components@0.18.4
+
+### Patch Changes
+
+- 9a942a4: Fixed bug in the `LogViewer` component where shift + click always opened a new window instead of just changing the selection.
+
+ In addition, improved the `LogViewer` component by a few usability enhancements:
+
+ - Added support for multiple selections using cmd/ctrl + click
+ - Improved the generated hash that is added to the URL to also support ranges & multiple selections
+ - Added an hover effect & info tooltip to the "Copy to clipboard" button to indicate its functionality
+ - Added some color and a separator to the line numbers to improve readability
+
+- 207c3c8: long words like urls now breaks to new line on warning panels instead of overflowing the container
+
+- 4c00303: Add `tooltipClasses` prop to `OverflowTooltip` component to allow customisation of the tooltip
+
+- 5d52dab: Add i18n support for LogViewer search control
+
+- f6b49ce: added support for wrapLongLines option in CodeSnippet
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/theme@0.7.1
+
+## @backstage/core-plugin-api@1.12.1
+
+### Patch Changes
+
+- 358c6f7: The `useApp` and `useRouteRef` functions are now forwards compatible with the new frontend system. Along with the previous route reference changes this means that there is no longer a need to use `compatWrapper` from `@backstage/core-compat-api` to make code based on `@backstage/core-plugin-api` compatible with `@backstage/frontend-plugin-api` APIs.
+- 97cd16f: Reversed the relationship between the old `@backstage/core-plugin-api` and the new `@backstage/frontend-plugin-api`. Previously, the a lot of API definitions and utilities where defined in the old and re-exported from the old, but this change flips that around so that they now reside in the new package and are re-exported from the old. The external API of both packages remain the same, but this is a step towards being able to add further compatibility with the new frontend system built into the old.
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.13.2
+
+## @backstage/create-app@0.7.7
+
+### Patch Changes
+
+- 336db00: Bumped create-app version.
+- 2bae83a: Updated engines to support Node 22 or 24
+- c8c2329: Add proxy configuration from env-vars to create-app tasks
+- 2bae83a: Bumped dev dependencies `@types/node`
+- Updated dependencies
+ - @backstage/cli-common@0.1.16
+
+## @backstage/dev-utils@1.1.18
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.19.3
+ - @backstage/ui@0.10.0
+ - @backstage/core-components@0.18.4
+ - @backstage/plugin-catalog-react@1.21.4
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/theme@0.7.1
+ - @backstage/app-defaults@1.7.3
+ - @backstage/integration-react@1.2.13
+
+## @backstage/frontend-app-api@0.13.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.19.3
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/frontend-defaults@0.3.4
+
+## @backstage/frontend-defaults@0.3.4
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-app@0.3.3
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/core-components@0.18.4
+ - @backstage/frontend-app-api@0.13.3
+
+## @backstage/frontend-dynamic-feature-loader@0.1.8
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.13.2
+
+## @backstage/frontend-plugin-api@0.13.2
+
+### Patch Changes
+
+- 75683ed: Added a new `errorPresentation` prop to `ExtensionBoundary` to control how errors are presented to the user. The default is `'error-display'`, which is the current behavior of showing the error in the `ErrorDisplay` component. The new option is `'error-api'`, posts errors to the `ErrorApi` and does not allow retries.
+
+ The `AppRootElementBlueprint` now wraps its element in an `ErrorBoundary` using the new `'error-api'` presentation mode.
+
+- 0bc1ce9: Fixed a versioning conflict that could result in a `.withContext` is not a function error.
+
+- f3f84f1: Made the return type of `.withOverrides` to be simplified.
+
+- 97cd16f: Reversed the relationship between the old `@backstage/core-plugin-api` and the new `@backstage/frontend-plugin-api`. Previously, the a lot of API definitions and utilities where defined in the old and re-exported from the old, but this change flips that around so that they now reside in the new package and are re-exported from the old. The external API of both packages remain the same, but this is a step towards being able to add further compatibility with the new frontend system built into the old.
+
+- 9b8bde4: Removed unnecessary dependencies on `@backstage/core-components`, `@backstage/config`, `@material-ui/core`, and `lodash`.
+
+## @backstage/frontend-test-utils@0.4.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-app@0.3.3
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/test-utils@1.7.14
+ - @backstage/frontend-app-api@0.13.3
+
+## @backstage/integration-react@1.2.13
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/core-plugin-api@1.12.1
+
+## @backstage/repo-tools@0.16.1
+
+### Patch Changes
+
+- 688f070: Updated to use new utilities from `@backstage/cli-common`.
+
+- 85895f9: Updates OpenAPI generator templates to preserve original property names (like 'group-name', 'user-id') from OpenAPI specs when propertyNaming=original is specified. Previously, these were always converted to camelCase regardless of the propertyNaming setting.
+
+ - Updates modelGeneric.mustache templates in both client and server generators
+ - Updates modelTaggedUnion.mustache templates in both client and server generators
+ - Uses {{baseName}} when available, falls back to {{name}} for backward compatibility
+ - Maintains backward compatibility - no changes when propertyNaming=original is not used
+
+- 2bae83a: Bump `@microsoft/api-documenter` and `@microsoft/api-extractor` to latest versions.
+
+- d1e38a7: Properly create workspace in OS temporary directory for `generate-patch` command
+
+- 2bae83a: Bumped dev dependencies `@types/node`
+
+- Updated dependencies
+ - @backstage/cli-node@0.2.16
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/cli-common@0.1.16
+ - @backstage/config-loader@1.10.7
+
+## @techdocs/cli@1.10.3
+
+### Patch Changes
+
+- 43629b1: Updated to use new utilities from `@backstage/cli-common`.
+- 2bae83a: Bumped dev dependencies `@types/node`
+- Updated dependencies
+ - @backstage/backend-defaults@0.14.0
+ - @backstage/plugin-techdocs-node@1.13.10
+ - @backstage/cli-common@0.1.16
+
+## @backstage/test-utils@1.7.14
+
+### Patch Changes
+
+- 97cd16f: Internal update of translation imports.
+- Updated dependencies
+ - @backstage/core-app-api@1.19.3
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/theme@0.7.1
+ - @backstage/plugin-permission-react@0.4.39
+
+## @backstage/theme@0.7.1
+
+### Patch Changes
+
+- fa06f6b: Added a `themeName` prop to `UnifiedThemeProvider`, enabling Backstage UI `data-theme-name` CSS attribute to be set based on active theme.
+
+## @backstage/plugin-api-docs@0.13.2
+
+### Patch Changes
+
+- f3f84f1: Minor extension type updates after frontend API bump
+- d02db50: Remove unnecessary use of `compatWrapper` and `convertLegacyRouteRef`(s) for the new frontend system.
+- Updated dependencies
+ - @backstage/plugin-catalog@1.32.1
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/core-components@0.18.4
+ - @backstage/plugin-catalog-react@1.21.4
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/plugin-permission-react@0.4.39
+
+## @backstage/plugin-app@0.3.3
+
+### Patch Changes
+
+- f3f84f1: Minor extension type updates after frontend API bump
+- f7bc228: Support to set `defaultLanguage` and `availableLanguages` for the app language API in the new frontend system
+- d02db50: Remove unnecessary use of `compatWrapper` and `convertLegacyRouteRef`(s) for the new frontend system.
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/core-components@0.18.4
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/theme@0.7.1
+ - @backstage/integration-react@1.2.13
+ - @backstage/plugin-permission-react@0.4.39
+
+## @backstage/plugin-app-backend@0.5.9
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/plugin-app-node@0.1.40
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/config-loader@1.10.7
+
+## @backstage/plugin-app-node@0.1.40
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/config-loader@1.10.7
+
+## @backstage/plugin-app-visualizer@0.1.26
+
+### Patch Changes
+
+- d02db50: Remove unnecessary use of `compatWrapper` and `convertLegacyRouteRef`(s) for the new frontend system.
+- Updated dependencies
+ - @backstage/ui@0.10.0
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/core-components@0.18.4
+ - @backstage/core-plugin-api@1.12.1
+
+## @backstage/plugin-auth@0.1.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/core-components@0.18.4
+ - @backstage/theme@0.7.1
+
+## @backstage/plugin-auth-backend@0.25.7
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-catalog-node@1.20.1
+
+## @backstage/plugin-auth-backend-module-atlassian-provider@0.4.10
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-auth-backend-module-auth0-provider@0.2.10
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-auth-backend-module-aws-alb-provider@0.4.10
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/plugin-auth-backend@0.25.7
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.15
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-auth-backend-module-bitbucket-provider@0.3.10
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.2.10
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.4.10
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-auth-backend-module-gcp-iap-provider@0.4.10
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-auth-backend-module-gitlab-provider@0.3.10
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-auth-backend-module-google-provider@0.3.10
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-auth-backend-module-guest-provider@0.2.15
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-auth-backend-module-microsoft-provider@0.3.10
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-auth-backend-module-oauth2-provider@0.4.10
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.15
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-auth-backend-module-oidc-provider@0.4.10
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/plugin-auth-backend@0.25.7
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-auth-backend-module-okta-provider@0.2.10
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-auth-backend-module-onelogin-provider@0.3.10
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-auth-backend-module-openshift-provider@0.1.3
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-auth-backend-module-pinniped-provider@0.3.10
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-auth-backend-module-vmware-cloud-provider@0.5.10
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-auth-node@0.6.10
+
+### Patch Changes
+
+- 2389358: remove leading dot in auth cookie cleanup call
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- b35f8b2: Fixed chunked cookie replacing edge case in OAuthCookieManager class where some of the old chunks would not get removed if new chunked cookie would have fewer chunks.
+- e9dd634: fix flawed cookie removal logic with chunked tokens
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-auth-react@0.1.22
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.18.4
+ - @backstage/core-plugin-api@1.12.1
+
+## @backstage/plugin-bitbucket-cloud-common@0.3.5
+
+### Patch Changes
+
+- 37fba1d: Added support for Bitbucket Cloud OAuth. This introduces an alternative authentication method using a workspace OAuth consumer, alongside App Passwords (deprecated) and API tokens. OAuth does not require a bot or service account and avoids token expiry issues.
+
+ **BREAKING CHANGES**
+
+ - **@backstage/integration** (`src/bitbucketCloud/core.ts`)
+
+ - `getBitbucketCloudRequestOptions` now returns a `Promise` and **must** be awaited.
+
+ - **@backstage/plugin-scaffolder-backend-module-bitbucket-cloud** (`src/actions/helpers.ts`)
+ - `getBitbucketClient` now returns a `Promise` and **must** be awaited.
+ - `getAuthorizationHeader` now returns a `Promise` and **must** be awaited.
+
+ **OAuth usage example**
+
+ ```yaml
+ integrations:
+ bitbucketCloud:
+ - clientId: client-id
+ clientSecret: client-secret
+ ```
+
+- Updated dependencies
+ - @backstage/integration@1.19.0
+
+## @backstage/plugin-catalog@1.32.1
+
+### Patch Changes
+
+- f3f84f1: Minor extension type updates after frontend API bump
+- d02db50: Remove unnecessary use of `compatWrapper` and `convertLegacyRouteRef`(s) for the new frontend system.
+- 91f5ed8: Fixed `catalogAboutEntityCard` to filter icon links before calling useProps(), preventing side effects from hooks in filtered-out links
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/core-components@0.18.4
+ - @backstage/plugin-catalog-react@1.21.4
+ - @backstage/plugin-search-react@1.10.1
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/core-compat-api@0.5.5
+ - @backstage/integration-react@1.2.13
+ - @backstage/plugin-permission-react@0.4.39
+ - @backstage/plugin-scaffolder-common@1.7.4
+ - @backstage/plugin-techdocs-react@1.3.6
+
+## @backstage/plugin-catalog-backend-module-aws@0.4.18
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/backend-defaults@0.14.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-kubernetes-common@0.9.9
+ - @backstage/plugin-catalog-node@1.20.1
+
+## @backstage/plugin-catalog-backend-module-azure@0.3.12
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-catalog-node@1.20.1
+
+## @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.9
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-openapi-utils@0.6.4
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-catalog-node@1.20.1
+
+## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.5.6
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/plugin-bitbucket-cloud-common@0.3.5
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-catalog-node@1.20.1
+
+## @backstage/plugin-catalog-backend-module-bitbucket-server@0.5.6
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-catalog-node@1.20.1
+
+## @backstage/plugin-catalog-backend-module-gcp@0.3.15
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-kubernetes-common@0.9.9
+ - @backstage/plugin-catalog-node@1.20.1
+
+## @backstage/plugin-catalog-backend-module-gerrit@0.3.9
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-catalog-node@1.20.1
+
+## @backstage/plugin-catalog-backend-module-gitea@0.1.7
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-catalog-node@1.20.1
+
+## @backstage/plugin-catalog-backend-module-github-org@0.3.17
+
+### Patch Changes
+
+- ed5a7a3: Introduce new configuration option to exclude suspended users from GitHub Enterprise instances.
+
+ When it’s set to true, suspended users won’t be returned when querying the organization users for GitHub Enterprise instances.
+ Note that this option should be used only against GitHub Enterprise instances, the property does not exist in the github.com GraphQL schema, setting it will cause a schema validation error and the syncing of users will fail.
+
+- Updated dependencies
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/plugin-catalog-backend-module-github@0.12.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-catalog-node@1.20.1
+
+## @backstage/plugin-catalog-backend-module-gitlab@0.7.6
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/backend-defaults@0.14.0
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-catalog-node@1.20.1
+
+## @backstage/plugin-catalog-backend-module-gitlab-org@0.2.16
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-catalog-backend-module-gitlab@0.7.6
+ - @backstage/plugin-catalog-node@1.20.1
+
+## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.7.7
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- fb029b6: Updated luxon types
+- Updated dependencies
+ - @backstage/backend-defaults@0.14.0
+ - @backstage/plugin-catalog-backend@3.3.0
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-catalog-node@1.20.1
+
+## @backstage/plugin-catalog-backend-module-ldap@0.12.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-catalog-node@1.20.1
+
+## @backstage/plugin-catalog-backend-module-logs@0.1.17
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-backend@3.3.0
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-catalog-backend-module-msgraph@0.8.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-catalog-node@1.20.1
+
+## @backstage/plugin-catalog-backend-module-openapi@0.2.17
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-catalog-node@1.20.1
+
+## @backstage/plugin-catalog-backend-module-puppetdb@0.2.17
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-catalog-node@1.20.1
+
+## @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.15
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-catalog-node@1.20.1
+ - @backstage/plugin-scaffolder-common@1.7.4
+
+## @backstage/plugin-catalog-backend-module-unprocessed@0.6.7
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-catalog-unprocessed-entities-common@0.0.12
+ - @backstage/plugin-catalog-node@1.20.1
+
+## @backstage/plugin-catalog-graph@0.5.4
+
+### Patch Changes
+
+- a67c144: Fixed zoom out description (replace `&` with &)
+- f3f84f1: Minor extension type updates after frontend API bump
+- d02db50: Remove unnecessary use of `compatWrapper` and `convertLegacyRouteRef`(s) for the new frontend system.
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/core-components@0.18.4
+ - @backstage/plugin-catalog-react@1.21.4
+ - @backstage/core-plugin-api@1.12.1
+
+## @backstage/plugin-catalog-import@0.13.8
+
+### Patch Changes
+
+- d02db50: Remove unnecessary use of `compatWrapper` and `convertLegacyRouteRef`(s) for the new frontend system.
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/core-components@0.18.4
+ - @backstage/plugin-catalog-react@1.21.4
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/integration-react@1.2.13
+ - @backstage/plugin-permission-react@0.4.39
+
+## @backstage/plugin-catalog-node@1.20.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-permission-node@0.10.7
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-catalog-react@1.21.4
+
+### Patch Changes
+
+- 6d39141: Fixed an issue where `EntityOwnerPicker` failed to filter options when the input text contained uppercase characters.
+- b3c0594: Use a versioned context for `useEntityList`, to better work with mixed `@backstage/plugin-catalog-react` versions.
+- c51c901: $contains may have string value in an entity filter. Typescript type and Zod parser were not the same.
+- d02db50: Remove unnecessary use of `compatWrapper` and `convertLegacyRouteRef`(s) for the new frontend system.
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/core-components@0.18.4
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/core-compat-api@0.5.5
+ - @backstage/frontend-test-utils@0.4.2
+ - @backstage/integration-react@1.2.13
+ - @backstage/plugin-permission-react@0.4.39
+
+## @backstage/plugin-catalog-unprocessed-entities@0.2.24
+
+### Patch Changes
+
+- d02db50: Remove unnecessary use of `compatWrapper` and `convertLegacyRouteRef`(s) for the new frontend system.
+
+- df4d646: Moved types, API and client to the common package, allowing both frontend and
+ backend plugins to use the `CatalogUnprocessedEntitiesClient`.
+
+ The following types, clients and interfaces have been deprecated and should be
+ imported from the `@backstage/plugin-catalog-unprocessed-entities-common` instead:
+ `CatalogUnprocessedEntitiesApi`, `CatalogUnprocessedEntitiesApiResponse`, `UnprocessedEntity`,
+ `UnprocessedEntityCache`, `UnprocessedEntityError`, `CatalogUnprocessedEntitiesClient`.
+
+ All those types, clients and interfaces are re-exported temporarily in the
+ `@backstage/plugin-catalog-unprocessed-entities` package until cleaned up.
+
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/core-components@0.18.4
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/plugin-catalog-unprocessed-entities-common@0.0.12
+
+## @backstage/plugin-catalog-unprocessed-entities-common@0.0.12
+
+### Patch Changes
+
+- df4d646: Moved types, API and client to the common package, allowing both frontend and
+ backend plugins to use the `CatalogUnprocessedEntitiesClient`.
+
+ The following types, clients and interfaces have been deprecated and should be
+ imported from the `@backstage/plugin-catalog-unprocessed-entities-common` instead:
+ `CatalogUnprocessedEntitiesApi`, `CatalogUnprocessedEntitiesApiResponse`, `UnprocessedEntity`,
+ `UnprocessedEntityCache`, `UnprocessedEntityError`, `CatalogUnprocessedEntitiesClient`.
+
+ All those types, clients and interfaces are re-exported temporarily in the
+ `@backstage/plugin-catalog-unprocessed-entities` package until cleaned up.
+
+## @backstage/plugin-config-schema@0.1.75
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.18.4
+ - @backstage/core-plugin-api@1.12.1
+
+## @backstage/plugin-devtools@0.1.34
+
+### Patch Changes
+
+- d02db50: Remove unnecessary use of `compatWrapper` and `convertLegacyRouteRef`(s) for the new frontend system.
+- 291bf9d: Added scheduled tasks UI feature for the DevTools plugin
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/core-components@0.18.4
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/plugin-devtools-common@0.1.20
+ - @backstage/core-compat-api@0.5.5
+ - @backstage/plugin-permission-react@0.4.39
+
+## @backstage/plugin-devtools-backend@0.5.12
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- 291bf9d: Added scheduled tasks UI feature for the DevTools plugin
+- Updated dependencies
+ - @backstage/backend-defaults@0.14.0
+ - @backstage/plugin-permission-node@0.10.7
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/cli-common@0.1.16
+ - @backstage/config-loader@1.10.7
+ - @backstage/plugin-devtools-common@0.1.20
+
+## @backstage/plugin-devtools-common@0.1.20
+
+### Patch Changes
+
+- 291bf9d: Added scheduled tasks UI feature for the DevTools plugin
+
+## @backstage/plugin-events-backend@0.5.9
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/backend-openapi-utils@0.6.4
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-events-backend-module-aws-sqs@0.4.18
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-events-backend-module-azure@0.2.27
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-events-backend-module-bitbucket-cloud@0.2.27
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-events-backend-module-bitbucket-server@0.1.8
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-events-backend-module-gerrit@0.2.27
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-events-backend-module-github@0.4.7
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-events-backend-module-gitlab@0.3.8
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-events-backend-module-google-pubsub@0.1.7
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-events-backend-test-utils@0.1.51
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-events-node@0.4.18
+
+## @backstage/plugin-events-node@0.4.18
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-gateway-backend@1.1.1
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- 7e860dd: Updated dependency `eventsource` to `^4.0.0`.
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-home@0.8.15
+
+### Patch Changes
+
+- d02db50: Remove unnecessary use of `compatWrapper` and `convertLegacyRouteRef`(s) for the new frontend system.
+- be21c5c: Updated dependency `@rjsf/utils` to `5.24.13`.
+ Updated dependency `@rjsf/core` to `5.24.13`.
+ Updated dependency `@rjsf/material-ui` to `5.24.13`.
+ Updated dependency `@rjsf/validator-ajv8` to `5.24.13`.
+- Updated dependencies
+ - @backstage/core-app-api@1.19.3
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/core-components@0.18.4
+ - @backstage/plugin-catalog-react@1.21.4
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/plugin-home-react@0.1.33
+ - @backstage/theme@0.7.1
+
+## @backstage/plugin-home-react@0.1.33
+
+### Patch Changes
+
+- be21c5c: Updated dependency `@rjsf/utils` to `5.24.13`.
+ Updated dependency `@rjsf/core` to `5.24.13`.
+ Updated dependency `@rjsf/material-ui` to `5.24.13`.
+ Updated dependency `@rjsf/validator-ajv8` to `5.24.13`.
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/core-components@0.18.4
+ - @backstage/core-plugin-api@1.12.1
+
+## @backstage/plugin-kubernetes@0.12.14
+
+### Patch Changes
+
+- f15d5f1: add missing i18n support for kubernetes and kubernetes-react
+- d02db50: Remove unnecessary use of `compatWrapper` and `convertLegacyRouteRef`(s) for the new frontend system.
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/plugin-kubernetes-react@0.5.14
+ - @backstage/core-components@0.18.4
+ - @backstage/plugin-catalog-react@1.21.4
+ - @backstage/plugin-kubernetes-common@0.9.9
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/plugin-permission-react@0.4.39
+
+## @backstage/plugin-kubernetes-cluster@0.0.32
+
+### Patch Changes
+
+- 2bae83a: Bumped dev dependencies `@types/node`
+- Updated dependencies
+ - @backstage/plugin-kubernetes-react@0.5.14
+ - @backstage/core-components@0.18.4
+ - @backstage/plugin-catalog-react@1.21.4
+ - @backstage/plugin-kubernetes-common@0.9.9
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/plugin-permission-react@0.4.39
+
+## @backstage/plugin-kubernetes-common@0.9.9
+
+### Patch Changes
+
+- 8fa8d87: Add Kubernetes Plugin Secrets Accordion with masked secret datas
+
+## @backstage/plugin-kubernetes-react@0.5.14
+
+### Patch Changes
+
+- f966a85: Enabled a pod terminal at GKE
+- 8fa8d87: Add Kubernetes Plugin Secrets Accordion with masked secret datas
+- f15d5f1: add missing i18n support for kubernetes and kubernetes-react
+- Updated dependencies
+ - @backstage/core-components@0.18.4
+ - @backstage/plugin-kubernetes-common@0.9.9
+ - @backstage/core-plugin-api@1.12.1
+
+## @backstage/plugin-mcp-actions-backend@0.1.6
+
+### Patch Changes
+
+- e83e038: Added `@cfworker/json-schema` as a dependency to this package part of the `@modelcontextprotocol/sdk` bump as it's required in the types
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- 79ef471: Clarify error handling in readme and update handleError.ts to include all backstage/errors
+- Updated dependencies
+ - @backstage/backend-defaults@0.14.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-catalog-node@1.20.1
+
+## @backstage/plugin-mui-to-bui@0.2.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/ui@0.10.0
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/theme@0.7.1
+
+## @backstage/plugin-notifications@0.5.12
+
+### Patch Changes
+
+- d02db50: Remove unnecessary use of `compatWrapper` and `convertLegacyRouteRef`(s) for the new frontend system.
+
+- 53347cc: Move long notification descriptions behind `Show more/less` button.
+
+ This improves readability of the notifications list by preventing long descriptions from taking up too much space
+ or rendering very small scrollable areas.
+
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/core-components@0.18.4
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/theme@0.7.1
+ - @backstage/plugin-signals-react@0.0.18
+
+## @backstage/plugin-notifications-backend@0.6.1
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/plugin-signals-node@0.1.27
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-catalog-node@1.20.1
+ - @backstage/plugin-notifications-node@0.2.22
+
+## @backstage/plugin-notifications-backend-module-email@0.3.17
+
+### Patch Changes
+
+- a5d5b3a: SES config for the notification email processor now supports utilizing an ARN for the SES identity when sending an email after the SES SDK V2 update.
+
+ The `sesConfig.fromArn` will set the `fromEmailAddressIdentityArn` option for the SES `SendEmailCommand`. The `sesConfig.sourceArn` field is removed since no equivalent option is available in the send email command options. Setting `sesConfig.sourceArn` will have no effect and log a warning. Example changes:
+
+ ```diff
+ notifications:
+ processors:
+ email:
+ transportConfig:
+ transport: "ses"
+ region: "us-west-2"
+ sender: "sender@mycompany.com"
+ replyTo: "no-reply@mycompany.com"
+ sesConfig:
+ - sourceArn: "arn:aws:ses:us-west-2:123456789012:identity/example.com"
+ fromArn: "arn:aws:ses:us-west-2:123456789012:identity/example.com"
+ ```
+
+- b267aea: Updated dependency `@types/nodemailer` to `^7.0.0`.
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-catalog-node@1.20.1
+ - @backstage/plugin-notifications-node@0.2.22
+
+## @backstage/plugin-notifications-node@0.2.22
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-signals-node@0.1.27
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-org@0.6.47
+
+### Patch Changes
+
+- f3f84f1: Minor extension type updates after frontend API bump
+- d02db50: Remove unnecessary use of `compatWrapper` and `convertLegacyRouteRef`(s) for the new frontend system.
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/core-components@0.18.4
+ - @backstage/plugin-catalog-react@1.21.4
+ - @backstage/core-plugin-api@1.12.1
+
+## @backstage/plugin-org-react@0.1.45
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.18.4
+ - @backstage/plugin-catalog-react@1.21.4
+ - @backstage/core-plugin-api@1.12.1
+
+## @backstage/plugin-permission-backend@0.7.7
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/plugin-permission-node@0.10.7
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-permission-backend-module-allow-all-policy@0.2.15
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/plugin-permission-node@0.10.7
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-permission-node@0.10.7
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-permission-react@0.4.39
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.12.1
+
+## @backstage/plugin-proxy-backend@0.6.9
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-proxy-node@0.1.11
+
+## @backstage/plugin-proxy-node@0.1.11
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-scaffolder-backend-module-azure@0.2.16
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-scaffolder-node@0.12.2
+
+## @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.17
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.3.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.16
+ - @backstage/plugin-scaffolder-node@0.12.2
+
+## @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.16
+
+### Patch Changes
+
+- 5a6aca2: Improve error message when provided target branch is missing
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-scaffolder-node@0.12.2
+
+## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.16
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-scaffolder-node@0.12.2
+
+## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.3.18
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/backend-defaults@0.14.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-scaffolder-node@0.12.2
+
+## @backstage/plugin-scaffolder-backend-module-gcp@0.2.16
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-scaffolder-node@0.12.2
+
+## @backstage/plugin-scaffolder-backend-module-gerrit@0.2.16
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-scaffolder-node@0.12.2
+
+## @backstage/plugin-scaffolder-backend-module-gitea@0.2.16
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-scaffolder-node@0.12.2
+
+## @backstage/plugin-scaffolder-backend-module-github@0.9.3
+
+### Patch Changes
+
+- dab3d3f: Added autocompletion resource `owners` for retrieving GitHub repository owners.
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-catalog-node@1.20.1
+ - @backstage/plugin-scaffolder-node@0.12.2
+
+## @backstage/plugin-scaffolder-backend-module-notifications@0.1.17
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-notifications-node@0.2.22
+ - @backstage/plugin-scaffolder-node@0.12.2
+
+## @backstage/plugin-scaffolder-backend-module-rails@0.5.16
+
+### Patch Changes
+
+- 2bae83a: Bumped dev dependencies `@types/node`
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-scaffolder-node@0.12.2
+
+## @backstage/plugin-scaffolder-backend-module-sentry@0.2.16
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-scaffolder-node@0.12.2
+
+## @backstage/plugin-scaffolder-backend-module-yeoman@0.4.17
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-scaffolder-node@0.12.2
+ - @backstage/plugin-scaffolder-node-test-utils@0.3.6
+
+## @backstage/plugin-scaffolder-common@1.7.4
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.0
+
+## @backstage/plugin-scaffolder-node@0.12.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-scaffolder-common@1.7.4
+
+## @backstage/plugin-scaffolder-node-test-utils@0.3.6
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-test-utils@1.10.2
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-scaffolder-node@0.12.2
+
+## @backstage/plugin-scaffolder-react@1.19.4
+
+### Patch Changes
+
+- fb029b6: Updated luxon types
+- 5ca461e: Fixed bug where custom `review.name` values were incorrectly formatted by `startCase`, preserving them exactly as written.
+- be21c5c: Updated dependency `@rjsf/utils` to `5.24.13`.
+ Updated dependency `@rjsf/core` to `5.24.13`.
+ Updated dependency `@rjsf/material-ui` to `5.24.13`.
+ Updated dependency `@rjsf/validator-ajv8` to `5.24.13`.
+- 9b38f22: Updated dependency `use-immer` to `^0.11.0`.
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/core-components@0.18.4
+ - @backstage/plugin-catalog-react@1.21.4
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/theme@0.7.1
+ - @backstage/plugin-permission-react@0.4.39
+ - @backstage/plugin-scaffolder-common@1.7.4
+
+## @backstage/plugin-search@1.5.1
+
+### Patch Changes
+
+- f3f84f1: Minor extension type updates after frontend API bump
+- d02db50: Remove unnecessary use of `compatWrapper` and `convertLegacyRouteRef`(s) for the new frontend system.
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/core-components@0.18.4
+ - @backstage/plugin-catalog-react@1.21.4
+ - @backstage/plugin-search-react@1.10.1
+ - @backstage/core-plugin-api@1.12.1
+
+## @backstage/plugin-search-backend@2.0.9
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/plugin-search-backend-node@1.4.0
+ - @backstage/backend-defaults@0.14.0
+ - @backstage/backend-openapi-utils@0.6.4
+ - @backstage/plugin-permission-node@0.10.7
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-search-backend-module-catalog@0.3.11
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-search-backend-node@1.4.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-catalog-node@1.20.1
+
+## @backstage/plugin-search-backend-module-elasticsearch@1.7.9
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-search-backend-node@1.4.0
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-search-backend-module-explore@0.3.10
+
+### Patch Changes
+
+- 9b69262: Updated dependency `@backstage-community/plugin-explore-common` to `^0.9.0`.
+- Updated dependencies
+ - @backstage/plugin-search-backend-node@1.4.0
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-search-backend-module-pg@0.5.51
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-search-backend-node@1.4.0
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-search-backend-module-stack-overflow-collator@0.3.16
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-search-backend-node@1.4.0
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-search-backend-module-techdocs@0.4.9
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-search-backend-node@1.4.0
+ - @backstage/plugin-techdocs-node@1.13.10
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-catalog-node@1.20.1
+
+## @backstage/plugin-search-react@1.10.1
+
+### Patch Changes
+
+- 8947a4e: Skip the very first empty search when going to the landing page
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/core-components@0.18.4
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/theme@0.7.1
+
+## @backstage/plugin-signals@0.0.26
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/core-components@0.18.4
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/theme@0.7.1
+ - @backstage/plugin-signals-react@0.0.18
+
+## @backstage/plugin-signals-backend@0.3.11
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/plugin-signals-node@0.1.27
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-signals-node@0.1.27
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-signals-react@0.0.18
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.12.1
+
+## @backstage/plugin-techdocs@1.16.1
+
+### Patch Changes
+
+- f3f84f1: Minor extension type updates after frontend API bump
+- 5c33821: Fixed schema type for additionalAllowedURIProtocols
+- d02db50: Remove unnecessary use of `compatWrapper` and `convertLegacyRouteRef`(s) for the new frontend system.
+- 592361e: The `techdocs` config is now marked as optional.
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/core-components@0.18.4
+ - @backstage/plugin-catalog-react@1.21.4
+ - @backstage/plugin-search-react@1.10.1
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/theme@0.7.1
+ - @backstage/integration-react@1.2.13
+ - @backstage/plugin-auth-react@0.1.22
+ - @backstage/plugin-techdocs-react@1.3.6
+
+## @backstage/plugin-techdocs-backend@2.1.3
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- 2bae83a: Corrected `ErrorCallback` type to work with Node 22 types
+- 592361e: The `techdocs` config is now marked as optional.
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/backend-defaults@0.14.0
+ - @backstage/plugin-techdocs-node@1.13.10
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-catalog-node@1.20.1
+
+## @backstage/plugin-techdocs-module-addons-contrib@1.1.31
+
+### Patch Changes
+
+- 8d6709e: Updated tests to match test-utils change
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/core-components@0.18.4
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/integration-react@1.2.13
+ - @backstage/plugin-techdocs-react@1.3.6
+
+## @backstage/plugin-techdocs-node@1.13.10
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- 703f8c0: There was an issue in the uploading of large size files to the AWS S3. We have modified the logic by adding retry along with multipart uploading functionality.
+- Updated dependencies
+ - @backstage/integration@1.19.0
+ - @backstage/backend-plugin-api@1.6.0
+
+## @backstage/plugin-techdocs-react@1.3.6
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/core-components@0.18.4
+ - @backstage/core-plugin-api@1.12.1
+
+## @backstage/plugin-user-settings@0.8.30
+
+### Patch Changes
+
+- d02db50: Remove unnecessary use of `compatWrapper` and `convertLegacyRouteRef`(s) for the new frontend system.
+- Updated dependencies
+ - @backstage/core-app-api@1.19.3
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/core-components@0.18.4
+ - @backstage/plugin-catalog-react@1.21.4
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/theme@0.7.1
+ - @backstage/plugin-signals-react@0.0.18
+
+## @backstage/plugin-user-settings-backend@0.3.9
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/backend-defaults@0.14.0
+ - @backstage/plugin-signals-node@0.1.27
+ - @backstage/backend-plugin-api@1.6.0
+
+## example-app@0.2.116
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.19.3
+ - @backstage/cli@0.35.0
+ - @backstage/ui@0.10.0
+ - @backstage/plugin-catalog-graph@0.5.4
+ - @backstage/plugin-api-docs@0.13.2
+ - @backstage/plugin-techdocs@1.16.1
+ - @backstage/plugin-catalog@1.32.1
+ - @backstage/plugin-search@1.5.1
+ - @backstage/plugin-org@0.6.47
+ - @backstage/plugin-scaffolder-react@1.19.4
+ - @backstage/core-components@0.18.4
+ - @backstage/plugin-techdocs-module-addons-contrib@1.1.31
+ - @backstage/plugin-catalog-react@1.21.4
+ - @backstage/plugin-kubernetes@0.12.14
+ - @backstage/plugin-search-react@1.10.1
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/plugin-catalog-unprocessed-entities@0.2.24
+ - @backstage/plugin-catalog-import@0.13.8
+ - @backstage/plugin-notifications@0.5.12
+ - @backstage/plugin-user-settings@0.8.30
+ - @backstage/plugin-scaffolder@1.35.0
+ - @backstage/plugin-devtools@0.1.34
+ - @backstage/plugin-home@0.8.15
+ - @backstage/theme@0.7.1
+ - @backstage/plugin-kubernetes-cluster@0.0.32
+ - @backstage/app-defaults@1.7.3
+ - @backstage/frontend-app-api@0.13.3
+ - @backstage/integration-react@1.2.13
+ - @backstage/plugin-auth-react@0.1.22
+ - @backstage/plugin-mui-to-bui@0.2.2
+ - @backstage/plugin-permission-react@0.4.39
+ - @backstage/plugin-signals@0.0.26
+ - @backstage/plugin-techdocs-react@1.3.6
+
+## example-app-next@0.0.30
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.19.3
+ - @backstage/cli@0.35.0
+ - @backstage/ui@0.10.0
+ - @backstage/plugin-catalog-graph@0.5.4
+ - @backstage/plugin-api-docs@0.13.2
+ - @backstage/plugin-techdocs@1.16.1
+ - @backstage/plugin-catalog@1.32.1
+ - @backstage/plugin-search@1.5.1
+ - @backstage/plugin-app@0.3.3
+ - @backstage/plugin-org@0.6.47
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/plugin-scaffolder-react@1.19.4
+ - @backstage/core-components@0.18.4
+ - @backstage/plugin-techdocs-module-addons-contrib@1.1.31
+ - @backstage/plugin-catalog-react@1.21.4
+ - @backstage/plugin-kubernetes@0.12.14
+ - @backstage/plugin-search-react@1.10.1
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/plugin-catalog-unprocessed-entities@0.2.24
+ - @backstage/plugin-app-visualizer@0.1.26
+ - @backstage/plugin-catalog-import@0.13.8
+ - @backstage/plugin-notifications@0.5.12
+ - @backstage/plugin-user-settings@0.8.30
+ - @backstage/plugin-scaffolder@1.35.0
+ - @backstage/plugin-home@0.8.15
+ - @backstage/theme@0.7.1
+ - @backstage/plugin-kubernetes-cluster@0.0.32
+ - @backstage/app-defaults@1.7.3
+ - @backstage/core-compat-api@0.5.5
+ - @backstage/frontend-app-api@0.13.3
+ - @backstage/frontend-defaults@0.3.4
+ - @backstage/integration-react@1.2.13
+ - @backstage/plugin-auth@0.1.3
+ - @backstage/plugin-auth-react@0.1.22
+ - @backstage/plugin-permission-react@0.4.39
+ - @backstage/plugin-signals@0.0.26
+ - @backstage/plugin-techdocs-react@1.3.6
+
+## app-next-example-plugin@0.0.30
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/core-components@0.18.4
+
+## example-backend@0.0.45
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-mcp-actions-backend@0.1.6
+ - @backstage/plugin-scaffolder-backend@3.1.0
+ - @backstage/plugin-search-backend-node@1.4.0
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/backend-defaults@0.14.0
+ - @backstage/plugin-app-backend@0.5.9
+ - @backstage/plugin-auth-backend-module-guest-provider@0.2.15
+ - @backstage/plugin-auth-backend-module-openshift-provider@0.1.3
+ - @backstage/plugin-auth-backend@0.25.7
+ - @backstage/plugin-catalog-backend@3.3.0
+ - @backstage/plugin-devtools-backend@0.5.12
+ - @backstage/plugin-events-backend@0.5.9
+ - @backstage/plugin-kubernetes-backend@0.21.0
+ - @backstage/plugin-notifications-backend@0.6.1
+ - @backstage/plugin-permission-backend@0.7.7
+ - @backstage/plugin-permission-node@0.10.7
+ - @backstage/plugin-proxy-backend@0.6.9
+ - @backstage/plugin-search-backend@2.0.9
+ - @backstage/plugin-signals-backend@0.3.11
+ - @backstage/plugin-techdocs-backend@2.1.3
+ - @backstage/plugin-auth-backend-module-github-provider@0.4.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-scaffolder-backend-module-github@0.9.3
+ - @backstage/plugin-search-backend-module-explore@0.3.10
+ - @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.9
+ - @backstage/plugin-catalog-backend-module-openapi@0.2.17
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.15
+ - @backstage/plugin-catalog-backend-module-unprocessed@0.6.7
+ - @backstage/plugin-events-backend-module-google-pubsub@0.1.7
+ - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.15
+ - @backstage/plugin-scaffolder-backend-module-notifications@0.1.17
+ - @backstage/plugin-search-backend-module-catalog@0.3.11
+ - @backstage/plugin-search-backend-module-elasticsearch@1.7.9
+ - @backstage/plugin-search-backend-module-techdocs@0.4.9
+
+## e2e-test@0.2.35
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/create-app@0.7.7
+ - @backstage/cli-common@0.1.16
+
+## @internal/frontend@0.0.16
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.13.2
+
+## @internal/scaffolder@0.0.16
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/plugin-scaffolder-react@1.19.4
+
+## techdocs-cli-embedded-app@0.2.115
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.19.3
+ - @backstage/cli@0.35.0
+ - @backstage/ui@0.10.0
+ - @backstage/plugin-techdocs@1.16.1
+ - @backstage/plugin-catalog@1.32.1
+ - @backstage/core-components@0.18.4
+ - @backstage/test-utils@1.7.14
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/theme@0.7.1
+ - @backstage/app-defaults@1.7.3
+ - @backstage/integration-react@1.2.13
+ - @backstage/plugin-techdocs-react@1.3.6
+
+## yarn-plugin-backstage@0.0.8
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/cli-common@0.1.16
+
+## @internal/plugin-todo-list@1.0.46
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.18.4
+ - @backstage/core-plugin-api@1.12.1
+
+## @internal/plugin-todo-list-backend@1.0.46
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.6.0
diff --git a/docs/releases/v1.46.0.md b/docs/releases/v1.46.0.md
new file mode 100644
index 0000000000..9ee4c68681
--- /dev/null
+++ b/docs/releases/v1.46.0.md
@@ -0,0 +1,129 @@
+---
+id: v1.46.0
+title: v1.46.0
+description: Backstage Release v1.46.0
+---
+
+These are the release notes for the v1.46.0 release of [Backstage](https://backstage.io/).
+
+A huge thanks to the whole team of maintainers and contributors as well as the amazing Backstage Community for the hard work in getting this release developed and done.
+
+## Highlights
+
+To begin with, this release has a few important framework level updates.
+
+### **BREAKING:** Updated supported Node.js versions to 22 and 24
+
+This release moves up the supported Node.js versions to 22 and 24, according to our [versioning policy](https://backstage.io/docs/overview/versioning-policy#nodejs-releases). As part of this change, we are also setting the compilation targets to ES2023, which lines up with the supported Node.js versions.
+
+The default TypeScript `target` compiler option is however left at ES2022. This is because older versions of TypeScript will error if they see an unsupported value, even if an override is set in your local `tsconfig.json`. You can still choose to set the TypeScript `target` to either `ES2023` or even `ES2024` in your own `tsconfig.json` if you prefer.
+
+### **BREAKING:** Switched modules to `ES2020` and resolution mode to `bundler`
+
+Now that the ecosystem has had some time to mature and adapt, we have finally switched over the default module resolution mode to `bundler` instead of `node`. The `module` setting was also changed to `ES2022`.
+
+You _may_ need to bump some dependencies as part of this change, or fix imports in code. The most common source of this is that type checking will now consider the `exports` field in `package.json` when resolving imports. This in turn can break older versions of packages that had incompatible `exports` fields. Generally these issues will have already been fixed in the upstream packages, but if you depend on old versions or unmaintained packages, you may still notice some effects of this.
+
+You might be tempted to use `--skipLibCheck` to hide issues due to this change, but it will weaken the type safety of your project. If you run into a large number of issues and want to keep the old behavior, you can reset the `moduleResolution` and `module` settings of your own `tsconfig.json` file to `node` and `ESNext` respectively. But keep in mind that the `node` option will be removed in future versions of TypeScript.
+
+A future version of Backstage will make these new settings mandatory, as we move to rely on the `exports` field for type resolution in packages, rather than the `typesVersions` field.
+
+### **BREAKING:** Moving toward updating `jest` and its DOM
+
+The `jest` test framework used to be a builtin dependency of the Backstage CLI. In this release, it has been made into a peer dependency to allow for easy upgrades to newer versions as you see fit.
+
+If you run tests using the Backstage CLI, you must therefore add Jest and its environment dependencies as `devDependencies` in your project root `package.json` when you upgrade.
+
+You can choose to install either Jest 29 or Jest 30. The built-in Jest version before this change was Jest 29, however, we recommend that you switch to Jest 30. Upgrading will solve the `Could not parse CSS stylesheet` errors, allow you to use MSW v2 in web packages, and ensure that you remain compatible with future versions of the Backstage CLI. Support for Jest 29 is temporary, with the purpose of allowing you to upgrade at your own pace, but it will eventually be removed.
+
+- **Jest 29**: Install `jest@^29` and `jest-environment-jsdom@^29` in your root `package.json`. No migration needed, but you may see `Could not parse CSS stylesheet` warnings/errors when testing components from `@backstage/ui` or other packages using CSS `@layer` declarations.
+- **Jest 30**: Install `jest@^30`, `@types/jest@^30`, `@jest/environment-jsdom-abstract@^30`, and `jsdom@^27` in your root `package.json`. Fixes the stylesheet parsing warnings/errors, but requires migration steps.
+
+See the [Jest 30 migration guide](https://backstage.io/docs/tutorials/jest30-migration) for detailed migration instructions.
+
+### **BREAKING:** Now using correct configuration options for Valkey
+
+If you are using Valkey as your backend cache provider, take note. It used to piggyback on the Redis configuration format, but that was not quite correct. So its config options have been updated to better match its capabilities.
+
+So if you use Valkey, you need to upgrade your `app-config.yaml`:
+
+```diff
+backend:
+ cache:
+ store: valkey
+ connection: ...
+ client:
+- namespace: 'my-app'
+- keyPrefixSeparator: ':'
++ keyPrefix: 'my-app:'
+- clearBatchSize: 1000
+- useUnlink: false
+```
+
+Contributed by [@benjidotsh](https://github.com/benjidotsh) in [#31497](https://github.com/backstage/backstage/pull/31497)
+
+### **BREAKING:** Techdocs addon test utils removed explicit `screen`
+
+`TechdocsAddonTester.renderWithEffects()` used to return a `screen` that you could use for things like `getByText`. In order to support moving to newer versions of `@testing-library`, we have removed this, and you should import and use the normal `screen` from `@testing-library/react` instead.
+
+However: that `screen` can’t see inside the shadow DOM, which TechDocs uses. So if your tests need to look inside shadow DOM, you must install `shadow-dom-testing-library` and use its `screen` which provides special shadow-DOM queries, such as `getByShadowText` instead of `getByText.
+
+Example:
+
+```tsx
+import { screen } from 'shadow-dom-testing-library';
+// ... render the addon ...
+await TechDocsAddonTester.buildAddonsInTechDocs([])
+ .withDom(TEST_CONTENT)
+ .renderWithEffects();
+expect(screen.getByShadowText('TEST_CONTENT')).toBeInTheDocument();
+```
+
+### **BREAKING:** Backstage-UI advances!
+
+Again, Backstage-UI has a bunch of updates! One of them is breaking: If you were using the `Cell` component with text-specific props (`title` etc), you should now instead use the `CellText` component for that. Plain `Cell` is now meant to be used with generic child elements instead.
+
+### Simplified route compatibility
+
+If you are partway through a migration to the New Frontend System, you may enjoy the fact that the `useApp` and `useRouteRef` hooks now are forwards compatible with NFS. Along with the previous route reference changes this means that there is no longer a need to use `compatWrapper` from `@backstage/core-compat-api` to make code based on `@backstage/core-plugin-api` compatible with `@backstage/frontend-plugin-api` APIs.
+
+### Support for Bitbucket Cloud OAuth
+
+Support for Bitbucket Cloud OAuth has been added - which was much welcome. This introduces an alternative authentication method using a workspace OAuth consumer, alongside App Passwords (deprecated) and API tokens. OAuth does not require a bot or service account and avoids token expiry issues.
+
+As part of this change, some breaking changes were made to low level auth getter functions, such that they now return a promise instead of a plain value.
+
+Contributed by [@jksmth](https://github.com/jksmth) in [#31848](https://github.com/backstage/backstage/pull/31848)
+
+### New Catalog actions
+
+There are two new MCP-usable actions on the block for registering and unregistering entities: `catalog:register-entity` and `catalog:unregister-entity`.
+
+Contributed by [@gabemontero](https://github.com/gabemontero) in [#32042](https://github.com/backstage/backstage/pull/32042)
+
+### New `RepoOwnerPicker` for Scaffolder
+
+A new field extension for selecting an organization or owner for a particular repository has been shipped! Currently, this only supports GitHub autocomplete, but contributions welcome in making this available for other providers!
+
+Contributed by [@benjidotsh](https://github.com/benjidotsh) in [#32105](https://github.com/backstage/backstage/pull/32105)
+
+## Security Fixes
+
+This release does not contain any security fixes.
+
+## Upgrade path
+
+We recommend that you keep your Backstage project up to date with this latest release. For more guidance on how to upgrade, check out the documentation for [keeping Backstage updated](https://backstage.io/docs/getting-started/keeping-backstage-updated).
+
+## Links and References
+
+Below you can find a list of links and references to help you learn about and start using this new release.
+
+- [Backstage official website](https://backstage.io/), [documentation](https://backstage.io/docs/), and [getting started guide](https://backstage.io/docs/getting-started/)
+- [GitHub repository](https://github.com/backstage/backstage)
+- Backstage's [versioning and support policy](https://backstage.io/docs/overview/versioning-policy)
+- [Community Discord](https://discord.gg/backstage-687207715902193673) for discussions and support
+- [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.46.0-changelog.md)
+- Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins)
+
+Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage.
diff --git a/docs/releases/v1.47.0-next.0-changelog.md b/docs/releases/v1.47.0-next.0-changelog.md
new file mode 100644
index 0000000000..e1fd3f9ebb
--- /dev/null
+++ b/docs/releases/v1.47.0-next.0-changelog.md
@@ -0,0 +1,578 @@
+# Release v1.47.0-next.0
+
+Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.47.0-next.0](https://backstage.github.io/upgrade-helper/?to=1.47.0-next.0)
+
+## @backstage/ui@0.11.0-next.0
+
+### Minor Changes
+
+- 4ea1d15: **BREAKING**: Renamed CSS variable `--bui-bg` to `--bui-bg-surface-0` for consistency.
+
+### Patch Changes
+
+- 1880402: Fixes app background color on dark mode.
+- 9c76682: build(deps-dev): bump `storybook` from 10.1.9 to 10.1.10
+- b4a4911: Fixed SearchField `startCollapsed` prop not working correctly in Backstage UI. The field now properly starts in a collapsed state, expands when clicked and focused, and collapses back when unfocused with no input. Also fixed CSS logic to work correctly in all layout contexts (flex row, flex column, and regular containers).
+
+ Affected components: SearchField
+
+## @backstage/backend-defaults@0.14.1-next.0
+
+### Patch Changes
+
+- 7126bf2: Fixed a spelling mistake in root health service shutdown response.
+- Updated dependencies
+ - @backstage/backend-app-api@1.4.0
+ - @backstage/backend-dev-utils@0.1.6
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/cli-node@0.2.16
+ - @backstage/config@1.3.6
+ - @backstage/config-loader@1.10.7
+ - @backstage/errors@1.2.7
+ - @backstage/integration@1.19.0
+ - @backstage/integration-aws-node@0.1.19
+ - @backstage/types@1.2.2
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/plugin-permission-node@0.10.7
+
+## @backstage/backend-dynamic-feature-service@0.7.8-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-openapi-utils@0.6.5-next.0
+ - @backstage/backend-defaults@0.14.1-next.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/cli-common@0.1.16
+ - @backstage/cli-node@0.2.16
+ - @backstage/config@1.3.6
+ - @backstage/config-loader@1.10.7
+ - @backstage/errors@1.2.7
+ - @backstage/types@1.2.2
+ - @backstage/plugin-app-node@0.1.40
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/plugin-catalog-backend@3.3.1-next.0
+ - @backstage/plugin-events-backend@0.5.10-next.0
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/plugin-permission-common@0.9.3
+ - @backstage/plugin-permission-node@0.10.7
+ - @backstage/plugin-scaffolder-node@0.12.2
+ - @backstage/plugin-search-backend-node@1.4.0
+ - @backstage/plugin-search-common@1.2.21
+
+## @backstage/backend-openapi-utils@0.6.5-next.0
+
+### Patch Changes
+
+- 6678b78: Internal update to use native feature from our request validation library for handling base path determination.
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/errors@1.2.7
+ - @backstage/types@1.2.2
+
+## @backstage/backend-test-utils@1.10.3-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.14.1-next.0
+ - @backstage/backend-app-api@1.4.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/config@1.3.6
+ - @backstage/errors@1.2.7
+ - @backstage/types@1.2.2
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/plugin-permission-common@0.9.3
+
+## @backstage/cli@0.35.2-next.0
+
+### Patch Changes
+
+- 320c6a9: Bump `@swc/core` to support `ES2023` and `ES2024`
+- 9ee5996: Bump minimum required `@swc/core` to avoid transpilation bug
+- Updated dependencies
+ - @backstage/catalog-model@1.7.6
+ - @backstage/cli-common@0.1.16
+ - @backstage/cli-node@0.2.16
+ - @backstage/config@1.3.6
+ - @backstage/config-loader@1.10.7
+ - @backstage/errors@1.2.7
+ - @backstage/eslint-plugin@0.2.0
+ - @backstage/integration@1.19.0
+ - @backstage/release-manifests@0.0.13
+ - @backstage/types@1.2.2
+
+## @backstage/create-app@0.7.8-next.0
+
+### Patch Changes
+
+- Bumped create-app version.
+- Updated dependencies
+ - @backstage/cli-common@0.1.16
+
+## @backstage/dev-utils@1.1.19-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/ui@0.11.0-next.0
+ - @backstage/app-defaults@1.7.3
+ - @backstage/catalog-model@1.7.6
+ - @backstage/core-app-api@1.19.3
+ - @backstage/core-components@0.18.4
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/integration-react@1.2.13
+ - @backstage/theme@0.7.1
+ - @backstage/plugin-catalog-react@1.21.4
+
+## @techdocs/cli@1.10.4-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.14.1-next.0
+ - @backstage/catalog-model@1.7.6
+ - @backstage/cli-common@0.1.16
+ - @backstage/config@1.3.6
+ - @backstage/plugin-techdocs-node@1.13.10
+
+## @backstage/plugin-app-visualizer@0.1.27-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/ui@0.11.0-next.0
+ - @backstage/core-components@0.18.4
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/frontend-plugin-api@0.13.2
+
+## @backstage/plugin-auth-backend-module-oidc-provider@0.4.11-next.0
+
+### Patch Changes
+
+- e54fcb2: Added support for custom start URL search parameters (with the new `startUrlSearchParams` config property)
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/config@1.3.6
+ - @backstage/types@1.2.2
+ - @backstage/plugin-auth-backend@0.25.7
+ - @backstage/plugin-auth-node@0.6.10
+
+## @backstage/plugin-catalog-backend@3.3.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-openapi-utils@0.6.5-next.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/catalog-client@1.12.1
+ - @backstage/catalog-model@1.7.6
+ - @backstage/config@1.3.6
+ - @backstage/errors@1.2.7
+ - @backstage/integration@1.19.0
+ - @backstage/types@1.2.2
+ - @backstage/plugin-catalog-common@1.1.7
+ - @backstage/plugin-catalog-node@1.20.1
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/plugin-permission-common@0.9.3
+ - @backstage/plugin-permission-node@0.10.7
+
+## @backstage/plugin-catalog-backend-module-aws@0.4.19-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.14.1-next.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/catalog-model@1.7.6
+ - @backstage/config@1.3.6
+ - @backstage/errors@1.2.7
+ - @backstage/integration@1.19.0
+ - @backstage/integration-aws-node@0.1.19
+ - @backstage/plugin-catalog-common@1.1.7
+ - @backstage/plugin-catalog-node@1.20.1
+ - @backstage/plugin-kubernetes-common@0.9.9
+
+## @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.10-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-openapi-utils@0.6.5-next.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/catalog-model@1.7.6
+ - @backstage/config@1.3.6
+ - @backstage/errors@1.2.7
+ - @backstage/plugin-catalog-node@1.20.1
+
+## @backstage/plugin-catalog-backend-module-gitlab@0.7.7-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.14.1-next.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/catalog-model@1.7.6
+ - @backstage/config@1.3.6
+ - @backstage/integration@1.19.0
+ - @backstage/plugin-catalog-common@1.1.7
+ - @backstage/plugin-catalog-node@1.20.1
+ - @backstage/plugin-events-node@0.4.18
+
+## @backstage/plugin-catalog-backend-module-gitlab-org@0.2.17-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-catalog-backend-module-gitlab@0.7.7-next.0
+ - @backstage/plugin-catalog-node@1.20.1
+ - @backstage/plugin-events-node@0.4.18
+
+## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.7.8-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.14.1-next.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/catalog-model@1.7.6
+ - @backstage/config@1.3.6
+ - @backstage/errors@1.2.7
+ - @backstage/types@1.2.2
+ - @backstage/plugin-catalog-backend@3.3.1-next.0
+ - @backstage/plugin-catalog-node@1.20.1
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/plugin-permission-common@0.9.3
+
+## @backstage/plugin-catalog-backend-module-logs@0.1.18-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-catalog-backend@3.3.1-next.0
+ - @backstage/plugin-events-node@0.4.18
+
+## @backstage/plugin-devtools-backend@0.5.13-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.14.1-next.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/cli-common@0.1.16
+ - @backstage/config@1.3.6
+ - @backstage/config-loader@1.10.7
+ - @backstage/errors@1.2.7
+ - @backstage/types@1.2.2
+ - @backstage/plugin-devtools-common@0.1.20
+ - @backstage/plugin-permission-common@0.9.3
+ - @backstage/plugin-permission-node@0.10.7
+
+## @backstage/plugin-events-backend@0.5.10-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-openapi-utils@0.6.5-next.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/config@1.3.6
+ - @backstage/errors@1.2.7
+ - @backstage/types@1.2.2
+ - @backstage/plugin-events-node@0.4.18
+
+## @backstage/plugin-mcp-actions-backend@0.1.7-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.14.1-next.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/catalog-client@1.12.1
+ - @backstage/errors@1.2.7
+ - @backstage/types@1.2.2
+ - @backstage/plugin-catalog-node@1.20.1
+
+## @backstage/plugin-mui-to-bui@0.2.3-next.0
+
+### Patch Changes
+
+- e4a1180: Updated tokens from `--bui-bg` to `--bui-bg-surface-0`
+- Updated dependencies
+ - @backstage/ui@0.11.0-next.0
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/theme@0.7.1
+
+## @backstage/plugin-scaffolder-backend@3.1.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-openapi-utils@0.6.5-next.0
+ - @backstage/backend-defaults@0.14.1-next.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/catalog-model@1.7.6
+ - @backstage/config@1.3.6
+ - @backstage/errors@1.2.7
+ - @backstage/integration@1.19.0
+ - @backstage/types@1.2.2
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/plugin-bitbucket-cloud-common@0.3.5
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.15
+ - @backstage/plugin-catalog-node@1.20.1
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/plugin-permission-common@0.9.3
+ - @backstage/plugin-permission-node@0.10.7
+ - @backstage/plugin-scaffolder-backend-module-azure@0.2.16
+ - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.17
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.3.0
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.16
+ - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.16
+ - @backstage/plugin-scaffolder-backend-module-gitea@0.2.16
+ - @backstage/plugin-scaffolder-backend-module-github@0.9.3
+ - @backstage/plugin-scaffolder-backend-module-gitlab@0.11.0
+ - @backstage/plugin-scaffolder-common@1.7.4
+ - @backstage/plugin-scaffolder-node@0.12.2
+
+## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.3.19-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.14.1-next.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/config@1.3.6
+ - @backstage/errors@1.2.7
+ - @backstage/integration@1.19.0
+ - @backstage/types@1.2.2
+ - @backstage/plugin-scaffolder-node@0.12.2
+
+## @backstage/plugin-scaffolder-backend-module-yeoman@0.4.18-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/types@1.2.2
+ - @backstage/plugin-scaffolder-node@0.12.2
+ - @backstage/plugin-scaffolder-node-test-utils@0.3.7-next.0
+
+## @backstage/plugin-scaffolder-node-test-utils@0.3.7-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/backend-test-utils@1.10.3-next.0
+ - @backstage/types@1.2.2
+ - @backstage/plugin-scaffolder-node@0.12.2
+
+## @backstage/plugin-search-backend@2.0.10-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-openapi-utils@0.6.5-next.0
+ - @backstage/backend-defaults@0.14.1-next.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/config@1.3.6
+ - @backstage/errors@1.2.7
+ - @backstage/types@1.2.2
+ - @backstage/plugin-permission-common@0.9.3
+ - @backstage/plugin-permission-node@0.10.7
+ - @backstage/plugin-search-backend-node@1.4.0
+ - @backstage/plugin-search-common@1.2.21
+
+## @backstage/plugin-techdocs-backend@2.1.4-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.14.1-next.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/catalog-client@1.12.1
+ - @backstage/catalog-model@1.7.6
+ - @backstage/config@1.3.6
+ - @backstage/errors@1.2.7
+ - @backstage/integration@1.19.0
+ - @backstage/types@1.2.2
+ - @backstage/plugin-catalog-node@1.20.1
+ - @backstage/plugin-techdocs-node@1.13.10
+
+## @backstage/plugin-user-settings-backend@0.3.10-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.14.1-next.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/errors@1.2.7
+ - @backstage/types@1.2.2
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/plugin-signals-node@0.1.27
+ - @backstage/plugin-user-settings-common@0.0.1
+
+## example-app@0.2.117-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/ui@0.11.0-next.0
+ - @backstage/cli@0.35.2-next.0
+ - @backstage/plugin-mui-to-bui@0.2.3-next.0
+ - @backstage/app-defaults@1.7.3
+ - @backstage/catalog-model@1.7.6
+ - @backstage/config@1.3.6
+ - @backstage/core-app-api@1.19.3
+ - @backstage/core-components@0.18.4
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/frontend-app-api@0.13.3
+ - @backstage/integration-react@1.2.13
+ - @backstage/theme@0.7.1
+ - @backstage/plugin-api-docs@0.13.2
+ - @backstage/plugin-auth-react@0.1.22
+ - @backstage/plugin-catalog@1.32.1
+ - @backstage/plugin-catalog-common@1.1.7
+ - @backstage/plugin-catalog-graph@0.5.4
+ - @backstage/plugin-catalog-import@0.13.8
+ - @backstage/plugin-catalog-react@1.21.4
+ - @backstage/plugin-catalog-unprocessed-entities@0.2.24
+ - @backstage/plugin-devtools@0.1.34
+ - @backstage/plugin-home@0.8.15
+ - @backstage/plugin-kubernetes@0.12.14
+ - @backstage/plugin-kubernetes-cluster@0.0.32
+ - @backstage/plugin-notifications@0.5.12
+ - @backstage/plugin-org@0.6.47
+ - @backstage/plugin-permission-react@0.4.39
+ - @backstage/plugin-scaffolder@1.35.0
+ - @backstage/plugin-scaffolder-react@1.19.4
+ - @backstage/plugin-search@1.5.1
+ - @backstage/plugin-search-common@1.2.21
+ - @backstage/plugin-search-react@1.10.1
+ - @backstage/plugin-signals@0.0.26
+ - @backstage/plugin-techdocs@1.16.1
+ - @backstage/plugin-techdocs-module-addons-contrib@1.1.31
+ - @backstage/plugin-techdocs-react@1.3.6
+ - @backstage/plugin-user-settings@0.8.30
+
+## example-app-next@0.0.31-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/ui@0.11.0-next.0
+ - @backstage/cli@0.35.2-next.0
+ - @backstage/plugin-app-visualizer@0.1.27-next.0
+ - @backstage/app-defaults@1.7.3
+ - @backstage/catalog-model@1.7.6
+ - @backstage/config@1.3.6
+ - @backstage/core-app-api@1.19.3
+ - @backstage/core-compat-api@0.5.5
+ - @backstage/core-components@0.18.4
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/frontend-app-api@0.13.3
+ - @backstage/frontend-defaults@0.3.4
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/integration-react@1.2.13
+ - @backstage/theme@0.7.1
+ - @backstage/plugin-api-docs@0.13.2
+ - @backstage/plugin-app@0.3.3
+ - @backstage/plugin-auth@0.1.3
+ - @backstage/plugin-auth-react@0.1.22
+ - @backstage/plugin-catalog@1.32.1
+ - @backstage/plugin-catalog-common@1.1.7
+ - @backstage/plugin-catalog-graph@0.5.4
+ - @backstage/plugin-catalog-import@0.13.8
+ - @backstage/plugin-catalog-react@1.21.4
+ - @backstage/plugin-catalog-unprocessed-entities@0.2.24
+ - @backstage/plugin-home@0.8.15
+ - @backstage/plugin-kubernetes@0.12.14
+ - @backstage/plugin-kubernetes-cluster@0.0.32
+ - @backstage/plugin-notifications@0.5.12
+ - @backstage/plugin-org@0.6.47
+ - @backstage/plugin-permission-react@0.4.39
+ - @backstage/plugin-scaffolder@1.35.0
+ - @backstage/plugin-scaffolder-react@1.19.4
+ - @backstage/plugin-search@1.5.1
+ - @backstage/plugin-search-common@1.2.21
+ - @backstage/plugin-search-react@1.10.1
+ - @backstage/plugin-signals@0.0.26
+ - @backstage/plugin-techdocs@1.16.1
+ - @backstage/plugin-techdocs-module-addons-contrib@1.1.31
+ - @backstage/plugin-techdocs-react@1.3.6
+ - @backstage/plugin-user-settings@0.8.30
+
+## example-backend@0.0.46-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.14.1-next.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/catalog-model@1.7.6
+ - @backstage/plugin-app-backend@0.5.9
+ - @backstage/plugin-auth-backend@0.25.7
+ - @backstage/plugin-auth-backend-module-github-provider@0.4.0
+ - @backstage/plugin-auth-backend-module-guest-provider@0.2.15
+ - @backstage/plugin-auth-backend-module-openshift-provider@0.1.3
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/plugin-catalog-backend@3.3.1-next.0
+ - @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.10-next.0
+ - @backstage/plugin-catalog-backend-module-openapi@0.2.17
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.15
+ - @backstage/plugin-catalog-backend-module-unprocessed@0.6.7
+ - @backstage/plugin-devtools-backend@0.5.13-next.0
+ - @backstage/plugin-events-backend@0.5.10-next.0
+ - @backstage/plugin-events-backend-module-google-pubsub@0.1.7
+ - @backstage/plugin-kubernetes-backend@0.21.0
+ - @backstage/plugin-mcp-actions-backend@0.1.7-next.0
+ - @backstage/plugin-notifications-backend@0.6.1
+ - @backstage/plugin-permission-backend@0.7.7
+ - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.15
+ - @backstage/plugin-permission-common@0.9.3
+ - @backstage/plugin-permission-node@0.10.7
+ - @backstage/plugin-proxy-backend@0.6.9
+ - @backstage/plugin-scaffolder-backend@3.1.1-next.0
+ - @backstage/plugin-scaffolder-backend-module-github@0.9.3
+ - @backstage/plugin-scaffolder-backend-module-notifications@0.1.17
+ - @backstage/plugin-search-backend@2.0.10-next.0
+ - @backstage/plugin-search-backend-module-catalog@0.3.11
+ - @backstage/plugin-search-backend-module-elasticsearch@1.7.9
+ - @backstage/plugin-search-backend-module-explore@0.3.10
+ - @backstage/plugin-search-backend-module-techdocs@0.4.9
+ - @backstage/plugin-search-backend-node@1.4.0
+ - @backstage/plugin-signals-backend@0.3.11
+ - @backstage/plugin-techdocs-backend@2.1.4-next.0
+
+## e2e-test@0.2.36-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/create-app@0.7.8-next.0
+ - @backstage/cli-common@0.1.16
+ - @backstage/errors@1.2.7
+
+## techdocs-cli-embedded-app@0.2.116-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/ui@0.11.0-next.0
+ - @backstage/cli@0.35.2-next.0
+ - @backstage/app-defaults@1.7.3
+ - @backstage/catalog-model@1.7.6
+ - @backstage/config@1.3.6
+ - @backstage/core-app-api@1.19.3
+ - @backstage/core-components@0.18.4
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/integration-react@1.2.13
+ - @backstage/test-utils@1.7.14
+ - @backstage/theme@0.7.1
+ - @backstage/plugin-catalog@1.32.1
+ - @backstage/plugin-techdocs@1.16.1
+ - @backstage/plugin-techdocs-react@1.3.6
diff --git a/docs/releases/v1.47.0-next.1-changelog.md b/docs/releases/v1.47.0-next.1-changelog.md
new file mode 100644
index 0000000000..5c93c23480
--- /dev/null
+++ b/docs/releases/v1.47.0-next.1-changelog.md
@@ -0,0 +1,648 @@
+# Release v1.47.0-next.1
+
+Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.47.0-next.1](https://backstage.github.io/upgrade-helper/?to=1.47.0-next.1)
+
+## @backstage/backend-defaults@0.14.1-next.1
+
+### Patch Changes
+
+- 3afeab4: Implementing `readTree` for `GoogleGcsReader`
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+
+## @backstage/backend-dynamic-feature-service@0.7.8-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.14.1-next.1
+ - @backstage/plugin-catalog-backend@3.3.1-next.1
+ - @backstage/plugin-scaffolder-node@0.12.3-next.0
+
+## @backstage/cli@0.35.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+
+## @backstage/core-compat-api@0.5.6-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.21.5-next.0
+ - @backstage/frontend-plugin-api@0.13.2
+
+## @backstage/create-app@0.7.8-next.1
+
+### Patch Changes
+
+- Bumped create-app version.
+
+## @backstage/dev-utils@1.1.19-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration-react@1.2.14-next.0
+ - @backstage/plugin-catalog-react@1.21.5-next.0
+
+## @backstage/frontend-app-api@0.13.4-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/frontend-defaults@0.3.5-next.0
+ - @backstage/frontend-plugin-api@0.13.2
+
+## @backstage/frontend-defaults@0.3.5-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-app@0.3.4-next.0
+ - @backstage/frontend-app-api@0.13.4-next.0
+ - @backstage/frontend-plugin-api@0.13.2
+
+## @backstage/frontend-test-utils@0.4.3-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-app@0.3.4-next.0
+ - @backstage/frontend-app-api@0.13.4-next.0
+ - @backstage/frontend-plugin-api@0.13.2
+
+## @backstage/integration@1.19.2-next.0
+
+### Patch Changes
+
+- 3afeab4: Implementing `ScmIntegration` for `GoogleGcs`
+- 9083273: Rollback the lowercase replacing in GitHub integration config
+
+## @backstage/integration-react@1.2.14-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+
+## @techdocs/cli@1.10.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.14.1-next.1
+ - @backstage/plugin-techdocs-node@1.13.11-next.0
+
+## @backstage/plugin-api-docs@0.13.3-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog@1.32.2-next.0
+ - @backstage/plugin-catalog-react@1.21.5-next.0
+ - @backstage/frontend-plugin-api@0.13.2
+
+## @backstage/plugin-app@0.3.4-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration-react@1.2.14-next.0
+ - @backstage/frontend-plugin-api@0.13.2
+
+## @backstage/plugin-bitbucket-cloud-common@0.3.6-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+
+## @backstage/plugin-catalog@1.32.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration-react@1.2.14-next.0
+ - @backstage/plugin-scaffolder-common@1.7.5-next.0
+ - @backstage/plugin-catalog-react@1.21.5-next.0
+ - @backstage/core-compat-api@0.5.6-next.0
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/plugin-search-react@1.10.1
+
+## @backstage/plugin-catalog-backend@3.3.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+
+## @backstage/plugin-catalog-backend-module-aws@0.4.19-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.14.1-next.1
+ - @backstage/integration@1.19.2-next.0
+
+## @backstage/plugin-catalog-backend-module-azure@0.3.13-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+
+## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.5.7-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+ - @backstage/plugin-bitbucket-cloud-common@0.3.6-next.0
+
+## @backstage/plugin-catalog-backend-module-bitbucket-server@0.5.7-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+
+## @backstage/plugin-catalog-backend-module-gerrit@0.3.10-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+
+## @backstage/plugin-catalog-backend-module-gitea@0.1.8-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+
+## @backstage/plugin-catalog-backend-module-github@0.12.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+
+## @backstage/plugin-catalog-backend-module-github-org@0.3.18-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-backend-module-github@0.12.1-next.0
+
+## @backstage/plugin-catalog-backend-module-gitlab@0.7.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.14.1-next.1
+ - @backstage/integration@1.19.2-next.0
+
+## @backstage/plugin-catalog-backend-module-openapi@0.2.18-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+
+## @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.16-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-common@1.7.5-next.0
+
+## @backstage/plugin-catalog-graph@0.5.5-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.21.5-next.0
+ - @backstage/frontend-plugin-api@0.13.2
+
+## @backstage/plugin-catalog-import@0.13.9-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+ - @backstage/integration-react@1.2.14-next.0
+ - @backstage/plugin-catalog-react@1.21.5-next.0
+ - @backstage/frontend-plugin-api@0.13.2
+
+## @backstage/plugin-catalog-react@1.21.5-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration-react@1.2.14-next.0
+ - @backstage/frontend-test-utils@0.4.3-next.0
+ - @backstage/core-compat-api@0.5.6-next.0
+ - @backstage/frontend-plugin-api@0.13.2
+
+## @backstage/plugin-devtools@0.1.35-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-compat-api@0.5.6-next.0
+ - @backstage/frontend-plugin-api@0.13.2
+
+## @backstage/plugin-events-backend-module-github@0.4.8-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+
+## @backstage/plugin-home@0.8.16-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.21.5-next.0
+ - @backstage/frontend-plugin-api@0.13.2
+
+## @backstage/plugin-kubernetes@0.12.15-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.21.5-next.0
+ - @backstage/frontend-plugin-api@0.13.2
+
+## @backstage/plugin-kubernetes-cluster@0.0.33-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.21.5-next.0
+
+## @backstage/plugin-org@0.6.48-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.21.5-next.0
+ - @backstage/frontend-plugin-api@0.13.2
+
+## @backstage/plugin-org-react@0.1.46-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.21.5-next.0
+
+## @backstage/plugin-scaffolder@1.35.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+ - @backstage/integration-react@1.2.14-next.0
+ - @backstage/plugin-scaffolder-common@1.7.5-next.0
+ - @backstage/plugin-catalog-react@1.21.5-next.0
+ - @backstage/plugin-scaffolder-react@1.19.5-next.0
+ - @backstage/frontend-plugin-api@0.13.2
+
+## @backstage/plugin-scaffolder-backend@3.1.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.14.1-next.1
+ - @backstage/integration@1.19.2-next.0
+ - @backstage/plugin-bitbucket-cloud-common@0.3.6-next.0
+ - @backstage/plugin-scaffolder-backend-module-azure@0.2.17-next.0
+ - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.18-next.0
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.3.1-next.0
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.17-next.0
+ - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.17-next.0
+ - @backstage/plugin-scaffolder-backend-module-gitea@0.2.17-next.0
+ - @backstage/plugin-scaffolder-backend-module-github@0.9.4-next.0
+ - @backstage/plugin-scaffolder-backend-module-gitlab@0.11.1-next.0
+ - @backstage/plugin-scaffolder-common@1.7.5-next.0
+ - @backstage/plugin-scaffolder-node@0.12.3-next.0
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.16-next.0
+
+## @backstage/plugin-scaffolder-backend-module-azure@0.2.17-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+ - @backstage/plugin-scaffolder-node@0.12.3-next.0
+
+## @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.18-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.3.1-next.0
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.17-next.0
+ - @backstage/plugin-scaffolder-node@0.12.3-next.0
+
+## @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.3.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+ - @backstage/plugin-bitbucket-cloud-common@0.3.6-next.0
+ - @backstage/plugin-scaffolder-node@0.12.3-next.0
+
+## @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.17-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+ - @backstage/plugin-scaffolder-node@0.12.3-next.0
+
+## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.17-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+ - @backstage/plugin-scaffolder-node@0.12.3-next.0
+
+## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.3.19-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.14.1-next.1
+ - @backstage/integration@1.19.2-next.0
+ - @backstage/plugin-scaffolder-node@0.12.3-next.0
+
+## @backstage/plugin-scaffolder-backend-module-gcp@0.2.17-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+ - @backstage/plugin-scaffolder-node@0.12.3-next.0
+
+## @backstage/plugin-scaffolder-backend-module-gerrit@0.2.17-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+ - @backstage/plugin-scaffolder-node@0.12.3-next.0
+
+## @backstage/plugin-scaffolder-backend-module-gitea@0.2.17-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+ - @backstage/plugin-scaffolder-node@0.12.3-next.0
+
+## @backstage/plugin-scaffolder-backend-module-github@0.9.4-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+ - @backstage/plugin-scaffolder-node@0.12.3-next.0
+
+## @backstage/plugin-scaffolder-backend-module-gitlab@0.11.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+ - @backstage/plugin-scaffolder-node@0.12.3-next.0
+
+## @backstage/plugin-scaffolder-backend-module-notifications@0.1.18-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.12.3-next.0
+
+## @backstage/plugin-scaffolder-backend-module-rails@0.5.17-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+ - @backstage/plugin-scaffolder-node@0.12.3-next.0
+
+## @backstage/plugin-scaffolder-backend-module-sentry@0.2.17-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.12.3-next.0
+
+## @backstage/plugin-scaffolder-backend-module-yeoman@0.4.18-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.12.3-next.0
+ - @backstage/plugin-scaffolder-node-test-utils@0.3.7-next.1
+
+## @backstage/plugin-scaffolder-common@1.7.5-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+
+## @backstage/plugin-scaffolder-node@0.12.3-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+ - @backstage/plugin-scaffolder-common@1.7.5-next.0
+
+## @backstage/plugin-scaffolder-node-test-utils@0.3.7-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.12.3-next.0
+
+## @backstage/plugin-scaffolder-react@1.19.5-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-common@1.7.5-next.0
+ - @backstage/plugin-catalog-react@1.21.5-next.0
+ - @backstage/frontend-plugin-api@0.13.2
+
+## @backstage/plugin-search@1.5.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.21.5-next.0
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/plugin-search-react@1.10.1
+
+## @backstage/plugin-search-backend-module-techdocs@0.4.10-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-techdocs-node@1.13.11-next.0
+
+## @backstage/plugin-techdocs@1.16.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+ - @backstage/integration-react@1.2.14-next.0
+ - @backstage/plugin-catalog-react@1.21.5-next.0
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/plugin-search-react@1.10.1
+
+## @backstage/plugin-techdocs-addons-test-utils@2.0.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration-react@1.2.14-next.0
+ - @backstage/plugin-techdocs@1.16.2-next.0
+ - @backstage/plugin-catalog@1.32.2-next.0
+ - @backstage/plugin-catalog-react@1.21.5-next.0
+ - @backstage/plugin-search-react@1.10.1
+
+## @backstage/plugin-techdocs-backend@2.1.4-next.1
+
+### Patch Changes
+
+- b6ff2a5: Some AWS `publisher` config options such as `region`, `endpoint`, `accountId` are now marked as `@visibility backend` instead of `secret`.
+- Updated dependencies
+ - @backstage/backend-defaults@0.14.1-next.1
+ - @backstage/integration@1.19.2-next.0
+ - @backstage/plugin-techdocs-node@1.13.11-next.0
+
+## @backstage/plugin-techdocs-module-addons-contrib@1.1.32-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+ - @backstage/integration-react@1.2.14-next.0
+ - @backstage/frontend-plugin-api@0.13.2
+
+## @backstage/plugin-techdocs-node@1.13.11-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+
+## @backstage/plugin-user-settings@0.8.31-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.21.5-next.0
+ - @backstage/frontend-plugin-api@0.13.2
+
+## example-app@0.2.117-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/cli@0.35.2-next.1
+ - @backstage/integration-react@1.2.14-next.0
+ - @backstage/plugin-catalog-import@0.13.9-next.0
+ - @backstage/plugin-scaffolder@1.35.1-next.0
+ - @backstage/plugin-techdocs@1.16.2-next.0
+ - @backstage/plugin-techdocs-module-addons-contrib@1.1.32-next.0
+ - @backstage/plugin-catalog@1.32.2-next.0
+ - @backstage/plugin-catalog-react@1.21.5-next.0
+ - @backstage/plugin-scaffolder-react@1.19.5-next.0
+ - @backstage/frontend-app-api@0.13.4-next.0
+ - @backstage/plugin-api-docs@0.13.3-next.0
+ - @backstage/plugin-catalog-graph@0.5.5-next.0
+ - @backstage/plugin-org@0.6.48-next.0
+ - @backstage/plugin-user-settings@0.8.31-next.0
+ - @backstage/plugin-home@0.8.16-next.0
+ - @backstage/plugin-kubernetes@0.12.15-next.0
+ - @backstage/plugin-kubernetes-cluster@0.0.33-next.0
+ - @backstage/plugin-search@1.5.2-next.0
+ - @backstage/plugin-search-react@1.10.1
+ - @backstage/plugin-devtools@0.1.35-next.0
+
+## example-app-next@0.0.31-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/cli@0.35.2-next.1
+ - @backstage/integration-react@1.2.14-next.0
+ - @backstage/plugin-catalog-import@0.13.9-next.0
+ - @backstage/plugin-scaffolder@1.35.1-next.0
+ - @backstage/plugin-techdocs@1.16.2-next.0
+ - @backstage/plugin-techdocs-module-addons-contrib@1.1.32-next.0
+ - @backstage/plugin-app@0.3.4-next.0
+ - @backstage/plugin-catalog@1.32.2-next.0
+ - @backstage/plugin-catalog-react@1.21.5-next.0
+ - @backstage/plugin-scaffolder-react@1.19.5-next.0
+ - @backstage/frontend-app-api@0.13.4-next.0
+ - @backstage/frontend-defaults@0.3.5-next.0
+ - @backstage/core-compat-api@0.5.6-next.0
+ - @backstage/plugin-api-docs@0.13.3-next.0
+ - @backstage/plugin-catalog-graph@0.5.5-next.0
+ - @backstage/plugin-org@0.6.48-next.0
+ - @backstage/plugin-user-settings@0.8.31-next.0
+ - @backstage/plugin-home@0.8.16-next.0
+ - @backstage/plugin-kubernetes@0.12.15-next.0
+ - @backstage/plugin-kubernetes-cluster@0.0.33-next.0
+ - @backstage/plugin-search@1.5.2-next.0
+ - @backstage/plugin-app-visualizer@0.1.27-next.0
+ - @backstage/plugin-auth@0.1.3
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/plugin-search-react@1.10.1
+
+## example-backend@0.0.46-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.14.1-next.1
+ - @backstage/plugin-techdocs-backend@2.1.4-next.1
+ - @backstage/plugin-catalog-backend@3.3.1-next.1
+ - @backstage/plugin-catalog-backend-module-openapi@0.2.18-next.0
+ - @backstage/plugin-scaffolder-backend@3.1.1-next.1
+ - @backstage/plugin-scaffolder-backend-module-github@0.9.4-next.0
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.16-next.0
+ - @backstage/plugin-scaffolder-backend-module-notifications@0.1.18-next.0
+ - @backstage/plugin-search-backend-module-techdocs@0.4.10-next.0
+
+## @internal/scaffolder@0.0.17-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-react@1.19.5-next.0
+ - @backstage/frontend-plugin-api@0.13.2
+
+## techdocs-cli-embedded-app@0.2.116-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/cli@0.35.2-next.1
+ - @backstage/integration-react@1.2.14-next.0
+ - @backstage/plugin-techdocs@1.16.2-next.0
+ - @backstage/plugin-catalog@1.32.2-next.0
diff --git a/docs/tutorials/jest30-migration.md b/docs/tutorials/jest30-migration.md
new file mode 100644
index 0000000000..ea79b03009
--- /dev/null
+++ b/docs/tutorials/jest30-migration.md
@@ -0,0 +1,95 @@
+---
+id: jest30-migration
+title: Migrating to Jest 30
+description: A guide to migrating your project to Jest 30 and JSDOM 27
+---
+
+Starting with a recent version of `@backstage/cli`, `jest` is a peer dependency. If you run tests using Backstage CLI, you must add Jest and its environment dependencies as `devDependencies` in your project.
+
+You can choose to install either Jest 29 or Jest 30. The built-in Jest version before this change was Jest 29, however, we recommend that you switch to Jest 30. Upgrading will solve the `Could not parse CSS stylesheet` errors, allow you to use MSW v2 in web packages, and ensure that you remain compatible with future versions of the Backstage CLI. Support for Jest 29 is temporary, with the purpose of allowing you to upgrade at your own pace, but it will eventually be removed.
+
+- **Jest 29**:
+
+ ```bash
+ # in your repository root, run:
+ yarn add --dev jest@^29 @types/jest@^29 jest-environment-jsdom@^29
+ ```
+
+ Pros: No migration needed
+
+ Cons: You may see `Could not parse CSS stylesheet` warnings/errors when testing components from `@backstage/ui` or other packages using CSS `@layer` declarations
+
+- **Jest 30**:
+
+ ```bash
+ # in your repository root, run:
+ yarn add --dev jest@^30 @types/jest@^30 @jest/environment-jsdom-abstract@^30 jsdom@^27
+ ```
+
+ Pros: Fixes the stylesheet parsing warnings/errors
+
+ Cons: Requires migration steps (see below) in your tests
+
+## Migration Guide
+
+The examples below are issues we encountered while migrating the Backstage repository. For a complete list of breaking changes, see the official documentation:
+
+- [Jest 30 upgrade guide](https://jestjs.io/docs/upgrading-to-jest30)
+- [JSDOM changelog](https://github.com/jsdom/jsdom/releases)
+
+### Jest 30
+
+**Asymmetric matchers with arrays**: `expect.objectContaining()` no longer works with arrays.
+
+```diff
+- expect(result).toEqual(expect.objectContaining([{ id: '123' }]));
++ expect(result).toEqual([{ id: '123' }]);
+// or
++ expect(result).toEqual(expect.arrayContaining([{ id: '123' }]));
+```
+
+**Array length assertions**: `expect.objectContaining({ length: N })` no longer works.
+
+```diff
+- expect(fn).toHaveBeenCalledWith(expect.objectContaining({ length: 2 }));
++ expect(fn).toHaveBeenCalledWith(expect.any(Array));
++ expect(fn.mock.calls[0][0]).toHaveLength(2);
+```
+
+**Deprecated matcher aliases removed**: Replace with canonical names.
+
+```diff
+- expect(fn).toBeCalled();
++ expect(fn).toHaveBeenCalled();
+```
+
+**Snapshots**: Regenerate snapshots as the header format has changed.
+
+```bash
+yarn test --no-watch -u
+```
+
+### JSDOM 27
+
+**window.location is non-configurable**: You can no longer mock location via `Object.defineProperty`.
+
+```diff
+- Object.defineProperty(window, 'location', { value: { href: '' } });
++ // Option 1: Use history API
++ history.replaceState({}, '', '/new-path');
++ // Option 2: Spy on navigation methods
++ const spy = jest.spyOn(component, 'navigate');
+```
+
+**CSS color values**: Colors may be returned as RGB instead of named colors.
+
+```diff
+- expect(element.style.color).toBe('red');
++ expect(element.style.color).toBe('rgb(255, 0, 0)');
+```
+
+**Error format changes**: Error messages and stack traces may have different formatting.
+
+#### If you run into `Cannot read properties of null (reading 'constructor')`
+
+Certain Backstage UI-components (e.g. Button) have a combination of CSS that triggers this error in tests. The solution is to make sure you have at least v0.9.25 of `@acemir/cssom`.
diff --git a/docs/tutorials/using-backstage-proxy-within-plugin.md b/docs/tutorials/using-backstage-proxy-within-plugin.md
index 237a7207a1..bb416bf731 100644
--- a/docs/tutorials/using-backstage-proxy-within-plugin.md
+++ b/docs/tutorials/using-backstage-proxy-within-plugin.md
@@ -94,15 +94,15 @@ export const AwesomeUsersTable = () => {
This section describes the steps to wrap your API client in a [Utility API](../api/utility-apis.md), which are:
-- use [`createApiRef`](../reference/frontend-plugin-api.createapiref.md) to create a
- new [`ApiRef`](../reference/frontend-plugin-api.apiref.md)
-- register an [`ApiFactory`](../reference/frontend-plugin-api.apifactory.md) with
+- use [`createApiRef`](https://backstage.io/api/stable/functions/_backstage_frontend-plugin-api.createApiRef.html) to create a
+ new [`ApiRef`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiRef.html)
+- register an [`ApiFactory`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiFactory.html) with
your plugin using
- [`createApiFactory`](../reference/frontend-plugin-api.createapifactory.md). This
+ [`createApiFactory`](https://backstage.io/api/stable/functions/_backstage_frontend-plugin-api.createApiFactory.html). This
will wrap your API implementation, associate your `ApiRef` with your
implementation and tell backstage how to instantiate it
- finally, you can use your API in your components by calling
- [`useApi`](../reference/frontend-plugin-api.useapi.md)
+ [`useApi`](https://backstage.io/api/stable/functions/_backstage_frontend-plugin-api.useApi.html)
### Defining the API client interface
@@ -187,8 +187,8 @@ export class MyAwesomeApiClient implements MyAwesomeApi {
```
> Check out the docs for more information on the
-> [DiscoveryApi](../reference/frontend-plugin-api.discoveryapi.md) or the
-> [FetchApi](../reference/frontend-plugin-api.fetchapi.md)
+> [DiscoveryApi](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.DiscoveryApi.html) or the
+> [FetchApi](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.FetchApi.html)
### Bundling your ApiRef with your plugin
@@ -233,7 +233,7 @@ export const myCustomPlugin = createPlugin({
### Using the API in your components
Now you should be able to access your API using the backstage hook
-[`useApi`](../reference/frontend-plugin-api.useapi.md) from within your plugin code.
+[`useApi`](https://backstage.io/api/stable/functions/_backstage_frontend-plugin-api.useApi.html) from within your plugin code.
```ts title="plugins/my-awesome-plugin/src/components/AwesomeUsersTable.tsx"
import { useApi } from '@backstage/core-plugin-api';
diff --git a/microsite/blog/2025-12-30-backstage-wrapped-2025.mdx b/microsite/blog/2025-12-30-backstage-wrapped-2025.mdx
new file mode 100644
index 0000000000..0f8bdd21cf
--- /dev/null
+++ b/microsite/blog/2025-12-30-backstage-wrapped-2025.mdx
@@ -0,0 +1,115 @@
+---
+title: 'Backstage Wrapped 2025: Celebrating a mature framework with modern foundations'
+author: Vincenzo Scamporlino, Spotify
+authorURL: https://github.com/vinzscam
+authorImageURL: https://avatars.githubusercontent.com/u/8433119?v=8
+---
+
+
+
+This year was another big one for Backstage and our worldwide community of adopters, contributors, and partners. Backstage turned five, the New Frontend System became adoption-ready, and your favorite platform for developer experience gained AI superpowers with the introduction of the Actions Registry and MCP server support. Let's blast into the New Year with a quick look back, along with a peek around the corner at what's coming next.
+
+{/* truncate */}
+
+---
+
+## Busy beavers here, there, and everywhere
+
+As in years past, we've visualized how our vibrant global community lights up the Backstage open source repo with enthusiasm, creativity, and commits. This year, we're visualizing contributions to the Community Plugins repo, too. Can you spot your name in the videos below?
+
+
+
+_All 7.7k commits to `backstage/backstage` in 2025_
+
+
+
+_All 3.3k commits to `backstage/community-plugins` in 2025_
+
+Couldn't spot your name in the videos? Here's one more chance — every contributor who helped shape Backstage in 2025, all in one picture.
+
+
+
+## Mature for a five-year-old
+
+
+_The growing Backstage ecosystem, by the numbers_
+
+Earlier this year, the Backstage project [celebrated its 5th birthday][bday] on the main stage at [KubeCon + CloudNativeCon in London][kcon-eu].
+
+While the framework still isn't old enough to shave, it's matured into the industry standard for internal developer portals (IDPs). According to [this DX survey][dx] released in March:
+
+> Backstage is dominating the IDP market, holding an impressive 89% market share compared to SaaS competitors and achieving a remarkable 67% overall market penetration. These percentages are even higher for enterprise companies.
+
+As you can see above in the [latest project stats][video], the Backstage ecosystem continues to expand, growing in adopters and contributors, as well as plugins and third-party service providers.
+
+Want to dive into more Backstage stats? Check out the project's health scores and more on the relaunched [LFX Insights][lfx] site.
+
+[bday]: https://www.youtube.com/watch?v=JqG1wey7-Ao&t=563s&list=PL8iP9yIjU0Q3K8LV_a9CcFmhvvNTAUzL1
+[kcon-eu]: https://backstage.io/blog/2025/04/29/backstagecon-kubecon-25-london#big-birthday-energy-on-the-big-stage
+[dx]: https://newsletter.getdx.com/p/backstage-and-the-developer-portal-market
+[video]: https://www.youtube.com/watch?v=Wih0a1v1Et0&list=PL8iP9yIjU0Q33vpSaBlAvIhgDb-9smXUU
+[lfx]: https://insights.linuxfoundation.org/project/backstage
+
+## Building the future on modern foundations
+
+Just because Backstage has cemented its place as the standard for IDPs doesn't mean it's sitting still. From backend to frontend, from AI to UI, the technical foundations of the platform have been modernized, updated, and revamped — this is why today's Backstage is ready to build the future of developer experience.
+
+Top 2025 highlights:
+
+- Goodbye to the old backend system
+- New Frontend System is adoption-ready
+- Hello to the Actions Registry + MCP server support
+- Introducing a new design system with Backstage UI
+
+With the [New Backend System][backend] released as a stable 1.0 last year and the [New Frontend System][frontend] becoming [adoption-ready][1-42] this year, Backstage is easier than ever to use, maintain, and build on — making it both more accessible and more capable for adopters, old and new.
+
+This year also saw the debut of the [Actions Registry][actions] and MCP server support — so now Backstage can empower both your human developers and their AI helpers.
+
+And [Backstage UI][ui] is coming! The alpha release of the upcoming design system made huge strides in 2025, preparing the way for a new level of usability throughout the Backstage experience.
+
+Catch up on a whole year's worth of improvements — and see where Backstage is heading next — in the recordings below.
+
+[backend]: https://backstage.io/docs/backend-system/
+[frontend]: https://backstage.io/docs/frontend-system/
+[1-42]: https://backstage.io/docs/releases/v1.42.0
+[actions]: https://backstage.io/docs/backend-system/core-services/actions-registry
+[ui]: https://ui.backstage.io/
+
+
+
+_Watch the Backstage maintainers' talk at [KubeCon in London][lon], where they demoed the New Frontend System and introduced the Actions Registry._
+
+
+_Watch the maintainers' talk at [KubeCon in Atlanta][atl], where they shared
+work towards an AI-Native Backstage, progress on Backstage UI, and more._
+
+[lon]: https://backstage.io/blog/2025/04/29/backstagecon-kubecon-25-london
+[atl]: https://backstage.io/blog/2025/11/25/backstagecon-kubecon-25-atlanta
+
+## See you in 2026!
+
+Happy New Year, Backstage Community! See you in the repos!
diff --git a/microsite/blog/assets/2025-12-30/contributors-wrapped-2025.png b/microsite/blog/assets/2025-12-30/contributors-wrapped-2025.png
new file mode 100644
index 0000000000..7aa16f106e
Binary files /dev/null and b/microsite/blog/assets/2025-12-30/contributors-wrapped-2025.png differ
diff --git a/microsite/blog/assets/2025-12-30/wrapped2025-stats.png b/microsite/blog/assets/2025-12-30/wrapped2025-stats.png
new file mode 100644
index 0000000000..59d31f142c
Binary files /dev/null and b/microsite/blog/assets/2025-12-30/wrapped2025-stats.png differ
diff --git a/microsite/blog/assets/2025-12-30/wrapped2025.png b/microsite/blog/assets/2025-12-30/wrapped2025.png
new file mode 100644
index 0000000000..b99768dfda
Binary files /dev/null and b/microsite/blog/assets/2025-12-30/wrapped2025.png differ
diff --git a/microsite/data/plugins/sds_workspace.yaml b/microsite/data/plugins/sds_workspace.yaml
new file mode 100644
index 0000000000..43d9a0f20e
--- /dev/null
+++ b/microsite/data/plugins/sds_workspace.yaml
@@ -0,0 +1,10 @@
+---
+title: Citrix Secure Developer Spaces (SDS)
+author: Citrix
+authorUrl: https://github.com/strong-network
+category: Development
+description: Connect Backstage with Citrix Secure Developer Spaces (SDS) to view and create developer workspaces.
+documentation: https://www.npmjs.com/package/@citrixcloud/backstage-sds-workspaces
+iconUrl: /img/citrix_sds.png
+npmPackageName: '@citrixcloud/backstage-sds-workspaces'
+addedDate: '2025-10-07'
diff --git a/microsite/package.json b/microsite/package.json
index a3430545f4..edf07abb02 100644
--- a/microsite/package.json
+++ b/microsite/package.json
@@ -28,7 +28,7 @@
"@docusaurus/preset-classic": "^3.1.1",
"@docusaurus/types": "^3.1.1",
"@mdx-js/react": "^3.0.0",
- "@swc/core": "^1.3.46",
+ "@swc/core": "^1.15.6",
"clsx": "^2.0.0",
"docusaurus-plugin-openapi-docs": "^4.3.0",
"docusaurus-plugin-sass": "^0.2.3",
diff --git a/microsite/sidebars.ts b/microsite/sidebars.ts
index a68e81aa4f..afe5616bbf 100644
--- a/microsite/sidebars.ts
+++ b/microsite/sidebars.ts
@@ -18,665 +18,743 @@ const scaffolderSidebar = tryToLoadCustomSidebar(
'../docs/features/software-templates/api/sidebar.ts',
);
+function sidebarElementWithIndex(
+ element: {
+ description?: string;
+ differentiator?: string;
+ label: string;
+ docId?: string;
+ },
+ children: Array,
+) {
+ const { label, description, differentiator } = element;
+ return {
+ type: 'category',
+ label: label,
+ description,
+ link: {
+ type: 'generated-index',
+ title: label,
+ slug: `/${differentiator}${label
+ .toLowerCase()
+ .replace(/[^a-z0-9 _-]/gi, '-')}/generated-index`,
+ },
+ items: children,
+ };
+}
+
export default {
- docs: {
- Overview: [
+ docs: [
+ sidebarElementWithIndex({ label: 'Overview' }, [
'overview/what-is-backstage',
'overview/technical-overview',
'overview/architecture-overview',
'overview/roadmap',
'overview/threat-model',
'overview/versioning-policy',
- ],
- 'Getting Started': [
+ ]),
+ sidebarElementWithIndex({ label: 'Getting Started' }, [
'getting-started/index',
- {
- type: 'category',
- label: 'Configuring Backstage',
- items: [
- 'getting-started/config/database',
- 'getting-started/config/authentication',
- 'getting-started/configure-app-with-plugins',
- 'getting-started/homepage',
- ],
- },
- {
- type: 'category',
- label: 'Deploying Backstage',
- items: [
- 'deployment/index',
- 'deployment/scaling',
- 'deployment/docker',
- 'deployment/k8s',
- ],
- },
- {
- type: 'category',
- label: 'Using Backstage',
- items: [
- 'getting-started/logging-in',
- 'getting-started/register-a-component',
- 'getting-started/create-a-component',
- ],
- },
+ sidebarElementWithIndex({ label: 'Configuring Backstage' }, [
+ 'getting-started/config/database',
+ 'getting-started/config/authentication',
+ 'getting-started/configure-app-with-plugins',
+ 'getting-started/homepage',
+ ]),
+ sidebarElementWithIndex({ label: 'Deploying Backstage' }, [
+ 'deployment/index',
+ 'deployment/scaling',
+ 'deployment/docker',
+ 'deployment/k8s',
+ ]),
+ sidebarElementWithIndex({ label: 'Using Backstage' }, [
+ 'getting-started/logging-in',
+ 'getting-started/register-a-component',
+ 'getting-started/create-a-component',
+ ]),
'overview/support',
'getting-started/keeping-backstage-updated',
- ],
+ ]),
...(process.env.GOLDEN_PATH
- ? {
- 'Golden Paths': [
+ ? [
+ sidebarElementWithIndex({ label: 'Golden Paths' }, [
+ sidebarElementWithIndex({ label: '001 - Create an App' }, [
+ 'golden-path/create-app/index',
+ 'golden-path/create-app/npx-create-app',
+ 'golden-path/create-app/local-development',
+ 'golden-path/create-app/installing-plugins',
+ 'golden-path/create-app/logging-in',
+ 'golden-path/create-app/custom-theme',
+ 'golden-path/create-app/keeping-backstage-updated',
+ ]),
+ sidebarElementWithIndex({ label: '002 - Plugins' }, [
+ 'golden-path/plugins/index',
+ 'golden-path/plugins/why-build-plugins',
+ 'golden-path/plugins/sustainable-plugin-development',
+ sidebarElementWithIndex({ label: 'Backend Plugins' }, [
+ 'golden-path/plugins/backend/001-first-steps',
+ 'golden-path/plugins/backend/002-poking-around',
+ ]),
+ ]),
+ ]),
+ ]
+ : []),
+ sidebarElementWithIndex(
+ {
+ label: 'Core Features',
+ description: 'Features powering the core of Backstage.',
+ },
+ [
+ sidebarElementWithIndex(
+ {
+ label: 'Auth and Identity',
+ description: 'Authentication and identity management features.',
+ },
+ [
+ 'auth/index',
+ sidebarElementWithIndex(
+ {
+ label: 'Included providers',
+ description:
+ 'Pre-configured authentication providers included with Backstage.',
+ },
+ [
+ 'auth/auth0/provider',
+ 'auth/atlassian/provider',
+ 'auth/aws-alb/provider',
+ 'auth/microsoft/provider',
+ 'auth/microsoft/easy-auth',
+ 'auth/bitbucket/provider',
+ 'auth/bitbucketServer/provider',
+ 'auth/cloudflare/provider',
+ 'auth/github/provider',
+ 'auth/gitlab/provider',
+ 'auth/google/provider',
+ 'auth/google/gcp-iap-auth',
+ 'auth/guest/provider',
+ 'auth/okta/provider',
+ 'auth/oauth2-proxy/provider',
+ 'auth/onelogin/provider',
+ 'auth/vmware-cloud/provider',
+ ],
+ ),
+ 'auth/identity-resolver',
+ 'auth/oauth',
+ 'auth/oidc',
+ 'auth/add-auth-provider',
+ 'auth/service-to-service-auth',
+ 'auth/autologout',
+ 'auth/troubleshooting',
+ ],
+ ),
+ sidebarElementWithIndex(
+ {
+ label: 'Kubernetes',
+ description: 'Use Kubernetes right from Backstage.',
+ },
+ [
+ 'features/kubernetes/overview',
+ 'features/kubernetes/installation',
+ 'features/kubernetes/configuration',
+ 'features/kubernetes/authentication',
+ 'features/kubernetes/authentication-strategies',
+ 'features/kubernetes/troubleshooting',
+ 'features/kubernetes/proxy',
+ ],
+ ),
+ sidebarElementWithIndex(
+ {
+ label: 'Notifications',
+ description: 'Know when important events happen in Backstage.',
+ },
+ [
+ 'notifications/index',
+ 'notifications/processors',
+ 'notifications/usage',
+ ],
+ ),
+ sidebarElementWithIndex(
+ {
+ label: 'Permissions',
+ description: 'Access control for your Backstage instance.',
+ },
+ [
+ 'permissions/overview',
+ 'permissions/concepts',
+ 'permissions/getting-started',
+ 'permissions/writing-a-policy',
+ 'permissions/frontend-integration',
+ 'permissions/custom-rules',
+ sidebarElementWithIndex(
+ {
+ label: 'Tutorial: using Permissions in your plugin',
+ description:
+ 'Step-by-step guide for plugin authors on using Permissions.',
+ },
+ [
+ 'permissions/plugin-authors/01-setup',
+ 'permissions/plugin-authors/02-adding-a-basic-permission-check',
+ 'permissions/plugin-authors/03-adding-a-resource-permission-check',
+ 'permissions/plugin-authors/04-authorizing-access-to-paginated-data',
+ 'permissions/plugin-authors/05-frontend-authorization',
+ ],
+ ),
+ ],
+ ),
+ sidebarElementWithIndex(
+ { label: 'Search', description: 'Using Search within Backstage.' },
+ [
+ 'features/search/search-overview',
+ 'features/search/getting-started',
+ 'features/search/concepts',
{
type: 'category',
- label: '001 - create-app',
- items: [
- 'golden-path/create-app/index',
- 'golden-path/create-app/npx-create-app',
- 'golden-path/create-app/local-development',
- 'golden-path/create-app/installing-plugins',
- 'golden-path/create-app/logging-in',
- 'golden-path/create-app/custom-theme',
- 'golden-path/create-app/keeping-backstage-updated',
- ],
+ label: 'API',
+ link:
+ searchSidebar.length > 0
+ ? {
+ type: 'generated-index',
+ title: 'Search API',
+ slug: '/category/search-api',
+ }
+ : {
+ type: 'doc',
+ id: 'openapi/generated-docs/404',
+ },
+ items: searchSidebar,
},
+ 'features/search/architecture',
+ 'features/search/search-engines',
+ 'features/search/collators',
+ 'features/search/how-to-guides',
+ ],
+ ),
+ sidebarElementWithIndex(
+ {
+ label: 'Software Catalog',
+ description: 'Manage and explore your software components.',
+ },
+ [
+ 'features/software-catalog/software-catalog-overview',
+ 'features/software-catalog/life-of-an-entity',
+ 'features/software-catalog/configuration',
+ 'features/software-catalog/system-model',
+ 'features/software-catalog/descriptor-format',
+ 'features/software-catalog/references',
+ 'features/software-catalog/well-known-annotations',
+ 'features/software-catalog/well-known-relations',
+ 'features/software-catalog/well-known-statuses',
+ 'features/software-catalog/extending-the-model',
+ 'features/software-catalog/external-integrations',
+ 'features/software-catalog/catalog-customization',
{
type: 'category',
- label: '002 - Plugins',
- items: [
- 'golden-path/plugins/index',
- 'golden-path/plugins/why-build-plugins',
- 'golden-path/plugins/sustainable-plugin-development',
- {
- type: 'category',
- label: 'Backend Plugins',
- items: [
- 'golden-path/plugins/backend/001-first-steps',
- 'golden-path/plugins/backend/002-poking-around',
- ],
- },
- ],
+ label: 'API',
+ link:
+ catalogSidebar.length > 0
+ ? {
+ type: 'generated-index',
+ title: 'Catalog API',
+ slug: '/category/catalog-api',
+ }
+ : {
+ type: 'doc',
+ id: 'openapi/generated-docs/404',
+ },
+ items: catalogSidebar,
+ },
+ 'features/software-catalog/creating-the-catalog-graph',
+ 'features/software-catalog/faq',
+ ],
+ ),
+ sidebarElementWithIndex(
+ {
+ label: 'Software Templates',
+ description: 'Create and manage software templates.',
+ },
+ [
+ 'features/software-templates/software-templates-index',
+ 'features/software-templates/configuration',
+ 'features/software-templates/adding-templates',
+ 'features/software-templates/writing-templates',
+ 'features/software-templates/input-examples',
+ 'features/software-templates/builtin-actions',
+ 'features/software-templates/writing-custom-actions',
+ 'features/software-templates/writing-tests-for-actions',
+ 'features/software-templates/writing-custom-field-extensions',
+ 'features/software-templates/writing-custom-step-layouts',
+ 'features/software-templates/authorizing-scaffolder-template-details',
+ 'features/software-templates/migrating-to-rjsf-v5',
+ 'features/software-templates/migrating-from-v1beta2-to-v1beta3',
+ 'features/software-templates/dry-run-testing',
+ 'features/software-templates/experimental',
+ 'features/software-templates/templating-extensions',
+ {
+ type: 'category',
+ label: 'API',
+ link:
+ scaffolderSidebar.length > 0
+ ? {
+ type: 'generated-index',
+ title: 'Scaffolder API',
+ slug: '/category/scaffolder-api',
+ }
+ : {
+ type: 'doc',
+ id: 'openapi/generated-docs/404',
+ },
+ items: scaffolderSidebar,
},
],
- }
- : {}),
- 'Core Features': [
- {
- type: 'category',
- label: 'Auth and Identity',
- items: [
- 'auth/index',
+ ),
+ sidebarElementWithIndex(
{
- type: 'category',
- label: 'Included providers',
- items: [
- 'auth/auth0/provider',
- 'auth/atlassian/provider',
- 'auth/aws-alb/provider',
- 'auth/microsoft/provider',
- 'auth/microsoft/easy-auth',
- 'auth/bitbucket/provider',
- 'auth/bitbucketServer/provider',
- 'auth/cloudflare/provider',
- 'auth/github/provider',
- 'auth/gitlab/provider',
- 'auth/google/provider',
- 'auth/google/gcp-iap-auth',
- 'auth/guest/provider',
- 'auth/okta/provider',
- 'auth/oauth2-proxy/provider',
- 'auth/onelogin/provider',
- 'auth/vmware-cloud/provider',
- ],
+ label: 'TechDocs',
+ description: 'Documentation as code for your software.',
},
- 'auth/identity-resolver',
- 'auth/oauth',
- 'auth/oidc',
- 'auth/add-auth-provider',
- 'auth/service-to-service-auth',
- 'auth/autologout',
- 'auth/troubleshooting',
- ],
- },
+ [
+ 'features/techdocs/techdocs-overview',
+ 'features/techdocs/getting-started',
+ 'features/techdocs/concepts',
+ 'features/techdocs/addons',
+ 'features/techdocs/architecture',
+ 'features/techdocs/extensions',
+ 'features/techdocs/creating-and-publishing',
+ 'features/techdocs/configuration',
+ 'features/techdocs/using-cloud-storage',
+ 'features/techdocs/configuring-ci-cd',
+ 'features/techdocs/cli',
+ 'features/techdocs/how-to-guides',
+ 'features/techdocs/troubleshooting',
+ 'features/techdocs/faqs',
+ ],
+ ),
+ ],
+ ),
+ sidebarElementWithIndex(
{
- type: 'category',
- label: 'Kubernetes',
- items: [
- 'features/kubernetes/overview',
- 'features/kubernetes/installation',
- 'features/kubernetes/configuration',
- 'features/kubernetes/authentication',
- 'features/kubernetes/authentication-strategies',
- 'features/kubernetes/troubleshooting',
- 'features/kubernetes/proxy',
- ],
+ label: 'Integrations',
+ description: 'Connect and integrate with external services.',
},
- {
- type: 'category',
- label: 'Notifications',
- items: [
- 'notifications/index',
- 'notifications/processors',
- 'notifications/usage',
- ],
- },
- {
- type: 'category',
- label: 'Permissions',
- items: [
- 'permissions/overview',
- 'permissions/concepts',
- 'permissions/getting-started',
- 'permissions/writing-a-policy',
- 'permissions/frontend-integration',
- 'permissions/custom-rules',
- {
- type: 'category',
- label: 'Tutorial: using Permissions in your plugin',
- items: [
- 'permissions/plugin-authors/01-setup',
- 'permissions/plugin-authors/02-adding-a-basic-permission-check',
- 'permissions/plugin-authors/03-adding-a-resource-permission-check',
- 'permissions/plugin-authors/04-authorizing-access-to-paginated-data',
- 'permissions/plugin-authors/05-frontend-authorization',
- ],
- },
- ],
- },
- {
- type: 'category',
- label: 'Search',
- items: [
- 'features/search/search-overview',
- 'features/search/getting-started',
- 'features/search/concepts',
- {
- type: 'category',
- label: 'API',
- link:
- searchSidebar.length > 0
- ? {
- type: 'generated-index',
- title: 'Search API',
- slug: '/category/search-api',
- }
- : {
- type: 'doc',
- id: 'openapi/generated-docs/404',
- },
- items: searchSidebar,
- },
- 'features/search/architecture',
- 'features/search/search-engines',
- 'features/search/collators',
- 'features/search/how-to-guides',
- ],
- },
- {
- type: 'category',
- label: 'Software Catalog',
- items: [
- 'features/software-catalog/software-catalog-overview',
- 'features/software-catalog/life-of-an-entity',
- 'features/software-catalog/configuration',
- 'features/software-catalog/system-model',
- 'features/software-catalog/descriptor-format',
- 'features/software-catalog/references',
- 'features/software-catalog/well-known-annotations',
- 'features/software-catalog/well-known-relations',
- 'features/software-catalog/well-known-statuses',
- 'features/software-catalog/extending-the-model',
- 'features/software-catalog/external-integrations',
- 'features/software-catalog/catalog-customization',
- {
- type: 'category',
- label: 'API',
- link:
- catalogSidebar.length > 0
- ? {
- type: 'generated-index',
- title: 'Catalog API',
- slug: '/category/catalog-api',
- }
- : {
- type: 'doc',
- id: 'openapi/generated-docs/404',
- },
- items: catalogSidebar,
- },
- 'features/software-catalog/creating-the-catalog-graph',
- 'features/software-catalog/faq',
- ],
- },
- {
- type: 'category',
- label: 'Software Templates',
- items: [
- 'features/software-templates/software-templates-index',
- 'features/software-templates/configuration',
- 'features/software-templates/adding-templates',
- 'features/software-templates/writing-templates',
- 'features/software-templates/input-examples',
- 'features/software-templates/builtin-actions',
- 'features/software-templates/writing-custom-actions',
- 'features/software-templates/writing-tests-for-actions',
- 'features/software-templates/writing-custom-field-extensions',
- 'features/software-templates/writing-custom-step-layouts',
- 'features/software-templates/authorizing-scaffolder-template-details',
- 'features/software-templates/migrating-to-rjsf-v5',
- 'features/software-templates/migrating-from-v1beta2-to-v1beta3',
- 'features/software-templates/dry-run-testing',
- 'features/software-templates/experimental',
- 'features/software-templates/templating-extensions',
- {
- type: 'category',
- label: 'API',
- link:
- scaffolderSidebar.length > 0
- ? {
- type: 'generated-index',
- title: 'Scaffolder API',
- slug: '/category/scaffolder-api',
- }
- : {
- type: 'doc',
- id: 'openapi/generated-docs/404',
- },
- items: scaffolderSidebar,
- },
- ],
- },
- {
- type: 'category',
- label: 'TechDocs',
- items: [
- 'features/techdocs/techdocs-overview',
- 'features/techdocs/getting-started',
- 'features/techdocs/concepts',
- 'features/techdocs/addons',
- 'features/techdocs/architecture',
- 'features/techdocs/extensions',
- 'features/techdocs/creating-and-publishing',
- 'features/techdocs/configuration',
- 'features/techdocs/using-cloud-storage',
- 'features/techdocs/configuring-ci-cd',
- 'features/techdocs/cli',
- 'features/techdocs/how-to-guides',
- 'features/techdocs/troubleshooting',
- 'features/techdocs/faqs',
- ],
- },
- ],
- Integrations: [
- 'integrations/index',
- {
- type: 'category',
- label: 'AWS S3',
- items: [
+ [
+ 'integrations/index',
+ sidebarElementWithIndex({ label: 'AWS S3' }, [
'integrations/aws-s3/locations',
'integrations/aws-s3/discovery',
- ],
- },
- {
- type: 'category',
- label: 'Azure Blob Storage',
- items: [
+ ]),
+ sidebarElementWithIndex({ label: 'Azure Blob Storage' }, [
'integrations/azure-blobStorage/locations',
'integrations/azure-blobStorage/discovery',
- ],
- },
- {
- type: 'category',
- label: 'Azure',
- items: [
+ ]),
+ sidebarElementWithIndex({ label: 'Azure' }, [
'integrations/azure/locations',
'integrations/azure/discovery',
'integrations/azure/org',
- ],
- },
- {
- type: 'category',
- label: 'Bitbucket Cloud',
- items: [
+ ]),
+ sidebarElementWithIndex({ label: 'Bitbucket Cloud' }, [
'integrations/bitbucketCloud/locations',
'integrations/bitbucketCloud/discovery',
- ],
- },
- {
- type: 'category',
- label: 'Bitbucket Server',
- items: [
+ ]),
+ sidebarElementWithIndex({ label: 'Bitbucket Server' }, [
'integrations/bitbucketServer/locations',
'integrations/bitbucketServer/discovery',
- ],
- },
- {
- type: 'category',
- label: 'Datadog',
- items: ['integrations/datadog-rum/installation'],
- },
- {
- type: 'category',
- label: 'Gerrit',
- items: [
+ ]),
+ sidebarElementWithIndex({ label: 'Datadog' }, [
+ 'integrations/datadog-rum/installation',
+ ]),
+ sidebarElementWithIndex({ label: 'Gerrit' }, [
'integrations/gerrit/locations',
'integrations/gerrit/discovery',
- ],
- },
- {
- type: 'category',
- label: 'GitHub',
- items: [
+ ]),
+ sidebarElementWithIndex({ label: 'Github' }, [
'integrations/github/locations',
'integrations/github/discovery',
'integrations/github/org',
'integrations/github/github-apps',
- ],
- },
- {
- type: 'category',
- label: 'GitLab',
- items: [
+ ]),
+ sidebarElementWithIndex({ label: 'GitLab' }, [
'integrations/gitlab/locations',
'integrations/gitlab/discovery',
'integrations/gitlab/org',
- ],
- },
+ ]),
+ sidebarElementWithIndex({ label: 'Gitea' }, [
+ 'integrations/gitea/locations',
+ 'integrations/gitea/discovery',
+ ]),
+ sidebarElementWithIndex({ label: 'Harness' }, [
+ 'integrations/harness/locations',
+ ]),
+ sidebarElementWithIndex({ label: 'Google GCS' }, [
+ 'integrations/google-cloud-storage/locations',
+ ]),
+ sidebarElementWithIndex({ label: 'LDAP' }, ['integrations/ldap/org']),
+ ],
+ ),
+ sidebarElementWithIndex(
{
- type: 'category',
- label: 'Gitea',
- items: ['integrations/gitea/locations', 'integrations/gitea/discovery'],
+ label: 'Plugins',
+ description: 'Extend Backstage with custom functionality.',
},
- {
- type: 'category',
- label: 'Harness',
- items: ['integrations/harness/locations'],
- },
- {
- type: 'category',
- label: 'Google GCS',
- items: ['integrations/google-cloud-storage/locations'],
- },
- {
- type: 'category',
- label: 'LDAP',
- items: ['integrations/ldap/org'],
- },
- ],
- Plugins: [
- 'plugins/index',
- 'plugins/existing-plugins',
- 'plugins/create-a-plugin',
- 'plugins/plugin-development',
- 'plugins/structure-of-a-plugin',
- 'plugins/integrating-plugin-into-software-catalog',
- 'plugins/integrating-search-into-plugins',
- 'plugins/composability',
- 'plugins/internationalization',
- 'plugins/analytics',
- 'plugins/feature-flags',
- {
- type: 'category',
- label: 'OpenAPI',
- items: [
- 'openapi/01-getting-started',
- 'openapi/generate-client',
- 'openapi/test-case-validation',
- ],
- },
- {
- type: 'category',
- label: 'Backends and APIs',
- items: [
- 'plugins/proxying',
- 'plugins/backend-plugin',
- 'plugins/call-existing-api',
- ],
- },
- {
- type: 'category',
- label: 'Testing',
- items: ['plugins/testing'],
- },
- {
- type: 'category',
- label: 'Publishing',
- items: [
- 'plugins/publish-private',
- 'plugins/add-to-directory',
- 'plugins/observability',
- ],
- },
- ],
- Configuration: [
- 'conf/index',
- 'conf/reading',
- 'conf/writing',
- 'conf/defining',
- ],
- Framework: [
- {
- type: 'category',
- label: 'Backend System',
- items: [
- 'backend-system/index',
+ [
+ 'plugins/index',
+ 'plugins/existing-plugins',
+ 'plugins/create-a-plugin',
+ 'plugins/plugin-development',
+ 'plugins/structure-of-a-plugin',
+ 'plugins/integrating-plugin-into-software-catalog',
+ 'plugins/integrating-search-into-plugins',
+ 'plugins/composability',
+ 'plugins/internationalization',
+ 'plugins/analytics',
+ 'plugins/feature-flags',
+ sidebarElementWithIndex(
{
- type: 'category',
- label: 'Architecture',
- items: [
- 'backend-system/architecture/index',
- 'backend-system/architecture/services',
- 'backend-system/architecture/plugins',
- 'backend-system/architecture/extension-points',
- 'backend-system/architecture/modules',
- 'backend-system/architecture/feature-loaders',
- 'backend-system/architecture/naming-patterns',
- ],
+ label: 'OpenAPI',
+ description:
+ 'Work with OpenAPI specifications and generate clients.',
},
+ [
+ 'openapi/01-getting-started',
+ 'openapi/generate-client',
+ 'openapi/test-case-validation',
+ ],
+ ),
+ sidebarElementWithIndex(
{
- type: 'category',
- label: 'Building Backends',
- items: [
- 'backend-system/building-backends/index',
- 'backend-system/building-backends/migrating',
- ],
+ label: 'Backends and APIs',
+ description: 'Build and manage backend services and APIs.',
},
- {
- type: 'category',
- label: 'Building Plugins & Modules',
- items: [
- 'backend-system/building-plugins-and-modules/index',
- 'backend-system/building-plugins-and-modules/testing',
- 'backend-system/building-plugins-and-modules/migrating',
- ],
- },
- {
- type: 'category',
- label: 'Core Services',
- items: [
- 'backend-system/core-services/index',
- 'backend-system/core-services/auditor',
- 'backend-system/core-services/auth',
- 'backend-system/core-services/cache',
- 'backend-system/core-services/database',
- 'backend-system/core-services/discovery',
- 'backend-system/core-services/http-auth',
- 'backend-system/core-services/http-router',
- 'backend-system/core-services/identity',
- 'backend-system/core-services/lifecycle',
- 'backend-system/core-services/logger',
- 'backend-system/core-services/permissions',
- 'backend-system/core-services/permissions-registry',
- 'backend-system/core-services/plugin-metadata',
- 'backend-system/core-services/root-config',
- 'backend-system/core-services/root-health',
- 'backend-system/core-services/root-instance-metadata',
- 'backend-system/core-services/root-http-router',
- 'backend-system/core-services/root-lifecycle',
- 'backend-system/core-services/root-logger',
- 'backend-system/core-services/scheduler',
- 'backend-system/core-services/token-manager',
- 'backend-system/core-services/url-reader',
- 'backend-system/core-services/user-info',
- 'backend-system/core-services/actions-registry',
- 'backend-system/core-services/actions',
- ],
- },
- ],
- },
+ [
+ 'plugins/proxying',
+ 'plugins/backend-plugin',
+ 'plugins/call-existing-api',
+ ],
+ ),
+ sidebarElementWithIndex(
+ { label: 'Testing', description: 'Testing plugins and modules.' },
+ ['plugins/testing'],
+ ),
+ sidebarElementWithIndex(
+ { label: 'Publishing', description: 'Publishing your plugins.' },
+ ['plugins/publish-private', 'plugins/add-to-directory'],
+ ),
+ 'plugins/observability',
+ ],
+ ),
+ sidebarElementWithIndex(
{
- type: 'category',
- label: 'New Frontend System',
- items: [
- 'frontend-system/index',
+ label: 'Configuration',
+ description: 'Manage static configuration files and settings.',
+ },
+ ['conf/index', 'conf/reading', 'conf/writing', 'conf/defining'],
+ ),
+ sidebarElementWithIndex(
+ {
+ label: 'Framework',
+ description: 'Core framework concepts and architecture.',
+ },
+ [
+ sidebarElementWithIndex(
{
- type: 'category',
- label: 'Architecture',
- items: [
- 'frontend-system/architecture/index',
- 'frontend-system/architecture/app',
- 'frontend-system/architecture/plugins',
- 'frontend-system/architecture/extensions',
- 'frontend-system/architecture/extension-blueprints',
- 'frontend-system/architecture/extension-overrides',
- 'frontend-system/architecture/references',
- 'frontend-system/architecture/utility-apis',
- 'frontend-system/architecture/routes',
- 'frontend-system/architecture/naming-patterns',
- 'frontend-system/architecture/migrations',
- ],
+ label: 'Backend System',
+ description: 'Backend system components and architecture.',
},
+ [
+ 'backend-system/index',
+ sidebarElementWithIndex(
+ {
+ label: 'Architecture',
+ description: 'Architecture of the backend system.',
+ },
+ [
+ 'backend-system/architecture/index',
+ 'backend-system/architecture/services',
+ 'backend-system/architecture/plugins',
+ 'backend-system/architecture/extension-points',
+ 'backend-system/architecture/modules',
+ 'backend-system/architecture/feature-loaders',
+ 'backend-system/architecture/naming-patterns',
+ ],
+ ),
+ sidebarElementWithIndex(
+ {
+ label: 'Building Backends',
+ description: 'Guides on building backend systems.',
+ },
+ [
+ 'backend-system/building-backends/index',
+ 'backend-system/building-backends/migrating',
+ ],
+ ),
+ sidebarElementWithIndex(
+ {
+ label: 'Building Plugins & Modules',
+ description: 'Guides on building plugins and modules.',
+ },
+ [
+ 'backend-system/building-plugins-and-modules/index',
+ 'backend-system/building-plugins-and-modules/testing',
+ 'backend-system/building-plugins-and-modules/migrating',
+ ],
+ ),
+ sidebarElementWithIndex(
+ {
+ label: 'Core Services',
+ description: 'Core services of the backend system.',
+ },
+ [
+ 'backend-system/core-services/index',
+ 'backend-system/core-services/auditor',
+ 'backend-system/core-services/auth',
+ 'backend-system/core-services/cache',
+ 'backend-system/core-services/database',
+ 'backend-system/core-services/discovery',
+ 'backend-system/core-services/http-auth',
+ 'backend-system/core-services/http-router',
+ 'backend-system/core-services/identity',
+ 'backend-system/core-services/lifecycle',
+ 'backend-system/core-services/logger',
+ 'backend-system/core-services/permissions',
+ 'backend-system/core-services/permissions-registry',
+ 'backend-system/core-services/plugin-metadata',
+ 'backend-system/core-services/root-config',
+ 'backend-system/core-services/root-health',
+ 'backend-system/core-services/root-http-router',
+ 'backend-system/core-services/root-instance-metadata',
+ 'backend-system/core-services/root-lifecycle',
+ 'backend-system/core-services/root-logger',
+ 'backend-system/core-services/scheduler',
+ 'backend-system/core-services/token-manager',
+ 'backend-system/core-services/url-reader',
+ 'backend-system/core-services/user-info',
+ 'backend-system/core-services/actions-registry',
+ 'backend-system/core-services/actions',
+ ],
+ ),
+ ],
+ ),
+ sidebarElementWithIndex(
{
- type: 'category',
- label: 'Building Plugins',
- items: [
- 'frontend-system/building-plugins/index',
- 'frontend-system/building-plugins/testing',
- 'frontend-system/building-plugins/common-extension-blueprints',
- 'frontend-system/building-plugins/built-in-data-refs',
- 'frontend-system/building-plugins/migrating',
- ],
+ label: 'New Frontend System',
+ description: 'New frontend system components and architecture.',
},
+ [
+ 'frontend-system/index',
+ sidebarElementWithIndex(
+ {
+ label: 'Architecture',
+ description: 'Architecture of the new frontend system.',
+ },
+ [
+ 'frontend-system/architecture/index',
+ 'frontend-system/architecture/app',
+ 'frontend-system/architecture/plugins',
+ 'frontend-system/architecture/extensions',
+ 'frontend-system/architecture/extension-blueprints',
+ 'frontend-system/architecture/extension-overrides',
+ 'frontend-system/architecture/references',
+ 'frontend-system/architecture/utility-apis',
+ 'frontend-system/architecture/routes',
+ 'frontend-system/architecture/naming-patterns',
+ 'frontend-system/architecture/migrations',
+ ],
+ ),
+ sidebarElementWithIndex(
+ {
+ label: 'Building Plugins',
+ description: 'Guides on building frontend plugins.',
+ },
+ [
+ 'frontend-system/building-plugins/index',
+ 'frontend-system/building-plugins/testing',
+ 'frontend-system/building-plugins/common-extension-blueprints',
+ 'frontend-system/building-plugins/built-in-data-refs',
+ 'frontend-system/building-plugins/migrating',
+ ],
+ ),
+ sidebarElementWithIndex(
+ {
+ label: 'Building Apps',
+ description: 'Guides on building frontend applications.',
+ },
+ [
+ 'frontend-system/building-apps/index',
+ 'frontend-system/building-apps/configuring-extensions',
+ 'frontend-system/building-apps/built-in-extensions',
+ 'frontend-system/building-apps/plugin-conversion',
+ 'frontend-system/building-apps/migrating',
+ ],
+ ),
+ sidebarElementWithIndex(
+ {
+ label: 'Utility APIs',
+ description: 'Utility APIs for the frontend system.',
+ },
+ [
+ 'frontend-system/utility-apis/index',
+ 'frontend-system/utility-apis/creating',
+ 'frontend-system/utility-apis/consuming',
+ 'frontend-system/utility-apis/configuring',
+ ],
+ ),
+ ],
+ ),
+ sidebarElementWithIndex(
{
- type: 'category',
- label: 'Building Apps',
- items: [
- 'frontend-system/building-apps/index',
- 'frontend-system/building-apps/configuring-extensions',
- 'frontend-system/building-apps/built-in-extensions',
- 'frontend-system/building-apps/plugin-conversion',
- 'frontend-system/building-apps/migrating',
- ],
+ label: 'Backstage CLI',
+ description: 'Command-line interface for Backstage.',
},
+ [
+ 'tooling/cli/overview',
+ 'tooling/cli/build-system',
+ 'tooling/cli/commands',
+ 'tooling/cli/templates',
+ sidebarElementWithIndex(
+ {
+ label: 'Local Development',
+ description:
+ 'Guides for local development using Backstage CLI.',
+ },
+ [
+ 'tooling/local-dev/linking-local-packages',
+ 'tooling/local-dev/debugging',
+ 'tooling/local-dev/profiling',
+ ],
+ ),
+ 'tooling/package-metadata',
+ ],
+ ),
+ sidebarElementWithIndex(
{
- type: 'category',
- label: 'Utility APIs',
- items: [
- 'frontend-system/utility-apis/index',
- 'frontend-system/utility-apis/creating',
- 'frontend-system/utility-apis/consuming',
- 'frontend-system/utility-apis/configuring',
- ],
+ label: 'User Interface',
+ description: 'User interface customization and configuration.',
},
- ],
- },
+ [
+ 'conf/user-interface/index',
+ 'conf/user-interface/logo',
+ 'conf/user-interface/icons',
+ 'conf/user-interface/sidebar',
+ ],
+ ),
+ ],
+ ),
+ sidebarElementWithIndex(
{
- 'Backstage CLI': [
- 'tooling/cli/overview',
- 'tooling/cli/build-system',
- 'tooling/cli/commands',
- 'tooling/cli/templates',
+ label: 'Tutorials',
+ description:
+ 'Step-by-step tutorials for various Backstage features and use cases.',
+ },
+ [
+ sidebarElementWithIndex(
{
- type: 'category',
- label: 'Local Development',
- items: [
- 'tooling/local-dev/linking-local-packages',
- 'tooling/local-dev/debugging',
- 'tooling/local-dev/profiling',
- ],
+ label: 'Non-technical',
+ description: 'Non-technical tutorials and guides.',
},
- 'tooling/package-metadata',
- ],
- },
+ ['overview/adopting'],
+ ),
+ sidebarElementWithIndex(
+ {
+ label: 'Technical',
+ description: 'Technical tutorials and guides.',
+ },
+ [
+ 'tutorials/quickstart-app-plugin',
+ 'tutorials/configuring-plugin-databases',
+ 'tutorials/manual-knex-rollback',
+ 'tutorials/switching-sqlite-postgres',
+ 'tutorials/using-backstage-proxy-within-plugin',
+ 'tutorials/enable-public-entry',
+ 'tutorials/setup-opentelemetry',
+ 'tutorials/integrating-event-driven-updates-with-entity-providers',
+ 'accessibility/index',
+ ],
+ ),
+ sidebarElementWithIndex(
+ {
+ label: 'Migrations',
+ description:
+ 'Guides for migrating between different versions and systems.',
+ },
+ [
+ 'tutorials/jest30-migration',
+ 'tutorials/react-router-stable-migration',
+ 'tutorials/react18-migration',
+ 'tutorials/package-role-migration',
+ 'tutorials/migrating-away-from-core',
+ 'tutorials/yarn-migration',
+ 'tutorials/migrate-to-mui5',
+ 'tutorials/auth-service-migration',
+ 'tutorials/jsx-transform-migration',
+ ],
+ ),
+ ],
+ ),
+ sidebarElementWithIndex(
+ { label: 'FAQ', description: 'Frequently asked questions and answers.' },
+ ['faq/index', 'faq/product', 'faq/technical'],
+ ),
+ sidebarElementWithIndex(
{
- type: 'category',
- label: 'User Interface',
- items: [
- 'conf/user-interface/index',
- 'conf/user-interface/logo',
- 'conf/user-interface/icons',
- 'conf/user-interface/sidebar',
- ],
+ label: 'Contribute',
+ description: 'Information on contributing to Backstage.',
},
- ],
- Tutorials: [
- { 'Non-technical': ['overview/adopting'] },
+ [
+ 'contribute/index',
+ 'contribute/getting-involved',
+ 'contribute/project-structure',
+ ],
+ ),
+ sidebarElementWithIndex(
{
- Technical: [
- 'tutorials/quickstart-app-plugin',
- 'tutorials/configuring-plugin-databases',
- 'tutorials/manual-knex-rollback',
- 'tutorials/switching-sqlite-postgres',
- 'tutorials/using-backstage-proxy-within-plugin',
- 'tutorials/enable-public-entry',
- 'tutorials/setup-opentelemetry',
- 'tutorials/integrating-event-driven-updates-with-entity-providers',
- 'accessibility/index',
- ],
+ label: 'References',
+ description: 'Reference materials and documentation.',
},
- {
- Migrations: [
- 'tutorials/react-router-stable-migration',
- 'tutorials/react18-migration',
- 'tutorials/package-role-migration',
- 'tutorials/migrating-away-from-core',
- 'tutorials/yarn-migration',
- 'tutorials/migrate-to-mui5',
- 'tutorials/auth-service-migration',
- 'tutorials/jsx-transform-migration',
- ],
- },
- ],
- FAQ: ['faq/index', 'faq/product', 'faq/technical'],
- Contribute: [
- 'contribute/index',
- 'contribute/getting-involved',
- 'contribute/project-structure',
- ],
- References: [
- {
- 'Designing for Backstage': [
- 'dls/design',
- 'dls/component-design-guidelines',
- 'dls/contributing-to-storybook',
- 'dls/figma',
- ],
- },
- {
- type: 'category',
- label: 'Architecture Decision Records (ADRs)',
- items: [
- 'architecture-decisions/adrs-overview',
- 'architecture-decisions/adrs-adr001',
- 'architecture-decisions/adrs-adr002',
- 'architecture-decisions/adrs-adr003',
- 'architecture-decisions/adrs-adr004',
- 'architecture-decisions/adrs-adr005',
- 'architecture-decisions/adrs-adr006',
- 'architecture-decisions/adrs-adr007',
- 'architecture-decisions/adrs-adr008',
- 'architecture-decisions/adrs-adr009',
- 'architecture-decisions/adrs-adr010',
- 'architecture-decisions/adrs-adr011',
- 'architecture-decisions/adrs-adr012',
- 'architecture-decisions/adrs-adr013',
- 'architecture-decisions/adrs-adr014',
- ],
- },
- 'api/deprecations',
- 'references/glossary',
- 'api/utility-apis',
- 'reference/index',
- ],
- },
+ [
+ sidebarElementWithIndex(
+ {
+ label: 'Designing for Backstage',
+ description:
+ 'Guidelines and resources for designing Backstage components.',
+ },
+ [
+ 'dls/design',
+ 'dls/component-design-guidelines',
+ 'dls/contributing-to-storybook',
+ 'dls/figma',
+ ],
+ ),
+ sidebarElementWithIndex(
+ {
+ label: 'Architecture Decision Records (ADRs)',
+ description:
+ 'Documentation of architectural decisions made in Backstage.',
+ },
+ [
+ 'architecture-decisions/adrs-overview',
+ 'architecture-decisions/adrs-adr001',
+ 'architecture-decisions/adrs-adr002',
+ 'architecture-decisions/adrs-adr003',
+ 'architecture-decisions/adrs-adr004',
+ 'architecture-decisions/adrs-adr005',
+ 'architecture-decisions/adrs-adr006',
+ 'architecture-decisions/adrs-adr007',
+ 'architecture-decisions/adrs-adr008',
+ 'architecture-decisions/adrs-adr009',
+ 'architecture-decisions/adrs-adr010',
+ 'architecture-decisions/adrs-adr011',
+ 'architecture-decisions/adrs-adr012',
+ 'architecture-decisions/adrs-adr013',
+ 'architecture-decisions/adrs-adr014',
+ 'architecture-decisions/adrs-adr015',
+ ],
+ ),
+ 'api/deprecations',
+ 'references/glossary',
+ 'api/utility-apis',
+ 'reference/index',
+ ],
+ ),
+ ],
releases: {
'Release Notes': releases.map(release => `releases/${release}`),
},
diff --git a/microsite/static/img/citrix_sds.png b/microsite/static/img/citrix_sds.png
new file mode 100644
index 0000000000..fac58411a1
Binary files /dev/null and b/microsite/static/img/citrix_sds.png differ
diff --git a/microsite/yarn.lock b/microsite/yarn.lock
index 2f6e723889..acceac04e2 100644
--- a/microsite/yarn.lock
+++ b/microsite/yarn.lock
@@ -2961,90 +2961,90 @@ __metadata:
languageName: node
linkType: hard
-"@swc/core-darwin-arm64@npm:1.15.3":
- version: 1.15.3
- resolution: "@swc/core-darwin-arm64@npm:1.15.3"
+"@swc/core-darwin-arm64@npm:1.15.6":
+ version: 1.15.6
+ resolution: "@swc/core-darwin-arm64@npm:1.15.6"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
-"@swc/core-darwin-x64@npm:1.15.3":
- version: 1.15.3
- resolution: "@swc/core-darwin-x64@npm:1.15.3"
+"@swc/core-darwin-x64@npm:1.15.6":
+ version: 1.15.6
+ resolution: "@swc/core-darwin-x64@npm:1.15.6"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
-"@swc/core-linux-arm-gnueabihf@npm:1.15.3":
- version: 1.15.3
- resolution: "@swc/core-linux-arm-gnueabihf@npm:1.15.3"
+"@swc/core-linux-arm-gnueabihf@npm:1.15.6":
+ version: 1.15.6
+ resolution: "@swc/core-linux-arm-gnueabihf@npm:1.15.6"
conditions: os=linux & cpu=arm
languageName: node
linkType: hard
-"@swc/core-linux-arm64-gnu@npm:1.15.3":
- version: 1.15.3
- resolution: "@swc/core-linux-arm64-gnu@npm:1.15.3"
+"@swc/core-linux-arm64-gnu@npm:1.15.6":
+ version: 1.15.6
+ resolution: "@swc/core-linux-arm64-gnu@npm:1.15.6"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard
-"@swc/core-linux-arm64-musl@npm:1.15.3":
- version: 1.15.3
- resolution: "@swc/core-linux-arm64-musl@npm:1.15.3"
+"@swc/core-linux-arm64-musl@npm:1.15.6":
+ version: 1.15.6
+ resolution: "@swc/core-linux-arm64-musl@npm:1.15.6"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard
-"@swc/core-linux-x64-gnu@npm:1.15.3":
- version: 1.15.3
- resolution: "@swc/core-linux-x64-gnu@npm:1.15.3"
+"@swc/core-linux-x64-gnu@npm:1.15.6":
+ version: 1.15.6
+ resolution: "@swc/core-linux-x64-gnu@npm:1.15.6"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard
-"@swc/core-linux-x64-musl@npm:1.15.3":
- version: 1.15.3
- resolution: "@swc/core-linux-x64-musl@npm:1.15.3"
+"@swc/core-linux-x64-musl@npm:1.15.6":
+ version: 1.15.6
+ resolution: "@swc/core-linux-x64-musl@npm:1.15.6"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard
-"@swc/core-win32-arm64-msvc@npm:1.15.3":
- version: 1.15.3
- resolution: "@swc/core-win32-arm64-msvc@npm:1.15.3"
+"@swc/core-win32-arm64-msvc@npm:1.15.6":
+ version: 1.15.6
+ resolution: "@swc/core-win32-arm64-msvc@npm:1.15.6"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
-"@swc/core-win32-ia32-msvc@npm:1.15.3":
- version: 1.15.3
- resolution: "@swc/core-win32-ia32-msvc@npm:1.15.3"
+"@swc/core-win32-ia32-msvc@npm:1.15.6":
+ version: 1.15.6
+ resolution: "@swc/core-win32-ia32-msvc@npm:1.15.6"
conditions: os=win32 & cpu=ia32
languageName: node
linkType: hard
-"@swc/core-win32-x64-msvc@npm:1.15.3":
- version: 1.15.3
- resolution: "@swc/core-win32-x64-msvc@npm:1.15.3"
+"@swc/core-win32-x64-msvc@npm:1.15.6":
+ version: 1.15.6
+ resolution: "@swc/core-win32-x64-msvc@npm:1.15.6"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
-"@swc/core@npm:^1.3.46":
- version: 1.15.3
- resolution: "@swc/core@npm:1.15.3"
+"@swc/core@npm:^1.15.6":
+ version: 1.15.6
+ resolution: "@swc/core@npm:1.15.6"
dependencies:
- "@swc/core-darwin-arm64": "npm:1.15.3"
- "@swc/core-darwin-x64": "npm:1.15.3"
- "@swc/core-linux-arm-gnueabihf": "npm:1.15.3"
- "@swc/core-linux-arm64-gnu": "npm:1.15.3"
- "@swc/core-linux-arm64-musl": "npm:1.15.3"
- "@swc/core-linux-x64-gnu": "npm:1.15.3"
- "@swc/core-linux-x64-musl": "npm:1.15.3"
- "@swc/core-win32-arm64-msvc": "npm:1.15.3"
- "@swc/core-win32-ia32-msvc": "npm:1.15.3"
- "@swc/core-win32-x64-msvc": "npm:1.15.3"
+ "@swc/core-darwin-arm64": "npm:1.15.6"
+ "@swc/core-darwin-x64": "npm:1.15.6"
+ "@swc/core-linux-arm-gnueabihf": "npm:1.15.6"
+ "@swc/core-linux-arm64-gnu": "npm:1.15.6"
+ "@swc/core-linux-arm64-musl": "npm:1.15.6"
+ "@swc/core-linux-x64-gnu": "npm:1.15.6"
+ "@swc/core-linux-x64-musl": "npm:1.15.6"
+ "@swc/core-win32-arm64-msvc": "npm:1.15.6"
+ "@swc/core-win32-ia32-msvc": "npm:1.15.6"
+ "@swc/core-win32-x64-msvc": "npm:1.15.6"
"@swc/counter": "npm:^0.1.3"
"@swc/types": "npm:^0.1.25"
peerDependencies:
@@ -3073,7 +3073,7 @@ __metadata:
peerDependenciesMeta:
"@swc/helpers":
optional: true
- checksum: 10/280330d82328818138ed64fdcf9ea9abde6b6f16eca65a9d4db27dde06a8dfffd2649f3447d2243387277513c7430fa4142cafcfd64e943d682ce6a713cb8c2d
+ checksum: 10/d17d1b5e6e81f8c262b668f237b863dd612eaa19fc35e74067b2a27ba3998c0c511ec7f49cd91c02f61fa77dd1b5d7e65d293736f65ec45d6c13989904b1c7eb
languageName: node
linkType: hard
@@ -4274,7 +4274,7 @@ __metadata:
"@docusaurus/tsconfig": "npm:^3.1.1"
"@docusaurus/types": "npm:^3.1.1"
"@mdx-js/react": "npm:^3.0.0"
- "@swc/core": "npm:^1.3.46"
+ "@swc/core": "npm:^1.15.6"
"@types/webpack-env": "npm:^1.18.0"
clsx: "npm:^2.0.0"
docusaurus-plugin-openapi-docs: "npm:^4.3.0"
@@ -4721,9 +4721,9 @@ __metadata:
linkType: hard
"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001646, caniuse-lite@npm:^1.0.30001688":
- version: 1.0.30001695
- resolution: "caniuse-lite@npm:1.0.30001695"
- checksum: 10/8107c5e89b86c7a2fd506b93c658ff945c98c6518260c3b28af9f02bd83bf83939696241f0b413545c5b9895c86bcae64c9370388576440e74e9b848f04170d3
+ version: 1.0.30001760
+ resolution: "caniuse-lite@npm:1.0.30001760"
+ checksum: 10/ac5c13d00b946c3ace331d25379ed9d85743b1028aba79ae80402cb128b4b491122585144898fefb836d4d9879c13c717a081ae241a00420cbbc7e1b934ec685
languageName: node
linkType: hard
diff --git a/package.json b/package.json
index caef1349f3..53a8387281 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "root",
- "version": "1.46.0-next.2",
+ "version": "1.47.0-next.1",
"backstage": {
"cli": {
"new": {
@@ -117,7 +117,6 @@
"csstype@npm:^3.0.2": "3.0.9",
"csstype@npm:^3.1.2": "3.0.9",
"csstype@npm:^3.1.3": "3.0.9",
- "jest-haste-map@^29.7.0": "patch:jest-haste-map@npm%3A29.7.0#./.yarn/patches/jest-haste-map-npm-29.7.0-e3be419eff.patch",
"recast@npm:0.23.9>ast-types": "patch:ast-types@npm%3A0.16.1#./.yarn/patches/ast-types-npm-0.16.1-43c4ac4b0d.patch"
},
"dependencies": {
@@ -138,11 +137,12 @@
"@octokit/rest": "^19.0.3",
"@playwright/test": "^1.32.3",
"@spotify/eslint-plugin": "^15.0.0",
- "@storybook/addon-a11y": "^9.1.7",
- "@storybook/addon-docs": "^9.1.7",
- "@storybook/addon-links": "^9.1.7",
- "@storybook/addon-themes": "^9.1.7",
- "@storybook/react-vite": "^9.1.7",
+ "@storybook/addon-a11y": "^10.1.9",
+ "@storybook/addon-docs": "^10.1.9",
+ "@storybook/addon-links": "^10.1.9",
+ "@storybook/addon-themes": "^10.1.9",
+ "@storybook/addon-vitest": "^10.1.9",
+ "@storybook/react-vite": "^10.1.9",
"@techdocs/cli": "workspace:*",
"@types/cacheable-request": "^8.3.6",
"@types/memjs": "^1.3.3",
@@ -168,7 +168,7 @@
"shx": "^0.4.0",
"sloc": "^0.3.1",
"sort-package-json": "^2.8.0",
- "storybook": "^9.1.7",
+ "storybook": "^10.1.10",
"ts-morph": "^24.0.0",
"typedoc": "^0.28.0",
"typescript": "~5.7.0",
diff --git a/packages/app-defaults/CHANGELOG.md b/packages/app-defaults/CHANGELOG.md
index ee64c2209e..cca956654d 100644
--- a/packages/app-defaults/CHANGELOG.md
+++ b/packages/app-defaults/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/app-defaults
+## 1.7.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.19.3
+ - @backstage/core-components@0.18.4
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/theme@0.7.1
+ - @backstage/plugin-permission-react@0.4.39
+
## 1.7.3-next.0
### Patch Changes
diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json
index ec08c04929..878e5b505b 100644
--- a/packages/app-defaults/package.json
+++ b/packages/app-defaults/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/app-defaults",
- "version": "1.7.3-next.0",
+ "version": "1.7.3",
"description": "Provides the default wiring of a Backstage App",
"backstage": {
"role": "web-library"
diff --git a/packages/app-next-example-plugin/CHANGELOG.md b/packages/app-next-example-plugin/CHANGELOG.md
index da46f90c56..ee1e797be4 100644
--- a/packages/app-next-example-plugin/CHANGELOG.md
+++ b/packages/app-next-example-plugin/CHANGELOG.md
@@ -1,5 +1,13 @@
# app-next-example-plugin
+## 0.0.30
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/core-components@0.18.4
+
## 0.0.30-next.0
### Patch Changes
diff --git a/packages/app-next-example-plugin/package.json b/packages/app-next-example-plugin/package.json
index f7d113827d..f632f00de8 100644
--- a/packages/app-next-example-plugin/package.json
+++ b/packages/app-next-example-plugin/package.json
@@ -1,6 +1,6 @@
{
"name": "app-next-example-plugin",
- "version": "0.0.30-next.0",
+ "version": "0.0.30",
"description": "Backstage internal example plugin",
"backstage": {
"role": "frontend-plugin",
diff --git a/packages/app-next/CHANGELOG.md b/packages/app-next/CHANGELOG.md
index 0a38482bab..81e6fe95aa 100644
--- a/packages/app-next/CHANGELOG.md
+++ b/packages/app-next/CHANGELOG.md
@@ -1,5 +1,126 @@
# example-app-next
+## 0.0.31-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/cli@0.35.2-next.1
+ - @backstage/integration-react@1.2.14-next.0
+ - @backstage/plugin-catalog-import@0.13.9-next.0
+ - @backstage/plugin-scaffolder@1.35.1-next.0
+ - @backstage/plugin-techdocs@1.16.2-next.0
+ - @backstage/plugin-techdocs-module-addons-contrib@1.1.32-next.0
+ - @backstage/plugin-app@0.3.4-next.0
+ - @backstage/plugin-catalog@1.32.2-next.0
+ - @backstage/plugin-catalog-react@1.21.5-next.0
+ - @backstage/plugin-scaffolder-react@1.19.5-next.0
+ - @backstage/frontend-app-api@0.13.4-next.0
+ - @backstage/frontend-defaults@0.3.5-next.0
+ - @backstage/core-compat-api@0.5.6-next.0
+ - @backstage/plugin-api-docs@0.13.3-next.0
+ - @backstage/plugin-catalog-graph@0.5.5-next.0
+ - @backstage/plugin-org@0.6.48-next.0
+ - @backstage/plugin-user-settings@0.8.31-next.0
+ - @backstage/plugin-home@0.8.16-next.0
+ - @backstage/plugin-kubernetes@0.12.15-next.0
+ - @backstage/plugin-kubernetes-cluster@0.0.33-next.0
+ - @backstage/plugin-search@1.5.2-next.0
+ - @backstage/plugin-app-visualizer@0.1.27-next.0
+ - @backstage/plugin-auth@0.1.3
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/plugin-search-react@1.10.1
+
+## 0.0.31-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/ui@0.11.0-next.0
+ - @backstage/cli@0.35.2-next.0
+ - @backstage/plugin-app-visualizer@0.1.27-next.0
+ - @backstage/app-defaults@1.7.3
+ - @backstage/catalog-model@1.7.6
+ - @backstage/config@1.3.6
+ - @backstage/core-app-api@1.19.3
+ - @backstage/core-compat-api@0.5.5
+ - @backstage/core-components@0.18.4
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/frontend-app-api@0.13.3
+ - @backstage/frontend-defaults@0.3.4
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/integration-react@1.2.13
+ - @backstage/theme@0.7.1
+ - @backstage/plugin-api-docs@0.13.2
+ - @backstage/plugin-app@0.3.3
+ - @backstage/plugin-auth@0.1.3
+ - @backstage/plugin-auth-react@0.1.22
+ - @backstage/plugin-catalog@1.32.1
+ - @backstage/plugin-catalog-common@1.1.7
+ - @backstage/plugin-catalog-graph@0.5.4
+ - @backstage/plugin-catalog-import@0.13.8
+ - @backstage/plugin-catalog-react@1.21.4
+ - @backstage/plugin-catalog-unprocessed-entities@0.2.24
+ - @backstage/plugin-home@0.8.15
+ - @backstage/plugin-kubernetes@0.12.14
+ - @backstage/plugin-kubernetes-cluster@0.0.32
+ - @backstage/plugin-notifications@0.5.12
+ - @backstage/plugin-org@0.6.47
+ - @backstage/plugin-permission-react@0.4.39
+ - @backstage/plugin-scaffolder@1.35.0
+ - @backstage/plugin-scaffolder-react@1.19.4
+ - @backstage/plugin-search@1.5.1
+ - @backstage/plugin-search-common@1.2.21
+ - @backstage/plugin-search-react@1.10.1
+ - @backstage/plugin-signals@0.0.26
+ - @backstage/plugin-techdocs@1.16.1
+ - @backstage/plugin-techdocs-module-addons-contrib@1.1.31
+ - @backstage/plugin-techdocs-react@1.3.6
+ - @backstage/plugin-user-settings@0.8.30
+
+## 0.0.30
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.19.3
+ - @backstage/cli@0.35.0
+ - @backstage/ui@0.10.0
+ - @backstage/plugin-catalog-graph@0.5.4
+ - @backstage/plugin-api-docs@0.13.2
+ - @backstage/plugin-techdocs@1.16.1
+ - @backstage/plugin-catalog@1.32.1
+ - @backstage/plugin-search@1.5.1
+ - @backstage/plugin-app@0.3.3
+ - @backstage/plugin-org@0.6.47
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/plugin-scaffolder-react@1.19.4
+ - @backstage/core-components@0.18.4
+ - @backstage/plugin-techdocs-module-addons-contrib@1.1.31
+ - @backstage/plugin-catalog-react@1.21.4
+ - @backstage/plugin-kubernetes@0.12.14
+ - @backstage/plugin-search-react@1.10.1
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/plugin-catalog-unprocessed-entities@0.2.24
+ - @backstage/plugin-app-visualizer@0.1.26
+ - @backstage/plugin-catalog-import@0.13.8
+ - @backstage/plugin-notifications@0.5.12
+ - @backstage/plugin-user-settings@0.8.30
+ - @backstage/plugin-scaffolder@1.35.0
+ - @backstage/plugin-home@0.8.15
+ - @backstage/theme@0.7.1
+ - @backstage/plugin-kubernetes-cluster@0.0.32
+ - @backstage/app-defaults@1.7.3
+ - @backstage/core-compat-api@0.5.5
+ - @backstage/frontend-app-api@0.13.3
+ - @backstage/frontend-defaults@0.3.4
+ - @backstage/integration-react@1.2.13
+ - @backstage/plugin-auth@0.1.3
+ - @backstage/plugin-auth-react@0.1.22
+ - @backstage/plugin-permission-react@0.4.39
+ - @backstage/plugin-signals@0.0.26
+ - @backstage/plugin-techdocs-react@1.3.6
+
## 0.0.30-next.2
### Patch Changes
diff --git a/packages/app-next/package.json b/packages/app-next/package.json
index c6d1ae36cc..c0015ad3ea 100644
--- a/packages/app-next/package.json
+++ b/packages/app-next/package.json
@@ -1,6 +1,6 @@
{
"name": "example-app-next",
- "version": "0.0.30-next.2",
+ "version": "0.0.31-next.1",
"backstage": {
"role": "frontend"
},
diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md
index ec083df48f..1ae2c67448 100644
--- a/packages/app/CHANGELOG.md
+++ b/packages/app/CHANGELOG.md
@@ -1,5 +1,113 @@
# example-app
+## 0.2.117-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/cli@0.35.2-next.1
+ - @backstage/integration-react@1.2.14-next.0
+ - @backstage/plugin-catalog-import@0.13.9-next.0
+ - @backstage/plugin-scaffolder@1.35.1-next.0
+ - @backstage/plugin-techdocs@1.16.2-next.0
+ - @backstage/plugin-techdocs-module-addons-contrib@1.1.32-next.0
+ - @backstage/plugin-catalog@1.32.2-next.0
+ - @backstage/plugin-catalog-react@1.21.5-next.0
+ - @backstage/plugin-scaffolder-react@1.19.5-next.0
+ - @backstage/frontend-app-api@0.13.4-next.0
+ - @backstage/plugin-api-docs@0.13.3-next.0
+ - @backstage/plugin-catalog-graph@0.5.5-next.0
+ - @backstage/plugin-org@0.6.48-next.0
+ - @backstage/plugin-user-settings@0.8.31-next.0
+ - @backstage/plugin-home@0.8.16-next.0
+ - @backstage/plugin-kubernetes@0.12.15-next.0
+ - @backstage/plugin-kubernetes-cluster@0.0.33-next.0
+ - @backstage/plugin-search@1.5.2-next.0
+ - @backstage/plugin-search-react@1.10.1
+ - @backstage/plugin-devtools@0.1.35-next.0
+
+## 0.2.117-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/ui@0.11.0-next.0
+ - @backstage/cli@0.35.2-next.0
+ - @backstage/plugin-mui-to-bui@0.2.3-next.0
+ - @backstage/app-defaults@1.7.3
+ - @backstage/catalog-model@1.7.6
+ - @backstage/config@1.3.6
+ - @backstage/core-app-api@1.19.3
+ - @backstage/core-components@0.18.4
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/frontend-app-api@0.13.3
+ - @backstage/integration-react@1.2.13
+ - @backstage/theme@0.7.1
+ - @backstage/plugin-api-docs@0.13.2
+ - @backstage/plugin-auth-react@0.1.22
+ - @backstage/plugin-catalog@1.32.1
+ - @backstage/plugin-catalog-common@1.1.7
+ - @backstage/plugin-catalog-graph@0.5.4
+ - @backstage/plugin-catalog-import@0.13.8
+ - @backstage/plugin-catalog-react@1.21.4
+ - @backstage/plugin-catalog-unprocessed-entities@0.2.24
+ - @backstage/plugin-devtools@0.1.34
+ - @backstage/plugin-home@0.8.15
+ - @backstage/plugin-kubernetes@0.12.14
+ - @backstage/plugin-kubernetes-cluster@0.0.32
+ - @backstage/plugin-notifications@0.5.12
+ - @backstage/plugin-org@0.6.47
+ - @backstage/plugin-permission-react@0.4.39
+ - @backstage/plugin-scaffolder@1.35.0
+ - @backstage/plugin-scaffolder-react@1.19.4
+ - @backstage/plugin-search@1.5.1
+ - @backstage/plugin-search-common@1.2.21
+ - @backstage/plugin-search-react@1.10.1
+ - @backstage/plugin-signals@0.0.26
+ - @backstage/plugin-techdocs@1.16.1
+ - @backstage/plugin-techdocs-module-addons-contrib@1.1.31
+ - @backstage/plugin-techdocs-react@1.3.6
+ - @backstage/plugin-user-settings@0.8.30
+
+## 0.2.116
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.19.3
+ - @backstage/cli@0.35.0
+ - @backstage/ui@0.10.0
+ - @backstage/plugin-catalog-graph@0.5.4
+ - @backstage/plugin-api-docs@0.13.2
+ - @backstage/plugin-techdocs@1.16.1
+ - @backstage/plugin-catalog@1.32.1
+ - @backstage/plugin-search@1.5.1
+ - @backstage/plugin-org@0.6.47
+ - @backstage/plugin-scaffolder-react@1.19.4
+ - @backstage/core-components@0.18.4
+ - @backstage/plugin-techdocs-module-addons-contrib@1.1.31
+ - @backstage/plugin-catalog-react@1.21.4
+ - @backstage/plugin-kubernetes@0.12.14
+ - @backstage/plugin-search-react@1.10.1
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/plugin-catalog-unprocessed-entities@0.2.24
+ - @backstage/plugin-catalog-import@0.13.8
+ - @backstage/plugin-notifications@0.5.12
+ - @backstage/plugin-user-settings@0.8.30
+ - @backstage/plugin-scaffolder@1.35.0
+ - @backstage/plugin-devtools@0.1.34
+ - @backstage/plugin-home@0.8.15
+ - @backstage/theme@0.7.1
+ - @backstage/plugin-kubernetes-cluster@0.0.32
+ - @backstage/app-defaults@1.7.3
+ - @backstage/frontend-app-api@0.13.3
+ - @backstage/integration-react@1.2.13
+ - @backstage/plugin-auth-react@0.1.22
+ - @backstage/plugin-mui-to-bui@0.2.2
+ - @backstage/plugin-permission-react@0.4.39
+ - @backstage/plugin-signals@0.0.26
+ - @backstage/plugin-techdocs-react@1.3.6
+
## 0.2.116-next.2
### Patch Changes
diff --git a/packages/app/package.json b/packages/app/package.json
index 6e6f1dd52d..0c8096df9b 100644
--- a/packages/app/package.json
+++ b/packages/app/package.json
@@ -1,6 +1,6 @@
{
"name": "example-app",
- "version": "0.2.116-next.2",
+ "version": "0.2.117-next.1",
"backstage": {
"role": "frontend"
},
diff --git a/packages/backend-app-api/CHANGELOG.md b/packages/backend-app-api/CHANGELOG.md
index e610d6ef77..398a515fd8 100644
--- a/packages/backend-app-api/CHANGELOG.md
+++ b/packages/backend-app-api/CHANGELOG.md
@@ -1,5 +1,18 @@
# @backstage/backend-app-api
+## 1.4.0
+
+### Minor Changes
+
+- 5a2d538: Introduced backend startup result tracking and error handling. The `Backend.start()` method now returns a `BackendStartupResult` with detailed success/failure status and timing information for all plugins and modules. When startup fails, a `BackendStartupError` is thrown that includes the complete startup results, making it easier to diagnose which plugins or modules failed.
+
+ This also improves the default error message when backend startup fails, and of course makes it possible to craft your own custom error reporting based on the startup results.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.6.0
+
## 1.4.0-next.1
### Patch Changes
diff --git a/packages/backend-app-api/package.json b/packages/backend-app-api/package.json
index 36db7175b6..f510dc0832 100644
--- a/packages/backend-app-api/package.json
+++ b/packages/backend-app-api/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-app-api",
- "version": "1.4.0-next.1",
+ "version": "1.4.0",
"description": "Core API used by Backstage backend apps",
"backstage": {
"role": "node-library"
diff --git a/packages/backend-defaults/CHANGELOG.md b/packages/backend-defaults/CHANGELOG.md
index 603a66f6f1..dea4639dfd 100644
--- a/packages/backend-defaults/CHANGELOG.md
+++ b/packages/backend-defaults/CHANGELOG.md
@@ -1,5 +1,101 @@
# @backstage/backend-defaults
+## 0.14.1-next.1
+
+### Patch Changes
+
+- 3afeab4: Implementing `readTree` for `GoogleGcsReader`
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+
+## 0.14.1-next.0
+
+### Patch Changes
+
+- 7126bf2: Fixed a spelling mistake in root health service shutdown response.
+- Updated dependencies
+ - @backstage/backend-app-api@1.4.0
+ - @backstage/backend-dev-utils@0.1.6
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/cli-node@0.2.16
+ - @backstage/config@1.3.6
+ - @backstage/config-loader@1.10.7
+ - @backstage/errors@1.2.7
+ - @backstage/integration@1.19.0
+ - @backstage/integration-aws-node@0.1.19
+ - @backstage/types@1.2.2
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/plugin-permission-node@0.10.7
+
+## 0.14.0
+
+### Minor Changes
+
+- fa43826: Move `better-sqlite3` from dependencies to peer dependencies
+- 2bc4e02: **BREAKING** The correct configuration options for Valkey are now being used.
+
+ These changes are **required** to `app-config.yaml`:
+
+ ```diff
+ backend:
+ cache:
+ store: valkey
+ connection: ...
+ client:
+ - namespace: 'my-app'
+ - keyPrefixSeparator: ':'
+ + keyPrefix: 'my-app:'
+ - clearBatchSize: 1000
+ - useUnlink: false
+ ```
+
+ In comparison to Redis, Valkey requires the full `keyPrefix` including the separator to be specified instead of separate `namespace` and `keyPrefixSeparator` options. Also, Valkey does not support the `clearBatchSize` and `useUnlink` options.
+
+### Patch Changes
+
+- 37fba1d: Added support for Bitbucket Cloud OAuth. This introduces an alternative authentication method using a workspace OAuth consumer, alongside App Passwords (deprecated) and API tokens. OAuth does not require a bot or service account and avoids token expiry issues.
+
+ **BREAKING CHANGES**
+
+ - **@backstage/integration** (`src/bitbucketCloud/core.ts`)
+
+ - `getBitbucketCloudRequestOptions` now returns a `Promise` and **must** be awaited.
+
+ - **@backstage/plugin-scaffolder-backend-module-bitbucket-cloud** (`src/actions/helpers.ts`)
+ - `getBitbucketClient` now returns a `Promise` and **must** be awaited.
+ - `getAuthorizationHeader` now returns a `Promise` and **must** be awaited.
+
+ **OAuth usage example**
+
+ ```yaml
+ integrations:
+ bitbucketCloud:
+ - clientId: client-id
+ clientSecret: client-secret
+ ```
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- aa79251: build(deps): bump `node-forge` from 1.3.1 to 1.3.2
+- f96edff: Allow configuration of the `referrerPolicy`
+- fb029b6: Updated luxon types
+- d9759a1: **BREAKING ALPHA**: The old `instanceMetadataService` has been removed from alpha. Please switch over to using the stable `coreServices.rootInstanceMetadata` and related types instead, available from `@backstage/backend-plugin-api`.
+- 847a330: Fix for `jose` types
+- 25b560e: Internal change to support new versions of the `logform` library
+- 2a0c4b0: Adds a new experimental `RootSystemMetadataService` for tracking the collection of Backstage instances that may be deployed at any one time. It currently offers a single API, `getInstalledPlugins` that returns a list of installed plugins based on config you have set up in `discovery.endpoints` as well as the plugins installed on the instance you're calling the API with. It does not handle wildcard values or fallback values. The intention is for this plugin to provide plugin authors with a simple interface to fetch a trustworthy list of all installed plugins.
+- 3016a79: Updated dependency `@types/archiver` to `^7.0.0`.
+- 42db6a6: Don't warn when parsing `storeOptions` for `memory` cache
+- Updated dependencies
+ - @backstage/cli-node@0.2.16
+ - @backstage/integration@1.19.0
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/plugin-permission-node@0.10.7
+ - @backstage/backend-app-api@1.4.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/config-loader@1.10.7
+ - @backstage/backend-dev-utils@0.1.6
+
## 0.14.0-next.1
### Patch Changes
diff --git a/packages/backend-defaults/config.d.ts b/packages/backend-defaults/config.d.ts
index 6131169d6b..8095e24660 100644
--- a/packages/backend-defaults/config.d.ts
+++ b/packages/backend-defaults/config.d.ts
@@ -710,27 +710,9 @@ export interface Config {
*/
client?: {
/**
- * Namespace for the current instance.
+ * Namespace and separator used for prefixing keys.
*/
- namespace?: string;
- /**
- * Separator to use between namespace and key.
- */
- keyPrefixSeparator?: string;
- /**
- * Number of keys to delete in a single batch.
- */
- clearBatchSize?: number;
- /**
- * Enable Unlink instead of using Del for clearing keys. This is more performant but may not be supported by all Redis versions.
- */
- useUnlink?: boolean;
- /**
- * Whether to allow clearing all keys when no namespace is set.
- * If set to true and no namespace is set, iterate() will return all keys.
- * Defaults to `false`.
- */
- noNamespaceAffectsAll?: boolean;
+ keyPrefix?: string;
};
/**
* An optional Valkey cluster (redis cluster under the hood) configuration.
diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json
index 96b96f1bf7..84df549e6a 100644
--- a/packages/backend-defaults/package.json
+++ b/packages/backend-defaults/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-defaults",
- "version": "0.14.0-next.1",
+ "version": "0.14.1-next.1",
"description": "Backend defaults used by Backstage backend apps",
"backstage": {
"role": "node-library"
diff --git a/packages/backend-defaults/src/entrypoints/cache/CacheManager.test.ts b/packages/backend-defaults/src/entrypoints/cache/CacheManager.test.ts
index a308caa222..323ca881c5 100644
--- a/packages/backend-defaults/src/entrypoints/cache/CacheManager.test.ts
+++ b/packages/backend-defaults/src/entrypoints/cache/CacheManager.test.ts
@@ -336,11 +336,17 @@ describe('CacheManager store options', () => {
it('correctly applies namespace configuration to redis and valkey stores', () => {
const testCases = [
- { store: 'redis', namespace: 'test1', separator: ':' },
- { store: 'valkey', namespace: 'test2', separator: '!' },
+ {
+ store: 'redis',
+ client: {
+ namespace: 'my-app',
+ keyPrefixSeparator: ':',
+ },
+ },
+ { store: 'valkey', client: { keyPrefix: 'my-app:' } },
];
- testCases.forEach(({ store, namespace, separator }) => {
+ testCases.forEach(({ store, client }) => {
const manager = CacheManager.fromConfig(
mockServices.rootConfig({
data: {
@@ -349,10 +355,7 @@ describe('CacheManager store options', () => {
store,
connection: 'redis://localhost:6379',
[store]: {
- client: {
- namespace,
- keyPrefixSeparator: separator,
- },
+ client,
},
},
},
@@ -364,16 +367,16 @@ describe('CacheManager store options', () => {
if (store === 'redis') {
// eslint-disable-next-line jest/no-conditional-expect
- expect(KeyvRedis).toHaveBeenCalledWith('redis://localhost:6379', {
- namespace,
- keyPrefixSeparator: separator,
- });
+ expect(KeyvRedis).toHaveBeenCalledWith(
+ 'redis://localhost:6379',
+ client,
+ );
} else if (store === 'valkey') {
// eslint-disable-next-line jest/no-conditional-expect
- expect(KeyvValkey).toHaveBeenCalledWith('redis://localhost:6379', {
- namespace,
- keyPrefixSeparator: separator,
- });
+ expect(KeyvValkey).toHaveBeenCalledWith(
+ 'redis://localhost:6379',
+ client,
+ );
}
});
});
@@ -408,21 +411,31 @@ describe('CacheManager store options', () => {
expect(result).toBe('testPlugin');
});
- it('returns pluginId when store options have no namespace', () => {
- const storeOptions = {
- client: {
- keyPrefixSeparator: ':',
- },
- };
- const result = (CacheManager as any).constructNamespace(
- 'testPlugin',
- storeOptions,
- );
- expect(result).toBe('testPlugin');
- });
+ it.each([
+ {
+ type: 'redis',
+ field: 'namespace',
+ client: { keyPrefixSeparator: ':' },
+ },
+ { type: 'valkey', field: 'keyPrefix', client: {} },
+ ])(
+ 'returns pluginId when store options have no $field for $type',
+ ({ type, client }) => {
+ const storeOptions = {
+ type,
+ client,
+ };
+ const result = (CacheManager as any).constructNamespace(
+ 'testPlugin',
+ storeOptions,
+ );
+ expect(result).toBe('testPlugin');
+ },
+ );
- it('combines namespace and pluginId with default separator', () => {
+ it('combines namespace and pluginId with default separator for redis', () => {
const storeOptions = {
+ type: 'redis',
client: {
namespace: 'my-app',
keyPrefixSeparator: ':',
@@ -435,8 +448,9 @@ describe('CacheManager store options', () => {
expect(result).toBe('my-app:testPlugin');
});
- it('combines namespace and pluginId with custom separator', () => {
+ it('combines namespace and pluginId with custom separator for redis', () => {
const storeOptions = {
+ type: 'redis',
client: {
namespace: 'my-app',
keyPrefixSeparator: '-',
@@ -449,8 +463,9 @@ describe('CacheManager store options', () => {
expect(result).toBe('my-app-testPlugin');
});
- it('uses default separator when keyPrefixSeparator is not provided', () => {
+ it('uses default separator when keyPrefixSeparator is not provided for redis', () => {
const storeOptions = {
+ type: 'redis',
client: {
namespace: 'my-app',
},
@@ -462,6 +477,20 @@ describe('CacheManager store options', () => {
expect(result).toBe('my-app:testPlugin');
});
+ it('uses keyPrefix for valkey', () => {
+ const storeOptions = {
+ type: 'valkey',
+ client: {
+ keyPrefix: 'my-app:',
+ },
+ };
+ const result = (CacheManager as any).constructNamespace(
+ 'testPlugin',
+ storeOptions,
+ );
+ expect(result).toBe('my-app:testPlugin');
+ });
+
it('handles empty namespace by falling back to pluginId', () => {
const storeOptions = {
client: {
diff --git a/packages/backend-defaults/src/entrypoints/cache/CacheManager.ts b/packages/backend-defaults/src/entrypoints/cache/CacheManager.ts
index 428a4b7592..38c0c761ed 100644
--- a/packages/backend-defaults/src/entrypoints/cache/CacheManager.ts
+++ b/packages/backend-defaults/src/entrypoints/cache/CacheManager.ts
@@ -29,6 +29,7 @@ import {
RedisCacheStoreOptions,
InfinispanClientBehaviorOptions,
InfinispanServerConfig,
+ ValkeyCacheStoreOptions,
} from './types';
import { InfinispanOptionsMapper } from './providers/infinispan/InfinispanOptionsMapper';
import { durationToMilliseconds } from '@backstage/types';
@@ -140,37 +141,32 @@ export class CacheManager {
);
}
- if (store === 'redis' || store === 'valkey') {
- return CacheManager.parseRedisOptions(
- store,
- storeConfigPath,
- config,
- logger,
- );
+ switch (store) {
+ case 'redis':
+ return CacheManager.parseRedisOptions(storeConfigPath, config, logger);
+ case 'valkey':
+ return CacheManager.parseValkeyOptions(storeConfigPath, config, logger);
+ case 'infinispan':
+ return InfinispanOptionsMapper.parseInfinispanOptions(
+ storeConfigPath,
+ config,
+ logger,
+ );
+ default:
+ return undefined;
}
-
- if (store === 'infinispan') {
- return InfinispanOptionsMapper.parseInfinispanOptions(
- storeConfigPath,
- config,
- logger,
- );
- }
-
- return undefined;
}
/**
* Parse Redis-specific options from configuration.
*/
private static parseRedisOptions(
- store: string,
storeConfigPath: string,
config: RootConfigService,
logger?: LoggerService,
): RedisCacheStoreOptions {
const redisOptions: RedisCacheStoreOptions = {
- type: store as 'redis' | 'valkey',
+ type: 'redis',
};
const redisConfig =
@@ -213,6 +209,51 @@ export class CacheManager {
return redisOptions;
}
+ /**
+ * Parse Valkey-specific options from configuration.
+ */
+ private static parseValkeyOptions(
+ storeConfigPath: string,
+ config: RootConfigService,
+ logger?: LoggerService,
+ ): ValkeyCacheStoreOptions {
+ const valkeyOptions: ValkeyCacheStoreOptions = {
+ type: 'valkey',
+ };
+
+ const valkeyConfig =
+ config.getOptionalConfig(storeConfigPath) ?? new ConfigReader({});
+
+ valkeyOptions.client = {
+ keyPrefix: valkeyConfig.getOptionalString('client.keyPrefix'),
+ };
+
+ if (valkeyConfig.has('cluster')) {
+ const clusterConfig = valkeyConfig.getConfig('cluster');
+
+ if (!clusterConfig.has('rootNodes')) {
+ logger?.warn(
+ `Valkey cluster config has no 'rootNodes' key, defaulting to non-clustered mode`,
+ );
+ return valkeyOptions;
+ }
+
+ valkeyOptions.cluster = {
+ rootNodes: clusterConfig.get('rootNodes'),
+ defaults: clusterConfig.getOptional('defaults'),
+ minimizeConnections: clusterConfig.getOptionalBoolean(
+ 'minimizeConnections',
+ ),
+ useReplicas: clusterConfig.getOptionalBoolean('useReplicas'),
+ maxCommandRedirections: clusterConfig.getOptionalNumber(
+ 'maxCommandRedirections',
+ ),
+ };
+ }
+
+ return valkeyOptions;
+ }
+
/**
* Construct the full namespace based on the options and pluginId.
*
@@ -222,13 +263,23 @@ export class CacheManager {
*/
private static constructNamespace(
pluginId: string,
- storeOptions: RedisCacheStoreOptions | undefined,
+ storeOptions: RedisCacheStoreOptions | ValkeyCacheStoreOptions | undefined,
): string {
- const prefix = storeOptions?.client?.namespace
- ? `${storeOptions.client.namespace}${
- storeOptions.client.keyPrefixSeparator ?? ':'
- }`
- : '';
+ let prefix: string;
+ switch (storeOptions?.type) {
+ case 'redis':
+ prefix = storeOptions?.client?.namespace
+ ? `${storeOptions.client.namespace}${
+ storeOptions.client.keyPrefixSeparator ?? ':'
+ }`
+ : '';
+ break;
+ case 'valkey':
+ prefix = storeOptions.client?.keyPrefix ?? '';
+ break;
+ default:
+ prefix = '';
+ }
return `${prefix}${pluginId}`;
}
@@ -317,7 +368,9 @@ export class CacheManager {
private createValkeyStoreFactory(): StoreFactory {
const KeyvValkey = require('@keyv/valkey').default;
- const { createCluster } = require('@keyv/valkey');
+ // `@keyv/valkey` doesn't export a `createCluster` function, but is compatible with the one from `@keyv/redis`
+ // See https://keyv.org/docs/storage-adapters/valkey
+ const { createCluster } = require('@keyv/redis');
const stores: Record = {};
return (pluginId, defaultTtl) => {
@@ -327,9 +380,7 @@ export class CacheManager {
);
}
if (!stores[pluginId]) {
- const valkeyOptions = this.storeOptions?.client || {
- keyPrefixSeparator: ':',
- };
+ const valkeyOptions = this.storeOptions?.client;
if (this.storeOptions?.cluster) {
// Create a Valkey cluster (Redis cluster under the hood)
const cluster = createCluster(this.storeOptions?.cluster);
diff --git a/packages/backend-defaults/src/entrypoints/cache/types.ts b/packages/backend-defaults/src/entrypoints/cache/types.ts
index 522ab2ac3e..60e32e8618 100644
--- a/packages/backend-defaults/src/entrypoints/cache/types.ts
+++ b/packages/backend-defaults/src/entrypoints/cache/types.ts
@@ -17,6 +17,7 @@
import { LoggerService } from '@backstage/backend-plugin-api';
import { HumanDuration, durationToMilliseconds } from '@backstage/types';
import { RedisClusterOptions, KeyvRedisOptions } from '@keyv/redis';
+import { KeyvValkeyOptions } from '@keyv/valkey';
/**
* Options for Redis cache store.
@@ -24,11 +25,22 @@ import { RedisClusterOptions, KeyvRedisOptions } from '@keyv/redis';
* @public
*/
export type RedisCacheStoreOptions = {
- type: 'redis' | 'valkey';
+ type: 'redis';
client?: KeyvRedisOptions;
cluster?: RedisClusterOptions;
};
+/**
+ * Options for Valkey cache store.
+ *
+ * @public
+ */
+export type ValkeyCacheStoreOptions = {
+ type: 'valkey';
+ client?: KeyvValkeyOptions;
+ cluster?: RedisClusterOptions;
+};
+
/**
* Union type of all cache store options.
*
@@ -36,6 +48,7 @@ export type RedisCacheStoreOptions = {
*/
export type CacheStoreOptions =
| RedisCacheStoreOptions
+ | ValkeyCacheStoreOptions
| InfinispanCacheStoreOptions;
/**
diff --git a/packages/backend-defaults/src/entrypoints/rootHealth/rootHealthServiceFactory.test.ts b/packages/backend-defaults/src/entrypoints/rootHealth/rootHealthServiceFactory.test.ts
index ca9085273c..4a5db18f6f 100644
--- a/packages/backend-defaults/src/entrypoints/rootHealth/rootHealthServiceFactory.test.ts
+++ b/packages/backend-defaults/src/entrypoints/rootHealth/rootHealthServiceFactory.test.ts
@@ -69,7 +69,7 @@ describe('DefaultRootHealthService', () => {
await expect(service.getReadiness()).resolves.toEqual({
status: 503,
payload: {
- message: 'Backend is shuttting down',
+ message: 'Backend is shutting down',
status: 'error',
},
});
diff --git a/packages/backend-defaults/src/entrypoints/rootHealth/rootHealthServiceFactory.ts b/packages/backend-defaults/src/entrypoints/rootHealth/rootHealthServiceFactory.ts
index e7255610bc..52812fc6b1 100644
--- a/packages/backend-defaults/src/entrypoints/rootHealth/rootHealthServiceFactory.ts
+++ b/packages/backend-defaults/src/entrypoints/rootHealth/rootHealthServiceFactory.ts
@@ -50,7 +50,7 @@ export class DefaultRootHealthService implements RootHealthService {
if (this.#state === 'down') {
return {
status: 503,
- payload: { message: 'Backend is shuttting down', status: 'error' },
+ payload: { message: 'Backend is shutting down', status: 'error' },
};
}
diff --git a/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.test.ts b/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.test.ts
index 8f8d1b7656..e9982bc589 100644
--- a/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.test.ts
+++ b/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.test.ts
@@ -285,7 +285,7 @@ describe('rootHttpRouterServiceFactory', () => {
// Immediately start failing the readiness health check
await request(app).get('/.backstage/health/v1/readiness').expect(503, {
- message: 'Backend is shuttting down',
+ message: 'Backend is shutting down',
status: 'error',
});
@@ -301,7 +301,7 @@ describe('rootHttpRouterServiceFactory', () => {
.expect(200, { status: 'ok' });
await request(app).get('/.backstage/health/v1/readiness').expect(503, {
- message: 'Backend is shuttting down',
+ message: 'Backend is shutting down',
status: 'error',
});
@@ -312,7 +312,7 @@ describe('rootHttpRouterServiceFactory', () => {
.expect(200, { status: 'ok' });
await request(app).get('/.backstage/health/v1/readiness').expect(503, {
- message: 'Backend is shuttting down',
+ message: 'Backend is shutting down',
status: 'error',
});
diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketCloudUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketCloudUrlReader.ts
index ff6ec3bb27..73302d37e5 100644
--- a/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketCloudUrlReader.ts
+++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketCloudUrlReader.ts
@@ -68,7 +68,15 @@ export class BitbucketCloudUrlReader implements UrlReaderService {
) {
this.integration = integration;
this.deps = deps;
- const { host, username, appPassword, token } = integration.config;
+ const { host, username, appPassword, token, clientId, clientSecret } =
+ integration.config;
+
+ // Validate: OAuth requires both clientId and clientSecret
+ if ((clientId && !clientSecret) || (clientSecret && !clientId)) {
+ throw new Error(
+ `Bitbucket Cloud integration has incomplete OAuth configuration. Both clientId and clientSecret are required.`,
+ );
+ }
if (username && !token && !appPassword) {
throw new Error(
@@ -91,7 +99,7 @@ export class BitbucketCloudUrlReader implements UrlReaderService {
url,
this.integration.config,
);
- const requestOptions = getBitbucketCloudRequestOptions(
+ const requestOptions = await getBitbucketCloudRequestOptions(
this.integration.config,
);
@@ -149,7 +157,7 @@ export class BitbucketCloudUrlReader implements UrlReaderService {
);
const archiveResponse = await fetch(
downloadUrl,
- getBitbucketCloudRequestOptions(this.integration.config),
+ await getBitbucketCloudRequestOptions(this.integration.config),
);
if (!archiveResponse.ok) {
const message = `Failed to read tree from ${url}, ${archiveResponse.status} ${archiveResponse.statusText}`;
@@ -250,7 +258,7 @@ export class BitbucketCloudUrlReader implements UrlReaderService {
const commitsResponse = await fetch(
commitsApiUrl,
- getBitbucketCloudRequestOptions(this.integration.config),
+ await getBitbucketCloudRequestOptions(this.integration.config),
);
if (!commitsResponse.ok) {
const message = `Failed to retrieve commits from ${commitsApiUrl}, ${commitsResponse.status} ${commitsResponse.statusText}`;
diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/GoogleGcsUrlReader.test.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/GoogleGcsUrlReader.test.ts
index 7429bae94f..52d9660632 100644
--- a/packages/backend-defaults/src/entrypoints/urlReader/lib/GoogleGcsUrlReader.test.ts
+++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/GoogleGcsUrlReader.test.ts
@@ -23,12 +23,18 @@ import { UrlReaderPredicateTuple } from './types';
import packageinfo from '../../../../package.json';
import { mockServices } from '@backstage/backend-test-utils';
import { UrlReaderServiceReadUrlResponse } from '@backstage/backend-plugin-api';
+import { Readable } from 'stream';
const bucketGetFilesMock = jest.fn();
class Bucket {
getFiles(query: any) {
return bucketGetFilesMock(query);
}
+ file(_name: string) {
+ return {
+ createReadStream: () => Readable.from(Buffer.from('mock content')),
+ };
+ }
}
class Storage {
bucket() {
@@ -186,4 +192,56 @@ describe('GcsUrlReader', () => {
expect((await data.files[0].content()).toString()).toEqual('content');
});
});
+
+ describe('readTree', () => {
+ const { reader } = createReader({ integrations: { googleGcs: {} } })[0];
+
+ beforeEach(() => {
+ jest.clearAllMocks();
+ });
+
+ it('returns files with relative paths', async () => {
+ const mockFile1 = {
+ name: 'prefix/file1.yaml',
+ metadata: { updated: '2024-01-01T00:00:00Z' },
+ createReadStream: () => Readable.from(Buffer.from('content1')),
+ };
+ const mockFile2 = {
+ name: 'prefix/subdir/file2.yaml',
+ metadata: { updated: '2024-01-02T00:00:00Z' },
+ createReadStream: () => Readable.from(Buffer.from('content2')),
+ };
+ bucketGetFilesMock.mockResolvedValue([[mockFile1, mockFile2]]);
+
+ const result = await reader.readTree(
+ 'https://storage.cloud.google.com/bucket/prefix/',
+ );
+ const files = await result.files();
+
+ expect(files).toHaveLength(2);
+ expect(files[0].path).toBe('file1.yaml');
+ expect(files[1].path).toBe('subdir/file2.yaml');
+ });
+
+ it('calls getFiles with correct prefix', async () => {
+ bucketGetFilesMock.mockResolvedValue([[]]);
+
+ await reader.readTree(
+ 'https://storage.cloud.google.com/bucket/some/prefix/',
+ );
+
+ expect(bucketGetFilesMock).toHaveBeenCalledWith({
+ autoPaginate: true,
+ prefix: 'some/prefix/',
+ });
+ });
+
+ it('throws if readTree url contains glob pattern', async () => {
+ await expect(
+ reader.readTree('https://storage.cloud.google.com/bucket/path/*'),
+ ).rejects.toThrow(
+ 'GcsUrlReader readTree does not support glob patterns, use search instead',
+ );
+ });
+ });
});
diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/GoogleGcsUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/GoogleGcsUrlReader.ts
index 0bc5add43f..a29b98eb51 100644
--- a/packages/backend-defaults/src/entrypoints/urlReader/lib/GoogleGcsUrlReader.ts
+++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/GoogleGcsUrlReader.ts
@@ -17,22 +17,25 @@
import * as GoogleCloud from '@google-cloud/storage';
import {
UrlReaderService,
+ UrlReaderServiceReadTreeOptions,
UrlReaderServiceReadTreeResponse,
UrlReaderServiceReadUrlOptions,
UrlReaderServiceReadUrlResponse,
UrlReaderServiceSearchOptions,
UrlReaderServiceSearchResponse,
} from '@backstage/backend-plugin-api';
-import { ReaderFactory } from './types';
+import { ReaderFactory, ReadTreeResponseFactory } from './types';
import getRawBody from 'raw-body';
import {
GoogleGcsIntegrationConfig,
readGoogleGcsIntegrationConfig,
} from '@backstage/integration';
+
import { Readable } from 'stream';
import { ReadUrlResponseFactory } from './ReadUrlResponseFactory';
import packageinfo from '../../../../package.json';
import { assertError } from '@backstage/errors';
+import { relative } from 'path/posix';
const GOOGLE_GCS_HOST = 'storage.cloud.google.com';
@@ -59,7 +62,7 @@ const parseURL = (
* @public
*/
export class GoogleGcsUrlReader implements UrlReaderService {
- static factory: ReaderFactory = ({ config, logger }) => {
+ static factory: ReaderFactory = ({ config, logger, treeResponseFactory }) => {
if (!config.has('integrations.googleGcs')) {
return [];
}
@@ -83,20 +86,29 @@ export class GoogleGcsUrlReader implements UrlReaderService {
userAgent: `backstage/backend-defaults.GoogleGcsUrlReader/${packageinfo.version}`,
});
}
- const reader = new GoogleGcsUrlReader(gcsConfig, storage);
+ const reader = new GoogleGcsUrlReader(gcsConfig, storage, {
+ treeResponseFactory,
+ });
const predicate = (url: URL) => url.host === GOOGLE_GCS_HOST;
return [{ reader, predicate }];
};
private readonly integration: GoogleGcsIntegrationConfig;
private readonly storage: GoogleCloud.Storage;
+ private readonly deps: {
+ treeResponseFactory: ReadTreeResponseFactory;
+ };
constructor(
integration: GoogleGcsIntegrationConfig,
storage: GoogleCloud.Storage,
+ deps: {
+ treeResponseFactory: ReadTreeResponseFactory;
+ },
) {
this.integration = integration;
this.storage = storage;
+ this.deps = deps;
}
private readStreamFromUrl(url: string): Readable {
@@ -121,8 +133,32 @@ export class GoogleGcsUrlReader implements UrlReaderService {
return ReadUrlResponseFactory.fromReadable(stream);
}
- async readTree(): Promise {
- throw new Error('GcsUrlReader does not implement readTree');
+ async readTree(
+ url: string,
+ _options?: UrlReaderServiceReadTreeOptions,
+ ): Promise {
+ const { bucket, key } = parseURL(url);
+
+ if (key.match(/[*?]/)) {
+ throw new Error(
+ 'GcsUrlReader readTree does not support glob patterns, use search instead',
+ );
+ }
+
+ const [files] = await this.storage.bucket(bucket).getFiles({
+ autoPaginate: true,
+ prefix: key,
+ });
+
+ const responses = files.map(file => ({
+ data: file.createReadStream(),
+ path: relative(key, file.name),
+ lastModifiedAt: file.metadata.updated
+ ? new Date(file.metadata.updated as string)
+ : undefined,
+ }));
+
+ return this.deps.treeResponseFactory.fromReadableArray(responses);
}
async search(
diff --git a/packages/backend-dev-utils/CHANGELOG.md b/packages/backend-dev-utils/CHANGELOG.md
index 4b89697ee8..d5884588fb 100644
--- a/packages/backend-dev-utils/CHANGELOG.md
+++ b/packages/backend-dev-utils/CHANGELOG.md
@@ -1,5 +1,11 @@
# @backstage/backend-dev-utils
+## 0.1.6
+
+### Patch Changes
+
+- 2bae83a: Internal update for Node.js v24 support.
+
## 0.1.6-next.0
### Patch Changes
diff --git a/packages/backend-dev-utils/package.json b/packages/backend-dev-utils/package.json
index 3eb9c05993..ba46f4b36e 100644
--- a/packages/backend-dev-utils/package.json
+++ b/packages/backend-dev-utils/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-dev-utils",
- "version": "0.1.6-next.0",
+ "version": "0.1.6",
"backstage": {
"role": "node-library"
},
diff --git a/packages/backend-dynamic-feature-service/CHANGELOG.md b/packages/backend-dynamic-feature-service/CHANGELOG.md
index aec27109a6..b98fa78082 100644
--- a/packages/backend-dynamic-feature-service/CHANGELOG.md
+++ b/packages/backend-dynamic-feature-service/CHANGELOG.md
@@ -1,5 +1,60 @@
# @backstage/backend-dynamic-feature-service
+## 0.7.8-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.14.1-next.1
+ - @backstage/plugin-catalog-backend@3.3.1-next.1
+ - @backstage/plugin-scaffolder-node@0.12.3-next.0
+
+## 0.7.8-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-openapi-utils@0.6.5-next.0
+ - @backstage/backend-defaults@0.14.1-next.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/cli-common@0.1.16
+ - @backstage/cli-node@0.2.16
+ - @backstage/config@1.3.6
+ - @backstage/config-loader@1.10.7
+ - @backstage/errors@1.2.7
+ - @backstage/types@1.2.2
+ - @backstage/plugin-app-node@0.1.40
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/plugin-catalog-backend@3.3.1-next.0
+ - @backstage/plugin-events-backend@0.5.10-next.0
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/plugin-permission-common@0.9.3
+ - @backstage/plugin-permission-node@0.10.7
+ - @backstage/plugin-scaffolder-node@0.12.2
+ - @backstage/plugin-search-backend-node@1.4.0
+ - @backstage/plugin-search-common@1.2.21
+
+## 0.7.7
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/cli-node@0.2.16
+ - @backstage/plugin-search-backend-node@1.4.0
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/backend-defaults@0.14.0
+ - @backstage/backend-openapi-utils@0.6.4
+ - @backstage/plugin-app-node@0.1.40
+ - @backstage/plugin-catalog-backend@3.3.0
+ - @backstage/plugin-events-backend@0.5.9
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/plugin-permission-node@0.10.7
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/cli-common@0.1.16
+ - @backstage/config-loader@1.10.7
+ - @backstage/plugin-scaffolder-node@0.12.2
+
## 0.7.7-next.1
### Patch Changes
diff --git a/packages/backend-dynamic-feature-service/package.json b/packages/backend-dynamic-feature-service/package.json
index 416cbfdc1e..1cabe17923 100644
--- a/packages/backend-dynamic-feature-service/package.json
+++ b/packages/backend-dynamic-feature-service/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-dynamic-feature-service",
- "version": "0.7.7-next.1",
+ "version": "0.7.8-next.1",
"description": "Backstage dynamic feature service",
"backstage": {
"role": "node-library"
diff --git a/packages/backend-openapi-utils/CHANGELOG.md b/packages/backend-openapi-utils/CHANGELOG.md
index 2fb0b39cbd..f90fecb9cc 100644
--- a/packages/backend-openapi-utils/CHANGELOG.md
+++ b/packages/backend-openapi-utils/CHANGELOG.md
@@ -1,5 +1,23 @@
# @backstage/backend-openapi-utils
+## 0.6.5-next.0
+
+### Patch Changes
+
+- 6678b78: Internal update to use native feature from our request validation library for handling base path determination.
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/errors@1.2.7
+ - @backstage/types@1.2.2
+
+## 0.6.4
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.6.0
+
## 0.6.4-next.1
### Patch Changes
diff --git a/packages/backend-openapi-utils/package.json b/packages/backend-openapi-utils/package.json
index 715c1ddbcb..5efffd1c55 100644
--- a/packages/backend-openapi-utils/package.json
+++ b/packages/backend-openapi-utils/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-openapi-utils",
- "version": "0.6.4-next.1",
+ "version": "0.6.5-next.0",
"description": "OpenAPI typescript support.",
"backstage": {
"role": "node-library"
diff --git a/packages/backend-openapi-utils/src/stub.ts b/packages/backend-openapi-utils/src/stub.ts
index 8ab00c4df4..717e2ae19b 100644
--- a/packages/backend-openapi-utils/src/stub.ts
+++ b/packages/backend-openapi-utils/src/stub.ts
@@ -31,13 +31,6 @@ import { middleware as OpenApiValidator } from 'express-openapi-validator';
import { OPENAPI_SPEC_ROUTE } from './constants';
import { isErrorResult, merge } from 'openapi-merge';
-type PropertyOverrideRequest = Request & {
- [key: symbol]: string;
-};
-
-const baseUrlSymbol = Symbol();
-const originalUrlSymbol = Symbol();
-
function validatorErrorTransformer(): ErrorRequestHandler {
return (error: Error, _: Request, _2: Response, next: NextFunction) => {
next(new InputError(error.message));
@@ -75,30 +68,6 @@ function createRouterWithValidation(
const router = PromiseRouter();
router.use(options?.middleware || getDefaultRouterMiddleware());
- /**
- * Middleware to setup the routing for OpenApiValidator. OpenApiValidator expects `req.originalUrl`
- * and `req.baseUrl` to be the full path. We adjust them here to basically be nothing and then
- * revive the old values in the last function in this method. We could instead update `req.path`
- * but that might affect the routing and I'd rather not.
- *
- * TODO: I opened https://github.com/cdimascio/express-openapi-validator/issues/843
- * to track this on the middleware side, but there was a similar ticket, https://github.com/cdimascio/express-openapi-validator/issues/113
- * that has had minimal activity. If that changes, update this to use a new option on their side.
- */
- router.use((req: Request, _, next) => {
- /**
- * Express typings are weird. They don't recognize PropertyOverrideRequest as a valid
- * Request child and try to overload as PathParams. Just cast it here, since we know
- * what we're doing.
- */
- const customRequest = req as PropertyOverrideRequest;
- customRequest[baseUrlSymbol] = customRequest.baseUrl;
- customRequest.baseUrl = '';
- customRequest[originalUrlSymbol] = customRequest.originalUrl;
- customRequest.originalUrl = customRequest.url;
- next();
- });
-
// TODO: Handle errors by converting from OpenApiValidator errors to known @backstage/errors errors.
router.use(
OpenApiValidator({
@@ -106,6 +75,7 @@ function createRouterWithValidation(
coerceTypes: false,
allowUnknownQueryParameters: false,
},
+ useRequestUrl: true,
ignoreUndocumented: true,
validateResponses: false,
...options?.validatorOptions,
@@ -113,19 +83,6 @@ function createRouterWithValidation(
}),
);
- /**
- * Revert `req.baseUrl` and `req.originalUrl` changes. This ensures that any further usage
- * of these variables will be unchanged.
- */
- router.use((req: Request, _, next) => {
- const customRequest = req as PropertyOverrideRequest;
- customRequest.baseUrl = customRequest[baseUrlSymbol];
- customRequest.originalUrl = customRequest[originalUrlSymbol];
- delete customRequest[baseUrlSymbol];
- delete customRequest[originalUrlSymbol];
- next();
- });
-
// Any errors from the middleware get through here.
router.use(validatorErrorTransformer());
diff --git a/packages/backend-plugin-api/CHANGELOG.md b/packages/backend-plugin-api/CHANGELOG.md
index 84ad95d700..83d63fa97a 100644
--- a/packages/backend-plugin-api/CHANGELOG.md
+++ b/packages/backend-plugin-api/CHANGELOG.md
@@ -1,5 +1,19 @@
# @backstage/backend-plugin-api
+## 1.6.0
+
+### Minor Changes
+
+- 2a0c4b0: Adds a new experimental `RootSystemMetadataService` for tracking the collection of Backstage instances that may be deployed at any one time. It currently offers a single API, `getInstalledPlugins` that returns a list of installed plugins based on config you have set up in `discovery.endpoints` as well as the plugins installed on the instance you're calling the API with. It does not handle wildcard values or fallback values. The intention is for this plugin to provide plugin authors with a simple interface to fetch a trustworthy list of all installed plugins.
+
+### Patch Changes
+
+- d9759a1: **BREAKING ALPHA**: The old `instanceMetadataService` has been removed from alpha. Please switch over to using the stable `coreServices.rootInstanceMetadata` and related types instead, available from `@backstage/backend-plugin-api`.
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/plugin-permission-node@0.10.7
+ - @backstage/cli-common@0.1.16
+
## 1.6.0-next.1
### Minor Changes
diff --git a/packages/backend-plugin-api/package.json b/packages/backend-plugin-api/package.json
index c26c0ce1de..4867fcd0a4 100644
--- a/packages/backend-plugin-api/package.json
+++ b/packages/backend-plugin-api/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-plugin-api",
- "version": "1.6.0-next.1",
+ "version": "1.6.0",
"description": "Core API used by Backstage backend plugins",
"backstage": {
"role": "node-library"
diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md
index 921eac9383..ca456b8491 100644
--- a/packages/backend-test-utils/CHANGELOG.md
+++ b/packages/backend-test-utils/CHANGELOG.md
@@ -1,5 +1,34 @@
# @backstage/backend-test-utils
+## 1.10.3-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.14.1-next.0
+ - @backstage/backend-app-api@1.4.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/config@1.3.6
+ - @backstage/errors@1.2.7
+ - @backstage/types@1.2.2
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/plugin-permission-common@0.9.3
+
+## 1.10.2
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- 8be23a4: Switched `textextensions` dependency for `text-extensions`.
+- 5a737e1: Fix PostgreSQL 18 `TestDatabases` by pinning the data directory
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/backend-defaults@0.14.0
+ - @backstage/plugin-events-node@0.4.18
+ - @backstage/backend-app-api@1.4.0
+ - @backstage/backend-plugin-api@1.6.0
+
## 1.10.2-next.1
### Patch Changes
diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json
index 08b5da6630..1f6df8457d 100644
--- a/packages/backend-test-utils/package.json
+++ b/packages/backend-test-utils/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-test-utils",
- "version": "1.10.2-next.1",
+ "version": "1.10.3-next.0",
"description": "Test helpers library for Backstage backends",
"backstage": {
"role": "node-library"
diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md
index dc0f2fc708..b3eab5806b 100644
--- a/packages/backend/CHANGELOG.md
+++ b/packages/backend/CHANGELOG.md
@@ -1,5 +1,102 @@
# example-backend
+## 0.0.46-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.14.1-next.1
+ - @backstage/plugin-techdocs-backend@2.1.4-next.1
+ - @backstage/plugin-catalog-backend@3.3.1-next.1
+ - @backstage/plugin-catalog-backend-module-openapi@0.2.18-next.0
+ - @backstage/plugin-scaffolder-backend@3.1.1-next.1
+ - @backstage/plugin-scaffolder-backend-module-github@0.9.4-next.0
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.16-next.0
+ - @backstage/plugin-scaffolder-backend-module-notifications@0.1.18-next.0
+ - @backstage/plugin-search-backend-module-techdocs@0.4.10-next.0
+
+## 0.0.46-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.14.1-next.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/catalog-model@1.7.6
+ - @backstage/plugin-app-backend@0.5.9
+ - @backstage/plugin-auth-backend@0.25.7
+ - @backstage/plugin-auth-backend-module-github-provider@0.4.0
+ - @backstage/plugin-auth-backend-module-guest-provider@0.2.15
+ - @backstage/plugin-auth-backend-module-openshift-provider@0.1.3
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/plugin-catalog-backend@3.3.1-next.0
+ - @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.10-next.0
+ - @backstage/plugin-catalog-backend-module-openapi@0.2.17
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.15
+ - @backstage/plugin-catalog-backend-module-unprocessed@0.6.7
+ - @backstage/plugin-devtools-backend@0.5.13-next.0
+ - @backstage/plugin-events-backend@0.5.10-next.0
+ - @backstage/plugin-events-backend-module-google-pubsub@0.1.7
+ - @backstage/plugin-kubernetes-backend@0.21.0
+ - @backstage/plugin-mcp-actions-backend@0.1.7-next.0
+ - @backstage/plugin-notifications-backend@0.6.1
+ - @backstage/plugin-permission-backend@0.7.7
+ - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.15
+ - @backstage/plugin-permission-common@0.9.3
+ - @backstage/plugin-permission-node@0.10.7
+ - @backstage/plugin-proxy-backend@0.6.9
+ - @backstage/plugin-scaffolder-backend@3.1.1-next.0
+ - @backstage/plugin-scaffolder-backend-module-github@0.9.3
+ - @backstage/plugin-scaffolder-backend-module-notifications@0.1.17
+ - @backstage/plugin-search-backend@2.0.10-next.0
+ - @backstage/plugin-search-backend-module-catalog@0.3.11
+ - @backstage/plugin-search-backend-module-elasticsearch@1.7.9
+ - @backstage/plugin-search-backend-module-explore@0.3.10
+ - @backstage/plugin-search-backend-module-techdocs@0.4.9
+ - @backstage/plugin-search-backend-node@1.4.0
+ - @backstage/plugin-signals-backend@0.3.11
+ - @backstage/plugin-techdocs-backend@2.1.4-next.0
+
+## 0.0.45
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-mcp-actions-backend@0.1.6
+ - @backstage/plugin-scaffolder-backend@3.1.0
+ - @backstage/plugin-search-backend-node@1.4.0
+ - @backstage/plugin-auth-node@0.6.10
+ - @backstage/backend-defaults@0.14.0
+ - @backstage/plugin-app-backend@0.5.9
+ - @backstage/plugin-auth-backend-module-guest-provider@0.2.15
+ - @backstage/plugin-auth-backend-module-openshift-provider@0.1.3
+ - @backstage/plugin-auth-backend@0.25.7
+ - @backstage/plugin-catalog-backend@3.3.0
+ - @backstage/plugin-devtools-backend@0.5.12
+ - @backstage/plugin-events-backend@0.5.9
+ - @backstage/plugin-kubernetes-backend@0.21.0
+ - @backstage/plugin-notifications-backend@0.6.1
+ - @backstage/plugin-permission-backend@0.7.7
+ - @backstage/plugin-permission-node@0.10.7
+ - @backstage/plugin-proxy-backend@0.6.9
+ - @backstage/plugin-search-backend@2.0.9
+ - @backstage/plugin-signals-backend@0.3.11
+ - @backstage/plugin-techdocs-backend@2.1.3
+ - @backstage/plugin-auth-backend-module-github-provider@0.4.0
+ - @backstage/backend-plugin-api@1.6.0
+ - @backstage/plugin-scaffolder-backend-module-github@0.9.3
+ - @backstage/plugin-search-backend-module-explore@0.3.10
+ - @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.9
+ - @backstage/plugin-catalog-backend-module-openapi@0.2.17
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.15
+ - @backstage/plugin-catalog-backend-module-unprocessed@0.6.7
+ - @backstage/plugin-events-backend-module-google-pubsub@0.1.7
+ - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.15
+ - @backstage/plugin-scaffolder-backend-module-notifications@0.1.17
+ - @backstage/plugin-search-backend-module-catalog@0.3.11
+ - @backstage/plugin-search-backend-module-elasticsearch@1.7.9
+ - @backstage/plugin-search-backend-module-techdocs@0.4.9
+
## 0.0.45-next.1
### Patch Changes
diff --git a/packages/backend/package.json b/packages/backend/package.json
index 10a2eeded3..918d809d2e 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -1,6 +1,6 @@
{
"name": "example-backend",
- "version": "0.0.45-next.1",
+ "version": "0.0.46-next.1",
"backstage": {
"role": "backend"
},
diff --git a/packages/cli-common/CHANGELOG.md b/packages/cli-common/CHANGELOG.md
index 145e04ddb3..a8e4872744 100644
--- a/packages/cli-common/CHANGELOG.md
+++ b/packages/cli-common/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/cli-common
+## 0.1.16
+
+### Patch Changes
+
+- 5cfb2a4: Added new `run`, `runOutput`, and `runCheck` utilities to help run child processes in a safe and portable way.
+- c8c2329: Add proxy configuration from env-vars to create-app tasks
+- 2bae83a: Bumped dev dependencies `@types/node`
+
## 0.1.16-next.2
### Patch Changes
diff --git a/packages/cli-common/package.json b/packages/cli-common/package.json
index 80857bffff..0ab0a9f1fd 100644
--- a/packages/cli-common/package.json
+++ b/packages/cli-common/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/cli-common",
- "version": "0.1.16-next.2",
+ "version": "0.1.16",
"description": "Common functionality used by cli, backend, and create-app",
"backstage": {
"role": "node-library"
diff --git a/packages/cli-node/CHANGELOG.md b/packages/cli-node/CHANGELOG.md
index 4c4005c0c9..bdacd69297 100644
--- a/packages/cli-node/CHANGELOG.md
+++ b/packages/cli-node/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/cli-node
+## 0.2.16
+
+### Patch Changes
+
+- 4e8c726: Updated to use new utilities from `@backstage/cli-common`.
+- Updated dependencies
+ - @backstage/cli-common@0.1.16
+
## 0.2.16-next.1
### Patch Changes
diff --git a/packages/cli-node/package.json b/packages/cli-node/package.json
index dcedc6b76c..52242bdd48 100644
--- a/packages/cli-node/package.json
+++ b/packages/cli-node/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/cli-node",
- "version": "0.2.16-next.1",
+ "version": "0.2.16",
"description": "Node.js library for Backstage CLIs",
"backstage": {
"role": "node-library"
diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md
index 6dd279fadb..03f4533e4c 100644
--- a/packages/cli/CHANGELOG.md
+++ b/packages/cli/CHANGELOG.md
@@ -1,5 +1,85 @@
# @backstage/cli
+## 0.35.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.19.2-next.0
+
+## 0.35.2-next.0
+
+### Patch Changes
+
+- 320c6a9: Bump `@swc/core` to support `ES2023` and `ES2024`
+- 9ee5996: Bump minimum required `@swc/core` to avoid transpilation bug
+- Updated dependencies
+ - @backstage/catalog-model@1.7.6
+ - @backstage/cli-common@0.1.16
+ - @backstage/cli-node@0.2.16
+ - @backstage/config@1.3.6
+ - @backstage/config-loader@1.10.7
+ - @backstage/errors@1.2.7
+ - @backstage/eslint-plugin@0.2.0
+ - @backstage/integration@1.19.0
+ - @backstage/release-manifests@0.0.13
+ - @backstage/types@1.2.2
+
+## 0.35.0
+
+### Minor Changes
+
+- f6f22a9: Provide `--no-node-snapshot` by default when running the `package start` or `package test`. You can disable this behavior by providing `NODE_OPTIONS='--node-snapshot'`.
+- f8dff94: Switched the default module resolution to `bundler` and the `module` setting to `ES2020`.
+
+ You may need to bump some dependencies as part of this change and fix imports in code. The most common source of this is that type checking will now consider the `exports` field in `package.json` when resolving imports. This in turn can break older versions of packages that had incompatible `exports` fields. Generally these issues will have already been fixed in the upstream packages.
+
+ You might be tempted to use `--skipLibCheck` to hide issues due to this change, but it will weaken the type safety of your project. If you run into a large number of issues and want to keep the old behavior, you can reset the `moduleResolution` and `module` settings your own `tsconfig.json` file to `node` and `ESNext` respectively. But keep in mind that the `node` option will be removed in future versions of TypeScript.
+
+ A future version of Backstage will make these new settings mandatory, as we move to rely on the `exports` field for type resolution in packages, rather than the `typesVersions` field.
+
+- cd0b8a1: **BREAKING**: `jest` is now a peer dependency. If you run tests using Backstage CLI, you must add Jest and its environment dependencies as `devDependencies` in your project.
+
+ You can choose to install either Jest 29 or Jest 30. The built-in Jest version before this change was Jest 29, however, we recommend that you switch to Jest 30. Upgrading will solve the `Could not parse CSS stylesheet` errors, allow you to use MSW v2 in web packages, and ensure that you remain compatible with future versions of the Backstage CLI. Support for Jest 29 is temporary, with the purpose of allowing you to upgrade at your own pace, but it will eventually be removed.
+
+ - **Jest 29**: Install `jest@^29` and `jest-environment-jsdom@^29`. No migration needed, but you may see `Could not parse CSS stylesheet` warnings/errors when testing components from `@backstage/ui` or other packages using CSS `@layer` declarations.
+ - **Jest 30**: Install `jest@^30`, `@jest/environment-jsdom-abstract@^30`, and `jsdom@^27`. Fixes the stylesheet parsing warnings/errors, but requires migration steps.
+
+ See the [Jest 30 migration guide](https://backstage.io/docs/tutorials/jest30-migration) for detailed migration instructions.
+
+### Patch Changes
+
+- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0
+- e7db290: Add missing peer/dev dependencies to the frontend plugin template.
+
+ `react-dom` was not declared as a peer dependency, causing module resolution
+ errors when generating plugins outside a Backstage monorepo. This adds
+ `react-dom` to `peerDependencies` (for consuming apps) and `devDependencies`
+ (for local development). `react-router-dom` is also added to `peerDependencies` (for consuming apps) and `devDependencies`
+ to support routing during plugin development.
+
+ Fixes:
+
+ - Module not found: Can't resolve 'react-dom'
+ - Module not found: Can't resolve 'react-router-dom'
+
+- 1226647: Updated dependency `esbuild` to `^0.27.0`.
+- f89a074: Updated dependency `@pmmmwh/react-refresh-webpack-plugin` to `^0.6.0`.
+- 2b81751: Updated dependency `webpack` to `~5.103.0`.
+- fafd9e1: Fixed internal usage of `yargs`.
+- c8c2329: Add proxy configuration from env-vars to create-app tasks
+- 2bae83a: Switched compilation target to ES2022 in order to match the new set of supported Node.js versions, which are 22 and 24.
+
+ The TypeScript compilation target has been set to ES2022, because setting it to a higher target will break projects on older TypeScript versions. If you use a newer TypeScript version in your own project, you can bump `compilerOptions.target` to ES2023 or ES2024 in your own `tsconfig.json` file.
+
+- 7fbac5c: Updated to use new utilities from `@backstage/cli-common`.
+- 2bae83a: Bumped dev dependencies `@types/node`
+- Updated dependencies
+ - @backstage/cli-node@0.2.16
+ - @backstage/integration@1.19.0
+ - @backstage/cli-common@0.1.16
+ - @backstage/config-loader@1.10.7
+
## 0.35.0-next.2
### Minor Changes
diff --git a/packages/cli/cli-report.md b/packages/cli/cli-report.md
index a8df5242ad..26bd89e909 100644
--- a/packages/cli/cli-report.md
+++ b/packages/cli/cli-report.md
@@ -324,7 +324,7 @@ Options:
### `backstage-cli package test`
```
-Usage: backstage-cli [--config=] [TestPathPattern]
+Usage: backstage-cli [--config=] [TestPathPatterns]
Options:
--all
@@ -349,7 +349,6 @@ Options:
--debug
--detectLeaks
--detectOpenHandles
- --env
--errorOnDeprecated
--filter
--findRelatedTests
@@ -359,7 +358,6 @@ Options:
--globals
--haste
--ignoreProjects
- --init
--injectGlobals
--json
--lastCommit
@@ -400,13 +398,13 @@ Options:
--silent
--skipFilter
--snapshotSerializers
- --testEnvironment
+ --testEnvironment, --env
--testEnvironmentOptions
--testFailureExitCode
--testLocationInResults
--testMatch
--testPathIgnorePatterns
- --testPathPattern
+ --testPathPatterns
--testRegex
--testResultsProcessor
--testRunner
@@ -418,6 +416,7 @@ Options:
--useStderr
--verbose
--version
+ --waitForUnhandledRejections
--watch
--watchAll
--watchPathIgnorePatterns
diff --git a/packages/cli/config/getJestEnvironment.js b/packages/cli/config/getJestEnvironment.js
new file mode 100644
index 0000000000..aac2f79021
--- /dev/null
+++ b/packages/cli/config/getJestEnvironment.js
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2025 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+function getJestMajorVersion() {
+ const jestVersion = require('jest/package.json').version;
+ const majorVersion = parseInt(jestVersion.split('.')[0], 10);
+ return majorVersion;
+}
+
+function getJestEnvironment() {
+ const majorVersion = getJestMajorVersion();
+
+ if (majorVersion >= 30) {
+ try {
+ require.resolve('@jest/environment-jsdom-abstract');
+ require.resolve('jsdom');
+ } catch {
+ throw new Error(
+ 'Jest 30+ requires @jest/environment-jsdom-abstract and jsdom. ' +
+ 'Please install them as dev dependencies.',
+ );
+ }
+ return require.resolve('./jest-environment-jsdom');
+ }
+ try {
+ require.resolve('jest-environment-jsdom');
+ } catch {
+ throw new Error(
+ 'Jest 29 requires jest-environment-jsdom. ' +
+ 'Please install it as a dev dependency.',
+ );
+ }
+ return require.resolve('jest-environment-jsdom');
+}
+
+module.exports = { getJestMajorVersion, getJestEnvironment };
diff --git a/packages/cli/config/jest-environment-jsdom/index.js b/packages/cli/config/jest-environment-jsdom/index.js
new file mode 100644
index 0000000000..9d8b76eaf5
--- /dev/null
+++ b/packages/cli/config/jest-environment-jsdom/index.js
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2025 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+const JSDOMEnvironment = require('@jest/environment-jsdom-abstract').default;
+const jsdom = require('jsdom');
+
+/**
+ * A custom JSDOM environment that extends the abstract base and applies
+ * fixes for Web API globals that are missing or incorrectly implemented
+ * in JSDOM.
+ *
+ * Based on https://github.com/mswjs/jest-fixed-jsdom
+ */
+class FixedJSDOMEnvironment extends JSDOMEnvironment {
+ constructor(config, context) {
+ super(config, context, jsdom);
+
+ // Fix Web API globals that JSDOM doesn't properly expose
+ this.global.TextDecoder = TextDecoder;
+ this.global.TextEncoder = TextEncoder;
+ this.global.TextDecoderStream = TextDecoderStream;
+ this.global.TextEncoderStream = TextEncoderStream;
+ this.global.ReadableStream = ReadableStream;
+
+ this.global.Blob = Blob;
+ this.global.Headers = Headers;
+ this.global.FormData = FormData;
+ this.global.Request = Request;
+ this.global.Response = Response;
+ this.global.fetch = fetch;
+ this.global.AbortController = AbortController;
+ this.global.AbortSignal = AbortSignal;
+ this.global.structuredClone = structuredClone;
+ this.global.URL = URL;
+ this.global.URLSearchParams = URLSearchParams;
+
+ this.global.BroadcastChannel = BroadcastChannel;
+ this.global.TransformStream = TransformStream;
+ this.global.WritableStream = WritableStream;
+
+ // Needed to ensure `e instanceof Error` works as expected with errors thrown from
+ // any of the native APIs above. Without this, the JSDOM `Error` is what the test
+ // code will use for comparison with `e`, which fails the instanceof check.
+ this.global.Error = Error;
+ }
+}
+
+module.exports = FixedJSDOMEnvironment;
diff --git a/packages/cli/config/jest.js b/packages/cli/config/jest.js
index f011d14b19..94e5b9c4a8 100644
--- a/packages/cli/config/jest.js
+++ b/packages/cli/config/jest.js
@@ -20,6 +20,10 @@ const crypto = require('crypto');
const glob = require('util').promisify(require('glob'));
const { version } = require('../package.json');
const paths = require('@backstage/cli-common').findPaths(process.cwd());
+const {
+ getJestEnvironment,
+ getJestMajorVersion,
+} = require('./getJestEnvironment');
const SRC_EXTS = ['ts', 'js', 'tsx', 'jsx', 'mts', 'cts', 'mjs', 'cjs'];
@@ -211,7 +215,7 @@ function getRoleConfig(role, pkgJson) {
};
if (FRONTEND_ROLES.includes(role)) {
return {
- testEnvironment: require.resolve('jest-environment-jsdom'),
+ testEnvironment: getJestEnvironment(),
// The caching module loader is only used to speed up frontend tests,
// as it breaks real dynamic imports of ESM modules.
runtime: envOptions.oldTests
@@ -279,7 +283,10 @@ async function getProjectConfig(targetPath, extraConfig, extraOptions) {
);
}
- if (options.testEnvironment === require.resolve('jest-environment-jsdom')) {
+ if (
+ options.testEnvironment === getJestEnvironment() &&
+ getJestMajorVersion() < 30 // Only needed when not running the custom env for Jest 30+
+ ) {
// FIXME https://github.com/jsdom/jsdom/issues/1724
options.setupFilesAfterEnv.unshift(require.resolve('cross-fetch/polyfill'));
}
diff --git a/packages/cli/config/jestCachingModuleLoader.js b/packages/cli/config/jestCachingModuleLoader.js
index a3fdf106e9..5652ff67e7 100644
--- a/packages/cli/config/jestCachingModuleLoader.js
+++ b/packages/cli/config/jestCachingModuleLoader.js
@@ -14,6 +14,8 @@
* limitations under the License.
*/
+// 'jest-runtime' is included with jest and should be kept in sync with the installed jest version
+// eslint-disable-next-line @backstage/no-undeclared-imports
const { default: JestRuntime } = require('jest-runtime');
module.exports = class CachingJestRuntime extends JestRuntime {
diff --git a/packages/cli/config/jestRejectNetworkRequests.js b/packages/cli/config/jestRejectNetworkRequests.js
index de6b486809..ef577b3a22 100644
--- a/packages/cli/config/jestRejectNetworkRequests.js
+++ b/packages/cli/config/jestRejectNetworkRequests.js
@@ -22,7 +22,7 @@ const errorMessage = 'Network requests are not allowed in tests';
const origHttpAgent = http.globalAgent;
const origHttpsAgent = https.globalAgent;
const origFetch = global.fetch;
-const origXMLHttpRequest = global.fetch;
+const origXMLHttpRequest = global.XMLHttpRequest;
http.globalAgent = new http.Agent({
lookup() {
@@ -36,10 +36,21 @@ https.globalAgent = new https.Agent({
},
});
+const BLOCKING_FETCH_SYMBOL = Symbol.for(
+ 'backstage.jestRejectNetworkRequests.blockingFetch',
+);
+
if (global.fetch) {
- global.fetch = async () => {
- throw new Error(errorMessage);
+ const blockingFetch = async (input, init) => {
+ // If global.fetch still has our marker, block the request
+ if (global.fetch[BLOCKING_FETCH_SYMBOL]) {
+ throw new Error(errorMessage);
+ }
+ // MSW (or something else) wrapped us - pass through
+ return origFetch(input, init);
};
+ blockingFetch[BLOCKING_FETCH_SYMBOL] = true;
+ global.fetch = blockingFetch;
}
if (global.XMLHttpRequest) {
diff --git a/packages/cli/package.json b/packages/cli/package.json
index c48b529551..fbefa70eff 100644
--- a/packages/cli/package.json
+++ b/packages/cli/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/cli",
- "version": "0.35.0-next.2",
+ "version": "0.35.2-next.1",
"description": "CLI for developing Backstage plugins and apps",
"backstage": {
"role": "cli"
@@ -70,10 +70,9 @@
"@spotify/eslint-config-base": "^15.0.0",
"@spotify/eslint-config-react": "^15.0.0",
"@spotify/eslint-config-typescript": "^15.0.0",
- "@swc/core": "^1.3.46",
- "@swc/helpers": "^0.5.0",
- "@swc/jest": "^0.2.22",
- "@types/jest": "^29.5.11",
+ "@swc/core": "^1.15.6",
+ "@swc/helpers": "^0.5.17",
+ "@swc/jest": "^0.2.39",
"@types/webpack-env": "^1.15.2",
"@typescript-eslint/eslint-plugin": "^8.17.0",
"@typescript-eslint/parser": "^8.16.0",
@@ -109,11 +108,7 @@
"handlebars": "^4.7.3",
"html-webpack-plugin": "^5.6.3",
"inquirer": "^8.2.0",
- "jest": "^29.7.0",
- "jest-cli": "^29.7.0",
"jest-css-modules": "^2.1.0",
- "jest-environment-jsdom": "^29.0.2",
- "jest-runtime": "^29.0.2",
"json-schema": "^0.4.0",
"lodash": "^4.17.21",
"minimatch": "^9.0.0",
@@ -167,6 +162,7 @@
"@backstage/plugin-scaffolder-node-test-utils": "workspace:^",
"@backstage/test-utils": "workspace:^",
"@backstage/theme": "workspace:^",
+ "@jest/environment-jsdom-abstract": "^30.0.0",
"@pmmmwh/react-refresh-webpack-plugin": "^0.6.0",
"@types/cross-spawn": "^6.0.2",
"@types/ejs": "^3.1.3",
@@ -174,6 +170,7 @@
"@types/fs-extra": "^11.0.0",
"@types/http-proxy": "^1.17.4",
"@types/inquirer": "^8.1.3",
+ "@types/jest": "^30.0.0",
"@types/node": "^22.13.14",
"@types/npm-packlist": "^3.0.0",
"@types/recursive-readdir": "^2.2.0",
@@ -188,6 +185,8 @@
"esbuild-loader": "^4.0.0",
"eslint-webpack-plugin": "^4.2.0",
"fork-ts-checker-webpack-plugin": "^9.0.0",
+ "jest": "^30.2.0",
+ "jsdom": "^27.1.0",
"mini-css-extract-plugin": "^2.4.2",
"msw": "^1.0.0",
"nodemon": "^3.0.1",
@@ -196,17 +195,24 @@
"webpack-dev-server": "^5.0.0"
},
"peerDependencies": {
+ "@jest/environment-jsdom-abstract": "^30.0.0",
"@module-federation/enhanced": "^0.9.0",
"@pmmmwh/react-refresh-webpack-plugin": "^0.6.0",
"esbuild-loader": "^4.0.0",
"eslint-webpack-plugin": "^4.2.0",
"fork-ts-checker-webpack-plugin": "^9.0.0",
+ "jest": "^29.0.0 || ^30.0.0",
+ "jest-environment-jsdom": "*",
+ "jsdom": "^27.1.0",
"mini-css-extract-plugin": "^2.4.2",
"terser-webpack-plugin": "^5.1.3",
"webpack": "~5.103.0",
"webpack-dev-server": "^5.0.0"
},
"peerDependenciesMeta": {
+ "@jest/environment-jsdom-abstract": {
+ "optional": true
+ },
"@module-federation/enhanced": {
"optional": true
},
@@ -222,6 +228,12 @@
"fork-ts-checker-webpack-plugin": {
"optional": true
},
+ "jest-environment-jsdom": {
+ "optional": true
+ },
+ "jsdom": {
+ "optional": true
+ },
"mini-css-extract-plugin": {
"optional": true
},
diff --git a/packages/cli/src/modules/test/commands/package/test.ts b/packages/cli/src/modules/test/commands/package/test.ts
index 72e78eae7b..992697d19c 100644
--- a/packages/cli/src/modules/test/commands/package/test.ts
+++ b/packages/cli/src/modules/test/commands/package/test.ts
@@ -91,5 +91,23 @@ export default async (_opts: OptionValues, cmd: Command) => {
(process.stdout as any)._handle.setBlocking(true);
}
+ // Because of the ongoing migration to v30 of jest, jest is no longer hard-depended to allow
+ // opt-in migration. Users instead need to add jest as a devDependency themselves and specify
+ // the version they want. This prints a helpful error message if jest is not found, i.e. they
+ // forgot/didn't know they had to add jest themselves.
+ try {
+ require.resolve('jest');
+ } catch {
+ console.error(
+ [
+ 'No Jest installation found in this project.',
+ '',
+ 'To support opt-in migration to Jest v30, the Backstage CLI now expects Jest to be installed as a devDependency.',
+ 'See the migration guide in the changelog for version options and their consequences.',
+ ].join('\n'),
+ );
+ process.exit(1);
+ }
+
await require('jest').run(args);
};
diff --git a/packages/cli/src/modules/test/commands/repo/test.ts b/packages/cli/src/modules/test/commands/repo/test.ts
index 40e6666dcf..2288d13476 100644
--- a/packages/cli/src/modules/test/commands/repo/test.ts
+++ b/packages/cli/src/modules/test/commands/repo/test.ts
@@ -17,6 +17,8 @@
import os from 'os';
import crypto from 'node:crypto';
import yargs from 'yargs';
+// 'jest-cli' is included with jest and should be kept in sync with the installed jest version
+// eslint-disable-next-line @backstage/no-undeclared-imports
import { run as runJest, yargsOptions as jestYargsOptions } from 'jest-cli';
import { relative as relativePath } from 'path';
import { Command, OptionValues } from 'commander';
diff --git a/packages/codemods/CHANGELOG.md b/packages/codemods/CHANGELOG.md
index 3f85216f69..22dd2a5df7 100644
--- a/packages/codemods/CHANGELOG.md
+++ b/packages/codemods/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/codemods
+## 0.1.53
+
+### Patch Changes
+
+- 688f070: Updated to use new utilities from `@backstage/cli-common`.
+- 2bae83a: Bumped dev dependencies `@types/node`
+- Updated dependencies
+ - @backstage/cli-common@0.1.16
+
## 0.1.53-next.2
### Patch Changes
diff --git a/packages/codemods/package.json b/packages/codemods/package.json
index 1a84ba417a..01f5ae9168 100644
--- a/packages/codemods/package.json
+++ b/packages/codemods/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/codemods",
- "version": "0.1.53-next.2",
+ "version": "0.1.53",
"description": "A collection of codemods for Backstage projects",
"backstage": {
"role": "cli"
diff --git a/packages/config-loader/CHANGELOG.md b/packages/config-loader/CHANGELOG.md
index 7055741def..84ad0e04a1 100644
--- a/packages/config-loader/CHANGELOG.md
+++ b/packages/config-loader/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/config-loader
+## 1.10.7
+
+### Patch Changes
+
+- 741c47a: Updated dependency `typescript-json-schema` to `^0.67.0`.
+- Updated dependencies
+ - @backstage/cli-common@0.1.16
+
## 1.10.7-next.1
### Patch Changes
diff --git a/packages/config-loader/package.json b/packages/config-loader/package.json
index bedbbff518..e48723e5f7 100644
--- a/packages/config-loader/package.json
+++ b/packages/config-loader/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/config-loader",
- "version": "1.10.7-next.1",
+ "version": "1.10.7",
"description": "Config loading functionality used by Backstage backend, and CLI",
"backstage": {
"role": "node-library"
@@ -57,7 +57,7 @@
"@backstage/cli": "workspace:^",
"@types/json-schema-merge-allof": "^0.6.0",
"@types/minimist": "^1.2.5",
- "msw": "^1.0.0",
+ "msw": "^2.0.0",
"zen-observable": "^0.10.0"
}
}
diff --git a/packages/config-loader/src/loader.test.ts b/packages/config-loader/src/loader.test.ts
index 8908b4268b..ea226aa557 100644
--- a/packages/config-loader/src/loader.test.ts
+++ b/packages/config-loader/src/loader.test.ts
@@ -17,7 +17,7 @@
import { AppConfig } from '@backstage/config';
import { loadConfig } from './loader';
import fs from 'fs-extra';
-import { rest } from 'msw';
+import { http, HttpResponse } from 'msw';
import { setupServer } from 'msw/node';
import { createMockDirectory } from '@backstage/backend-test-utils';
import { createDeferred } from '@backstage/types';
@@ -74,32 +74,28 @@ describe('loadConfig', () => {
});
const server = setupServer();
- const initialLoaderHandler = rest.get(
+ const initialLoaderHandler = http.get(
`https://some.domain.io/app-config.yaml`,
- (_req, res, ctx) => {
- return res(
- ctx.body(
- `app:
+ () => {
+ return new HttpResponse(
+ `app:
title: Remote Example App
sessionKey: 'abc123'
escaped: \$\${Escaped}
`,
- ),
);
},
);
- const reloadHandler = rest.get(
+ const reloadHandler = http.get(
`https://some.domain.io/app-config.yaml`,
- (_req, res, ctx) => {
- return res(
- ctx.body(
- `app:
+ () => {
+ return new HttpResponse(
+ `app:
title: NEW ReMOTe ExaMPLe App
sessionKey: 'abc123'
escaped: \$\${Escaped}
`,
- ),
);
},
);
diff --git a/packages/config-loader/src/schema/collect.test.ts b/packages/config-loader/src/schema/collect.test.ts
index d48c98fbe4..a732d982d3 100644
--- a/packages/config-loader/src/schema/collect.test.ts
+++ b/packages/config-loader/src/schema/collect.test.ts
@@ -15,14 +15,9 @@
*/
import { createMockDirectory } from '@backstage/backend-test-utils';
-import { collectConfigSchemas } from './collect';
+import { collectConfigSchemas, internal } from './collect';
import path from 'path';
-
-// cwd must be restored
-const origDir = process.cwd();
-afterAll(() => {
- process.chdir(origDir);
-});
+import { execSync } from 'child_process';
const mockSchema = {
type: 'object',
@@ -37,6 +32,36 @@ const mockSchema = {
describe('collectConfigSchemas', () => {
const mockDir = createMockDirectory();
+ // Jest 30's module resolver doesn't find nested node_modules in mock directories.
+ // Use a child process for native Node.js resolution instead.
+ const originalResolvePackagePath = internal.resolvePackagePath;
+ beforeAll(() => {
+ internal.resolvePackagePath = (name, options) => {
+ const basePath = (options && options.paths?.[0]) ?? process.cwd();
+ const baseDir = basePath.endsWith('.json')
+ ? path.dirname(basePath)
+ : basePath;
+
+ try {
+ return execSync('node', {
+ input: `console.log(require.resolve(${JSON.stringify(
+ name,
+ )}, { paths: [${JSON.stringify(baseDir)}] }))`,
+ encoding: 'utf8',
+ stdio: ['pipe', 'pipe', 'pipe'],
+ }).trim();
+ } catch {
+ const error = new Error(`Cannot find module '${name}'`);
+ (error as NodeJS.ErrnoException).code = 'MODULE_NOT_FOUND';
+ throw error;
+ }
+ };
+ });
+
+ afterAll(() => {
+ internal.resolvePackagePath = originalResolvePackagePath;
+ });
+
afterEach(() => {
mockDir.clear();
});
diff --git a/packages/config-loader/src/schema/collect.ts b/packages/config-loader/src/schema/collect.ts
index 16bd654946..5f4e54387d 100644
--- a/packages/config-loader/src/schema/collect.ts
+++ b/packages/config-loader/src/schema/collect.ts
@@ -37,6 +37,17 @@ const req =
? require
: __non_webpack_require__;
+/**
+ * Exported for test mocking. Jest 30's module resolver has issues with
+ * nested node_modules, requiring tests to use an alternative resolution strategy.
+ * @internal
+ */
+export const internal = {
+ resolvePackagePath(name: string, options?: { paths: string[] }): string {
+ return req.resolve(name, options);
+ },
+};
+
/**
* This collects all known config schemas across all dependencies of the app.
*/
@@ -62,11 +73,9 @@ export async function collectConfigSchemas(
const { name, parentPath } = item;
try {
- pkgPath = req.resolve(
+ pkgPath = internal.resolvePackagePath(
`${name}/package.json`,
- parentPath && {
- paths: [parentPath],
- },
+ parentPath ? { paths: [parentPath] } : undefined,
);
} catch {
// We can somewhat safely ignore packages that don't export package.json,
diff --git a/packages/config-loader/src/sources/RemoteConfigSource.test.ts b/packages/config-loader/src/sources/RemoteConfigSource.test.ts
index 372dc91823..acb5870c7d 100644
--- a/packages/config-loader/src/sources/RemoteConfigSource.test.ts
+++ b/packages/config-loader/src/sources/RemoteConfigSource.test.ts
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-import { rest } from 'msw';
+import { http, HttpResponse } from 'msw';
import { registerMswTestHooks } from '@backstage/backend-test-utils';
import { setupServer } from 'msw/node';
import { RemoteConfigSource } from './RemoteConfigSource';
@@ -26,15 +26,15 @@ describe('RemoteConfigSource', () => {
it('should load config from a remote URL', async () => {
worker.use(
- rest.get('http://localhost/config.yaml', (_req, res, ctx) =>
- res(
- ctx.body(`
+ http.get(
+ 'http://localhost/config.yaml',
+ () =>
+ new HttpResponse(`
app:
title: Example App
substituted: \${VALUE}
escaped: \$\${VALUE}
`),
- ),
),
);
@@ -61,9 +61,10 @@ app:
it('should load and parse config from a remote URL', async () => {
worker.use(
- rest.get('http://localhost/config.json', (_req, res, ctx) =>
- res(
- ctx.body(
+ http.get(
+ 'http://localhost/config.json',
+ () =>
+ new HttpResponse(
JSON.stringify({
app: {
title: 'Example App',
@@ -72,7 +73,6 @@ app:
},
}),
),
- ),
),
);
@@ -102,12 +102,12 @@ app:
let fetched = false;
worker.use(
- rest.get('http://localhost/config.yaml', (_req, res, ctx) => {
+ http.get('http://localhost/config.yaml', () => {
if (!fetched) {
fetched = true;
- return res(ctx.body('x: 1'));
+ return new HttpResponse('x: 1');
}
- return res(ctx.body('x: 2'));
+ return new HttpResponse('x: 2');
}),
);
diff --git a/packages/core-app-api/CHANGELOG.md b/packages/core-app-api/CHANGELOG.md
index 19720d0c7e..2b2dbeccfd 100644
--- a/packages/core-app-api/CHANGELOG.md
+++ b/packages/core-app-api/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/core-app-api
+## 1.19.3
+
+### Patch Changes
+
+- 75683ed: Added replay functionality to `AlertApiForwarder` to buffer and replay recent alerts to new subscribers, preventing missed alerts that were posted before subscription.
+- 97cd16f: Internal update of translation imports.
+- Updated dependencies
+ - @backstage/core-plugin-api@1.12.1
+
## 1.19.3-next.1
### Patch Changes
diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json
index 70670fa27d..cd56c90ce8 100644
--- a/packages/core-app-api/package.json
+++ b/packages/core-app-api/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/core-app-api",
- "version": "1.19.3-next.1",
+ "version": "1.19.3",
"description": "Core app API used by Backstage apps",
"backstage": {
"role": "web-library"
diff --git a/packages/core-app-api/src/apis/implementations/FetchApi/PluginProtocolResolverFetchMiddleware.test.ts b/packages/core-app-api/src/apis/implementations/FetchApi/PluginProtocolResolverFetchMiddleware.test.ts
index bd82d58736..2b2545f52f 100644
--- a/packages/core-app-api/src/apis/implementations/FetchApi/PluginProtocolResolverFetchMiddleware.test.ts
+++ b/packages/core-app-api/src/apis/implementations/FetchApi/PluginProtocolResolverFetchMiddleware.test.ts
@@ -60,12 +60,6 @@ describe('PluginProtocolResolverFetchMiddleware', () => {
'https://real.com:8080/base',
'https://real.com:8080/base?c=d&e=f#g',
],
- [
- 'plugin://username:password@x?c=d&e=f#g',
- 'x',
- 'https://real.com:8080/base',
- 'https://username:password@real.com:8080/base?c=d&e=f#g',
- ],
[
'plugin://x?c=d&e=f#g',
'x',
@@ -106,14 +100,14 @@ describe('PluginProtocolResolverFetchMiddleware', () => {
expect(inner.mock.calls[0][0]).toBe('https://elsewhere.com');
expect(inner.mock.calls[0][1].body).toBe('123');
- await outer(
- new Request('plugin://a', {
- method: 'POST',
- body: '123',
- }),
- );
+ const inputRequest = new Request('plugin://a', {
+ method: 'POST',
+ body: '123',
+ });
+
+ await outer(inputRequest);
expect(inner.mock.calls[1][0]).toBe('https://elsewhere.com');
- expect(inner.mock.calls[1][1].body).toEqual(Buffer.from('123', 'utf8'));
+ expect(inner.mock.calls[1][1]).toBe(inputRequest);
});
});
diff --git a/packages/core-app-api/src/apis/implementations/IdentityApi/AppIdentityProxy.test.ts b/packages/core-app-api/src/apis/implementations/IdentityApi/AppIdentityProxy.test.ts
index 5993543c33..9d320c4033 100644
--- a/packages/core-app-api/src/apis/implementations/IdentityApi/AppIdentityProxy.test.ts
+++ b/packages/core-app-api/src/apis/implementations/IdentityApi/AppIdentityProxy.test.ts
@@ -83,12 +83,9 @@ describe('AppIdentityProxy', () => {
it('should navigate to target URL on sign out', async () => {
const proxy = new AppIdentityProxy();
proxy.setTarget(mockIdentityApi, { signOutTargetUrl: '/foo' });
- Object.defineProperty(window, 'location', {
- writable: true,
- value: {},
- });
+ const navigateSpy = jest.spyOn(proxy as any, 'navigateToUrl');
await proxy.signOut();
- expect(window.location.href).toBe('/foo');
+ expect(navigateSpy).toHaveBeenCalledWith('/foo');
});
});
diff --git a/packages/core-app-api/src/apis/implementations/IdentityApi/AppIdentityProxy.ts b/packages/core-app-api/src/apis/implementations/IdentityApi/AppIdentityProxy.ts
index 941ec90d66..161092fe9f 100644
--- a/packages/core-app-api/src/apis/implementations/IdentityApi/AppIdentityProxy.ts
+++ b/packages/core-app-api/src/apis/implementations/IdentityApi/AppIdentityProxy.ts
@@ -133,7 +133,11 @@ export class AppIdentityProxy implements IdentityApi {
await this.#cookieAuthSignOut?.();
- window.location.href = this.signOutTargetUrl;
+ this.navigateToUrl(this.signOutTargetUrl);
+ }
+
+ private navigateToUrl(url: string): void {
+ window.location.href = url;
}
enableCookieAuth(ctx: {
diff --git a/packages/core-app-api/src/apis/system/ApiProvider.test.tsx b/packages/core-app-api/src/apis/system/ApiProvider.test.tsx
index 095fc88627..4273587c00 100644
--- a/packages/core-app-api/src/apis/system/ApiProvider.test.tsx
+++ b/packages/core-app-api/src/apis/system/ApiProvider.test.tsx
@@ -117,16 +117,12 @@ describe('ApiProvider', () => {
}).toThrow(/^API context is not available/);
}).error,
).toEqual([
- expect.objectContaining({
- detail: new Error('API context is not available'),
- type: 'unhandled exception',
- }),
- expect.objectContaining({
- detail: new Error('API context is not available'),
- type: 'unhandled exception',
- }),
- expect.stringMatching(
- /^The above error occurred in the component/,
+ expect.stringContaining('Error: API context is not available'),
+ expect.objectContaining({ type: 'unhandled-exception' }),
+ expect.stringContaining('Error: API context is not available'),
+ expect.objectContaining({ type: 'unhandled-exception' }),
+ expect.stringContaining(
+ 'The above error occurred in the component',
),
]);
@@ -137,16 +133,12 @@ describe('ApiProvider', () => {
}).toThrow(/^API context is not available/);
}).error,
).toEqual([
- expect.objectContaining({
- detail: new Error('API context is not available'),
- type: 'unhandled exception',
- }),
- expect.objectContaining({
- detail: new Error('API context is not available'),
- type: 'unhandled exception',
- }),
- expect.stringMatching(
- /^The above error occurred in the component/,
+ expect.stringContaining('Error: API context is not available'),
+ expect.objectContaining({ type: 'unhandled-exception' }),
+ expect.stringContaining('Error: API context is not available'),
+ expect.objectContaining({ type: 'unhandled-exception' }),
+ expect.stringContaining(
+ 'The above error occurred in the component',
),
]);
});
@@ -163,16 +155,16 @@ describe('ApiProvider', () => {
}).toThrow('No implementation available for apiRef{x}');
}).error,
).toEqual([
- expect.objectContaining({
- detail: new Error('No implementation available for apiRef{x}'),
- type: 'unhandled exception',
- }),
- expect.objectContaining({
- detail: new Error('No implementation available for apiRef{x}'),
- type: 'unhandled exception',
- }),
- expect.stringMatching(
- /^The above error occurred in the component/,
+ expect.stringContaining(
+ 'Error: No implementation available for apiRef{x}',
+ ),
+ expect.objectContaining({ type: 'unhandled-exception' }),
+ expect.stringContaining(
+ 'Error: No implementation available for apiRef{x}',
+ ),
+ expect.objectContaining({ type: 'unhandled-exception' }),
+ expect.stringContaining(
+ 'The above error occurred in the component',
),
]);
@@ -187,16 +179,16 @@ describe('ApiProvider', () => {
}).toThrow('No implementation available for apiRef{x}');
}).error,
).toEqual([
- expect.objectContaining({
- detail: new Error('No implementation available for apiRef{x}'),
- type: 'unhandled exception',
- }),
- expect.objectContaining({
- detail: new Error('No implementation available for apiRef{x}'),
- type: 'unhandled exception',
- }),
- expect.stringMatching(
- /^The above error occurred in the component/,
+ expect.stringContaining(
+ 'Error: No implementation available for apiRef{x}',
+ ),
+ expect.objectContaining({ type: 'unhandled-exception' }),
+ expect.stringContaining(
+ 'Error: No implementation available for apiRef{x}',
+ ),
+ expect.objectContaining({ type: 'unhandled-exception' }),
+ expect.stringContaining(
+ 'The above error occurred in the component',
),
]);
});
diff --git a/packages/core-app-api/src/app/AppManager.test.tsx b/packages/core-app-api/src/app/AppManager.test.tsx
index 3981da56ad..4a146678bc 100644
--- a/packages/core-app-api/src/app/AppManager.test.tsx
+++ b/packages/core-app-api/src/app/AppManager.test.tsx
@@ -670,14 +670,10 @@ describe('Integration Test', () => {
});
expect(errorLogs).toEqual([
- expect.objectContaining({
- detail: new Error(expectedMessage),
- type: 'unhandled exception',
- }),
- expect.objectContaining({
- detail: new Error(expectedMessage),
- type: 'unhandled exception',
- }),
+ expect.stringContaining(`Error: ${expectedMessage}`),
+ expect.objectContaining({ type: 'unhandled-exception' }),
+ expect.stringContaining(`Error: ${expectedMessage}`),
+ expect.objectContaining({ type: 'unhandled-exception' }),
expect.stringContaining(
'The above error occurred in the component:',
),
@@ -714,14 +710,10 @@ describe('Integration Test', () => {
).rejects.toThrow(expectedMessage);
});
expect(errorLogs).toEqual([
- expect.objectContaining({
- detail: new Error(expectedMessage),
- type: 'unhandled exception',
- }),
- expect.objectContaining({
- detail: new Error(expectedMessage),
- type: 'unhandled exception',
- }),
+ expect.stringContaining(`Error: ${expectedMessage}`),
+ expect.objectContaining({ type: 'unhandled-exception' }),
+ expect.stringContaining(`Error: ${expectedMessage}`),
+ expect.objectContaining({ type: 'unhandled-exception' }),
expect.stringContaining(
'The above error occurred in the component:',
),
diff --git a/packages/core-compat-api/CHANGELOG.md b/packages/core-compat-api/CHANGELOG.md
index 4f3d30deda..55980561f4 100644
--- a/packages/core-compat-api/CHANGELOG.md
+++ b/packages/core-compat-api/CHANGELOG.md
@@ -1,5 +1,22 @@
# @backstage/core-compat-api
+## 0.5.6-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.21.5-next.0
+ - @backstage/frontend-plugin-api@0.13.2
+
+## 0.5.5
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.13.2
+ - @backstage/plugin-catalog-react@1.21.4
+ - @backstage/core-plugin-api@1.12.1
+
## 0.5.5-next.0
### Patch Changes
diff --git a/packages/core-compat-api/package.json b/packages/core-compat-api/package.json
index 7bb92d26fc..2894bfdca2 100644
--- a/packages/core-compat-api/package.json
+++ b/packages/core-compat-api/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/core-compat-api",
- "version": "0.5.5-next.0",
+ "version": "0.5.6-next.0",
"backstage": {
"role": "web-library"
},
diff --git a/packages/core-compat-api/src/convertLegacyApp.test.tsx b/packages/core-compat-api/src/convertLegacyApp.test.tsx
index 1cb2b757e3..7094eb798c 100644
--- a/packages/core-compat-api/src/convertLegacyApp.test.tsx
+++ b/packages/core-compat-api/src/convertLegacyApp.test.tsx
@@ -262,13 +262,16 @@ describe('convertLegacyApp', () => {
],
});
+ // Increase timeout for async rendering of complex catalog entity pages
+ const findOptions = { timeout: 5000 };
+
// Overview
const renderOverviewTest = await renderTestApp({
features: [catalogOverride, ...converted],
initialRouteEntries: ['/catalog/default/test/x'],
});
await expect(
- renderOverviewTest.findByText('overview content'),
+ renderOverviewTest.findByText('overview content', {}, findOptions),
).resolves.toBeInTheDocument();
renderOverviewTest.unmount();
@@ -277,7 +280,7 @@ describe('convertLegacyApp', () => {
initialRouteEntries: ['/catalog/default/other/x'],
});
await expect(
- renderOverviewOther.findByText('other overview content'),
+ renderOverviewOther.findByText('other overview content', {}, findOptions),
).resolves.toBeInTheDocument();
renderOverviewOther.unmount();
@@ -287,7 +290,7 @@ describe('convertLegacyApp', () => {
initialRouteEntries: ['/catalog/default/test/x/foo'],
});
await expect(
- renderFooTest.findByText('foo content'),
+ renderFooTest.findByText('foo content', {}, findOptions),
).resolves.toBeInTheDocument();
renderFooTest.unmount();
@@ -296,7 +299,7 @@ describe('convertLegacyApp', () => {
initialRouteEntries: ['/catalog/default/other/x/foo'],
});
await expect(
- renderFooOther.findByText('other foo content'),
+ renderFooOther.findByText('other foo content', {}, findOptions),
).resolves.toBeInTheDocument();
renderFooOther.unmount();
@@ -306,7 +309,7 @@ describe('convertLegacyApp', () => {
initialRouteEntries: ['/catalog/default/test/x/bar'],
});
await expect(
- renderBarTest.findByText('bar content'),
+ renderBarTest.findByText('bar content', {}, findOptions),
).resolves.toBeInTheDocument();
renderBarTest.unmount();
@@ -315,7 +318,7 @@ describe('convertLegacyApp', () => {
initialRouteEntries: ['/catalog/default/other/x/bar'],
});
await expect(
- renderBarOther.findByText('other overview content'),
+ renderBarOther.findByText('other overview content', {}, findOptions),
).resolves.toBeInTheDocument(); // /bar does not exist, fall back to rendering overview
renderBarOther.unmount();
});
diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md
index b5f5ae226f..7346287cf6 100644
--- a/packages/core-components/CHANGELOG.md
+++ b/packages/core-components/CHANGELOG.md
@@ -1,5 +1,26 @@
# @backstage/core-components
+## 0.18.4
+
+### Patch Changes
+
+- 9a942a4: Fixed bug in the `LogViewer` component where shift + click always opened a new window instead of just changing the selection.
+
+ In addition, improved the `LogViewer` component by a few usability enhancements:
+
+ - Added support for multiple selections using cmd/ctrl + click
+ - Improved the generated hash that is added to the URL to also support ranges & multiple selections
+ - Added an hover effect & info tooltip to the "Copy to clipboard" button to indicate its functionality
+ - Added some color and a separator to the line numbers to improve readability
+
+- 207c3c8: long words like urls now breaks to new line on warning panels instead of overflowing the container
+- 4c00303: Add `tooltipClasses` prop to `OverflowTooltip` component to allow customisation of the tooltip
+- 5d52dab: Add i18n support for LogViewer search control
+- f6b49ce: added support for wrapLongLines option in CodeSnippet
+- Updated dependencies
+ - @backstage/core-plugin-api@1.12.1
+ - @backstage/theme@0.7.1
+
## 0.18.4-next.2
### Patch Changes
diff --git a/packages/core-components/package.json b/packages/core-components/package.json
index da266d1b66..536f0ee9f0 100644
--- a/packages/core-components/package.json
+++ b/packages/core-components/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/core-components",
- "version": "0.18.4-next.2",
+ "version": "0.18.4",
"description": "Core components used by Backstage plugins and apps",
"backstage": {
"role": "web-library"
diff --git a/packages/core-components/src/components/Link/Link.test.tsx b/packages/core-components/src/components/Link/Link.test.tsx
index c132d832a2..c178ba6cbf 100644
--- a/packages/core-components/src/components/Link/Link.test.tsx
+++ b/packages/core-components/src/components/Link/Link.test.tsx
@@ -50,7 +50,7 @@ describe('', () => {
External Link,
);
const externalLink = screen.getByRole('link', {
- name: 'External Link , Opens in a new window',
+ name: 'External Link, Opens in a new window',
});
const externalLinkIcon = container.querySelector('svg');
expect(externalLink).not.toContainElement(externalLinkIcon);
@@ -62,6 +62,7 @@ describe('', () => {
External Link
,
);
+ // Note: when externalLinkIcon is present, the SVG adds whitespace to the accessible name
const externalLink = screen.getByRole('link', {
name: 'External Link , Opens in a new window',
});
diff --git a/packages/core-components/src/components/TabbedLayout/TabbedLayout.test.tsx b/packages/core-components/src/components/TabbedLayout/TabbedLayout.test.tsx
index 1be58d2dcf..3e4ab1df7c 100644
--- a/packages/core-components/src/components/TabbedLayout/TabbedLayout.test.tsx
+++ b/packages/core-components/src/components/TabbedLayout/TabbedLayout.test.tsx
@@ -47,18 +47,20 @@ describe('TabbedLayout', () => {
});
expect(error).toEqual([
+ expect.stringContaining(
+ 'Error: Child of TabbedLayout must be an TabbedLayout.Route',
+ ),
expect.objectContaining({
- detail: new Error(
- 'Child of TabbedLayout must be an TabbedLayout.Route',
- ),
+ type: 'unhandled-exception',
}),
+ expect.stringContaining(
+ 'Error: Child of TabbedLayout must be an TabbedLayout.Route',
+ ),
expect.objectContaining({
- detail: new Error(
- 'Child of TabbedLayout must be an TabbedLayout.Route',
- ),
+ type: 'unhandled-exception',
}),
- expect.stringMatching(
- /The above error occurred in the component/,
+ expect.stringContaining(
+ 'The above error occurred in the component',
),
]);
});
diff --git a/packages/core-components/src/components/Table/Table.test.tsx b/packages/core-components/src/components/Table/Table.test.tsx
index dfae66d1c2..dab5a462c2 100644
--- a/packages/core-components/src/components/Table/Table.test.tsx
+++ b/packages/core-components/src/components/Table/Table.test.tsx
@@ -68,7 +68,7 @@ describe('
: null;
+ };
+
+ const { getByText } = await renderInTestApp(
+
+
+
+ ,
+ );
+
+ await act(async () => {
+ // need to wait for the debounce to finish
+ await new Promise(resolve => setTimeout(resolve, 600));
+ });
+
+ expect(mockScmAuthApi.getCredentials).toHaveBeenCalledWith({
+ url: 'https://github.com',
+ additionalScope: {
+ repoWrite: true,
+ customScopes: {
+ github: ['workflow'],
+ },
+ },
+ });
+
+ expect(getByText('abc123')).toBeInTheDocument();
+ });
+
+ it('should call the scmAuthApi with the correct params if workspace is nested', async () => {
+ await renderInTestApp(
+
+
+
+ ,
+ );
+
+ await act(async () => {
+ // need to wait for the debounce to finish
+ await new Promise(resolve => setTimeout(resolve, 600));
+ });
+
+ expect(mockScmAuthApi.getCredentials).toHaveBeenCalledWith({
+ url: 'https://github.com',
+ additionalScope: {
+ repoWrite: true,
+ },
+ });
+ });
+
+ it('should not call the scmAuthApi if secret is available in the state', async () => {
+ const secretsKey = 'testKey';
+
+ const SecretsComponent = () => {
+ const { secrets } = useTemplateSecrets();
+ const secret = secrets[secretsKey];
+ return secret ?
{secret}
: null;
+ };
+
+ const { getByText } = await renderInTestApp(
+
+
+
+ ,
+ );
+
+ await act(async () => {
+ // need to wait for the debounce to finish
+ await new Promise(resolve => setTimeout(resolve, 600));
+ });
+
+ // as we already have a secret in the state, getCredentials should not be called again.
+ expect(mockScmAuthApi.getCredentials).toHaveBeenCalledTimes(0);
+
+ expect(getByText('abc123')).toBeInTheDocument();
+ });
+ });
+});
diff --git a/plugins/scaffolder/src/components/fields/RepoOwnerPicker/RepoOwnerPicker.tsx b/plugins/scaffolder/src/components/fields/RepoOwnerPicker/RepoOwnerPicker.tsx
new file mode 100644
index 0000000000..bcb1a0001c
--- /dev/null
+++ b/plugins/scaffolder/src/components/fields/RepoOwnerPicker/RepoOwnerPicker.tsx
@@ -0,0 +1,138 @@
+/*
+ * Copyright 2025 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { useApi } from '@backstage/core-plugin-api';
+import {
+ scmIntegrationsApiRef,
+ scmAuthApiRef,
+} from '@backstage/integration-react';
+import { useEffect, useState, useCallback, useMemo } from 'react';
+import useDebounce from 'react-use/esm/useDebounce';
+import { useTemplateSecrets } from '@backstage/plugin-scaffolder-react';
+
+import { RepoOwnerPickerProps } from './schema';
+import { RepoOwnerPickerState } from './types';
+import { DefaultRepoOwnerPicker } from './DefaultRepoOwnerPicker';
+import { GitHubRepoOwnerPicker } from './GitHubRepoOwnerPicker';
+
+/**
+ * The underlying component that is rendered in the form for the `RepoOwnerPicker`
+ * field extension.
+ *
+ * @public
+ */
+export const RepoOwnerPicker = (props: RepoOwnerPickerProps) => {
+ const { uiSchema, onChange, rawErrors, formData, schema, required } = props;
+ const [state, setState] = useState({
+ owner: formData || '',
+ });
+ const excludedOwners = useMemo(
+ () => uiSchema?.['ui:options']?.excludedOwners ?? [],
+ [uiSchema],
+ );
+ const { host, owner } = state;
+
+ const integrationApi = useApi(scmIntegrationsApiRef);
+ const scmAuthApi = useApi(scmAuthApiRef);
+
+ const { secrets, setSecrets } = useTemplateSecrets();
+
+ useDebounce(
+ async () => {
+ const { requestUserCredentials } = uiSchema?.['ui:options'] ?? {};
+
+ if (!requestUserCredentials || !host) {
+ return;
+ }
+
+ // don't show login prompt if secret value is already in state
+ if (secrets[requestUserCredentials.secretsKey]) {
+ return;
+ }
+
+ // user has requested that we use the users credentials
+ // so lets grab them using the scmAuthApi and pass through
+ // any additional scopes from the ui:options
+ const { token } = await scmAuthApi.getCredentials({
+ url: `https://${host}`,
+ additionalScope: {
+ repoWrite: true,
+ customScopes: requestUserCredentials.additionalScopes,
+ },
+ });
+
+ // set the secret using the key provided in the ui:options for use
+ // in the templating the manifest with ${{ secrets[secretsKey] }}
+ setSecrets({ [requestUserCredentials.secretsKey]: token });
+ },
+ 500,
+ [host, uiSchema],
+ );
+
+ useEffect(() => {
+ if (uiSchema?.['ui:options']?.host) {
+ const hostUiOption = uiSchema['ui:options'].host;
+ setState(prevState => ({ ...prevState, host: hostUiOption }));
+ }
+ }, [uiSchema]);
+
+ useEffect(() => {
+ onChange(owner);
+ }, [owner, onChange]);
+
+ const updateLocalState = useCallback(
+ (newState: RepoOwnerPickerState) => {
+ setState(prevState => ({ ...prevState, ...newState }));
+ },
+ [setState],
+ );
+
+ const hostType = (host && integrationApi.byHost(host)?.type) ?? null;
+
+ const renderRepoOwnerPicker = () => {
+ switch (hostType) {
+ case 'github':
+ return (
+
+ );
+ default:
+ return (
+
+ );
+ }
+ };
+
+ return renderRepoOwnerPicker();
+};
diff --git a/plugins/scaffolder/src/components/fields/RepoOwnerPicker/index.ts b/plugins/scaffolder/src/components/fields/RepoOwnerPicker/index.ts
new file mode 100644
index 0000000000..d93e5e22e5
--- /dev/null
+++ b/plugins/scaffolder/src/components/fields/RepoOwnerPicker/index.ts
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2025 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export { RepoOwnerPicker } from './RepoOwnerPicker';
+export {
+ RepoOwnerPickerFieldSchema,
+ type RepoOwnerPickerUiOptions,
+ RepoOwnerPickerSchema,
+} from './schema';
diff --git a/plugins/scaffolder/src/components/fields/RepoOwnerPicker/schema.ts b/plugins/scaffolder/src/components/fields/RepoOwnerPicker/schema.ts
new file mode 100644
index 0000000000..7931ca1eec
--- /dev/null
+++ b/plugins/scaffolder/src/components/fields/RepoOwnerPicker/schema.ts
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2025 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { makeFieldSchema } from '@backstage/plugin-scaffolder-react';
+
+export const RepoOwnerPickerFieldSchema = makeFieldSchema({
+ output: z => z.string(),
+ uiOptions: z =>
+ z.object({
+ host: z.string().optional(),
+ excludedOwners: z
+ .array(z.string())
+ .optional()
+ .describe('List of excluded owners'),
+ requestUserCredentials: z
+ .object({
+ secretsKey: z
+ .string()
+ .describe(
+ 'Key used within the template secrets context to store the credential',
+ ),
+ additionalScopes: z
+ .object({
+ gitea: z
+ .array(z.string())
+ .optional()
+ .describe('Additional Gitea scopes to request'),
+ gerrit: z
+ .array(z.string())
+ .optional()
+ .describe('Additional Gerrit scopes to request'),
+ github: z
+ .array(z.string())
+ .optional()
+ .describe('Additional GitHub scopes to request'),
+ gitlab: z
+ .array(z.string())
+ .optional()
+ .describe('Additional GitLab scopes to request'),
+ bitbucket: z
+ .array(z.string())
+ .optional()
+ .describe('Additional BitBucket scopes to request'),
+ azure: z
+ .array(z.string())
+ .optional()
+ .describe('Additional Azure scopes to request'),
+ })
+ .optional()
+ .describe('Additional permission scopes to request'),
+ })
+ .optional()
+ .describe(
+ 'If defined will request user credentials to auth against the given SCM platform',
+ ),
+ }),
+});
+
+/**
+ * The input props that can be specified under `ui:options` for the
+ * `RepoOwnerPicker` field extension.
+ */
+export type RepoOwnerPickerUiOptions = NonNullable<
+ (typeof RepoOwnerPickerFieldSchema.TProps.uiSchema)['ui:options']
+>;
+
+export type RepoOwnerPickerProps = typeof RepoOwnerPickerFieldSchema.TProps;
+
+// This has been duplicated from /plugins/scaffolder/src/components/fields/RepoUrlPicker/schema.ts
+// NOTE: There is a bug with this failing validation in the custom field explorer due
+// to https://github.com/rjsf-team/react-jsonschema-form/issues/675 even if
+// requestUserCredentials is not defined
+export const RepoOwnerPickerSchema = RepoOwnerPickerFieldSchema.schema;
diff --git a/plugins/scaffolder/src/components/fields/RepoOwnerPicker/types.ts b/plugins/scaffolder/src/components/fields/RepoOwnerPicker/types.ts
new file mode 100644
index 0000000000..eceed58df5
--- /dev/null
+++ b/plugins/scaffolder/src/components/fields/RepoOwnerPicker/types.ts
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2025 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { RJSFSchema } from '@rjsf/utils';
+
+export interface RepoOwnerPickerState {
+ host?: string;
+ owner?: string;
+}
+
+export type BaseRepoOwnerPickerProps = T & {
+ onChange: (state: RepoOwnerPickerState) => void;
+ state: RepoOwnerPickerState;
+ rawErrors: string[];
+ isDisabled?: boolean;
+ required?: boolean;
+ schema?: RJSFSchema;
+};
diff --git a/plugins/scaffolder/src/components/fields/VirtualizedListbox.test.tsx b/plugins/scaffolder/src/components/fields/VirtualizedListbox.test.tsx
index 59f311fe88..8a058d5320 100644
--- a/plugins/scaffolder/src/components/fields/VirtualizedListbox.test.tsx
+++ b/plugins/scaffolder/src/components/fields/VirtualizedListbox.test.tsx
@@ -33,7 +33,7 @@ describe('', () => {
aria-expanded="true"
class="MuiAutocomplete-root MuiAutocomplete-hasClearIcon MuiAutocomplete-hasPopupIcon"
role="combobox"
- style="position: relative; height: 18px; width: 100%; overflow: auto; will-change: transform; direction: ltr;"
+ style="position: relative; height: 18px; width: 100%; overflow: auto; -webkit-overflow-scrolling: touch; will-change: transform; direction: ltr;"
>
', () => {