diff --git a/apps/public-docsite-v9-headless/.storybook/preview.js b/apps/public-docsite-v9-headless/.storybook/preview.js index 5185ce7b232f73..2bfb8e3991a7d2 100644 --- a/apps/public-docsite-v9-headless/.storybook/preview.js +++ b/apps/public-docsite-v9-headless/.storybook/preview.js @@ -22,6 +22,8 @@ export const parameters = { dirSwitcher: true, // headless components don't support theming themePicker: false, + // CAP visual language only applies to @fluentui/react-components + visualLanguagePicker: false, }, }, }; diff --git a/packages/react-components/react-components/etc/react-components.api.md b/packages/react-components/react-components/etc/react-components.api.md index bbf85c9b010572..25fe56f506b227 100644 --- a/packages/react-components/react-components/etc/react-components.api.md +++ b/packages/react-components/react-components/etc/react-components.api.md @@ -135,6 +135,7 @@ import { buttonClassNames } from '@fluentui/react-button'; import { ButtonProps } from '@fluentui/react-button'; import { ButtonSlots } from '@fluentui/react-button'; import { ButtonState } from '@fluentui/react-button'; +import { CAP_STYLE_HOOKS } from '@fluentui-contrib/react-cap-theme'; import { Caption1 } from '@fluentui/react-text'; import { caption1ClassNames } from '@fluentui/react-text'; import { Caption1Strong } from '@fluentui/react-text'; @@ -2294,6 +2295,8 @@ export { ButtonSlots } export { ButtonState } +export { CAP_STYLE_HOOKS } + export { Caption1 } export { caption1ClassNames } diff --git a/packages/react-components/react-components/package.json b/packages/react-components/react-components/package.json index 08c46c6f79d24c..34d3fc7a946dc1 100644 --- a/packages/react-components/react-components/package.json +++ b/packages/react-components/react-components/package.json @@ -73,7 +73,8 @@ "@fluentui/react-motion": "^9.16.0", "@fluentui/react-carousel": "^9.9.8", "@fluentui/react-color-picker": "^9.2.17", - "@fluentui/react-nav": "^9.4.0" + "@fluentui/react-nav": "^9.4.0", + "@fluentui-contrib/react-cap-theme": "^0.4.2" }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", diff --git a/packages/react-components/react-components/src/index.ts b/packages/react-components/react-components/src/index.ts index 905c45bc2c20bf..79c82607e7bc35 100644 --- a/packages/react-components/react-components/src/index.ts +++ b/packages/react-components/react-components/src/index.ts @@ -31,6 +31,11 @@ export type { FluentProviderSlots, FluentProviderState, } from '@fluentui/react-provider'; + +// CAP theme overlay — pass to `` +// to opt in to the CAP visual treatment without installing a separate package. +// See: docs/react-v9/contributing/rfcs/shared/cap-theme-in-fluent-v9.md +export { CAP_STYLE_HOOKS } from '@fluentui-contrib/react-cap-theme'; export { createCustomFocusIndicatorStyle, createFocusOutlineStyle, diff --git a/packages/react-components/react-storybook-addon/etc/react-storybook-addon.api.md b/packages/react-components/react-storybook-addon/etc/react-storybook-addon.api.md index 977601745fed0a..50f5e7951ffa7b 100644 --- a/packages/react-components/react-storybook-addon/etc/react-storybook-addon.api.md +++ b/packages/react-components/react-storybook-addon/etc/react-storybook-addon.api.md @@ -12,6 +12,9 @@ import * as React_2 from 'react'; import type { Renderer } from 'storybook/internal/types'; import type { StoryContext } from '@storybook/react-webpack5'; +// @public (undocumented) +export const CAP_ID: "storybook_fluentui-react-addon_cap"; + // @public (undocumented) export const DIR_ID: "storybook_fluentui-react-addon_dir"; @@ -30,6 +33,8 @@ export type FluentDocsPageProps = { // @public export interface FluentGlobals extends Args { + // (undocumented) + [CAP_ID]?: boolean; // (undocumented) [DIR_ID]?: 'ltr' | 'rtl'; // (undocumented) @@ -40,6 +45,8 @@ export interface FluentGlobals extends Args { // @public export interface FluentParameters extends Parameters_2 { + // (undocumented) + cap?: boolean; // (undocumented) dir?: 'ltr' | 'rtl'; // (undocumented) diff --git a/packages/react-components/react-storybook-addon/package.json b/packages/react-components/react-storybook-addon/package.json index 92f25ece790f19..a0dc7ff714df2b 100644 --- a/packages/react-components/react-storybook-addon/package.json +++ b/packages/react-components/react-storybook-addon/package.json @@ -26,7 +26,8 @@ "@fluentui/react-spinner": "^9.8.3", "@fluentui/react-toast": "^9.8.0", "@griffel/react": "^1.5.32", - "@swc/helpers": "^0.5.1" + "@swc/helpers": "^0.5.1", + "@fluentui-contrib/react-cap-theme": "^0.4.2" }, "peerDependencies": { "@storybook/addon-docs": "^9.1.17", diff --git a/packages/react-components/react-storybook-addon/src/cap.ts b/packages/react-components/react-storybook-addon/src/cap.ts new file mode 100644 index 00000000000000..c455010137a6e5 --- /dev/null +++ b/packages/react-components/react-storybook-addon/src/cap.ts @@ -0,0 +1,15 @@ +/** + * CAP visual-language option ids stored as a Storybook global. + * + * Modeled after `ThemeIds` so the value persists in the URL as a readable + * token (e.g. `storybook_fluentui-react-addon_cap:cap`) instead of a boolean + * (`storybook_fluentui-react-addon_cap:!false`). + */ +export type CapIds = 'base' | 'cap'; + +export const capOptions: ReadonlyArray<{ id: CapIds; label: string }> = [ + { id: 'base', label: 'Fluent' }, + { id: 'cap', label: 'CAP' }, +]; + +export const defaultCap: { id: CapIds; label: string } = capOptions[0]; diff --git a/packages/react-components/react-storybook-addon/src/components/VisualLanguagePicker.tsx b/packages/react-components/react-storybook-addon/src/components/VisualLanguagePicker.tsx new file mode 100644 index 00000000000000..e2ef83d2547b5f --- /dev/null +++ b/packages/react-components/react-storybook-addon/src/components/VisualLanguagePicker.tsx @@ -0,0 +1,87 @@ +import * as React from 'react'; +import { IconButton, TooltipLinkList, WithTooltip } from 'storybook/internal/components'; +import { PaintBrushIcon } from '@storybook/icons'; +import { useParameter } from 'storybook/manager-api'; + +import type { JSXElement } from '@fluentui/react-utilities'; +import type { CapIds } from '../cap'; +import { capOptions, defaultCap } from '../cap'; +import { CAP_ID } from '../constants'; +import type { FluentParameters } from '../hooks'; +import { useGlobals } from '../hooks'; + +export interface CapSelectorItem { + id: string; + title: string; + onClick: () => void; + value: string; + active: boolean; +} + +function createCapItems( + value: typeof capOptions, + changeCap: (id: CapIds) => void, + getCurrentCap: () => CapIds, +): CapSelectorItem[] { + return value.map(item => { + return { + id: item.id, + title: item.id === defaultCap.id ? `${item.label} (Default)` : item.label, + onClick: () => { + changeCap(item.id); + }, + value: item.id, + active: getCurrentCap() === item.id, + }; + }); +} + +/** + * Toolbar picker that selects the CAP visual-language overlay on top of the + * currently selected Fluent base theme. When `cap` is active, the + * FluentProvider decorator applies `CAP_STYLE_HOOKS` from + * `@fluentui-contrib/react-cap-theme`. + */ +export const VisualLanguagePicker = (): JSXElement => { + const [globals, updateGlobals] = useGlobals(); + const capParameter: FluentParameters['cap'] = useParameter('cap'); + + const selectedCapId: CapIds = capParameter ?? globals[CAP_ID] ?? defaultCap.id; + const selectedCap = capOptions.find(entry => entry.id === selectedCapId); + + const isActive = selectedCapId !== defaultCap.id; + + const setCap = React.useCallback( + (id: CapIds) => { + updateGlobals({ [CAP_ID]: id }); + }, + [updateGlobals], + ); + + const renderTooltip = React.useCallback( + (props: { onHide: () => void }) => { + return ( + { + setCap(id); + props.onHide(); + }, + () => selectedCapId, + )} + /> + ); + }, + [selectedCapId, setCap], + ); + + return ( + + + + Visual Language: {selectedCap?.label} + + + ); +}; diff --git a/packages/react-components/react-storybook-addon/src/constants.ts b/packages/react-components/react-storybook-addon/src/constants.ts index 277499ae0c1693..18322d80b38165 100644 --- a/packages/react-components/react-storybook-addon/src/constants.ts +++ b/packages/react-components/react-storybook-addon/src/constants.ts @@ -3,3 +3,4 @@ export const ADDON_ID = 'storybook_fluentui-react-addon'; export const DIR_ID = `${ADDON_ID}_dir` as const; export const STRICT_MODE_ID = `${ADDON_ID}_strict-mode` as const; export const THEME_ID = `${ADDON_ID}_theme` as const; +export const CAP_ID = `${ADDON_ID}_cap` as const; diff --git a/packages/react-components/react-storybook-addon/src/decorators/withFluentProvider.tsx b/packages/react-components/react-storybook-addon/src/decorators/withFluentProvider.tsx index 48a6d647f5cb1a..9a5103ef0e85c6 100644 --- a/packages/react-components/react-storybook-addon/src/decorators/withFluentProvider.tsx +++ b/packages/react-components/react-storybook-addon/src/decorators/withFluentProvider.tsx @@ -12,12 +12,12 @@ import { webDarkTheme, webLightTheme, } from '@fluentui/react-theme'; +import { CAP_STYLE_HOOKS } from '@fluentui-contrib/react-cap-theme'; import type { ThemeIds } from '../theme'; import { defaultTheme } from '../theme'; -import { DIR_ID, THEME_ID } from '../constants'; +import { CAP_ID, DIR_ID, THEME_ID } from '../constants'; import type { FluentStoryContext } from '../hooks'; import { isDecoratorDisabled } from '../utils/isDecoratorDisabled'; - const themes: Record = { 'web-light': webLightTheme, 'web-dark': webDarkTheme, @@ -42,12 +42,27 @@ export const withFluentProvider = (StoryFn: () => JSXElement, context: FluentSto const isVrTest = mode === 'vr-test'; const dir = parameters.dir ?? globals[DIR_ID] ?? 'ltr'; - const globalTheme = findTheme(globals[THEME_ID]); - const paramTheme = findTheme(parameters.fluentTheme); + const globalThemeId: ThemeIds | undefined = globals[THEME_ID]; + const paramThemeId: ThemeIds | undefined = parameters.fluentTheme; + const globalTheme = findTheme(globalThemeId); + const paramTheme = findTheme(paramThemeId); const theme = paramTheme ?? globalTheme ?? themes[defaultTheme.id]; + // CAP is a visual-language overlay applied on top of any base Fluent theme. + // Toggle via the Storybook toolbar (CAP switch) or per-story via `parameters.cap`. + const capValue = parameters.cap ?? globals[CAP_ID]; + const capEnabled = capValue === 'cap'; + const customStyleHooks = capEnabled ? CAP_STYLE_HOOKS : undefined; + + // CAP style hooks add their own React hook calls inside each Fluent component + // (e.g. CAP's `useButtonStyles` calls 9 hooks). Switching `customStyleHooks_unstable` + // between `undefined` and an object on a live tree changes the hook count, which + // violates the Rules of Hooks. Keying on `capEnabled` forces the subtree to + // remount so the hook order stays consistent within each mount. + const providerKey = capEnabled ? 'cap-on' : 'cap-off'; + return ( - + {isVrTest ? StoryFn() : {StoryFn()}} ); diff --git a/packages/react-components/react-storybook-addon/src/docs/FluentDocsPage.tsx b/packages/react-components/react-storybook-addon/src/docs/FluentDocsPage.tsx index 57728961cff7f1..49295fda324058 100644 --- a/packages/react-components/react-storybook-addon/src/docs/FluentDocsPage.tsx +++ b/packages/react-components/react-storybook-addon/src/docs/FluentDocsPage.tsx @@ -19,10 +19,11 @@ import { makeStyles } from '@griffel/react'; import { InfoFilled } from '@fluentui/react-icons'; import type { JSXElement } from '@fluentui/react-utilities'; -import { DIR_ID, THEME_ID } from '../constants'; +import { CAP_ID, DIR_ID, THEME_ID } from '../constants'; import { themes } from '../theme'; import { getDocsPageConfig } from './utils'; +import { VisualLanguagePicker } from './VisualLanguagePicker'; import { DirSwitch } from './DirSwitch'; import { ThemePicker } from './ThemePicker'; import { Toc, nameToHash } from './Toc'; @@ -371,6 +372,7 @@ export const FluentDocsPage = ({ assertStoryMetaValues(primaryStory); const dir = primaryStoryContext.parameters?.dir ?? primaryStoryContext.globals?.[DIR_ID] ?? 'ltr'; + const capValue = primaryStoryContext.parameters?.cap ?? primaryStoryContext.globals?.[CAP_ID]; const selectedTheme = themes.find(theme => theme.id === primaryStoryContext.globals![THEME_ID]); const hideArgsTable = Boolean(primaryStoryContext.parameters?.docs?.hideArgsTable); @@ -398,6 +400,7 @@ export const FluentDocsPage = ({ tableOfContents: showTableOfContents, dirSwitcher: showDirSwitcher, themePicker: showThemePicker, + visualLanguagePicker: showVisualLanguagePicker, copyAsMarkdown: showCopyAsMarkdown, argTable, } = docsPageConfig; @@ -419,9 +422,10 @@ export const FluentDocsPage = ({ <div className={styles.wrapper}> <div className={styles.container}> - {(showThemePicker || showDirSwitcher || showCopyAsMarkdown) && ( + {(showThemePicker || showDirSwitcher || showVisualLanguagePicker || showCopyAsMarkdown) && ( <div className={styles.globalTogglesContainer}> {showThemePicker && <ThemePicker selectedThemeId={selectedTheme?.id} />} + {showVisualLanguagePicker && <VisualLanguagePicker selectedCapId={capValue} />} {showDirSwitcher && <DirSwitch dir={dir} />} {showCopyAsMarkdown && <CopyAsMarkdownButton storyId={primaryStory.id} />} </div> diff --git a/packages/react-components/react-storybook-addon/src/docs/VisualLanguagePicker.tsx b/packages/react-components/react-storybook-addon/src/docs/VisualLanguagePicker.tsx new file mode 100644 index 00000000000000..945dfce04072d0 --- /dev/null +++ b/packages/react-components/react-storybook-addon/src/docs/VisualLanguagePicker.tsx @@ -0,0 +1,71 @@ +import * as React from 'react'; +import { addons } from 'storybook/preview-api'; + +import { Menu, MenuItemRadio, MenuList, MenuPopover, MenuTrigger } from '@fluentui/react-menu'; +import type { MenuProps } from '@fluentui/react-menu'; +import { MenuButton } from '@fluentui/react-button'; +import { makeStyles } from '@griffel/react'; + +import type { CapIds } from '../cap'; +import { capOptions, CAP_ID } from '..'; + +const useStyles = makeStyles({ + menuButton: { + minWidth: '160px', + justifyContent: 'flex-start', + }, + + chevronIcon: { + marginLeft: 'auto', + }, + + menuPopover: { + minWidth: '160px', + }, +}); + +/** + * CAP visual-language picker used in the react-components docs header. + * + * Mirrors `ThemePicker`: stores the selected option id (`'cap' | 'base'`) + * as a Storybook global so it persists in the URL as a readable value. + */ +export const VisualLanguagePicker: React.FC<{ selectedCapId?: CapIds }> = ({ selectedCapId }) => { + const styles = useStyles(); + const [currentCapId, setCurrentCapId] = React.useState<CapIds | null>(selectedCapId ?? null); + + const setGlobalCap = (capId: CapIds): void => { + addons.getChannel().emit('updateGlobals', { globals: { [CAP_ID]: capId } }); + }; + const onCheckedValueChange: MenuProps['onCheckedValueChange'] = (_e, data) => { + const newCapId = data.checkedItems[0] as CapIds; + setGlobalCap(newCapId); + setCurrentCapId(newCapId); + }; + + const selectedCap = capOptions.find(o => o.id === currentCapId); + + return ( + <Menu + // eslint-disable-next-line react/jsx-no-bind + onCheckedValueChange={onCheckedValueChange} + checkedValues={{ cap: selectedCapId ? [selectedCapId] : [] }} + positioning={{ autoSize: true }} + > + <MenuTrigger> + <MenuButton className={styles.menuButton} menuIcon={{ className: styles.chevronIcon }}> + {selectedCap?.label ?? 'Visual Language'} + </MenuButton> + </MenuTrigger> + <MenuPopover className={styles.menuPopover}> + <MenuList> + {capOptions.map(o => ( + <MenuItemRadio name="cap" value={o.id} key={o.id}> + {o.label} + </MenuItemRadio> + ))} + </MenuList> + </MenuPopover> + </Menu> + ); +}; diff --git a/packages/react-components/react-storybook-addon/src/docs/utils.ts b/packages/react-components/react-storybook-addon/src/docs/utils.ts index 2521c45389ca4f..fd59c6911ea849 100644 --- a/packages/react-components/react-storybook-addon/src/docs/utils.ts +++ b/packages/react-components/react-storybook-addon/src/docs/utils.ts @@ -7,6 +7,7 @@ const docsDefaults = { tableOfContents: true, dirSwitcher: true, themePicker: true, + visualLanguagePicker: true, argTable: { slotsApi: true, nativePropsApi: true, @@ -46,6 +47,7 @@ export function getDocsPageConfig(context: DocsContextProps): { tableOfContents: boolean; dirSwitcher: boolean; themePicker: boolean; + visualLanguagePicker: boolean; copyAsMarkdown: boolean; argTable: { slotsApi: boolean; @@ -66,6 +68,7 @@ export function getDocsPageConfig(context: DocsContextProps): { tableOfContents: docsConfig.tableOfContents !== false, dirSwitcher: docsConfig.dirSwitcher !== false, themePicker: docsConfig.themePicker !== false, + visualLanguagePicker: docsConfig.visualLanguagePicker !== false, argTable: getArgTableConfig(docsConfig.argTable), }; } diff --git a/packages/react-components/react-storybook-addon/src/hooks.ts b/packages/react-components/react-storybook-addon/src/hooks.ts index c054b4bda33f2b..930af569dbaca0 100644 --- a/packages/react-components/react-storybook-addon/src/hooks.ts +++ b/packages/react-components/react-storybook-addon/src/hooks.ts @@ -1,8 +1,9 @@ import { useGlobals as useStorybookGlobals } from 'storybook/manager-api'; import type { Args as StorybookArgs, StoryContext as StorybookContext, Parameters } from '@storybook/react-webpack5'; -import type { DIR_ID, STRICT_MODE_ID, THEME_ID } from './constants'; +import type { CAP_ID, DIR_ID, STRICT_MODE_ID, THEME_ID } from './constants'; import type { ThemeIds } from './theme'; +import type { CapIds } from './cap'; export interface FluentStoryContext extends StorybookContext { globals: FluentGlobals; @@ -16,6 +17,7 @@ export interface FluentGlobals extends StorybookArgs { [DIR_ID]?: 'ltr' | 'rtl'; [THEME_ID]?: ThemeIds; [STRICT_MODE_ID]?: boolean; + [CAP_ID]?: CapIds; } /** @@ -24,6 +26,7 @@ export interface FluentGlobals extends StorybookArgs { export interface FluentParameters extends Parameters { dir?: 'ltr' | 'rtl'; fluentTheme?: ThemeIds; + cap?: CapIds; mode?: 'default' | 'vr-test'; reactStorybookAddon?: { disabledDecorators?: ['AriaLive' | 'FluentProvider' | 'ReactStrictMode']; @@ -40,6 +43,7 @@ type FluentDocsConfig = tableOfContents?: boolean; dirSwitcher?: boolean; themePicker?: boolean; + visualLanguagePicker?: boolean; copyAsMarkdown?: boolean; argTable?: | boolean diff --git a/packages/react-components/react-storybook-addon/src/index.ts b/packages/react-components/react-storybook-addon/src/index.ts index d15dce947e7687..e583b19da468e1 100644 --- a/packages/react-components/react-storybook-addon/src/index.ts +++ b/packages/react-components/react-storybook-addon/src/index.ts @@ -1,7 +1,9 @@ export type { FluentGlobals, FluentParameters, FluentStoryContext } from './hooks'; export type { ThemeIds } from './theme'; export { themes } from './theme'; -export { DIR_ID, THEME_ID } from './constants'; +export type { CapIds } from './cap'; +export { capOptions, defaultCap } from './cap'; +export { CAP_ID, DIR_ID, THEME_ID } from './constants'; export { parameters } from './hooks'; export { FluentCanvas, FluentDocsPage, FluentStory } from './docs'; export type { FluentDocsPageProps } from './docs'; diff --git a/packages/react-components/react-storybook-addon/src/preset/manager.ts b/packages/react-components/react-storybook-addon/src/preset/manager.ts index caacbc158d77bd..c3957f17ad9a25 100644 --- a/packages/react-components/react-storybook-addon/src/preset/manager.ts +++ b/packages/react-components/react-storybook-addon/src/preset/manager.ts @@ -1,9 +1,10 @@ import { addons, types } from 'storybook/manager-api'; -import { ADDON_ID, DIR_ID, STRICT_MODE_ID, THEME_ID } from '../constants'; +import { ADDON_ID, CAP_ID, DIR_ID, STRICT_MODE_ID, THEME_ID } from '../constants'; import { ThemePicker } from '../components/ThemePicker'; import { ReactStrictMode } from '../components/ReactStrictMode'; import { DirectionSwitch } from '../components/DirectionSwitch'; +import { VisualLanguagePicker } from '../components/VisualLanguagePicker'; addons.register(ADDON_ID, () => { addons.add(THEME_ID, { @@ -13,6 +14,13 @@ addons.register(ADDON_ID, () => { match: ({ viewMode }) => !!(viewMode && viewMode.match(/^(story|docs)$/)), render: ThemePicker, }); + addons.add(CAP_ID, { + title: 'CAP Visual Language', + + type: types.TOOL, + match: ({ viewMode }) => !!(viewMode && viewMode.match(/^(story|docs)$/)), + render: VisualLanguagePicker, + }); addons.add(DIR_ID, { title: 'Direction Switch', diff --git a/packages/react-components/react-storybook-addon/src/preset/preview.ts b/packages/react-components/react-storybook-addon/src/preset/preview.ts index 5b3fc2e687c8f2..98005e756ba2c3 100644 --- a/packages/react-components/react-storybook-addon/src/preset/preview.ts +++ b/packages/react-components/react-storybook-addon/src/preset/preview.ts @@ -5,11 +5,16 @@ import { withReactStrictMode } from '../decorators/withReactStrictMode'; import { withAriaLive } from '../decorators/withAriaLive'; import { FluentDocsContainer, FluentDocsPage } from '../docs'; -import { DIR_ID, STRICT_MODE_ID, THEME_ID } from '../constants'; +import { CAP_ID, DIR_ID, STRICT_MODE_ID, THEME_ID } from '../constants'; export const decorators = [withFluentProvider, withAriaLive, withReactStrictMode] as Preview['decorators']; -export const initialGlobals = { [THEME_ID]: undefined, [DIR_ID]: undefined, [STRICT_MODE_ID]: undefined }; // allow theme to be set by URL query param +export const initialGlobals = { + [THEME_ID]: undefined, + [DIR_ID]: undefined, + [STRICT_MODE_ID]: undefined, + [CAP_ID]: undefined, +}; // allow theme to be set by URL query param const preview: Preview = { decorators, diff --git a/yarn.lock b/yarn.lock index 8fb3ef306d2a5b..2b22debaa0fd98 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1806,6 +1806,13 @@ resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.8.tgz#21a907684723bbbaa5f0974cf7730bd797eb8e62" integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig== +"@fluentui-contrib/react-cap-theme@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@fluentui-contrib/react-cap-theme/-/react-cap-theme-0.4.2.tgz#424f7044049396cb724da1922961d5ca4d0f4436" + integrity sha512-yRXtfes9QLHFB4Bt0DP3uJZ8ft7lXuEw80HKZGbeBKb764+Jtx2EgzCcFYoRddhwkKOc0fBv/DpiNjdSHhLHnw== + dependencies: + "@swc/helpers" "~0.5.11" + "@fluentui/accessibility@^0.66.5": version "0.66.5" resolved "https://registry.yarnpkg.com/@fluentui/accessibility/-/accessibility-0.66.5.tgz#dd7db595b5404a7a8ddf05032da4278a4408172f" @@ -4005,6 +4012,13 @@ dependencies: tslib "^2.4.0" +"@swc/helpers@~0.5.11": + version "0.5.23" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.23.tgz#19287d0d86d962b111376039a50c792902c9a86a" + integrity sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw== + dependencies: + tslib "^2.8.0" + "@swc/jest@0.2.38": version "0.2.38" resolved "https://registry.yarnpkg.com/@swc/jest/-/jest-0.2.38.tgz#8b137e344c6c021d4e49ee2bc62b0e5e564d2c7c" @@ -19766,7 +19780,7 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@2.8.1, tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.4.0, tslib@^2.4.1, tslib@^2.5.0, tslib@^2.6.2, tslib@^2.8.1: +tslib@2.8.1, tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.4.0, tslib@^2.4.1, tslib@^2.5.0, tslib@^2.6.2, tslib@^2.8.0, tslib@^2.8.1: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==