Merge branch 'master' into canon-merge-field-input

This commit is contained in:
Charles de Dreuille
2025-04-02 13:31:07 +01:00
229 changed files with 5043 additions and 320 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/create-app': patch
---
Bumped create-app version.
+21 -1
View File
@@ -194,39 +194,59 @@
"@backstage/plugin-techdocs-react": "1.2.15",
"@backstage/plugin-user-settings": "0.8.20",
"@backstage/plugin-user-settings-backend": "0.3.0",
"@backstage/plugin-user-settings-common": "0.0.1"
"@backstage/plugin-user-settings-common": "0.0.1",
"@backstage/plugin-events-backend-module-bitbucket-server": "0.0.0",
"@backstage/plugin-notifications-backend-module-slack": "0.0.0"
},
"changesets": [
"chatty-days-wonder",
"chilly-sheep-scream",
"clear-pigs-share",
"clever-tomatoes-jump",
"common-parrots-wink",
"crazy-hands-film",
"create-app-1742907012",
"create-app-1743513781",
"cuddly-dodos-allow",
"cuddly-kids-sell",
"cuddly-mirrors-ask",
"deep-flies-vanish",
"dry-cars-build",
"early-feet-lay",
"every-ties-wink",
"famous-dragons-bake",
"famous-eggs-dance",
"funny-hotels-cut",
"funny-lizards-clean",
"giant-donkeys-punch",
"honest-ties-worry",
"huge-toys-beam",
"itchy-times-behave",
"large-kings-protect",
"lemon-shoes-enter",
"light-cameras-fold",
"metal-animals-notice",
"moody-eagles-smile",
"nine-falcons-repeat",
"odd-bobcats-hang",
"orange-queens-grin",
"quick-carrots-open",
"rotten-bobcats-notice",
"sad-pots-try",
"serious-guests-tan",
"silver-rocks-invite",
"spotty-towns-show",
"stale-tables-stick",
"strange-planes-kneel",
"sweet-maps-invent",
"swift-boats-add",
"tame-sloths-brake",
"tame-worms-do",
"thin-snails-judge",
"tiny-swans-warn",
"twenty-forks-cheat",
"twenty-walls-join",
"unlucky-carrots-shave",
"wet-penguins-beg",
"wide-planets-camp",
"witty-planets-sing"
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-techdocs-node': patch
---
Update Azure file retrieval logic from storing file in buffer array to piping to res for better memory efficiency.
-5
View File
@@ -1,5 +0,0 @@
---
'@backstage/plugin-catalog': patch
---
Fix the default catalog table search behavior by using the catalog table toolbar for all table variations (including when pagination mode is none).
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/canon': minor
---
Add new Select component for Canon
@@ -0,0 +1,128 @@
import { PropsTable } from '@/components/PropsTable';
import { Snippet } from '@/components/Snippet';
import { Tabs } from '@/components/Tabs';
import { CodeBlock } from '@/components/CodeBlock';
import { SelectSnippet } from '@/snippets/stories-snippets';
import { selectPropDefs } from './props';
# Select
A common form component for choosing a predefined value in a dropdown menu.
<Snippet
align="center"
py={4}
preview={<SelectSnippet story="Preview" />}
code={`<Select name="font" label="Font Family" options={[
{ value: 'sans', label: 'Sans-serif' },
{ value: 'serif', label: 'Serif' },
{ value: 'mono', label: 'Monospace' },
{ value: 'cursive', label: 'Cursive' },
]} />
`}
/>
<Tabs.Root>
<Tabs.List>
<Tabs.Tab>Usage</Tabs.Tab>
<Tabs.Tab>Theming</Tabs.Tab>
</Tabs.List>
<Tabs.Panel>
<CodeBlock
code={`import { Select } from '@backstage/canon';
<Select
name="font"
options={[
{ value: 'sans', label: 'Sans-serif' },
{ value: 'serif', label: 'Serif' },
{ value: 'mono', label: 'Monospace' },
{ value: 'cursive', label: 'Cursive' },
]}
/>
`}
/>
</Tabs.Panel>
<Tabs.Panel>
We recommend starting with our [global tokens](/theme/theming) to customize the library and align it with
your brand. For additional flexibility, you can use the provided class names for each element listed below.
<CodeBlock
code={`<Select className="canon-SelectFieldRoot" />`}
/>
</Tabs.Panel>
</Tabs.Root>
## API reference
<PropsTable data={selectPropDefs} />
## Examples
### With Label and description
Select component with label and description.
<Snippet
align="center"
py={4}
open
preview={<SelectSnippet story="WithDescription" />}
code={`<Select
name="font"
label="Font Family"
description="Choose a font family for your document"
options={[ ... ]}
/>`}
/>
### Sizes
Here's a view when the selects have different sizes.
<Snippet
align="center"
py={4}
open
preview={<SelectSnippet story="Sizes" />}
code={`<Flex>
<Select
size="small"
label="Font family"
options={[ ... ]}
/>
<Select
size="medium"
label="Font family"
options={[ ... ]}
/>
</Flex>`}
/>
### Disabled
Here's a view when the select is disabled.
<Snippet
align="center"
py={4}
open
preview={<SelectSnippet story="Disabled" />}
code={`<Select
disabled
label="Font family"
options={[ ... ]}
/>`}
/>
### Responsive
Here's a view when the select is responsive.
<CodeBlock
code={`<Select
size={{ initial: 'small', lg: 'medium' }}
label="Font family"
options={[ ... ]}
/>`}
/>
@@ -0,0 +1,54 @@
import { classNamePropDefs, stylePropDefs } from '../../../../utils/propDefs';
import type { PropDef } from '../../../../utils/propDefs';
export const selectPropDefs: Record<string, PropDef> = {
label: {
type: 'string',
default: 'Select an option',
responsive: false,
},
description: {
type: 'string',
responsive: false,
},
name: {
type: 'string',
responsive: false,
required: true,
},
options: {
type: 'enum',
values: ['Array<{ value: string, label: string }>'],
required: true,
},
value: {
type: 'string',
responsive: false,
},
defaultValue: {
type: 'string',
responsive: false,
},
placeholder: {
type: 'string',
responsive: false,
},
size: {
type: 'enum',
values: ['small', 'medium'],
default: 'medium',
responsive: true,
},
onValueChange: {
type: 'enum',
values: ['(value: string) => void'],
responsive: false,
},
onOpenChange: {
type: 'enum',
values: ['(open: boolean) => void'],
responsive: false,
},
...classNamePropDefs,
...stylePropDefs,
};
@@ -25,8 +25,8 @@ export const PropsTable = <T extends Record<string, PropData>>({
<Table.Header>
<Table.HeaderRow>
<Table.HeaderCell style={{ width: '16%' }}>Prop</Table.HeaderCell>
<Table.HeaderCell style={{ width: '56%' }}>Type</Table.HeaderCell>
<Table.HeaderCell style={{ width: '14%' }}>Default</Table.HeaderCell>
<Table.HeaderCell style={{ width: '50%' }}>Type</Table.HeaderCell>
<Table.HeaderCell style={{ width: '20%' }}>Default</Table.HeaderCell>
<Table.HeaderCell style={{ width: '14%' }}>
Responsive
</Table.HeaderCell>
@@ -45,7 +45,7 @@ export const PropsTable = <T extends Record<string, PropData>>({
<Table.Cell style={{ width: '16%' }}>
<Chip head>{n}</Chip>
</Table.Cell>
<Table.Cell style={{ width: '56%' }}>
<Table.Cell style={{ width: '50%' }}>
<div
style={{ display: 'flex', flexWrap: 'wrap', gap: '0.375rem' }}
>
@@ -61,7 +61,7 @@ export const PropsTable = <T extends Record<string, PropData>>({
)}
</div>
</Table.Cell>
<Table.Cell style={{ width: '14%' }}>
<Table.Cell style={{ width: '20%' }}>
<Chip>{data[n].default ? data[n].default : '-'}</Chip>
</Table.Cell>
<Table.Cell style={{ width: '14%' }}>
@@ -13,6 +13,7 @@ import * as IconStories from '../../../packages/canon/src/components/Icon/Icon.s
import * as InputStories from '../../../packages/canon/src/components/Input/Input.stories';
import * as TextStories from '../../../packages/canon/src/components/Text/Text.stories';
import * as FlexStories from '../../../packages/canon/src/components/Flex/Flex.stories';
import * as SelectStories from '../../../packages/canon/src/components/Select/Select.stories';
export const BoxSnippet = ({ story }: { story: keyof typeof BoxStories }) => {
const stories = composeStories(BoxStories);
@@ -125,3 +126,14 @@ export const TextSnippet = ({ story }: { story: keyof typeof TextStories }) => {
return StoryComponent ? <StoryComponent /> : null;
};
export const SelectSnippet = ({
story,
}: {
story: keyof typeof SelectStories;
}) => {
const stories = composeStories(SelectStories);
const StoryComponent = stories[story as keyof typeof stories];
return StoryComponent ? <StoryComponent /> : null;
};
+5
View File
@@ -97,6 +97,11 @@ export const components: Page[] = [
slug: 'input',
status: 'alpha',
},
{
title: 'Select',
slug: 'select',
status: 'alpha',
},
{
title: 'Table',
slug: 'table',
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "root",
"version": "1.38.0-next.0",
"version": "1.38.0-next.1",
"backstage": {
"cli": {
"new": {
+11
View File
@@ -1,5 +1,16 @@
# @backstage/app-defaults
## 1.6.1-next.0
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.17.1-next.0
- @backstage/core-app-api@1.16.0
- @backstage/core-plugin-api@1.10.5
- @backstage/theme@0.6.4
- @backstage/plugin-permission-react@0.4.32
## 1.6.0
### Minor Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/app-defaults",
"version": "1.6.0",
"version": "1.6.1-next.0",
"description": "Provides the default wiring of a Backstage App",
"backstage": {
"role": "web-library"
@@ -1,5 +1,13 @@
# app-next-example-plugin
## 0.0.22-next.0
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.17.1-next.0
- @backstage/frontend-plugin-api@0.10.1-next.0
## 0.0.21
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "app-next-example-plugin",
"version": "0.0.21",
"version": "0.0.22-next.0",
"description": "Backstage internal example plugin",
"backstage": {
"role": "frontend-plugin",
+46
View File
@@ -1,5 +1,51 @@
# example-app-next
## 0.0.22-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-techdocs-react@1.2.16-next.0
- @backstage/plugin-kubernetes@0.12.6-next.1
- @backstage/canon@0.2.1-next.1
- @backstage/core-components@0.17.1-next.0
- @backstage/plugin-catalog-import@0.12.12-next.1
- @backstage/integration-react@1.2.6-next.0
- @backstage/plugin-techdocs-module-addons-contrib@1.1.23-next.0
- @backstage/plugin-techdocs@1.12.5-next.1
- @backstage/app-defaults@1.6.1-next.0
- @backstage/cli@0.32.0-next.1
- @backstage/frontend-plugin-api@0.10.1-next.0
- @backstage/plugin-api-docs@0.12.6-next.1
- @backstage/plugin-app@0.1.8-next.0
- @backstage/plugin-app-visualizer@0.1.18-next.0
- @backstage/plugin-auth-react@0.1.14-next.0
- @backstage/plugin-catalog@1.29.0-next.1
- @backstage/plugin-catalog-graph@0.4.18-next.1
- @backstage/plugin-catalog-react@1.16.1-next.1
- @backstage/plugin-catalog-unprocessed-entities@0.2.16-next.1
- @backstage/plugin-home@0.8.7-next.1
- @backstage/plugin-kubernetes-cluster@0.0.24-next.1
- @backstage/plugin-notifications@0.5.4-next.1
- @backstage/plugin-org@0.6.38-next.1
- @backstage/plugin-scaffolder@1.30.0-next.1
- @backstage/plugin-scaffolder-react@1.15.0-next.1
- @backstage/plugin-search@1.4.25-next.1
- @backstage/plugin-search-react@1.8.8-next.0
- @backstage/plugin-signals@0.0.18-next.0
- @backstage/plugin-user-settings@0.8.21-next.1
- @backstage/core-compat-api@0.4.1-next.1
- @backstage/frontend-app-api@0.11.1-next.0
- @backstage/frontend-defaults@0.2.1-next.0
- @backstage/catalog-model@1.7.3
- @backstage/config@1.3.2
- @backstage/core-app-api@1.16.0
- @backstage/core-plugin-api@1.10.5
- @backstage/theme@0.6.4
- @backstage/plugin-catalog-common@1.1.3
- @backstage/plugin-permission-react@0.4.32
- @backstage/plugin-search-common@1.2.17
## 0.0.22-next.0
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "example-app-next",
"version": "0.0.22-next.0",
"version": "0.0.22-next.1",
"backstage": {
"role": "frontend"
},
+42
View File
@@ -1,5 +1,47 @@
# example-app
## 0.2.108-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-techdocs-react@1.2.16-next.0
- @backstage/plugin-kubernetes@0.12.6-next.1
- @backstage/canon@0.2.1-next.1
- @backstage/core-components@0.17.1-next.0
- @backstage/plugin-catalog-import@0.12.12-next.1
- @backstage/integration-react@1.2.6-next.0
- @backstage/plugin-techdocs-module-addons-contrib@1.1.23-next.0
- @backstage/plugin-techdocs@1.12.5-next.1
- @backstage/app-defaults@1.6.1-next.0
- @backstage/cli@0.32.0-next.1
- @backstage/plugin-api-docs@0.12.6-next.1
- @backstage/plugin-auth-react@0.1.14-next.0
- @backstage/plugin-catalog@1.29.0-next.1
- @backstage/plugin-catalog-graph@0.4.18-next.1
- @backstage/plugin-catalog-react@1.16.1-next.1
- @backstage/plugin-catalog-unprocessed-entities@0.2.16-next.1
- @backstage/plugin-devtools@0.1.26-next.1
- @backstage/plugin-home@0.8.7-next.1
- @backstage/plugin-kubernetes-cluster@0.0.24-next.1
- @backstage/plugin-notifications@0.5.4-next.1
- @backstage/plugin-org@0.6.38-next.1
- @backstage/plugin-scaffolder@1.30.0-next.1
- @backstage/plugin-scaffolder-react@1.15.0-next.1
- @backstage/plugin-search@1.4.25-next.1
- @backstage/plugin-search-react@1.8.8-next.0
- @backstage/plugin-signals@0.0.18-next.0
- @backstage/plugin-user-settings@0.8.21-next.1
- @backstage/frontend-app-api@0.11.1-next.0
- @backstage/catalog-model@1.7.3
- @backstage/config@1.3.2
- @backstage/core-app-api@1.16.0
- @backstage/core-plugin-api@1.10.5
- @backstage/theme@0.6.4
- @backstage/plugin-catalog-common@1.1.3
- @backstage/plugin-permission-react@0.4.32
- @backstage/plugin-search-common@1.2.17
## 0.2.108-next.0
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "example-app",
"version": "0.2.108-next.0",
"version": "0.2.108-next.1",
"backstage": {
"role": "frontend"
},
+19
View File
@@ -1,5 +1,24 @@
# @backstage/backend-defaults
## 0.9.0-next.1
### Patch Changes
- Updated dependencies
- @backstage/integration@1.16.3-next.0
- @backstage/backend-app-api@1.2.1
- @backstage/plugin-auth-node@0.6.1
- @backstage/plugin-permission-node@0.9.0
- @backstage/backend-dev-utils@0.1.5
- @backstage/backend-plugin-api@1.2.1
- @backstage/cli-node@0.2.13
- @backstage/config@1.3.2
- @backstage/config-loader@1.10.0
- @backstage/errors@1.2.7
- @backstage/integration-aws-node@0.1.15
- @backstage/types@1.2.1
- @backstage/plugin-events-node@0.4.9
## 0.9.0-next.0
### Minor Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-defaults",
"version": "0.9.0-next.0",
"version": "0.9.0-next.1",
"description": "Backend defaults used by Backstage backend apps",
"backstage": {
"role": "node-library"
@@ -1,5 +1,29 @@
# @backstage/backend-dynamic-feature-service
## 0.6.2-next.1
### Patch Changes
- Updated dependencies
- @backstage/backend-defaults@0.9.0-next.1
- @backstage/plugin-catalog-backend@1.32.1-next.0
- @backstage/plugin-scaffolder-node@0.8.1-next.1
- @backstage/plugin-auth-node@0.6.1
- @backstage/plugin-events-backend@0.5.0
- @backstage/plugin-permission-node@0.9.0
- @backstage/plugin-search-backend-node@1.3.9
- @backstage/backend-plugin-api@1.2.1
- @backstage/cli-common@0.1.15
- @backstage/cli-node@0.2.13
- @backstage/config@1.3.2
- @backstage/config-loader@1.10.0
- @backstage/errors@1.2.7
- @backstage/types@1.2.1
- @backstage/plugin-app-node@0.1.31
- @backstage/plugin-events-node@0.4.9
- @backstage/plugin-permission-common@0.8.4
- @backstage/plugin-search-common@1.2.17
## 0.6.2-next.0
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-dynamic-feature-service",
"version": "0.6.2-next.0",
"version": "0.6.2-next.1",
"description": "Backstage dynamic feature service",
"backstage": {
"role": "node-library"
+38
View File
@@ -1,5 +1,43 @@
# example-backend-legacy
## 0.2.109-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-scaffolder-backend-module-gitlab@0.8.2-next.1
- @backstage/integration@1.16.3-next.0
- @backstage/plugin-auth-backend@0.24.5-next.1
- @backstage/plugin-scaffolder-backend@1.32.0-next.1
- @backstage/backend-defaults@0.9.0-next.1
- @backstage/plugin-catalog-backend@1.32.1-next.0
- @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.8-next.1
- @backstage/plugin-scaffolder-backend-module-rails@0.5.8-next.1
- @backstage/plugin-techdocs-backend@2.0.1-next.1
- @backstage/plugin-signals-backend@0.3.2
- @backstage/plugin-auth-node@0.6.1
- @backstage/plugin-events-backend@0.5.0
- @backstage/plugin-kubernetes-backend@0.19.4
- @backstage/plugin-permission-backend@0.5.55
- @backstage/plugin-permission-node@0.9.0
- @backstage/plugin-search-backend@2.0.1-next.1
- @backstage/plugin-search-backend-node@1.3.9
- @backstage/backend-plugin-api@1.2.1
- @backstage/catalog-client@1.9.1
- @backstage/catalog-model@1.7.3
- @backstage/config@1.3.2
- @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.6
- @backstage/plugin-catalog-backend-module-unprocessed@0.5.6
- @backstage/plugin-catalog-node@1.16.1
- @backstage/plugin-events-node@0.4.9
- @backstage/plugin-permission-common@0.8.4
- @backstage/plugin-search-backend-module-catalog@0.3.2
- @backstage/plugin-search-backend-module-elasticsearch@1.7.0
- @backstage/plugin-search-backend-module-explore@0.3.0
- @backstage/plugin-search-backend-module-pg@0.5.42
- @backstage/plugin-search-backend-module-techdocs@0.4.1-next.1
- @backstage/plugin-signals-node@0.1.18
## 0.2.109-next.0
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "example-backend-legacy",
"version": "0.2.109-next.0",
"version": "0.2.109-next.1",
"backstage": {
"role": "backend"
},
+14
View File
@@ -1,5 +1,19 @@
# @backstage/backend-test-utils
## 1.3.2-next.1
### Patch Changes
- Updated dependencies
- @backstage/backend-defaults@0.9.0-next.1
- @backstage/backend-app-api@1.2.1
- @backstage/plugin-auth-node@0.6.1
- @backstage/backend-plugin-api@1.2.1
- @backstage/config@1.3.2
- @backstage/errors@1.2.7
- @backstage/types@1.2.1
- @backstage/plugin-events-node@0.4.9
## 1.3.2-next.0
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-test-utils",
"version": "1.3.2-next.0",
"version": "1.3.2-next.1",
"description": "Test helpers library for Backstage backends",
"backstage": {
"role": "node-library"
+38
View File
@@ -1,5 +1,43 @@
# example-backend
## 0.0.37-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-notifications-backend@0.5.5-next.0
- @backstage/plugin-auth-backend@0.24.5-next.1
- @backstage/plugin-scaffolder-backend@1.32.0-next.1
- @backstage/backend-defaults@0.9.0-next.1
- @backstage/plugin-catalog-backend@1.32.1-next.0
- @backstage/plugin-catalog-backend-module-openapi@0.2.9-next.0
- @backstage/plugin-scaffolder-backend-module-github@0.6.2-next.1
- @backstage/plugin-techdocs-backend@2.0.1-next.1
- @backstage/plugin-auth-backend-module-github-provider@0.3.1
- @backstage/plugin-signals-backend@0.3.2
- @backstage/plugin-app-backend@0.5.0
- @backstage/plugin-auth-node@0.6.1
- @backstage/plugin-devtools-backend@0.5.4-next.1
- @backstage/plugin-events-backend@0.5.0
- @backstage/plugin-kubernetes-backend@0.19.4
- @backstage/plugin-permission-backend@0.5.55
- @backstage/plugin-permission-node@0.9.0
- @backstage/plugin-proxy-backend@0.6.0
- @backstage/plugin-search-backend@2.0.1-next.1
- @backstage/plugin-search-backend-node@1.3.9
- @backstage/backend-plugin-api@1.2.1
- @backstage/catalog-model@1.7.3
- @backstage/plugin-auth-backend-module-guest-provider@0.2.6
- @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.0
- @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.6
- @backstage/plugin-catalog-backend-module-unprocessed@0.5.6
- @backstage/plugin-permission-backend-module-allow-all-policy@0.2.6
- @backstage/plugin-permission-common@0.8.4
- @backstage/plugin-scaffolder-backend-module-notifications@0.1.9-next.1
- @backstage/plugin-search-backend-module-catalog@0.3.2
- @backstage/plugin-search-backend-module-explore@0.3.0
- @backstage/plugin-search-backend-module-techdocs@0.4.1-next.1
## 0.0.37-next.0
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "example-backend",
"version": "0.0.37-next.0",
"version": "0.0.37-next.1",
"backstage": {
"role": "backend"
},
+7
View File
@@ -1,5 +1,12 @@
# @backstage/canon
## 0.2.1-next.1
### Patch Changes
- f7cb538: Internal refactor and fixes to the prop extraction logic for layout components.
- 5e80f0b: Fix types on the Icon component.
## 0.2.1-next.0
### Patch Changes
+163
View File
@@ -689,3 +689,166 @@
background-color: var(--canon-scrollbar-thumb);
width: 100%;
}
.canon-SelectFieldRoot {
font-family: var(--canon-font-regular);
flex-direction: column;
width: 100%;
display: flex;
}
.canon-SelectFieldLabel {
font-size: var(--canon-font-size-2);
font-weight: var(--canon-font-weight-regular);
color: var(--canon-fg-primary);
margin-bottom: var(--canon-space-1_5);
}
.canon-SelectFieldDescription {
font-size: var(--canon-font-size-2);
font-weight: var(--canon-font-weight-regular);
color: var(--canon-fg-secondary);
padding-top: var(--canon-space-1_5);
margin: 0;
}
.canon-SelectFieldError {
font-size: var(--canon-font-size-2);
font-weight: var(--canon-font-weight-regular);
color: var(--canon-fg-danger);
padding-top: var(--canon-space-1_5);
margin: 0;
}
.canon-SelectTrigger {
box-sizing: border-box;
border-radius: var(--canon-radius-3);
border: 1px solid var(--canon-border);
padding: 0 var(--canon-space-4);
background-color: var(--canon-bg-surface-1);
font-size: var(--canon-font-size-3);
font-family: var(--canon-font-regular);
font-weight: var(--canon-font-weight-regular);
color: var(--canon-fg-primary);
cursor: pointer;
justify-content: space-between;
align-items: center;
width: 100%;
transition: border-color .2s ease-in-out, outline-color .2s ease-in-out;
display: flex;
}
.canon-SelectTrigger::placeholder {
color: var(--canon-fg-secondary);
}
.canon-SelectTrigger:hover {
border-color: var(--canon-border-hover);
}
.canon-SelectTrigger:focus-visible {
border-color: var(--canon-border-pressed);
outline: 0;
}
.canon-SelectTrigger[data-invalid] {
border-color: var(--canon-fg-danger);
}
.canon-SelectTrigger[data-invalid]:hover, .canon-SelectTrigger[data-invalid]:focus-visible {
border-width: 2px;
}
.canon-SelectTrigger[data-disabled] {
cursor: not-allowed;
border-color: var(--canon-border-disabled);
color: var(--canon-fg-disabled);
}
.canon-SelectTrigger--size-small, .canon-SelectItem--size-small {
height: 2rem;
}
.canon-SelectTrigger--size-medium, .canon-SelectItem--size-medium {
height: 3rem;
}
.canon-SelectIcon {
margin-left: var(--canon-space-5);
transition: transform .2s;
}
.canon-SelectTrigger[data-popup-open] .canon-SelectIcon {
transform: rotate(180deg);
}
.canon-SelectPopup {
box-sizing: border-box;
max-height: var(--available-height);
background-color: var(--canon-bg-surface-1);
border: 1px solid var(--canon-border);
border-radius: var(--canon-radius-3);
padding-block: var(--canon-space-1);
z-index: 1;
transform-origin: var(--transform-origin);
outline: 0;
transition: transform .15s, opacity .15s;
overflow-y: auto;
box-shadow: 0 4px 12px #0003;
}
.canon-SelectPopup[data-starting-style], .canon-SelectPopup[data-ending-style] {
opacity: 0;
transform: scale(.9);
}
.canon-SelectItem {
width: var(--anchor-width);
padding-block: var(--canon-space-2);
padding-inline: var(--canon-space-4);
color: var(--canon-fg-primary);
border-radius: var(--canon-radius-3);
cursor: pointer;
user-select: none;
font-size: var(--canon-font-size-3);
align-items: center;
gap: var(--canon-space-2);
outline: none;
grid-template-columns: 1rem 1fr;
grid-template-areas: "icon text";
display: grid;
position: relative;
}
.canon-SelectItem[data-highlighted] {
z-index: 0;
color: var(--canon-fg-primary);
position: relative;
}
.canon-SelectItem[data-highlighted]:before {
content: "";
z-index: -1;
background-color: var(--canon-bg-tint-hover);
border-radius: .25rem;
position: absolute;
inset-block: 0;
inset-inline: .25rem;
}
.canon-SelectItem[data-disabled] {
cursor: not-allowed;
color: var(--canon-fg-disabled);
}
.canon-SelectItemIndicator {
grid-area: icon;
justify-content: center;
align-items: center;
display: flex;
}
.canon-SelectItemText {
flex: 1;
grid-area: text;
}
+162
View File
@@ -0,0 +1,162 @@
.canon-SelectFieldRoot {
font-family: var(--canon-font-regular);
flex-direction: column;
width: 100%;
display: flex;
}
.canon-SelectFieldLabel {
font-size: var(--canon-font-size-2);
font-weight: var(--canon-font-weight-regular);
color: var(--canon-fg-primary);
margin-bottom: var(--canon-space-1_5);
}
.canon-SelectFieldDescription {
font-size: var(--canon-font-size-2);
font-weight: var(--canon-font-weight-regular);
color: var(--canon-fg-secondary);
padding-top: var(--canon-space-1_5);
margin: 0;
}
.canon-SelectFieldError {
font-size: var(--canon-font-size-2);
font-weight: var(--canon-font-weight-regular);
color: var(--canon-fg-danger);
padding-top: var(--canon-space-1_5);
margin: 0;
}
.canon-SelectTrigger {
box-sizing: border-box;
border-radius: var(--canon-radius-3);
border: 1px solid var(--canon-border);
padding: 0 var(--canon-space-4);
background-color: var(--canon-bg-surface-1);
font-size: var(--canon-font-size-3);
font-family: var(--canon-font-regular);
font-weight: var(--canon-font-weight-regular);
color: var(--canon-fg-primary);
cursor: pointer;
justify-content: space-between;
align-items: center;
width: 100%;
transition: border-color .2s ease-in-out, outline-color .2s ease-in-out;
display: flex;
}
.canon-SelectTrigger::placeholder {
color: var(--canon-fg-secondary);
}
.canon-SelectTrigger:hover {
border-color: var(--canon-border-hover);
}
.canon-SelectTrigger:focus-visible {
border-color: var(--canon-border-pressed);
outline: 0;
}
.canon-SelectTrigger[data-invalid] {
border-color: var(--canon-fg-danger);
}
.canon-SelectTrigger[data-invalid]:hover, .canon-SelectTrigger[data-invalid]:focus-visible {
border-width: 2px;
}
.canon-SelectTrigger[data-disabled] {
cursor: not-allowed;
border-color: var(--canon-border-disabled);
color: var(--canon-fg-disabled);
}
.canon-SelectTrigger--size-small, .canon-SelectItem--size-small {
height: 2rem;
}
.canon-SelectTrigger--size-medium, .canon-SelectItem--size-medium {
height: 3rem;
}
.canon-SelectIcon {
margin-left: var(--canon-space-5);
transition: transform .2s;
}
.canon-SelectTrigger[data-popup-open] .canon-SelectIcon {
transform: rotate(180deg);
}
.canon-SelectPopup {
box-sizing: border-box;
max-height: var(--available-height);
background-color: var(--canon-bg-surface-1);
border: 1px solid var(--canon-border);
border-radius: var(--canon-radius-3);
padding-block: var(--canon-space-1);
z-index: 1;
transform-origin: var(--transform-origin);
outline: 0;
transition: transform .15s, opacity .15s;
overflow-y: auto;
box-shadow: 0 4px 12px #0003;
}
.canon-SelectPopup[data-starting-style], .canon-SelectPopup[data-ending-style] {
opacity: 0;
transform: scale(.9);
}
.canon-SelectItem {
width: var(--anchor-width);
padding-block: var(--canon-space-2);
padding-inline: var(--canon-space-4);
color: var(--canon-fg-primary);
border-radius: var(--canon-radius-3);
cursor: pointer;
user-select: none;
font-size: var(--canon-font-size-3);
align-items: center;
gap: var(--canon-space-2);
outline: none;
grid-template-columns: 1rem 1fr;
grid-template-areas: "icon text";
display: grid;
position: relative;
}
.canon-SelectItem[data-highlighted] {
z-index: 0;
color: var(--canon-fg-primary);
position: relative;
}
.canon-SelectItem[data-highlighted]:before {
content: "";
z-index: -1;
background-color: var(--canon-bg-tint-hover);
border-radius: .25rem;
position: absolute;
inset-block: 0;
inset-inline: .25rem;
}
.canon-SelectItem[data-disabled] {
cursor: not-allowed;
color: var(--canon-fg-disabled);
}
.canon-SelectItemIndicator {
grid-area: icon;
justify-content: center;
align-items: center;
display: flex;
}
.canon-SelectItemText {
flex: 1;
grid-area: text;
}
+163
View File
@@ -9895,3 +9895,166 @@
background-color: var(--canon-scrollbar-thumb);
width: 100%;
}
.canon-SelectFieldRoot {
font-family: var(--canon-font-regular);
flex-direction: column;
width: 100%;
display: flex;
}
.canon-SelectFieldLabel {
font-size: var(--canon-font-size-2);
font-weight: var(--canon-font-weight-regular);
color: var(--canon-fg-primary);
margin-bottom: var(--canon-space-1_5);
}
.canon-SelectFieldDescription {
font-size: var(--canon-font-size-2);
font-weight: var(--canon-font-weight-regular);
color: var(--canon-fg-secondary);
padding-top: var(--canon-space-1_5);
margin: 0;
}
.canon-SelectFieldError {
font-size: var(--canon-font-size-2);
font-weight: var(--canon-font-weight-regular);
color: var(--canon-fg-danger);
padding-top: var(--canon-space-1_5);
margin: 0;
}
.canon-SelectTrigger {
box-sizing: border-box;
border-radius: var(--canon-radius-3);
border: 1px solid var(--canon-border);
padding: 0 var(--canon-space-4);
background-color: var(--canon-bg-surface-1);
font-size: var(--canon-font-size-3);
font-family: var(--canon-font-regular);
font-weight: var(--canon-font-weight-regular);
color: var(--canon-fg-primary);
cursor: pointer;
justify-content: space-between;
align-items: center;
width: 100%;
transition: border-color .2s ease-in-out, outline-color .2s ease-in-out;
display: flex;
}
.canon-SelectTrigger::placeholder {
color: var(--canon-fg-secondary);
}
.canon-SelectTrigger:hover {
border-color: var(--canon-border-hover);
}
.canon-SelectTrigger:focus-visible {
border-color: var(--canon-border-pressed);
outline: 0;
}
.canon-SelectTrigger[data-invalid] {
border-color: var(--canon-fg-danger);
}
.canon-SelectTrigger[data-invalid]:hover, .canon-SelectTrigger[data-invalid]:focus-visible {
border-width: 2px;
}
.canon-SelectTrigger[data-disabled] {
cursor: not-allowed;
border-color: var(--canon-border-disabled);
color: var(--canon-fg-disabled);
}
.canon-SelectTrigger--size-small, .canon-SelectItem--size-small {
height: 2rem;
}
.canon-SelectTrigger--size-medium, .canon-SelectItem--size-medium {
height: 3rem;
}
.canon-SelectIcon {
margin-left: var(--canon-space-5);
transition: transform .2s;
}
.canon-SelectTrigger[data-popup-open] .canon-SelectIcon {
transform: rotate(180deg);
}
.canon-SelectPopup {
box-sizing: border-box;
max-height: var(--available-height);
background-color: var(--canon-bg-surface-1);
border: 1px solid var(--canon-border);
border-radius: var(--canon-radius-3);
padding-block: var(--canon-space-1);
z-index: 1;
transform-origin: var(--transform-origin);
outline: 0;
transition: transform .15s, opacity .15s;
overflow-y: auto;
box-shadow: 0 4px 12px #0003;
}
.canon-SelectPopup[data-starting-style], .canon-SelectPopup[data-ending-style] {
opacity: 0;
transform: scale(.9);
}
.canon-SelectItem {
width: var(--anchor-width);
padding-block: var(--canon-space-2);
padding-inline: var(--canon-space-4);
color: var(--canon-fg-primary);
border-radius: var(--canon-radius-3);
cursor: pointer;
user-select: none;
font-size: var(--canon-font-size-3);
align-items: center;
gap: var(--canon-space-2);
outline: none;
grid-template-columns: 1rem 1fr;
grid-template-areas: "icon text";
display: grid;
position: relative;
}
.canon-SelectItem[data-highlighted] {
z-index: 0;
color: var(--canon-fg-primary);
position: relative;
}
.canon-SelectItem[data-highlighted]:before {
content: "";
z-index: -1;
background-color: var(--canon-bg-tint-hover);
border-radius: .25rem;
position: absolute;
inset-block: 0;
inset-inline: .25rem;
}
.canon-SelectItem[data-disabled] {
cursor: not-allowed;
color: var(--canon-fg-disabled);
}
.canon-SelectItemIndicator {
grid-area: icon;
justify-content: center;
align-items: center;
display: flex;
}
.canon-SelectItemText {
flex: 1;
grid-area: text;
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/canon",
"version": "0.2.1-next.0",
"version": "0.2.1-next.1",
"backstage": {
"role": "web-library"
},
+28
View File
@@ -3,6 +3,7 @@
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
```ts
import { Breakpoint as Breakpoint_2 } from '@backstage/canon';
import { Context } from 'react';
import type { CSSProperties } from 'react';
import { ForwardRefExoticComponent } from 'react';
@@ -912,6 +913,33 @@ export const ScrollArea: {
>;
};
// @public (undocumented)
export const Select: React_2.ForwardRefExoticComponent<
SelectProps & React_2.RefAttributes<HTMLSelectElement>
>;
// @public (undocumented)
export interface SelectProps {
className?: string;
defaultValue?: string;
description?: string;
disabled?: boolean;
label?: string;
name: string;
onOpenChange?: (open: boolean) => void;
onValueChange?: (value: string) => void;
options?: Array<{
value: string;
label: string;
disabled?: boolean;
}>;
placeholder?: string;
required?: boolean;
size?: 'small' | 'medium' | Partial<Record<Breakpoint_2, 'small' | 'medium'>>;
style?: React.CSSProperties;
value?: string;
}
// @public (undocumented)
export type Space =
| '0.5'
@@ -0,0 +1,327 @@
/*
* 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 React, { useState } from 'react';
import type { Meta, StoryObj } from '@storybook/react';
import { Select } from './Select';
import { Form } from '@base-ui-components/react/form';
import { Button } from '../Button';
import { Flex } from '../Flex';
const meta = {
title: 'Components/Select',
component: Select,
} satisfies Meta<typeof Select>;
export default meta;
type Story = StoryObj<typeof meta>;
const fontOptions = [
{ value: 'sans', label: 'Sans-serif' },
{ value: 'serif', label: 'Serif' },
{ value: 'mono', label: 'Monospace' },
{ value: 'cursive', label: 'Cursive' },
];
export const Default: Story = {
args: {
options: fontOptions,
name: 'font',
},
};
export const Preview: Story = {
args: {
label: 'Font Family',
options: fontOptions,
placeholder: 'Select a font',
name: 'font',
style: { maxWidth: 260 },
},
};
export const WithDescription: Story = {
args: {
...Preview.args,
description: 'Choose a font family for your document',
},
};
export const Sizes: Story = {
args: {
...Preview.args,
},
render: args => (
<Flex direction="row" gap="2" style={{ width: '100%', maxWidth: 540 }}>
<Select {...args} size="small" />
<Select {...args} size="medium" />
</Flex>
),
};
export const Required: Story = {
args: {
...Preview.args,
required: true,
},
};
export const Disabled: Story = {
args: {
...Preview.args,
disabled: true,
},
};
export const DisabledOption: Story = {
args: {
...Preview.args,
options: [
...fontOptions,
{ value: 'comic-sans', label: 'Comic sans', disabled: true },
],
},
};
export const NoLabel: Story = {
args: {
...Preview.args,
label: undefined,
},
};
export const NoOptions: Story = {
args: {
...Preview.args,
options: undefined,
},
};
export const Small: Story = {
args: {
...Preview.args,
size: 'small',
},
};
export const WithValue: Story = {
args: {
...Preview.args,
value: 'mono',
defaultValue: 'serif',
},
};
export const WithDefaultValue: Story = {
args: {
...Preview.args,
defaultValue: 'serif',
options: fontOptions,
name: 'font',
},
};
const generateOptions = (count = 100) => {
const firstWords = [
'Moon',
'Sun',
'Star',
'Cosmic',
'Globe',
'Flux',
'Nova',
'Echo',
'Pulse',
'Vertex',
'Nexus',
'Orbit',
'Prism',
'Quantum',
'Zenith',
'Aura',
'Crystal',
'Shadow',
'Phantom',
'Azure',
'Ember',
'Frost',
'Horizon',
'Mystic',
'Raven',
'Solstice',
'Tempest',
'Vortex',
'Whisper',
'Zephyr',
];
const secondWords = [
'green',
'blue',
'red',
'black',
'white',
'silver',
'gold',
'copper',
'bronze',
'steel',
'flow',
'light',
'dark',
'dream',
'stream',
'life',
'sight',
'mind',
'craft',
'blend',
'wave',
'swift',
'sharp',
'soft',
'bold',
'clear',
'deep',
'lift',
'shift',
'grace',
];
const thirdWords = [
'Sans',
'Serif',
'Mono',
'Script',
'Display',
'Slab',
'Round',
'Thin',
'Bold',
'Italic',
'Pro',
'Neo',
'Prime',
'Plus',
'One',
'Two',
'Nova',
'Ultra',
'Elite',
'Max',
'Type',
'Text',
'View',
'Graph',
'Print',
'Read',
'Write',
'Book',
'Note',
'Letter',
];
const randomElement = <T extends any>(array: T[]): T =>
array[Math.floor(Math.random() * array.length)];
const uniqueRandomNames = Array.from({ length: count })
.map(() => {
const firstName = randomElement(firstWords);
const secondName = randomElement(secondWords);
const thirdName = randomElement(thirdWords);
return `${firstName}${secondName} ${thirdName}`;
})
.reduce((accSet, label) => {
accSet.add(label);
return accSet;
}, new Set<string>())
.values();
return Array.from(uniqueRandomNames).map(label => ({
value: label.toLocaleLowerCase('en-US').replaceAll(' ', '-'),
label,
}));
};
export const WithManyOptions: Story = {
args: {
label: 'Font Family',
options: generateOptions(),
name: 'font',
},
};
async function validateFont(value: string) {
// Mimic a server response
await new Promise(resolve => {
setTimeout(resolve, 500);
});
const restrictedFonts = ['comic-sans'];
if (restrictedFonts.includes(value)) {
return { error: 'This font should not be allowed.' };
}
return { success: true };
}
export const ShowErrorOnSubmit: Story = {
args: {
...Preview.args,
label: 'Font Family (select Comic sans to see error)',
options: [...fontOptions, { value: 'comic-sans', label: 'Comic sans' }],
required: true,
},
decorators: [
Story => {
const [errors, setErrors] = useState({});
const [loading, setLoading] = useState(false);
return (
<Form
errors={errors}
onClearErrors={setErrors}
onSubmit={async event => {
event.preventDefault();
const formData = new FormData(event.currentTarget);
const fontValue = formData.get('font') as string;
setLoading(true);
const response = await validateFont(fontValue);
if (response.error) {
setErrors({
font: response.error,
});
} else {
setErrors({});
}
setLoading(false);
}}
>
<Story />
<Button
type="submit"
disabled={loading}
size="small"
style={{ marginTop: '0.75rem' }}
>
Submit
</Button>
</Form>
);
},
],
};
@@ -0,0 +1,184 @@
/*
* Copyright 2024 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.
*/
.canon-SelectFieldRoot {
display: flex;
flex-direction: column;
font-family: var(--canon-font-regular);
width: 100%;
}
.canon-SelectFieldLabel {
font-size: var(--canon-font-size-2);
font-weight: var(--canon-font-weight-regular);
color: var(--canon-fg-primary);
margin-bottom: var(--canon-space-1_5);
}
.canon-SelectFieldDescription {
font-size: var(--canon-font-size-2);
font-weight: var(--canon-font-weight-regular);
color: var(--canon-fg-secondary);
margin: 0;
padding-top: var(--canon-space-1_5);
}
.canon-SelectFieldError {
font-size: var(--canon-font-size-2);
font-weight: var(--canon-font-weight-regular);
color: var(--canon-fg-danger);
margin: 0;
padding-top: var(--canon-space-1_5);
}
.canon-SelectTrigger {
box-sizing: border-box;
border-radius: var(--canon-radius-3);
border: 1px solid var(--canon-border);
padding: 0 var(--canon-space-4);
background-color: var(--canon-bg-surface-1);
font-size: var(--canon-font-size-3);
font-family: var(--canon-font-regular);
font-weight: var(--canon-font-weight-regular);
color: var(--canon-fg-primary);
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
transition: border-color 0.2s ease-in-out, outline-color 0.2s ease-in-out;
cursor: pointer;
}
.canon-SelectTrigger::placeholder {
color: var(--canon-fg-secondary);
}
.canon-SelectTrigger:hover {
border-color: var(--canon-border-hover);
}
.canon-SelectTrigger:focus-visible {
border-color: var(--canon-border-pressed);
outline: 0;
}
.canon-SelectTrigger[data-invalid] {
border-color: var(--canon-fg-danger);
}
.canon-SelectTrigger[data-invalid]:hover {
border-width: 2px;
}
.canon-SelectTrigger[data-invalid]:focus-visible {
border-width: 2px;
}
.canon-SelectTrigger[data-disabled] {
cursor: not-allowed;
border-color: var(--canon-border-disabled);
color: var(--canon-fg-disabled);
}
.canon-SelectTrigger--size-small,
.canon-SelectItem--size-small {
height: 2rem;
}
.canon-SelectTrigger--size-medium,
.canon-SelectItem--size-medium {
height: 3rem;
}
.canon-SelectIcon {
margin-left: var(--canon-space-5);
transition: transform 0.2s ease;
}
.canon-SelectTrigger[data-popup-open] .canon-SelectIcon {
transform: rotate(180deg);
}
.canon-SelectPopup {
box-sizing: border-box;
max-height: var(--available-height);
overflow-y: auto;
background-color: var(--canon-bg-surface-1);
border: 1px solid var(--canon-border);
border-radius: var(--canon-radius-3);
padding-block: var(--canon-space-1);
z-index: 1;
outline: 0;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
transform-origin: var(--transform-origin);
transition: transform 150ms, opacity 150ms;
}
.canon-SelectPopup[data-starting-style],
.canon-SelectPopup[data-ending-style] {
opacity: 0;
transform: scale(0.9);
}
.canon-SelectItem {
position: relative;
width: var(--anchor-width);
display: grid;
grid-template-areas: 'icon text';
grid-template-columns: 1rem 1fr;
align-items: center;
padding-block: var(--canon-space-2);
padding-inline: var(--canon-space-4);
color: var(--canon-fg-primary);
border-radius: var(--canon-radius-3);
cursor: pointer;
user-select: none;
font-size: var(--canon-font-size-3);
gap: var(--canon-space-2);
outline: none;
}
.canon-SelectItem[data-highlighted] {
z-index: 0;
position: relative;
color: var(--canon-fg-primary);
}
.canon-SelectItem[data-highlighted]::before {
content: '';
z-index: -1;
position: absolute;
inset-block: 0;
inset-inline: 0.25rem;
border-radius: 0.25rem;
background-color: var(--canon-bg-tint-hover);
}
.canon-SelectItem[data-disabled] {
cursor: not-allowed;
color: var(--canon-fg-disabled);
}
.canon-SelectItemIndicator {
grid-area: icon;
display: flex;
align-items: center;
justify-content: center;
}
.canon-SelectItemText {
flex: 1;
grid-area: text;
}
@@ -0,0 +1,107 @@
/*
* Copyright 2024 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 React from 'react';
import { Select as SelectPrimitive } from '@base-ui-components/react/select';
import { Field, Icon } from '@backstage/canon';
import clsx from 'clsx';
import './Select.styles.css';
import { SelectProps } from './types';
/** @public */
export const Select = React.forwardRef<HTMLSelectElement, SelectProps>(
(props, ref) => {
const {
className,
name,
label,
description,
value,
defaultValue,
onValueChange,
onOpenChange,
options,
placeholder = 'Select an option',
size = 'medium',
disabled = false,
required = false,
style,
} = props;
return (
<Field.Root
className={clsx('canon-SelectFieldRoot', className)}
disabled={disabled}
name={name}
style={style}
>
{label && (
<Field.Label className="canon-SelectFieldLabel">{label}</Field.Label>
)}
<SelectPrimitive.Root
value={value}
defaultValue={defaultValue}
onValueChange={onValueChange}
onOpenChange={onOpenChange}
required={required}
name={name}
>
<SelectPrimitive.Trigger
ref={ref}
className={clsx(
'canon-SelectTrigger',
`canon-SelectTrigger--size-${size}`,
)}
>
<SelectPrimitive.Value placeholder={placeholder} />
<SelectPrimitive.Icon className="canon-SelectIcon">
<Icon name="chevron-down" />
</SelectPrimitive.Icon>
</SelectPrimitive.Trigger>
<SelectPrimitive.Portal>
<SelectPrimitive.Backdrop />
<SelectPrimitive.Positioner>
<SelectPrimitive.Popup className="canon-SelectPopup">
{options?.map(option => (
<SelectPrimitive.Item
key={option.value}
value={option.value}
disabled={option.disabled}
className="canon-SelectItem"
>
<SelectPrimitive.ItemIndicator className="canon-SelectItemIndicator">
<Icon name="check" />
</SelectPrimitive.ItemIndicator>
<SelectPrimitive.ItemText className="canon-SelectItemText">
{option.label}
</SelectPrimitive.ItemText>
</SelectPrimitive.Item>
))}
</SelectPrimitive.Popup>
</SelectPrimitive.Positioner>
</SelectPrimitive.Portal>
</SelectPrimitive.Root>
{description && (
<Field.Description className="canon-SelectFieldDescription">
{description}
</Field.Description>
)}
<Field.Error className="canon-SelectFieldError" />
</Field.Root>
);
},
);
Select.displayName = 'Select';
@@ -0,0 +1,18 @@
/*
* Copyright 2024 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 * from './Select';
export * from './types';
@@ -0,0 +1,94 @@
/*
* 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 { Breakpoint } from '@backstage/canon';
/** @public */
export interface SelectProps {
/**
* The class name of the select field
*/
className?: string;
/**
* The size of the select field
* @defaultValue 'medium'
*/
size?: 'small' | 'medium' | Partial<Record<Breakpoint, 'small' | 'medium'>>;
/**
* The label of the select field
*/
label?: string;
/**
* The description of the select field
*/
description?: string;
/**
* The name of the select field
*/
name: string;
/**
* Whether the select field should ignore user input
* @defaultValue false
*/
disabled?: boolean;
/**
* Whether the select field is required
* @defaultValue false
*/
required?: boolean;
/**
* The options of the select field
*/
options?: Array<{ value: string; label: string; disabled?: boolean }>;
/**
* The current value of the select field
*/
value?: string;
/**
* The default value of the select field, if nothing has been selected yet
*/
defaultValue?: string;
/**
* A placeholder text to show if nothing has been selected and there's no default value
* @defaultValue 'Select an option'
*/
placeholder?: string;
/**
* Callback that is called when the value of the select field changes
*/
onValueChange?: (value: string) => void;
/**
* Callbak that is called when the select field is opened or closed
*/
onOpenChange?: (open: boolean) => void;
/**
* The style of the select field
*/
style?: React.CSSProperties;
}
+1
View File
@@ -30,3 +30,4 @@
@import '../components/Link/styles.css';
@import '../components/Tooltip/Tooltip.styles.css';
@import '../components/ScrollArea/ScrollArea.styles.css';
@import '../components/Select/Select.styles.css';
+1
View File
@@ -41,6 +41,7 @@ export * from './components/TextField';
export * from './components/Tooltip';
export * from './components/Menu';
export * from './components/ScrollArea';
export * from './components/Select';
// Types
export * from './types';
+16
View File
@@ -1,5 +1,21 @@
# @backstage/cli
## 0.32.0-next.1
### Patch Changes
- Updated dependencies
- @backstage/integration@1.16.3-next.0
- @backstage/catalog-model@1.7.3
- @backstage/cli-common@0.1.15
- @backstage/cli-node@0.2.13
- @backstage/config@1.3.2
- @backstage/config-loader@1.10.0
- @backstage/errors@1.2.7
- @backstage/eslint-plugin@0.1.10
- @backstage/release-manifests@0.0.12
- @backstage/types@1.2.1
## 0.32.0-next.0
### Minor Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/cli",
"version": "0.32.0-next.0",
"version": "0.32.0-next.1",
"description": "CLI for developing Backstage plugins and apps",
"backstage": {
"role": "cli"
+10
View File
@@ -1,5 +1,15 @@
# @backstage/core-compat-api
## 0.4.1-next.1
### Patch Changes
- Updated dependencies
- @backstage/frontend-plugin-api@0.10.1-next.0
- @backstage/plugin-catalog-react@1.16.1-next.1
- @backstage/core-plugin-api@1.10.5
- @backstage/version-bridge@1.0.11
## 0.4.1-next.0
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/core-compat-api",
"version": "0.4.1-next.0",
"version": "0.4.1-next.1",
"backstage": {
"role": "web-library"
},
+12
View File
@@ -1,5 +1,17 @@
# @backstage/core-components
## 0.17.1-next.0
### Patch Changes
- 5d7bad4: Fixed the messaging in the `AlertDisplay` where it was claiming that there were older messages available rather than newer.
- Updated dependencies
- @backstage/config@1.3.2
- @backstage/core-plugin-api@1.10.5
- @backstage/errors@1.2.7
- @backstage/theme@0.6.4
- @backstage/version-bridge@1.0.11
## 0.17.0
### Minor Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/core-components",
"version": "0.17.0",
"version": "0.17.1-next.0",
"description": "Core components used by Backstage plugins and apps",
"backstage": {
"role": "web-library"
+8
View File
@@ -1,5 +1,13 @@
# @backstage/create-app
## 0.6.1-next.1
### Patch Changes
- Bumped create-app version.
- Updated dependencies
- @backstage/cli-common@0.1.15
## 0.6.1-next.0
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/create-app",
"version": "0.6.1-next.0",
"version": "0.6.1-next.1",
"description": "A CLI that helps you create your own Backstage app",
"backstage": {
"role": "cli"
+14
View File
@@ -1,5 +1,19 @@
# @backstage/dev-utils
## 1.1.9-next.1
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.17.1-next.0
- @backstage/integration-react@1.2.6-next.0
- @backstage/app-defaults@1.6.1-next.0
- @backstage/plugin-catalog-react@1.16.1-next.1
- @backstage/catalog-model@1.7.3
- @backstage/core-app-api@1.16.0
- @backstage/core-plugin-api@1.10.5
- @backstage/theme@0.6.4
## 1.1.9-next.0
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/dev-utils",
"version": "1.1.9-next.0",
"version": "1.1.9-next.1",
"description": "Utilities for developing Backstage plugins.",
"backstage": {
"role": "web-library"
+9
View File
@@ -1,5 +1,14 @@
# e2e-test
## 0.2.27-next.1
### Patch Changes
- Updated dependencies
- @backstage/create-app@0.6.1-next.1
- @backstage/cli-common@0.1.15
- @backstage/errors@1.2.7
## 0.2.27-next.0
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "e2e-test",
"version": "0.2.27-next.0",
"version": "0.2.27-next.1",
"description": "E2E test for verifying Backstage packages",
"backstage": {
"role": "cli"
+14
View File
@@ -1,5 +1,19 @@
# @backstage/frontend-app-api
## 0.11.1-next.0
### Patch Changes
- Updated dependencies
- @backstage/frontend-plugin-api@0.10.1-next.0
- @backstage/frontend-defaults@0.2.1-next.0
- @backstage/config@1.3.2
- @backstage/core-app-api@1.16.0
- @backstage/core-plugin-api@1.10.5
- @backstage/errors@1.2.7
- @backstage/types@1.2.1
- @backstage/version-bridge@1.0.11
## 0.11.0
### Minor Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/frontend-app-api",
"version": "0.11.0",
"version": "0.11.1-next.0",
"backstage": {
"role": "web-library"
},
+11
View File
@@ -1,5 +1,16 @@
# @backstage/frontend-defaults
## 0.2.1-next.0
### Patch Changes
- Updated dependencies
- @backstage/frontend-plugin-api@0.10.1-next.0
- @backstage/plugin-app@0.1.8-next.0
- @backstage/frontend-app-api@0.11.1-next.0
- @backstage/config@1.3.2
- @backstage/errors@1.2.7
## 0.2.0
### Minor Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/frontend-defaults",
"version": "0.2.0",
"version": "0.2.1-next.0",
"backstage": {
"role": "web-library"
},
+9
View File
@@ -1,5 +1,14 @@
# @internal/frontend
## 0.0.8-next.0
### Patch Changes
- Updated dependencies
- @backstage/frontend-plugin-api@0.10.1-next.0
- @backstage/types@1.2.1
- @backstage/version-bridge@1.0.11
## 0.0.7
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@internal/frontend",
"version": "0.0.7",
"version": "0.0.8-next.0",
"backstage": {
"role": "web-library",
"inline": true
+10
View File
@@ -1,5 +1,15 @@
# @backstage/frontend-plugin-api
## 0.10.1-next.0
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.17.1-next.0
- @backstage/core-plugin-api@1.10.5
- @backstage/types@1.2.1
- @backstage/version-bridge@1.0.11
## 0.10.0
### Minor Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/frontend-plugin-api",
"version": "0.10.0",
"version": "0.10.1-next.0",
"backstage": {
"role": "web-library"
},
+13
View File
@@ -1,5 +1,18 @@
# @backstage/frontend-test-utils
## 0.3.1-next.0
### Patch Changes
- Updated dependencies
- @backstage/frontend-plugin-api@0.10.1-next.0
- @backstage/plugin-app@0.1.8-next.0
- @backstage/frontend-app-api@0.11.1-next.0
- @backstage/config@1.3.2
- @backstage/test-utils@1.7.6
- @backstage/types@1.2.1
- @backstage/version-bridge@1.0.11
## 0.3.0
### Minor Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/frontend-test-utils",
"version": "0.3.0",
"version": "0.3.1-next.0",
"backstage": {
"role": "web-library"
},
+10
View File
@@ -1,5 +1,15 @@
# @backstage/integration-react
## 1.2.6-next.0
### Patch Changes
- 5d10f99: Added scope `project` for Bitbucket Cloud.
- Updated dependencies
- @backstage/integration@1.16.3-next.0
- @backstage/config@1.3.2
- @backstage/core-plugin-api@1.10.5
## 1.2.5
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/integration-react",
"version": "1.2.5",
"version": "1.2.6-next.0",
"description": "Frontend package for managing integrations towards external systems",
"backstage": {
"role": "web-library"
+9
View File
@@ -1,5 +1,14 @@
# @backstage/integration
## 1.16.3-next.0
### Patch Changes
- 9768992: Mark GitHub `webhookSecret` config property as optional. A `webhookSecret` is not required when creating a GitHub App.
- Updated dependencies
- @backstage/config@1.3.2
- @backstage/errors@1.2.7
## 1.16.2
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/integration",
"version": "1.16.2",
"version": "1.16.3-next.0",
"description": "Helpers for managing integrations towards external systems",
"backstage": {
"role": "common-library"
@@ -1,5 +1,13 @@
# @internal/scaffolder
## 0.0.8-next.1
### Patch Changes
- Updated dependencies
- @backstage/frontend-plugin-api@0.10.1-next.0
- @backstage/plugin-scaffolder-react@1.15.0-next.1
## 0.0.8-next.0
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@internal/scaffolder",
"version": "0.0.8-next.0",
"version": "0.0.8-next.1",
"backstage": {
"role": "web-library",
"inline": true
@@ -1,5 +1,24 @@
# techdocs-cli-embedded-app
## 0.2.107-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-techdocs-react@1.2.16-next.0
- @backstage/core-components@0.17.1-next.0
- @backstage/integration-react@1.2.6-next.0
- @backstage/plugin-techdocs@1.12.5-next.1
- @backstage/app-defaults@1.6.1-next.0
- @backstage/cli@0.32.0-next.1
- @backstage/plugin-catalog@1.29.0-next.1
- @backstage/catalog-model@1.7.3
- @backstage/config@1.3.2
- @backstage/core-app-api@1.16.0
- @backstage/core-plugin-api@1.10.5
- @backstage/test-utils@1.7.6
- @backstage/theme@0.6.4
## 0.2.107-next.0
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "techdocs-cli-embedded-app",
"version": "0.2.107-next.0",
"version": "0.2.107-next.1",
"backstage": {
"role": "frontend"
},
+11
View File
@@ -1,5 +1,16 @@
# @techdocs/cli
## 1.9.2-next.1
### Patch Changes
- Updated dependencies
- @backstage/backend-defaults@0.9.0-next.1
- @backstage/plugin-techdocs-node@1.13.2-next.1
- @backstage/catalog-model@1.7.3
- @backstage/cli-common@0.1.15
- @backstage/config@1.3.2
## 1.9.2-next.0
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@techdocs/cli",
"version": "1.9.2-next.0",
"version": "1.9.2-next.1",
"description": "Utility CLI for managing TechDocs sites in Backstage.",
"backstage": {
"role": "cli"
+15
View File
@@ -1,5 +1,20 @@
# @backstage/plugin-api-docs
## 0.12.6-next.1
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.17.1-next.0
- @backstage/frontend-plugin-api@0.10.1-next.0
- @backstage/plugin-catalog@1.29.0-next.1
- @backstage/plugin-catalog-react@1.16.1-next.1
- @backstage/core-compat-api@0.4.1-next.1
- @backstage/catalog-model@1.7.3
- @backstage/core-plugin-api@1.10.5
- @backstage/plugin-catalog-common@1.1.3
- @backstage/plugin-permission-react@0.4.32
## 0.12.6-next.0
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-api-docs",
"version": "0.12.6-next.0",
"version": "0.12.6-next.1",
"description": "A Backstage plugin that helps represent API entities in the frontend",
"backstage": {
"role": "frontend-plugin",
+9
View File
@@ -1,5 +1,14 @@
# @backstage/plugin-app-visualizer
## 0.1.18-next.0
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.17.1-next.0
- @backstage/frontend-plugin-api@0.10.1-next.0
- @backstage/core-plugin-api@1.10.5
## 0.1.17
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-app-visualizer",
"version": "0.1.17",
"version": "0.1.18-next.0",
"description": "Visualizes the Backstage app structure",
"backstage": {
"role": "frontend-plugin",
+13
View File
@@ -1,5 +1,18 @@
# @backstage/plugin-app
## 0.1.8-next.0
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.17.1-next.0
- @backstage/integration-react@1.2.6-next.0
- @backstage/frontend-plugin-api@0.10.1-next.0
- @backstage/core-plugin-api@1.10.5
- @backstage/theme@0.6.4
- @backstage/types@1.2.1
- @backstage/plugin-permission-react@0.4.32
## 0.1.7
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-app",
"version": "0.1.7",
"version": "0.1.8-next.0",
"backstage": {
"role": "frontend-plugin",
"pluginId": "app",
@@ -1,5 +1,15 @@
# @backstage/plugin-auth-backend-module-aws-alb-provider
## 0.4.2-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-backend@0.24.5-next.1
- @backstage/plugin-auth-node@0.6.1
- @backstage/backend-plugin-api@1.2.1
- @backstage/errors@1.2.7
## 0.4.2-next.0
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend-module-aws-alb-provider",
"version": "0.4.2-next.0",
"version": "0.4.2-next.1",
"description": "The aws-alb provider module for the Backstage auth backend.",
"backstage": {
"role": "backend-plugin-module",
@@ -1,5 +1,14 @@
# @backstage/plugin-auth-backend-module-bitbucket-provider
## 0.3.2-next.0
### Patch Changes
- 5d10f99: Enabled persistency of scopes for Bitbucket Cloud.
- Updated dependencies
- @backstage/plugin-auth-node@0.6.1
- @backstage/backend-plugin-api@1.2.1
## 0.3.1
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend-module-bitbucket-provider",
"version": "0.3.1",
"version": "0.3.2-next.0",
"description": "The bitbucket-provider backend module for the auth plugin.",
"backstage": {
"role": "backend-plugin-module",
@@ -1,5 +1,16 @@
# @backstage/plugin-auth-backend-module-oidc-provider
## 0.4.2-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-backend@0.24.5-next.1
- @backstage/plugin-auth-node@0.6.1
- @backstage/backend-plugin-api@1.2.1
- @backstage/config@1.3.2
- @backstage/types@1.2.1
## 0.4.2-next.0
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend-module-oidc-provider",
"version": "0.4.2-next.0",
"version": "0.4.2-next.1",
"description": "The oidc-provider backend module for the auth plugin.",
"backstage": {
"role": "backend-plugin-module",
+31
View File
@@ -1,5 +1,36 @@
# @backstage/plugin-auth-backend
## 0.24.5-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-auth-backend-module-bitbucket-provider@0.3.2-next.0
- @backstage/plugin-auth-backend-module-atlassian-provider@0.4.1
- @backstage/plugin-auth-backend-module-auth0-provider@0.2.1
- @backstage/plugin-auth-backend-module-aws-alb-provider@0.4.2-next.1
- @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.6
- @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.2.1
- @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.4.1
- @backstage/plugin-auth-backend-module-github-provider@0.3.1
- @backstage/plugin-auth-backend-module-gitlab-provider@0.3.1
- @backstage/plugin-auth-backend-module-google-provider@0.3.1
- @backstage/plugin-auth-backend-module-microsoft-provider@0.3.1
- @backstage/plugin-auth-backend-module-oauth2-provider@0.4.1
- @backstage/plugin-auth-backend-module-oidc-provider@0.4.2-next.1
- @backstage/plugin-auth-backend-module-okta-provider@0.2.1
- @backstage/plugin-auth-backend-module-onelogin-provider@0.3.1
- @backstage/plugin-auth-node@0.6.1
- @backstage/backend-plugin-api@1.2.1
- @backstage/catalog-client@1.9.1
- @backstage/catalog-model@1.7.3
- @backstage/config@1.3.2
- @backstage/errors@1.2.7
- @backstage/types@1.2.1
- @backstage/plugin-auth-backend-module-gcp-iap-provider@0.4.1
- @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.6
- @backstage/plugin-catalog-node@1.16.1
## 0.24.5-next.0
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend",
"version": "0.24.5-next.0",
"version": "0.24.5-next.1",
"description": "A Backstage backend plugin that handles authentication",
"backstage": {
"role": "backend-plugin",
+9
View File
@@ -1,5 +1,14 @@
# @backstage/plugin-auth-react
## 0.1.14-next.0
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.17.1-next.0
- @backstage/core-plugin-api@1.10.5
- @backstage/errors@1.2.7
## 0.1.13
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-react",
"version": "0.1.13",
"version": "0.1.14-next.0",
"description": "Web library for the auth plugin",
"backstage": {
"role": "web-library",
@@ -1,5 +1,12 @@
# @backstage/plugin-bitbucket-cloud-common
## 0.2.29-next.0
### Patch Changes
- Updated dependencies
- @backstage/integration@1.16.3-next.0
## 0.2.28
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-bitbucket-cloud-common",
"version": "0.2.28",
"version": "0.2.29-next.0",
"description": "Common functionalities for bitbucket-cloud plugins",
"backstage": {
"role": "common-library",
@@ -1,5 +1,21 @@
# @backstage/plugin-catalog-backend-module-aws
## 0.4.10-next.1
### Patch Changes
- Updated dependencies
- @backstage/integration@1.16.3-next.0
- @backstage/backend-defaults@0.9.0-next.1
- @backstage/backend-plugin-api@1.2.1
- @backstage/catalog-model@1.7.3
- @backstage/config@1.3.2
- @backstage/errors@1.2.7
- @backstage/integration-aws-node@0.1.15
- @backstage/plugin-catalog-common@1.1.3
- @backstage/plugin-catalog-node@1.16.1
- @backstage/plugin-kubernetes-common@0.9.4
## 0.4.10-next.0
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-aws",
"version": "0.4.10-next.0",
"version": "0.4.10-next.1",
"description": "A Backstage catalog backend module that helps integrate towards AWS",
"backstage": {
"role": "backend-plugin-module",
@@ -1,5 +1,16 @@
# @backstage/plugin-catalog-backend-module-azure
## 0.3.4-next.0
### Patch Changes
- Updated dependencies
- @backstage/integration@1.16.3-next.0
- @backstage/backend-plugin-api@1.2.1
- @backstage/config@1.3.2
- @backstage/plugin-catalog-common@1.1.3
- @backstage/plugin-catalog-node@1.16.1
## 0.3.3
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-azure",
"version": "0.3.3",
"version": "0.3.4-next.0",
"description": "A Backstage catalog backend module that helps integrate towards Azure",
"backstage": {
"role": "backend-plugin-module",
@@ -1,5 +1,21 @@
# @backstage/plugin-catalog-backend-module-bitbucket-cloud
## 0.4.7-next.0
### Patch Changes
- 146e41b: Fixed bug in event-based discovery that caused unnecessary API calls to Bitbucket Cloud
- Updated dependencies
- @backstage/integration@1.16.3-next.0
- @backstage/plugin-bitbucket-cloud-common@0.2.29-next.0
- @backstage/backend-plugin-api@1.2.1
- @backstage/catalog-client@1.9.1
- @backstage/catalog-model@1.7.3
- @backstage/config@1.3.2
- @backstage/plugin-catalog-common@1.1.3
- @backstage/plugin-catalog-node@1.16.1
- @backstage/plugin-events-node@0.4.9
## 0.4.6
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-bitbucket-cloud",
"version": "0.4.6",
"version": "0.4.7-next.0",
"description": "A Backstage catalog backend module that helps integrate towards Bitbucket Cloud",
"backstage": {
"role": "backend-plugin-module",
@@ -1,5 +1,24 @@
# @backstage/plugin-catalog-backend-module-bitbucket-server
## 0.4.0-next.0
### Minor Changes
- 7b3ed9b: Added the ability for the plugin to receive events coming from Bitbucket Server push webhooks. It then performs a delta mutation on the catalog.
### Patch Changes
- Updated dependencies
- @backstage/integration@1.16.3-next.0
- @backstage/backend-plugin-api@1.2.1
- @backstage/catalog-client@1.9.1
- @backstage/catalog-model@1.7.3
- @backstage/config@1.3.2
- @backstage/errors@1.2.7
- @backstage/plugin-catalog-common@1.1.3
- @backstage/plugin-catalog-node@1.16.1
- @backstage/plugin-events-node@0.4.9
## 0.3.3
### Patch Changes

Some files were not shown because too many files have changed in this diff Show More