Private
Public Access
1
0

feat: Fluent UI Outlook Lite + connections mockup

This commit is contained in:
2026-04-14 18:52:25 +00:00
parent 1199eff6c3
commit dfa4010406
34820 changed files with 1003813 additions and 205 deletions

View File

@@ -0,0 +1,15 @@
'use client';
import * as React from 'react';
import { useCustomStyleHook_unstable } from '@fluentui/react-shared-contexts';
import { useNavItem_unstable } from './useNavItem';
import { renderNavItem_unstable } from './renderNavItem';
import { useNavItemStyles_unstable } from './useNavItemStyles.styles';
/**
* NavItem component - a single item in the navigation menu.
*/ export const NavItem = /*#__PURE__*/ React.forwardRef((props, ref)=>{
const state = useNavItem_unstable(props, ref);
useNavItemStyles_unstable(state);
useCustomStyleHook_unstable('useNavItemStyles_unstable')(state);
return renderNavItem_unstable(state);
});
NavItem.displayName = 'NavItem';

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../src/components/NavItem/NavItem.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport type { ForwardRefComponent } from '@fluentui/react-utilities';\nimport { useCustomStyleHook_unstable } from '@fluentui/react-shared-contexts';\n\nimport { useNavItem_unstable } from './useNavItem';\nimport { renderNavItem_unstable } from './renderNavItem';\nimport { useNavItemStyles_unstable } from './useNavItemStyles.styles';\nimport type { NavItemProps } from './NavItem.types';\n\n/**\n * NavItem component - a single item in the navigation menu.\n */\nexport const NavItem: ForwardRefComponent<NavItemProps> = React.forwardRef((props, ref) => {\n const state = useNavItem_unstable(props, ref);\n\n useNavItemStyles_unstable(state);\n useCustomStyleHook_unstable('useNavItemStyles_unstable')(state);\n\n return renderNavItem_unstable(state);\n});\n\nNavItem.displayName = 'NavItem';\n"],"names":["React","useCustomStyleHook_unstable","useNavItem_unstable","renderNavItem_unstable","useNavItemStyles_unstable","NavItem","forwardRef","props","ref","state","displayName"],"mappings":"AAAA;AAEA,YAAYA,WAAW,QAAQ;AAE/B,SAASC,2BAA2B,QAAQ,kCAAkC;AAE9E,SAASC,mBAAmB,QAAQ,eAAe;AACnD,SAASC,sBAAsB,QAAQ,kBAAkB;AACzD,SAASC,yBAAyB,QAAQ,4BAA4B;AAGtE;;CAEC,GACD,OAAO,MAAMC,wBAA6CL,MAAMM,UAAU,CAAC,CAACC,OAAOC;IACjF,MAAMC,QAAQP,oBAAoBK,OAAOC;IAEzCJ,0BAA0BK;IAC1BR,4BAA4B,6BAA6BQ;IAEzD,OAAON,uBAAuBM;AAChC,GAAG;AAEHJ,QAAQK,WAAW,GAAG"}

View File

@@ -0,0 +1,3 @@
/**
* State used in rendering NavItem
*/ export { };

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../src/components/NavItem/NavItem.types.ts"],"sourcesContent":["import { NavItemValue } from '../NavContext.types';\nimport { NavDensity } from '../Nav/Nav.types';\nimport type { ARIAButtonSlotProps } from '@fluentui/react-aria';\nimport type { ComponentProps, ComponentState, Slot } from '@fluentui/react-utilities';\n\nexport type NavItemSlots = {\n /**\n * The root element of the NavItem.\n */\n root: NonNullable<Slot<ARIAButtonSlotProps<'a'>>>;\n\n /**\n * Icon that renders before the content.\n */\n icon?: Slot<'span'>;\n};\n\n/**\n * NavItem Props\n */\nexport type NavItemProps = ComponentProps<NavItemSlots> & {\n /**\n * Destination where the nav item points to.\n */\n href?: string;\n /**\n * The value that identifies this navCategoryItem when selected.\n */\n value: NavItemValue;\n};\n\n/**\n * State used in rendering NavItem\n */\nexport type NavItemState = ComponentState<NavItemSlots> &\n Pick<NavItemProps, 'value'> & {\n /**\n * If this navCategoryItem is selected\n */\n selected: boolean;\n\n /**\n * The density of the NavItem\n *\n * @default 'medium'\n */\n density: NavDensity;\n };\n"],"names":[],"mappings":"AA+BA;;CAEC,GACD,WAaI"}

