diff --git a/.changeset/odd-ears-grab.md b/.changeset/odd-ears-grab.md new file mode 100644 index 0000000000..a683f3e6f5 --- /dev/null +++ b/.changeset/odd-ears-grab.md @@ -0,0 +1,7 @@ +--- +'@backstage/ui': patch +--- + +The `Select` trigger now automatically adapts its background colour based on the parent background context. + +**Affected components:** Select diff --git a/packages/ui/src/components/Select/Select.module.css b/packages/ui/src/components/Select/Select.module.css index 8ceaa2528e..74801de1a9 100644 --- a/packages/ui/src/components/Select/Select.module.css +++ b/packages/ui/src/components/Select/Select.module.css @@ -35,8 +35,26 @@ .bui-SelectTrigger { box-sizing: border-box; border-radius: var(--bui-radius-3); - border: 1px solid var(--bui-border-2); + border: none; + outline: none; background-color: var(--bui-bg-neutral-1); + transition: box-shadow 0.2s ease-in-out; + + &[data-on-bg='neutral-1'] { + background-color: var(--bui-bg-neutral-2); + } + + &[data-on-bg='neutral-2'] { + background-color: var(--bui-bg-neutral-3); + } + + &[data-on-bg='neutral-3'] { + background-color: var(--bui-bg-neutral-4); + } + + .bui-Select[data-focused] & { + box-shadow: inset 0 0 0 1px var(--bui-ring); + } display: flex; justify-content: space-between; align-items: center; @@ -73,12 +91,7 @@ } .bui-Select[data-invalid] & { - border-color: var(--bui-fg-danger); - - &:focus-visible, - &:hover { - outline: 1px solid var(--bui-fg-danger); - } + box-shadow: inset 0 0 0 1px var(--bui-border-danger); } &[disabled] { @@ -119,6 +132,8 @@ .bui-SelectList { overflow: auto; min-height: 0; + padding-block: var(--bui-space-1); + padding-inline: var(--bui-space-1); &:focus-visible { /* Remove default focus-visible outline because React Aria @@ -132,7 +147,6 @@ .bui-SelectItem { box-sizing: border-box; position: relative; - width: var(--anchor-width); display: grid; grid-template-areas: 'icon text'; grid-template-columns: 1rem 1fr; @@ -147,20 +161,10 @@ font-size: var(--bui-font-size-3); gap: var(--bui-space-2); outline: none; + border-radius: var(--bui-radius-2); - &[data-focus-visible] { - outline: 2px solid var(--bui-ring); - outline-offset: 2px; - } - - &[data-focused]::before { - content: ''; - position: absolute; - inset-block: 0; - inset-inline: var(--bui-space-1); - border-radius: var(--bui-radius-2); - background: var(--bui-bg-neutral-2); - z-index: -1; + &[data-focused] { + background-color: var(--bui-bg-neutral-2); } &[data-disabled] { diff --git a/packages/ui/src/components/Select/Select.stories.tsx b/packages/ui/src/components/Select/Select.stories.tsx index e3c2ad41aa..cf410e43a1 100644 --- a/packages/ui/src/components/Select/Select.stories.tsx +++ b/packages/ui/src/components/Select/Select.stories.tsx @@ -17,6 +17,8 @@ import preview from '../../../../../.storybook/preview'; import { Select } from './Select'; import { Flex } from '../Flex'; +import { Box } from '../Box'; +import { Text } from '../Text'; import { Form } from 'react-aria-components'; import { RiCloudLine } from '@remixicon/react'; @@ -391,6 +393,41 @@ export const WithLongNamesAndPadding = meta.story({ ], }); +export const AutoBg = meta.story({ + render: () => ( + + + Select automatically detects its parent bg context and increments the + neutral level by 1. No prop is needed — it's fully automatic. + + + Neutral 1 container + + + + + + + Neutral 2 container + + + + + + + + + Neutral 3 container + + + + + + + + ), +}); + export const WithAccessibilityProps = meta.story({ args: { ...Default.input.args, diff --git a/packages/ui/src/components/Select/SelectTrigger.tsx b/packages/ui/src/components/Select/SelectTrigger.tsx index 1585ac36ab..ddb7601fa7 100644 --- a/packages/ui/src/components/Select/SelectTrigger.tsx +++ b/packages/ui/src/components/Select/SelectTrigger.tsx @@ -25,11 +25,14 @@ interface SelectTriggerProps { } export function SelectTrigger(props: SelectTriggerProps) { - const { ownProps } = useDefinition(SelectTriggerDefinition, props); + const { ownProps, dataAttributes } = useDefinition( + SelectTriggerDefinition, + props, + ); const { classes, icon } = ownProps; return ( - + {icon} diff --git a/packages/ui/src/components/Select/definition.ts b/packages/ui/src/components/Select/definition.ts index 2a15733c5e..937e015098 100644 --- a/packages/ui/src/components/Select/definition.ts +++ b/packages/ui/src/components/Select/definition.ts @@ -59,6 +59,7 @@ export const SelectTriggerDefinition = defineComponent()( chevron: 'bui-SelectTriggerChevron', value: 'bui-SelectValue', }, + bg: 'consumer', propDefs: { icon: {}, },