diff --git a/.changeset/blue-moons-crash.md b/.changeset/blue-moons-crash.md new file mode 100644 index 0000000000..31244cc870 --- /dev/null +++ b/.changeset/blue-moons-crash.md @@ -0,0 +1,5 @@ +--- +'@backstage/ui': patch +--- + +Made Accordion a bg provider so nested components like Button auto-increment their background level. Updated `useDefinition` to resolve bg propDef defaults for provider components. diff --git a/packages/ui/report.api.md b/packages/ui/report.api.md index c80da62db9..14283ed1b4 100644 --- a/packages/ui/report.api.md +++ b/packages/ui/report.api.md @@ -72,8 +72,13 @@ export const AccordionDefinition: { readonly classNames: { readonly root: 'bui-Accordion'; }; - readonly bg: 'consumer'; + readonly bg: 'provider'; readonly propDefs: { + readonly bg: { + readonly dataAttribute: true; + readonly default: 'neutral-auto'; + }; + readonly children: {}; readonly className: {}; }; }; @@ -112,6 +117,8 @@ export interface AccordionGroupProps // @public export type AccordionOwnProps = { + bg?: ProviderBg; + children?: ReactNode; className?: string; }; @@ -145,7 +152,7 @@ export interface AccordionPanelProps // @public export interface AccordionProps - extends Omit, + extends Omit, AccordionOwnProps {} // @public (undocumented) diff --git a/packages/ui/src/components/Accordion/Accordion.module.css b/packages/ui/src/components/Accordion/Accordion.module.css index cef40a6744..23b527c2e7 100644 --- a/packages/ui/src/components/Accordion/Accordion.module.css +++ b/packages/ui/src/components/Accordion/Accordion.module.css @@ -19,21 +19,20 @@ @layer components { .bui-Accordion { width: 100%; - background-color: var(--bui-bg-neutral-1); border-radius: var(--bui-radius-3); padding: var(--bui-space-3); - &[data-on-bg='neutral-1'] { + &[data-bg='neutral-1'] { + background-color: var(--bui-bg-neutral-1); + } + + &[data-bg='neutral-2'] { background-color: var(--bui-bg-neutral-2); } - &[data-on-bg='neutral-2'] { + &[data-bg='neutral-3'] { background-color: var(--bui-bg-neutral-3); } - - &[data-on-bg='neutral-3'] { - background-color: var(--bui-bg-neutral-4); - } } .bui-AccordionTrigger { diff --git a/packages/ui/src/components/Accordion/Accordion.stories.tsx b/packages/ui/src/components/Accordion/Accordion.stories.tsx index f87c36e5bc..b88b547e08 100644 --- a/packages/ui/src/components/Accordion/Accordion.stories.tsx +++ b/packages/ui/src/components/Accordion/Accordion.stories.tsx @@ -21,6 +21,7 @@ import { AccordionGroup, } from './Accordion'; import { Box } from '../Box'; +import { Button } from '../Button'; import { Flex } from '../Flex'; import { Text } from '../Text'; @@ -187,6 +188,10 @@ export const AutoBg = meta.story({ + + + + @@ -197,6 +202,10 @@ export const AutoBg = meta.story({ + + + + @@ -208,6 +217,10 @@ export const AutoBg = meta.story({ + + + + @@ -216,9 +229,13 @@ export const AutoBg = meta.story({ Neutral 3 container - + + + + + diff --git a/packages/ui/src/components/Accordion/Accordion.tsx b/packages/ui/src/components/Accordion/Accordion.tsx index 101a2d16c0..1a1eb2f2c8 100644 --- a/packages/ui/src/components/Accordion/Accordion.tsx +++ b/packages/ui/src/components/Accordion/Accordion.tsx @@ -45,7 +45,7 @@ export const Accordion = forwardRef( AccordionDefinition, props, ); - const { classes } = ownProps; + const { classes, childrenWithBgProvider } = ownProps; return ( + > + {childrenWithBgProvider} + ); }, ); diff --git a/packages/ui/src/components/Accordion/definition.ts b/packages/ui/src/components/Accordion/definition.ts index 4c525e3cc6..69ef9be3a7 100644 --- a/packages/ui/src/components/Accordion/definition.ts +++ b/packages/ui/src/components/Accordion/definition.ts @@ -32,8 +32,10 @@ export const AccordionDefinition = defineComponent()({ classNames: { root: 'bui-Accordion', }, - bg: 'consumer', + bg: 'provider', propDefs: { + bg: { dataAttribute: true, default: 'neutral-auto' }, + children: {}, className: {}, }, }); diff --git a/packages/ui/src/components/Accordion/types.ts b/packages/ui/src/components/Accordion/types.ts index 9afc2f9a3f..8895b79086 100644 --- a/packages/ui/src/components/Accordion/types.ts +++ b/packages/ui/src/components/Accordion/types.ts @@ -21,12 +21,15 @@ import type { DisclosurePanelProps as RADisclosurePanelProps, DisclosureGroupProps as RADisclosureGroupProps, } from 'react-aria-components'; +import type { ProviderBg } from '../../types'; /** * Own props for the Accordion component. * @public */ export type AccordionOwnProps = { + bg?: ProviderBg; + children?: ReactNode; className?: string; }; @@ -35,7 +38,7 @@ export type AccordionOwnProps = { * @public */ export interface AccordionProps - extends Omit, + extends Omit, AccordionOwnProps {} /** diff --git a/packages/ui/src/hooks/useDefinition/useDefinition.tsx b/packages/ui/src/hooks/useDefinition/useDefinition.tsx index d1fe9af96c..1ccf5ee5a4 100644 --- a/packages/ui/src/hooks/useDefinition/useDefinition.tsx +++ b/packages/ui/src/hooks/useDefinition/useDefinition.tsx @@ -38,7 +38,9 @@ export function useDefinition< // Provider: resolve bg and provide context for children const providerBg = useBgProvider( - definition.bg === 'provider' ? props.bg : undefined, + definition.bg === 'provider' + ? props.bg ?? (definition.propDefs as any).bg?.default + : undefined, ); // Consumer: read parent context bg