diff --git a/change/@fluentui-react-message-bar-b0ba04c4-c297-4a33-a27b-3222459bc266.json b/change/@fluentui-react-message-bar-b0ba04c4-c297-4a33-a27b-3222459bc266.json new file mode 100644 index 0000000000000..4e7ab3518e696 --- /dev/null +++ b/change/@fluentui-react-message-bar-b0ba04c4-c297-4a33-a27b-3222459bc266.json @@ -0,0 +1,7 @@ +{ + "type": "minor", + "comment": "feat: add base state hooks for MessageBar components", + "packageName": "@fluentui/react-message-bar", + "email": "copilot@github.com", + "dependentChangeType": "patch" +} diff --git a/packages/react-components/react-message-bar/library/src/MessageBar.ts b/packages/react-components/react-message-bar/library/src/MessageBar.ts index ffb91018f6786..3e567fa75574d 100644 --- a/packages/react-components/react-message-bar/library/src/MessageBar.ts +++ b/packages/react-components/react-message-bar/library/src/MessageBar.ts @@ -1,4 +1,6 @@ export type { + MessageBarBaseProps, + MessageBarBaseState, MessageBarContextValues, MessageBarIntent, MessageBarProps, @@ -9,6 +11,7 @@ export { MessageBar, messageBarClassNames, renderMessageBar_unstable, + useMessageBarBase_unstable, useMessageBarContextValue_unstable, useMessageBarStyles_unstable, useMessageBar_unstable, diff --git a/packages/react-components/react-message-bar/library/src/MessageBarActions.ts b/packages/react-components/react-message-bar/library/src/MessageBarActions.ts index 45a9abf9ef58b..ce68e3ec2bcdf 100644 --- a/packages/react-components/react-message-bar/library/src/MessageBarActions.ts +++ b/packages/react-components/react-message-bar/library/src/MessageBarActions.ts @@ -1,4 +1,6 @@ export type { + MessageBarActionsBaseProps, + MessageBarActionsBaseState, MessageBarActionsContextValues, MessageBarActionsProps, MessageBarActionsSlots, @@ -8,6 +10,7 @@ export { MessageBarActions, messageBarActionsClassNames, renderMessageBarActions_unstable, + useMessageBarActionsBase_unstable, useMessageBarActionsContextValue_unstable, useMessageBarActionsStyles_unstable, useMessageBarActions_unstable, diff --git a/packages/react-components/react-message-bar/library/src/MessageBarBody.ts b/packages/react-components/react-message-bar/library/src/MessageBarBody.ts index 6b36a72d2517b..674d571d97636 100644 --- a/packages/react-components/react-message-bar/library/src/MessageBarBody.ts +++ b/packages/react-components/react-message-bar/library/src/MessageBarBody.ts @@ -1,4 +1,6 @@ export type { + MessageBarBodyBaseProps, + MessageBarBodyBaseState, MessageBarBodyContextValues, MessageBarBodyProps, MessageBarBodySlots, @@ -8,6 +10,7 @@ export { MessageBarBody, messageBarBodyClassNames, renderMessageBarBody_unstable, + useMessageBarBodyBase_unstable, useMessageBarBodyStyles_unstable, useMessageBarBody_unstable, } from './components/MessageBarBody/index'; diff --git a/packages/react-components/react-message-bar/library/src/MessageBarGroup.ts b/packages/react-components/react-message-bar/library/src/MessageBarGroup.ts index 3a9869f3cdebe..5795a75185e91 100644 --- a/packages/react-components/react-message-bar/library/src/MessageBarGroup.ts +++ b/packages/react-components/react-message-bar/library/src/MessageBarGroup.ts @@ -1,4 +1,6 @@ export type { + MessageBarGroupBaseProps, + MessageBarGroupBaseState, MessageBarGroupProps, MessageBarGroupSlots, MessageBarGroupState, @@ -7,6 +9,8 @@ export { MessageBarGroup, messageBarGroupClassNames, renderMessageBarGroup_unstable, + renderMessageBarGroupBase_unstable, + useMessageBarGroupBase_unstable, useMessageBarGroupStyles_unstable, useMessageBarGroup_unstable, } from './components/MessageBarGroup/index'; diff --git a/packages/react-components/react-message-bar/library/src/MessageBarTitle.ts b/packages/react-components/react-message-bar/library/src/MessageBarTitle.ts index 2de5394587fa9..94a35519b070e 100644 --- a/packages/react-components/react-message-bar/library/src/MessageBarTitle.ts +++ b/packages/react-components/react-message-bar/library/src/MessageBarTitle.ts @@ -1,4 +1,6 @@ export type { + MessageBarTitleBaseProps, + MessageBarTitleBaseState, MessageBarTitleProps, MessageBarTitleSlots, MessageBarTitleState, @@ -7,6 +9,7 @@ export { MessageBarTitle, messageBarTitleClassNames, renderMessageBarTitle_unstable, + useMessageBarTitleBase_unstable, useMessageBarTitleStyles_unstable, useMessageBarTitle_unstable, } from './components/MessageBarTitle/index'; diff --git a/packages/react-components/react-message-bar/library/src/components/MessageBar/MessageBar.types.ts b/packages/react-components/react-message-bar/library/src/components/MessageBar/MessageBar.types.ts index 95b0ee35ccf3d..f5b34cc1a5227 100644 --- a/packages/react-components/react-message-bar/library/src/components/MessageBar/MessageBar.types.ts +++ b/packages/react-components/react-message-bar/library/src/components/MessageBar/MessageBar.types.ts @@ -10,7 +10,7 @@ export type MessageBarSlots = { * over this element * * NOTE: If you are using this slot, this probably means that you are using the MessageBar without - * actions, this is not recommended from an accesibility point of view + * actions, this is not recommended from an accessibility point of view */ bottomReflowSpacer?: Slot<'div'>; }; @@ -36,12 +36,17 @@ export type MessageBarProps = ComponentProps & */ politeness?: 'assertive' | 'polite'; /** - * Use squal for page level messages and rounded for component level messages + * Use square for page level messages and rounded for component level messages * @default rounded */ shape?: 'square' | 'rounded'; }; +/** + * MessageBar base props, excluding design-related props like intent and shape + */ +export type MessageBarBaseProps = Omit; + /** * State used in rendering MessageBar */ @@ -53,3 +58,8 @@ export type MessageBarState = ComponentState & */ transitionClassName: string; }; + +/** + * MessageBar base state, excluding design-related state like intent and shape + */ +export type MessageBarBaseState = Omit; diff --git a/packages/react-components/react-message-bar/library/src/components/MessageBar/index.ts b/packages/react-components/react-message-bar/library/src/components/MessageBar/index.ts index 5cb0b03985cb3..a5236e157bbe9 100644 --- a/packages/react-components/react-message-bar/library/src/components/MessageBar/index.ts +++ b/packages/react-components/react-message-bar/library/src/components/MessageBar/index.ts @@ -1,5 +1,7 @@ export { MessageBar } from './MessageBar'; export type { + MessageBarBaseProps, + MessageBarBaseState, MessageBarContextValues, MessageBarIntent, MessageBarProps, @@ -7,6 +9,6 @@ export type { MessageBarState, } from './MessageBar.types'; export { renderMessageBar_unstable } from './renderMessageBar'; -export { useMessageBar_unstable } from './useMessageBar'; +export { useMessageBar_unstable, useMessageBarBase_unstable } from './useMessageBar'; export { messageBarClassNames, useMessageBarStyles_unstable } from './useMessageBarStyles.styles'; export { useMessageBarContextValue_unstable } from './useMessageBarContextValues'; diff --git a/packages/react-components/react-message-bar/library/src/components/MessageBar/useMessageBar.ts b/packages/react-components/react-message-bar/library/src/components/MessageBar/useMessageBar.ts index 5226fa2e33270..752a11ba212d5 100644 --- a/packages/react-components/react-message-bar/library/src/components/MessageBar/useMessageBar.ts +++ b/packages/react-components/react-message-bar/library/src/components/MessageBar/useMessageBar.ts @@ -1,9 +1,9 @@ 'use client'; import * as React from 'react'; -import { getIntrinsicElementProps, slot, useId, useMergedRefs } from '@fluentui/react-utilities'; +import { slot, useId, useMergedRefs } from '@fluentui/react-utilities'; import { useAnnounce } from '@fluentui/react-shared-contexts'; -import type { MessageBarProps, MessageBarState } from './MessageBar.types'; +import type { MessageBarProps, MessageBarState, MessageBarBaseProps, MessageBarBaseState } from './MessageBar.types'; import { getIntentIcon } from './getIntentIcon'; import { useMessageBarReflow } from './useMessageBarReflow'; import { useMessageBarTransitionContext } from '../../contexts/messageBarTransitionContext'; @@ -19,16 +19,47 @@ import { useMotionForwardedRef } from '../MotionRefForwarder'; * @param ref - reference to root HTMLElement of MessageBar */ export const useMessageBar_unstable = (props: MessageBarProps, ref: React.Ref): MessageBarState => { - const { layout = 'auto', intent = 'info', politeness, shape = 'rounded' } = props; - const computedPoliteness = politeness ?? intent === 'info' ? 'polite' : 'assertive'; - const autoReflow = layout === 'auto'; - const { ref: reflowRef, reflowing } = useMessageBarReflow(autoReflow); - const computedLayout = autoReflow ? (reflowing ? 'multiline' : 'singleline') : layout; + 'use no memo'; + + const { shape = 'rounded', ...restProps } = props; + + const baseState = useMessageBarBase_unstable(restProps, ref); // eslint-disable-next-line @typescript-eslint/no-deprecated const { className: transitionClassName, nodeRef } = useMessageBarTransitionContext(); const motionRef = useMotionForwardedRef(); + baseState.root.ref = useMergedRefs(baseState.root.ref, nodeRef, motionRef); + + return { + ...baseState, + icon: slot.optional(props.icon, { + renderByDefault: true, + elementType: 'div', + defaultProps: { children: getIntentIcon(baseState.intent) }, + }), + shape, + transitionClassName, + }; +}; + +/** + * Base hook for MessageBar component, manages state and structure common to all variants of MessageBar + * + * @param props - base props from this instance of MessageBar + * @param ref - reference to root HTMLElement of MessageBar + */ +export const useMessageBarBase_unstable = ( + props: MessageBarBaseProps, + ref: React.Ref, +): MessageBarBaseState => { + const { layout = 'auto', politeness, bottomReflowSpacer, icon, intent = 'info', ...rest } = props; + const autoReflow = layout === 'auto'; + const { ref: reflowRef, reflowing } = useMessageBarReflow(autoReflow); + + const computedPoliteness = politeness ?? (intent === 'info' ? 'polite' : 'assertive'); + const computedLayout = autoReflow ? (reflowing ? 'multiline' : 'singleline') : layout; + const actionsRef = React.useRef(null); const bodyRef = React.useRef(null); const { announce } = useAnnounce(); @@ -49,30 +80,25 @@ export const useMessageBar_unstable = (props: MessageBarProps, ref: React.Ref; +/** + * MessageBarActions base props + */ +export type MessageBarActionsBaseProps = MessageBarActionsProps; + /** * State used in rendering MessageBarActions */ @@ -29,3 +34,8 @@ export type MessageBarActionsState = ComponentState & */ hasActions: boolean; }; + +/** + * MessageBarActions base state + */ +export type MessageBarActionsBaseState = MessageBarActionsState; diff --git a/packages/react-components/react-message-bar/library/src/components/MessageBarActions/index.ts b/packages/react-components/react-message-bar/library/src/components/MessageBarActions/index.ts index 5186603a68bef..c5489c04d7186 100644 --- a/packages/react-components/react-message-bar/library/src/components/MessageBarActions/index.ts +++ b/packages/react-components/react-message-bar/library/src/components/MessageBarActions/index.ts @@ -1,11 +1,13 @@ export { MessageBarActions } from './MessageBarActions'; export type { + MessageBarActionsBaseProps, + MessageBarActionsBaseState, MessageBarActionsContextValues, MessageBarActionsProps, MessageBarActionsSlots, MessageBarActionsState, } from './MessageBarActions.types'; export { renderMessageBarActions_unstable } from './renderMessageBarActions'; -export { useMessageBarActions_unstable } from './useMessageBarActions'; +export { useMessageBarActions_unstable, useMessageBarActionsBase_unstable } from './useMessageBarActions'; export { messageBarActionsClassNames, useMessageBarActionsStyles_unstable } from './useMessageBarActionsStyles.styles'; export { useMessageBarActionsContextValue_unstable } from './useMessageBarActionsContextValues'; diff --git a/packages/react-components/react-message-bar/library/src/components/MessageBarActions/useMessageBarActions.ts b/packages/react-components/react-message-bar/library/src/components/MessageBarActions/useMessageBarActions.ts index a96a197ac77e1..450feb94cff61 100644 --- a/packages/react-components/react-message-bar/library/src/components/MessageBarActions/useMessageBarActions.ts +++ b/packages/react-components/react-message-bar/library/src/components/MessageBarActions/useMessageBarActions.ts @@ -2,7 +2,12 @@ import * as React from 'react'; import { getIntrinsicElementProps, slot, useMergedRefs } from '@fluentui/react-utilities'; -import type { MessageBarActionsProps, MessageBarActionsState } from './MessageBarActions.types'; +import type { + MessageBarActionsProps, + MessageBarActionsState, + MessageBarActionsBaseProps, + MessageBarActionsBaseState, +} from './MessageBarActions.types'; import { useMessageBarContext } from '../../contexts/messageBarContext'; /** @@ -18,6 +23,19 @@ export const useMessageBarActions_unstable = ( props: MessageBarActionsProps, ref: React.Ref, ): MessageBarActionsState => { + return useMessageBarActionsBase_unstable(props, ref); +}; + +/** + * Base hook for MessageBarActions component, manages state and structure common to all variants of MessageBarActions + * + * @param props - base props from this instance of MessageBarActions + * @param ref - reference to root HTMLElement of MessageBarActions + */ +export const useMessageBarActionsBase_unstable = ( + props: MessageBarActionsBaseProps, + ref?: React.Ref, +): MessageBarActionsBaseState => { const { layout = 'singleline', actionsRef } = useMessageBarContext(); return { components: { diff --git a/packages/react-components/react-message-bar/library/src/components/MessageBarBody/MessageBarBody.types.ts b/packages/react-components/react-message-bar/library/src/components/MessageBarBody/MessageBarBody.types.ts index 212256fbfcb53..cdfd44014ac43 100644 --- a/packages/react-components/react-message-bar/library/src/components/MessageBarBody/MessageBarBody.types.ts +++ b/packages/react-components/react-message-bar/library/src/components/MessageBarBody/MessageBarBody.types.ts @@ -15,7 +15,17 @@ export type MessageBarBodySlots = { */ export type MessageBarBodyProps = ComponentProps; +/** + * MessageBarBody base props + */ +export type MessageBarBodyBaseProps = ComponentProps; + /** * State used in rendering MessageBarBody */ export type MessageBarBodyState = ComponentState; + +/** + * MessageBarBody base state + */ +export type MessageBarBodyBaseState = ComponentState; diff --git a/packages/react-components/react-message-bar/library/src/components/MessageBarBody/index.ts b/packages/react-components/react-message-bar/library/src/components/MessageBarBody/index.ts index 70cdf388b9395..ea8826fcaf6e2 100644 --- a/packages/react-components/react-message-bar/library/src/components/MessageBarBody/index.ts +++ b/packages/react-components/react-message-bar/library/src/components/MessageBarBody/index.ts @@ -1,10 +1,12 @@ export { MessageBarBody } from './MessageBarBody'; export type { + MessageBarBodyBaseProps, + MessageBarBodyBaseState, MessageBarBodyContextValues, MessageBarBodyProps, MessageBarBodySlots, MessageBarBodyState, } from './MessageBarBody.types'; export { renderMessageBarBody_unstable } from './renderMessageBarBody'; -export { useMessageBarBody_unstable } from './useMessageBarBody'; +export { useMessageBarBody_unstable, useMessageBarBodyBase_unstable } from './useMessageBarBody'; export { messageBarBodyClassNames, useMessageBarBodyStyles_unstable } from './useMessageBarBodyStyles.styles'; diff --git a/packages/react-components/react-message-bar/library/src/components/MessageBarBody/useMessageBarBody.ts b/packages/react-components/react-message-bar/library/src/components/MessageBarBody/useMessageBarBody.ts index 7d69fb2aa71a2..445cf7ff31649 100644 --- a/packages/react-components/react-message-bar/library/src/components/MessageBarBody/useMessageBarBody.ts +++ b/packages/react-components/react-message-bar/library/src/components/MessageBarBody/useMessageBarBody.ts @@ -1,8 +1,13 @@ 'use client'; import * as React from 'react'; -import { getIntrinsicElementProps, slot, useMergedRefs } from '@fluentui/react-utilities'; -import type { MessageBarBodyProps, MessageBarBodyState } from './MessageBarBody.types'; +import { slot, useMergedRefs } from '@fluentui/react-utilities'; +import type { + MessageBarBodyProps, + MessageBarBodyState, + MessageBarBodyBaseProps, + MessageBarBodyBaseState, +} from './MessageBarBody.types'; import { useMessageBarContext } from '../../contexts/messageBarContext'; /** @@ -18,16 +23,29 @@ export const useMessageBarBody_unstable = ( props: MessageBarBodyProps, ref: React.Ref, ): MessageBarBodyState => { + return useMessageBarBodyBase_unstable(props, ref); +}; + +/** + * Base hook for MessageBarBody component, manages state and structure common to all variants of MessageBarBody + * + * @param props - base props from this instance of MessageBarBody + * @param ref - reference to root HTMLElement of MessageBarBody + */ +export const useMessageBarBodyBase_unstable = ( + props: MessageBarBodyBaseProps, + ref?: React.Ref, +): MessageBarBodyBaseState => { const { bodyRef } = useMessageBarContext(); return { components: { root: 'div', }, root: slot.always( - getIntrinsicElementProps('div', { + { ref: useMergedRefs(ref, bodyRef), ...props, - }), + }, { elementType: 'div' }, ), }; diff --git a/packages/react-components/react-message-bar/library/src/components/MessageBarGroup/MessageBarGroup.types.ts b/packages/react-components/react-message-bar/library/src/components/MessageBarGroup/MessageBarGroup.types.ts index 3892ffb59ac5c..65db69b341ea7 100644 --- a/packages/react-components/react-message-bar/library/src/components/MessageBarGroup/MessageBarGroup.types.ts +++ b/packages/react-components/react-message-bar/library/src/components/MessageBarGroup/MessageBarGroup.types.ts @@ -13,6 +13,11 @@ export type MessageBarGroupProps = ComponentProps & { animate?: 'exit-only' | 'both'; }; +/** + * MessageBarGroup base props + */ +export type MessageBarGroupBaseProps = Omit; + /** * State used in rendering MessageBarGroup */ @@ -24,3 +29,8 @@ export type MessageBarGroupState = ComponentState & exitStyles: string; children: React.ReactElement[]; }; + +/** + * MessageBarGroup base state + */ +export type MessageBarGroupBaseState = Omit; diff --git a/packages/react-components/react-message-bar/library/src/components/MessageBarGroup/index.ts b/packages/react-components/react-message-bar/library/src/components/MessageBarGroup/index.ts index 90ac15b9cc20f..ba38f2cdb93b4 100644 --- a/packages/react-components/react-message-bar/library/src/components/MessageBarGroup/index.ts +++ b/packages/react-components/react-message-bar/library/src/components/MessageBarGroup/index.ts @@ -1,5 +1,11 @@ export { MessageBarGroup } from './MessageBarGroup'; -export type { MessageBarGroupProps, MessageBarGroupSlots, MessageBarGroupState } from './MessageBarGroup.types'; -export { renderMessageBarGroup_unstable } from './renderMessageBarGroup'; -export { useMessageBarGroup_unstable } from './useMessageBarGroup'; +export type { + MessageBarGroupBaseProps, + MessageBarGroupBaseState, + MessageBarGroupProps, + MessageBarGroupSlots, + MessageBarGroupState, +} from './MessageBarGroup.types'; +export { renderMessageBarGroup_unstable, renderMessageBarGroupBase_unstable } from './renderMessageBarGroup'; +export { useMessageBarGroup_unstable, useMessageBarGroupBase_unstable } from './useMessageBarGroup'; export { messageBarGroupClassNames, useMessageBarGroupStyles_unstable } from './useMessageBarGroupStyles.styles'; diff --git a/packages/react-components/react-message-bar/library/src/components/MessageBarGroup/renderMessageBarGroup.tsx b/packages/react-components/react-message-bar/library/src/components/MessageBarGroup/renderMessageBarGroup.tsx index fe3a6fa0e9ab5..afe4fd346e3d0 100644 --- a/packages/react-components/react-message-bar/library/src/components/MessageBarGroup/renderMessageBarGroup.tsx +++ b/packages/react-components/react-message-bar/library/src/components/MessageBarGroup/renderMessageBarGroup.tsx @@ -3,7 +3,7 @@ import { assertSlots } from '@fluentui/react-utilities'; import type { JSXElement } from '@fluentui/react-utilities'; -import type { MessageBarGroupState, MessageBarGroupSlots } from './MessageBarGroup.types'; +import type { MessageBarGroupState, MessageBarGroupSlots, MessageBarGroupBaseState } from './MessageBarGroup.types'; import { PresenceGroup } from '@fluentui/react-motion'; import { MessageBarMotion } from './MessageBarGroup.motions'; import { MotionRefForwarder } from '../MotionRefForwarder'; @@ -26,3 +26,12 @@ export const renderMessageBarGroup_unstable = (state: MessageBarGroupState): JSX ); }; + +/** + * Render the final JSX of MessageBarGroup without motion + */ +export const renderMessageBarGroupBase_unstable = (state: MessageBarGroupBaseState): JSXElement => { + assertSlots(state); + + return {state.children}; +}; diff --git a/packages/react-components/react-message-bar/library/src/components/MessageBarGroup/useMessageBarGroup.ts b/packages/react-components/react-message-bar/library/src/components/MessageBarGroup/useMessageBarGroup.ts index 8e2d3d120bab5..b97b3efaaf79e 100644 --- a/packages/react-components/react-message-bar/library/src/components/MessageBarGroup/useMessageBarGroup.ts +++ b/packages/react-components/react-message-bar/library/src/components/MessageBarGroup/useMessageBarGroup.ts @@ -1,6 +1,13 @@ +'use client'; + import * as React from 'react'; -import type { MessageBarGroupProps, MessageBarGroupState } from './MessageBarGroup.types'; -import { getIntrinsicElementProps, slot } from '@fluentui/react-utilities'; +import type { + MessageBarGroupProps, + MessageBarGroupState, + MessageBarGroupBaseProps, + MessageBarGroupBaseState, +} from './MessageBarGroup.types'; +import { slot } from '@fluentui/react-utilities'; /** * Create the state required to render MessageBarGroup. @@ -15,6 +22,27 @@ export const useMessageBarGroup_unstable = ( props: MessageBarGroupProps, ref: React.Ref, ): MessageBarGroupState => { + const { animate = 'exit-only', ...baseProps } = props; + const baseState = useMessageBarGroupBase_unstable(baseProps, ref); + + return { + ...baseState, + animate, + enterStyles: '', + exitStyles: '', + }; +}; + +/** + * Base hook for MessageBarGroup component, manages state and structure common to all variants of MessageBarGroup + * + * @param props - base props from this instance of MessageBarGroup + * @param ref - reference to root HTMLElement of MessageBarGroup + */ +export const useMessageBarGroupBase_unstable = ( + props: MessageBarGroupBaseProps, + ref?: React.Ref, +): MessageBarGroupBaseState => { if (process.env.NODE_ENV !== 'production') { React.Children.forEach(props.children, c => { if (!React.isValidElement(c) || c.type === React.Fragment) { @@ -33,17 +61,7 @@ export const useMessageBarGroup_unstable = ( components: { root: 'div', }, - - root: slot.always( - getIntrinsicElementProps('div', { - ref, - ...props, - }), - { elementType: 'div' }, - ), + root: slot.always({ ref, ...props }, { elementType: 'div' }), children, - animate: props.animate ?? 'exit-only', - enterStyles: '', - exitStyles: '', }; }; diff --git a/packages/react-components/react-message-bar/library/src/components/MessageBarTitle/MessageBarTitle.types.ts b/packages/react-components/react-message-bar/library/src/components/MessageBarTitle/MessageBarTitle.types.ts index 6a36a9db8aa90..5c62c4cdee12f 100644 --- a/packages/react-components/react-message-bar/library/src/components/MessageBarTitle/MessageBarTitle.types.ts +++ b/packages/react-components/react-message-bar/library/src/components/MessageBarTitle/MessageBarTitle.types.ts @@ -9,7 +9,17 @@ export type MessageBarTitleSlots = { */ export type MessageBarTitleProps = ComponentProps; +/** + * MessageBarTitle base props + */ +export type MessageBarTitleBaseProps = MessageBarTitleProps; + /** * State used in rendering MessageBarTitle */ export type MessageBarTitleState = ComponentState; + +/** + * MessageBarTitle base state + */ +export type MessageBarTitleBaseState = MessageBarTitleState; diff --git a/packages/react-components/react-message-bar/library/src/components/MessageBarTitle/index.ts b/packages/react-components/react-message-bar/library/src/components/MessageBarTitle/index.ts index bb37dbfa28a18..f2d0b124892fc 100644 --- a/packages/react-components/react-message-bar/library/src/components/MessageBarTitle/index.ts +++ b/packages/react-components/react-message-bar/library/src/components/MessageBarTitle/index.ts @@ -1,5 +1,11 @@ export { MessageBarTitle } from './MessageBarTitle'; -export type { MessageBarTitleProps, MessageBarTitleSlots, MessageBarTitleState } from './MessageBarTitle.types'; +export type { + MessageBarTitleBaseProps, + MessageBarTitleBaseState, + MessageBarTitleProps, + MessageBarTitleSlots, + MessageBarTitleState, +} from './MessageBarTitle.types'; export { renderMessageBarTitle_unstable } from './renderMessageBarTitle'; -export { useMessageBarTitle_unstable } from './useMessageBarTitle'; +export { useMessageBarTitle_unstable, useMessageBarTitleBase_unstable } from './useMessageBarTitle'; export { messageBarTitleClassNames, useMessageBarTitleStyles_unstable } from './useMessageBarTitleStyles.styles'; diff --git a/packages/react-components/react-message-bar/library/src/components/MessageBarTitle/useMessageBarTitle.ts b/packages/react-components/react-message-bar/library/src/components/MessageBarTitle/useMessageBarTitle.ts index 8a9d4f000c14c..1c1795e56ad1d 100644 --- a/packages/react-components/react-message-bar/library/src/components/MessageBarTitle/useMessageBarTitle.ts +++ b/packages/react-components/react-message-bar/library/src/components/MessageBarTitle/useMessageBarTitle.ts @@ -1,8 +1,13 @@ 'use client'; import * as React from 'react'; -import { getIntrinsicElementProps, slot } from '@fluentui/react-utilities'; -import type { MessageBarTitleProps, MessageBarTitleState } from './MessageBarTitle.types'; +import { slot } from '@fluentui/react-utilities'; +import type { + MessageBarTitleProps, + MessageBarTitleState, + MessageBarTitleBaseProps, + MessageBarTitleBaseState, +} from './MessageBarTitle.types'; import { useMessageBarContext } from '../../contexts/messageBarContext'; /** @@ -18,6 +23,19 @@ export const useMessageBarTitle_unstable = ( props: MessageBarTitleProps, ref: React.Ref, ): MessageBarTitleState => { + return useMessageBarTitleBase_unstable(props, ref); +}; + +/** + * Base hook for MessageBarTitle component, manages state and structure common to all variants of MessageBarTitle + * + * @param props - base props from this instance of MessageBarTitle + * @param ref - reference to root HTMLElement of MessageBarTitle + */ +export const useMessageBarTitleBase_unstable = ( + props: MessageBarTitleBaseProps, + ref?: React.Ref, +): MessageBarTitleBaseState => { const { titleId } = useMessageBarContext(); return { @@ -25,11 +43,11 @@ export const useMessageBarTitle_unstable = ( root: 'span', }, root: slot.always( - getIntrinsicElementProps('span', { + { ref, id: titleId, ...props, - }), + }, { elementType: 'span' }, ), }; diff --git a/packages/react-components/react-message-bar/library/src/index.ts b/packages/react-components/react-message-bar/library/src/index.ts index 0bc4ab549edc8..285cedbd149a0 100644 --- a/packages/react-components/react-message-bar/library/src/index.ts +++ b/packages/react-components/react-message-bar/library/src/index.ts @@ -69,3 +69,16 @@ export { } from './MessageBarGroup'; export type { MessageBarGroupProps, MessageBarGroupSlots, MessageBarGroupState } from './MessageBarGroup'; + +// Experimental APIs, will be uncommented in experimental branch only +// export type { MessageBarGroupProps, MessageBarGroupSlots, MessageBarGroupState } from './MessageBarGroup'; +// export { useMessageBarBase_unstable } from './MessageBar'; +// export type { MessageBarBaseProps, MessageBarBaseState } from './MessageBar'; +// export { useMessageBarTitleBase_unstable } from './MessageBarTitle'; +// export type { MessageBarTitleBaseProps, MessageBarTitleBaseState } from './MessageBarTitle'; +// export { useMessageBarActionsBase_unstable } from './MessageBarActions'; +// export type { MessageBarActionsBaseProps, MessageBarActionsBaseState } from './MessageBarActions'; +// export { useMessageBarBodyBase_unstable } from './MessageBarBody'; +// export type { MessageBarBodyBaseProps, MessageBarBodyBaseState } from './MessageBarBody'; +// export { useMessageBarGroupBase_unstable, renderMessageBarGroupBase_unstable } from './MessageBarGroup'; +// export type { MessageBarGroupBaseProps, MessageBarGroupBaseState } from './MessageBarGroup';