View File

@@ -0,0 +1,4 @@
export { NavItem } from './NavItem';
export { renderNavItem_unstable } from './renderNavItem';
export { useNavItem_unstable } from './useNavItem';
export { useNavItemStyles_unstable, navItemClassNames } from './useNavItemStyles.styles';

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../src/components/NavItem/index.ts"],"sourcesContent":["export { NavItem } from './NavItem';\nexport type { NavItemSlots, NavItemProps, NavItemState } from './NavItem.types';\nexport { renderNavItem_unstable } from './renderNavItem';\nexport { useNavItem_unstable } from './useNavItem';\nexport { useNavItemStyles_unstable, navItemClassNames } from './useNavItemStyles.styles';\n"],"names":["NavItem","renderNavItem_unstable","useNavItem_unstable","useNavItemStyles_unstable","navItemClassNames"],"mappings":"AAAA,SAASA,OAAO,QAAQ,YAAY;AAEpC,SAASC,sBAAsB,QAAQ,kBAAkB;AACzD,SAASC,mBAAmB,QAAQ,eAAe;AACnD,SAASC,yBAAyB,EAAEC,iBAAiB,QAAQ,4BAA4B"}

View File

@@ -0,0 +1,13 @@
import { jsx as _jsx, jsxs as _jsxs } from "@fluentui/react-jsx-runtime/jsx-runtime";
import { assertSlots } from '@fluentui/react-utilities';
/**
* Render the final JSX of NavItem
*/ export const renderNavItem_unstable = (state)=>{
assertSlots(state);
return /*#__PURE__*/ _jsxs(state.root, {
children: [
state.icon && /*#__PURE__*/ _jsx(state.icon, {}),
state.root.children
]
});
};

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../src/components/NavItem/renderNavItem.tsx"],"sourcesContent":["/** @jsxRuntime automatic */\n/** @jsxImportSource @fluentui/react-jsx-runtime */\n\nimport { assertSlots } from '@fluentui/react-utilities';\nimport type { JSXElement } from '@fluentui/react-utilities';\n\nimport type { NavItemState, NavItemSlots } from './NavItem.types';\n\n/**\n * Render the final JSX of NavItem\n */\nexport const renderNavItem_unstable = (state: NavItemState): JSXElement => {\n assertSlots<NavItemSlots>(state);\n\n return (\n <state.root>\n {state.icon && <state.icon />}\n {state.root.children}\n </state.root>\n );\n};\n"],"names":["assertSlots","renderNavItem_unstable","state","root","icon","children"],"mappings":"AAAA,0BAA0B,GAC1B,iDAAiD;AAEjD,SAASA,WAAW,QAAQ,4BAA4B;AAKxD;;CAEC,GACD,OAAO,MAAMC,yBAAyB,CAACC;IACrCF,YAA0BE;IAE1B,qBACE,MAACA,MAAMC,IAAI;;YACRD,MAAME,IAAI,kBAAI,KAACF,MAAME,IAAI;YACzBF,MAAMC,IAAI,CAACE,QAAQ;;;AAG1B,EAAE"}

View File

