,
@@ -51,19 +36,22 @@ export interface ComponentConfig<
propDefs: { [K in keyof P]: PropDefConfig };
// readonly for compatibility with const inference from factory
utilityProps?: readonly UtilityPropKey[];
- bg?: BgConfig;
+ /**
+ * How this component participates in the bg system.
+ *
+ * - `'provider'` — calls `useBgProvider`, sets `data-bg`, wraps children in `BgProvider`
+ * - `'consumer'` — calls `useBgConsumer`, sets `data-on-bg`
+ */
+ bg?: 'provider' | 'consumer';
}
/**
* Type constraint that validates bg props are present in the props type.
- * - Provider-only components must include 'bg' in their props
- * - Provider+consumer components (e.g. Card) don't need a bg prop (they auto-increment)
- * - Consumer-only components don't need a bg prop
+ * - Provider components must include 'bg' in their props
+ * - Consumer components don't need a bg prop
*/
-export type BgPropsConstraint
= Bg extends { provider: true }
- ? Bg extends { consumer: true }
- ? {} // provider+consumer: bg prop is optional (auto-increment via defaultBg)
- : 'bg' extends keyof P
+export type BgPropsConstraint
= Bg extends 'provider'
+ ? 'bg' extends keyof P
? {}
: {
__error: 'Bg provider components must include bg in props type.';
@@ -93,11 +81,10 @@ type ResolvedOwnProps<
[K in keyof PropDefs & keyof P]: ResolvePropType
;
};
-type ChildrenProps = Bg extends {
- provider: true;
-}
- ? { bgChildren: ReactNode; children?: never }
- : { children: ReactNode; bgChildren?: never };
+type ChildrenProps =
+ Bg extends 'provider'
+ ? { childrenWithBgProvider: ReactNode; children?: never }
+ : { children: ReactNode; childrenWithBgProvider?: never };
type DataAttributeKeys = {
[K in keyof PropDefs]: PropDefs[K] extends { dataAttribute: true }
diff --git a/packages/ui/src/hooks/useDefinition/useDefinition.tsx b/packages/ui/src/hooks/useDefinition/useDefinition.tsx
index 15817a754c..d1fe9af96c 100644
--- a/packages/ui/src/hooks/useDefinition/useDefinition.tsx
+++ b/packages/ui/src/hooks/useDefinition/useDefinition.tsx
@@ -36,14 +36,10 @@ export function useDefinition<
): UseDefinitionResult {
const { breakpoint } = useBreakpoint();
- // Resolve the effective bg value: use the bg prop if provided,
- // otherwise fall back to the defaultBg from the bg config
- const effectiveBg = definition.bg?.provider
- ? props.bg ?? definition.bg.defaultBg
- : undefined;
-
// Provider: resolve bg and provide context for children
- const providerBg = useBgProvider(effectiveBg);
+ const providerBg = useBgProvider(
+ definition.bg === 'provider' ? props.bg : undefined,
+ );
// Consumer: read parent context bg
const consumerBg = useBgConsumer();
@@ -74,7 +70,7 @@ export function useDefinition<
ownPropsResolved[key] = finalValue;
// Skip data-bg for bg prop when the provider path handles it
- if (key === 'bg' && definition.bg?.provider) continue;
+ if (key === 'bg' && definition.bg === 'provider') continue;
if ((config as any).dataAttribute) {
// eslint-disable-next-line no-restricted-syntax
@@ -83,17 +79,13 @@ export function useDefinition<
}
}
- // Provider-only: set data-bg (provider+consumer components use data-on-bg instead)
- if (
- definition.bg?.provider &&
- !definition.bg?.consumer &&
- providerBg.bg !== undefined
- ) {
+ // Provider: set data-bg from the resolved provider bg
+ if (definition.bg === 'provider' && providerBg.bg !== undefined) {
dataAttributes['data-bg'] = String(providerBg.bg);
}
// Consumer: set data-on-bg from the parent context
- if (definition.bg?.consumer && consumerBg.bg !== undefined) {
+ if (definition.bg === 'consumer' && consumerBg.bg !== undefined) {
dataAttributes['data-on-bg'] = String(consumerBg.bg);
}
@@ -117,10 +109,10 @@ export function useDefinition<
}
let children: ReactNode | undefined;
- let bgChildren: ReactNode | undefined;
+ let childrenWithBgProvider: ReactNode | undefined;
- if (definition.bg?.provider) {
- bgChildren = providerBg.bg ? (
+ if (definition.bg === 'provider') {
+ childrenWithBgProvider = providerBg.bg ? (
{props.children}
) : (
props.children
@@ -133,7 +125,9 @@ export function useDefinition<
ownProps: {
classes,
...ownPropsResolved,
- ...(definition.bg?.provider ? { bgChildren } : { children }),
+ ...(definition.bg === 'provider'
+ ? { childrenWithBgProvider }
+ : { children }),
},
restProps,
dataAttributes,