@@ -0,0 +1,71 @@
'use client';
import * as React from 'react';
import { getIntrinsicElementProps, slot, useEventCallback, isHTMLElement } from '@fluentui/react-utilities';
import { useARIAButtonProps } from '@fluentui/react-aria';
import { useNavContext_unstable } from '../NavContext';
/**
* Create the state required to render NavItem.
*
* The returned state can be modified with hooks such as useNavItemStyles_unstable,
* before being passed to renderNavItem_unstable.
*
* @param props - props from this instance of NavItem
* @param ref - reference to root HTMLAnchorElement of NavItem
*/ export const useNavItem_unstable = (props, ref)=>{
const { onClick, value, icon, as, href } = props;
const { selectedValue, onRegister, onUnregister, onSelect, density = 'medium' } = useNavContext_unstable();
const rootElementType = as || (href ? 'a' : 'button');
const selected = selectedValue === value;
const innerRef = React.useRef(null);
const onNavItemClick = useEventCallback((event)=>{
onClick === null || onClick === void 0 ? void 0 : onClick(event);
if (!event.defaultPrevented && isHTMLElement(event.target)) {
onSelect(event, {
type: 'click',
event,
value
});
}
});
const root = slot.always(getIntrinsicElementProps(rootElementType, useARIAButtonProps(rootElementType, {
'aria-current': selected ? 'page' : 'false',
...props
})), {
elementType: rootElementType,
defaultProps: {
ref: ref,
type: rootElementType
}
});
root.onClick = onNavItemClick;
React.useEffect(()=>{
onRegister({
value,
ref: innerRef
});
return ()=>{
onUnregister({
value,
ref: innerRef
});
};
}, [
onRegister,
onUnregister,
innerRef,
value
]);
return {
components: {
root: rootElementType,
icon: 'span'
},
root,
icon: slot.optional(icon, {
elementType: 'span'
}),
selected,
value,
density
};
};

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../src/components/NavItem/useNavItem.ts"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { getIntrinsicElementProps, slot, useEventCallback, isHTMLElement } from '@fluentui/react-utilities';\nimport { useARIAButtonProps } from '@fluentui/react-aria';\nimport { useNavContext_unstable } from '../NavContext';\n\nimport type { ARIAButtonSlotProps } from '@fluentui/react-aria';\nimport type { NavItemProps, NavItemState } from './NavItem.types';\n\n/**\n * Create the state required to render NavItem.\n *\n * The returned state can be modified with hooks such as useNavItemStyles_unstable,\n * before being passed to renderNavItem_unstable.\n *\n * @param props - props from this instance of NavItem\n * @param ref - reference to root HTMLAnchorElement of NavItem\n */\nexport const useNavItem_unstable = (\n props: NavItemProps,\n ref: React.Ref<HTMLButtonElement | HTMLAnchorElement>,\n): NavItemState => {\n const { onClick, value, icon, as, href } = props;\n\n const { selectedValue, onRegister, onUnregister, onSelect, density = 'medium' } = useNavContext_unstable();\n\n const rootElementType = as || (href ? 'a' : 'button');\n\n const selected = selectedValue === value;\n\n const innerRef = React.useRef<HTMLElement>(null);\n\n const onNavItemClick: ARIAButtonSlotProps<'a'>['onClick'] = useEventCallback(event => {\n onClick?.(event);\n\n if (!event.defaultPrevented && isHTMLElement(event.target)) {\n onSelect(event, { type: 'click', event, value });\n }\n });\n\n const root = slot.always<ARIAButtonSlotProps<'a'>>(\n getIntrinsicElementProps(\n rootElementType,\n useARIAButtonProps(rootElementType, {\n 'aria-current': selected ? 'page' : 'false',\n ...props,\n }),\n ),\n {\n elementType: rootElementType,\n defaultProps: {\n ref: ref as React.Ref<HTMLButtonElement & HTMLAnchorElement>,\n type: rootElementType,\n },\n },\n );\n\n root.onClick = onNavItemClick;\n\n React.useEffect(() => {\n onRegister({\n value,\n ref: innerRef,\n });\n\n return () => {\n onUnregister({ value, ref: innerRef });\n };\n }, [onRegister, onUnregister, innerRef, value]);\n\n return {\n components: { root: rootElementType, icon: 'span' },\n root,\n icon: slot.optional(icon, {\n elementType: 'span',\n }),\n selected,\n value,\n density,\n };\n};\n"],"names":["React","getIntrinsicElementProps","slot","useEventCallback","isHTMLElement","useARIAButtonProps","useNavContext_unstable","useNavItem_unstable","props","ref","onClick","value","icon","as","href","selectedValue","onRegister","onUnregister","onSelect","density","rootElementType","selected","innerRef","useRef","onNavItemClick","event","defaultPrevented","target","type","root","always","elementType","defaultProps","useEffect","components","optional"],"mappings":"AAAA;AAEA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,wBAAwB,EAAEC,IAAI,EAAEC,gBAAgB,EAAEC,aAAa,QAAQ,4BAA4B;AAC5G,SAASC,kBAAkB,QAAQ,uBAAuB;AAC1D,SAASC,sBAAsB,QAAQ,gBAAgB;AAKvD;;;;;;;;CAQC,GACD,OAAO,MAAMC,sBAAsB,CACjCC,OACAC;IAEA,MAAM,EAAEC,OAAO,EAAEC,KAAK,EAAEC,IAAI,EAAEC,EAAE,EAAEC,IAAI,EAAE,GAAGN;IAE3C,MAAM,EAAEO,aAAa,EAAEC,UAAU,EAAEC,YAAY,EAAEC,QAAQ,EAAEC,UAAU,QAAQ,EAAE,GAAGb;IAElF,MAAMc,kBAAkBP,MAAOC,CAAAA,OAAO,MAAM,QAAO;IAEnD,MAAMO,WAAWN,kBAAkBJ;IAEnC,MAAMW,WAAWtB,MAAMuB,MAAM,CAAc;IAE3C,MAAMC,iBAAsDrB,iBAAiBsB,CAAAA;QAC3Ef,oBAAAA,8BAAAA,QAAUe;QAEV,IAAI,CAACA,MAAMC,gBAAgB,IAAItB,cAAcqB,MAAME,MAAM,GAAG;YAC1DT,SAASO,OAAO;gBAAEG,MAAM;gBAASH;gBAAOd;YAAM;QAChD;IACF;IAEA,MAAMkB,OAAO3B,KAAK4B,MAAM,CACtB7B,yBACEmB,iBACAf,mBAAmBe,iBAAiB;QAClC,gBAAgBC,WAAW,SAAS;QACpC,GAAGb,KAAK;IACV,KAEF;QACEuB,aAAaX;QACbY,cAAc;YACZvB,KAAKA;YACLmB,MAAMR;QACR;IACF;IAGFS,KAAKnB,OAAO,GAAGc;IAEfxB,MAAMiC,SAAS,CAAC;QACdjB,WAAW;YACTL;YACAF,KAAKa;QACP;QAEA,OAAO;YACLL,aAAa;gBAAEN;gBAAOF,KAAKa;YAAS;QACtC;IACF,GAAG;QAACN;QAAYC;QAAcK;QAAUX;KAAM;IAE9C,OAAO;QACLuB,YAAY;YAAEL,MAAMT;YAAiBR,MAAM;QAAO;QAClDiB;QACAjB,MAAMV,KAAKiC,QAAQ,CAACvB,MAAM;YACxBmB,aAAa;QACf;QACAV;QACAV;QACAQ;IACF;AACF,EAAE"}

View File

@@ -0,0 +1,29 @@
'use client';
import { mergeClasses } from '@griffel/react';
import { useContentStyles, useIconStyles, useIndicatorStyles, useRootDefaultClassName, useSmallStyles } from '../sharedNavStyles.styles';
export const navItemClassNames = {
root: 'fui-NavItem',
icon: 'fui-NavItem__icon'
};
/**
* Apply styling to the NavItem slots based on the state
*/
export const useNavItemStyles_unstable = state => {
'use no memo';
const rootDefaultClassName = useRootDefaultClassName();
const smallStyles = useSmallStyles();
const contentStyles = useContentStyles();
const indicatorStyles = useIndicatorStyles();
const iconStyles = useIconStyles();
const {
selected,
density
} = state;
state.root.className = mergeClasses(navItemClassNames.root, rootDefaultClassName, density === 'small' && smallStyles.root, selected && indicatorStyles.base, selected && contentStyles.selected, state.root.className);
if (state.icon) {
state.icon.className = mergeClasses(navItemClassNames.icon, iconStyles.base, selected && iconStyles.selected, state.icon.className);
}
return state;
};

View File

@@ -0,0 +1 @@
{"version":3,"names":["mergeClasses","useContentStyles","useIconStyles","useIndicatorStyles","useRootDefaultClassName","useSmallStyles","navItemClassNames","root","icon","useNavItemStyles_unstable","state","rootDefaultClassName","smallStyles","contentStyles","indicatorStyles","iconStyles","selected","density","className","base"],"sources":["useNavItemStyles.styles.js"],"sourcesContent":["'use client';\nimport { mergeClasses } from '@griffel/react';\nimport { useContentStyles, useIconStyles, useIndicatorStyles, useRootDefaultClassName, useSmallStyles } from '../sharedNavStyles.styles';\nexport const navItemClassNames = {\n root: 'fui-NavItem',\n icon: 'fui-NavItem__icon'\n};\n/**\n * Apply styling to the NavItem slots based on the state\n */ export const useNavItemStyles_unstable = (state)=>{\n 'use no memo';\n const rootDefaultClassName = useRootDefaultClassName();\n const smallStyles = useSmallStyles();\n const contentStyles = useContentStyles();\n const indicatorStyles = useIndicatorStyles();\n const iconStyles = useIconStyles();\n const { selected, density } = state;\n state.root.className = mergeClasses(navItemClassNames.root, rootDefaultClassName, density === 'small' && smallStyles.root, selected && indicatorStyles.base, selected && contentStyles.selected, state.root.className);\n if (state.icon) {\n state.icon.className = mergeClasses(navItemClassNames.icon, iconStyles.base, selected && iconStyles.selected, state.icon.className);\n }\n return state;\n};\n"],"mappings":"AAAA,YAAY;;AACZ,SAASA,YAAY,QAAQ,gBAAgB;AAC7C,SAASC,gBAAgB,EAAEC,aAAa,EAAEC,kBAAkB,EAAEC,uBAAuB,EAAEC,cAAc,QAAQ,2BAA2B;AACxI,OAAO,MAAMC,iBAAiB,GAAG;EAC7BC,IAAI,EAAE,aAAa;EACnBC,IAAI,EAAE;AACV,CAAC;AACD;AACA;AACA;AAAI,OAAO,MAAMC,yBAAyB,GAAIC,KAAK,IAAG;EAClD,aAAa;;EACb,MAAMC,oBAAoB,GAAGP,uBAAuB,CAAC,CAAC;EACtD,MAAMQ,WAAW,GAAGP,cAAc,CAAC,CAAC;EACpC,MAAMQ,aAAa,GAAGZ,gBAAgB,CAAC,CAAC;EACxC,MAAMa,eAAe,GAAGX,kBAAkB,CAAC,CAAC;EAC5C,MAAMY,UAAU,GAAGb,aAAa,CAAC,CAAC;EAClC,MAAM;IAAEc,QAAQ;IAAEC;EAAQ,CAAC,GAAGP,KAAK;EACnCA,KAAK,CAACH,IAAI,CAACW,SAAS,GAAGlB,YAAY,CAACM,iBAAiB,CAACC,IAAI,EAAEI,oBAAoB,EAAEM,OAAO,KAAK,OAAO,IAAIL,WAAW,CAACL,IAAI,EAAES,QAAQ,IAAIF,eAAe,CAACK,IAAI,EAAEH,QAAQ,IAAIH,aAAa,CAACG,QAAQ,EAAEN,KAAK,CAACH,IAAI,CAACW,SAAS,CAAC;EACtN,IAAIR,KAAK,CAACF,IAAI,EAAE;IACZE,KAAK,CAACF,IAAI,CAACU,SAAS,GAAGlB,YAAY,CAACM,iBAAiB,CAACE,IAAI,EAAEO,UAAU,CAACI,IAAI,EAAEH,QAAQ,IAAID,UAAU,CAACC,QAAQ,EAAEN,KAAK,CAACF,IAAI,CAACU,SAAS,CAAC;EACvI;EACA,OAAOR,KAAK;AAChB,CAAC","ignoreList":[]}

View File

@@ -0,0 +1,23 @@
'use client';
import { mergeClasses } from '@griffel/react';
import { useContentStyles, useIconStyles, useIndicatorStyles, useRootDefaultClassName, useSmallStyles } from '../sharedNavStyles.styles';
export const navItemClassNames = {
root: 'fui-NavItem',
icon: 'fui-NavItem__icon'
};
/**
* Apply styling to the NavItem slots based on the state
*/ export const useNavItemStyles_unstable = (state)=>{
'use no memo';
const rootDefaultClassName = useRootDefaultClassName();
const smallStyles = useSmallStyles();
const contentStyles = useContentStyles();
const indicatorStyles = useIndicatorStyles();
const iconStyles = useIconStyles();
const { selected, density } = state;
state.root.className = mergeClasses(navItemClassNames.root, rootDefaultClassName, density === 'small' && smallStyles.root, selected && indicatorStyles.base, selected && contentStyles.selected, state.root.className);
if (state.icon) {
state.icon.className = mergeClasses(navItemClassNames.icon, iconStyles.base, selected && iconStyles.selected, state.icon.className);
}
return state;
};

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../src/components/NavItem/useNavItemStyles.styles.ts"],"sourcesContent":["'use client';\n\nimport { mergeClasses } from '@griffel/react';\nimport {\n useContentStyles,\n useIconStyles,\n useIndicatorStyles,\n useRootDefaultClassName,\n useSmallStyles,\n} from '../sharedNavStyles.styles';\n\nimport type { SlotClassNames } from '@fluentui/react-utilities';\nimport type { NavItemSlots, NavItemState } from './NavItem.types';\nexport const navItemClassNames: SlotClassNames<NavItemSlots> = {\n root: 'fui-NavItem',\n icon: 'fui-NavItem__icon',\n};\n\n/**\n * Apply styling to the NavItem slots based on the state\n */\nexport const useNavItemStyles_unstable = (state: NavItemState): NavItemState => {\n 'use no memo';\n\n const rootDefaultClassName = useRootDefaultClassName();\n const smallStyles = useSmallStyles();\n const contentStyles = useContentStyles();\n const indicatorStyles = useIndicatorStyles();\n const iconStyles = useIconStyles();\n\n const { selected, density } = state;\n\n state.root.className = mergeClasses(\n navItemClassNames.root,\n rootDefaultClassName,\n density === 'small' && smallStyles.root,\n selected && indicatorStyles.base,\n selected && contentStyles.selected,\n state.root.className,\n );\n\n if (state.icon) {\n state.icon.className = mergeClasses(\n navItemClassNames.icon,\n iconStyles.base,\n selected && iconStyles.selected,\n state.icon.className,\n );\n }\n\n return state;\n};\n"],"names":["mergeClasses","useContentStyles","useIconStyles","useIndicatorStyles","useRootDefaultClassName","useSmallStyles","navItemClassNames","root","icon","useNavItemStyles_unstable","state","rootDefaultClassName","smallStyles","contentStyles","indicatorStyles","iconStyles","selected","density","className","base"],"mappings":"AAAA;AAEA,SAASA,YAAY,QAAQ,iBAAiB;AAC9C,SACEC,gBAAgB,EAChBC,aAAa,EACbC,kBAAkB,EAClBC,uBAAuB,EACvBC,cAAc,QACT,4BAA4B;AAInC,OAAO,MAAMC,oBAAkD;IAC7DC,MAAM;IACNC,MAAM;AACR,EAAE;AAEF;;CAEC,GACD,OAAO,MAAMC,4BAA4B,CAACC;IACxC;IAEA,MAAMC,uBAAuBP;IAC7B,MAAMQ,cAAcP;IACpB,MAAMQ,gBAAgBZ;IACtB,MAAMa,kBAAkBX;IACxB,MAAMY,aAAab;IAEnB,MAAM,EAAEc,QAAQ,EAAEC,OAAO,EAAE,GAAGP;IAE9BA,MAAMH,IAAI,CAACW,SAAS,GAAGlB,aACrBM,kBAAkBC,IAAI,EACtBI,sBACAM,YAAY,WAAWL,YAAYL,IAAI,EACvCS,YAAYF,gBAAgBK,IAAI,EAChCH,YAAYH,cAAcG,QAAQ,EAClCN,MAAMH,IAAI,CAACW,SAAS;IAGtB,IAAIR,MAAMF,IAAI,EAAE;QACdE,MAAMF,IAAI,CAACU,SAAS,GAAGlB,aACrBM,kBAAkBE,IAAI,EACtBO,WAAWI,IAAI,EACfH,YAAYD,WAAWC,QAAQ,EAC/BN,MAAMF,IAAI,CAACU,SAAS;IAExB;IAEA,OAAOR;AACT,EAAE"}