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,24 @@
'use client';
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "CarouselCard", {
enumerable: true,
get: function() {
return CarouselCard;
}
});
const _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
const _useCarouselCard = require("./useCarouselCard");
const _renderCarouselCard = require("./renderCarouselCard");
const _useCarouselCardStylesstyles = require("./useCarouselCardStyles.styles");
const _reactsharedcontexts = require("@fluentui/react-shared-contexts");
const CarouselCard = /*#__PURE__*/ _react.forwardRef((props, ref)=>{
const state = (0, _useCarouselCard.useCarouselCard_unstable)(props, ref);
(0, _useCarouselCardStylesstyles.useCarouselCardStyles_unstable)(state);
(0, _reactsharedcontexts.useCustomStyleHook_unstable)('useCarouselCardStyles_unstable')(state);
return (0, _renderCarouselCard.renderCarouselCard_unstable)(state);
});
CarouselCard.displayName = 'CarouselCard';

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../src/components/CarouselCard/CarouselCard.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport type { ForwardRefComponent } from '@fluentui/react-utilities';\nimport { useCarouselCard_unstable } from './useCarouselCard';\nimport { renderCarouselCard_unstable } from './renderCarouselCard';\nimport { useCarouselCardStyles_unstable } from './useCarouselCardStyles.styles';\nimport type { CarouselCardProps } from './CarouselCard.types';\nimport { useCustomStyleHook_unstable } from '@fluentui/react-shared-contexts';\n\n/**\n * The defining wrapper of a carousel's indexed content, they will take up the full\n * viewport of CarouselSlider or div wrapper,\n * users may place multiple items within this Card if desired, with consideration of viewport width.\n *\n * Clickable actions within the content area are available via mouse and tab as expected,\n * non-active card content will be set to inert until moved to active card.\n */\nexport const CarouselCard: ForwardRefComponent<CarouselCardProps> = React.forwardRef((props, ref) => {\n const state = useCarouselCard_unstable(props, ref);\n\n useCarouselCardStyles_unstable(state);\n useCustomStyleHook_unstable('useCarouselCardStyles_unstable')(state);\n\n return renderCarouselCard_unstable(state);\n});\n\nCarouselCard.displayName = 'CarouselCard';\n"],"names":["React","useCarouselCard_unstable","renderCarouselCard_unstable","useCarouselCardStyles_unstable","useCustomStyleHook_unstable","CarouselCard","forwardRef","props","ref","state","displayName"],"mappings":"AAAA;;;;;;;;;;;;iEAEuB,QAAQ;iCAEU,oBAAoB;oCACjB,uBAAuB;6CACpB,iCAAiC;qCAEpC,kCAAkC;AAUvE,MAAMK,eAAAA,WAAAA,GAAuDL,OAAMM,UAAU,CAAC,CAACC,OAAOC;IAC3F,MAAMC,YAAQR,yCAAAA,EAAyBM,OAAOC;QAE9CL,2DAAAA,EAA+BM;QAC/BL,gDAAAA,EAA4B,kCAAkCK;IAE9D,WAAOP,+CAAAA,EAA4BO;AACrC,GAAG;AAEHJ,aAAaK,WAAW,GAAG"}

View File

@@ -0,0 +1,6 @@
/**
* State used in rendering CarouselCard
*/ "use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../src/components/CarouselCard/CarouselCard.types.ts"],"sourcesContent":["import type { ComponentProps, ComponentState, Slot } from '@fluentui/react-utilities';\n\nexport type CarouselCardSlots = {\n root: Slot<'div'>;\n};\n\n/**\n * CarouselCard Props\n */\nexport type CarouselCardProps = ComponentProps<CarouselCardSlots> & {\n /**\n * Sets the card styling to be responsive based on content.\n */\n autoSize?: boolean;\n};\n\n/**\n * State used in rendering CarouselCard\n */\nexport type CarouselCardState = ComponentState<CarouselCardSlots> & Pick<CarouselCardProps, 'autoSize'>;\n"],"names":[],"mappings":"AAgBA;;CAEC,GACD,WAAwG"}

View File

@@ -0,0 +1,31 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
CarouselCard: function() {
return _CarouselCard.CarouselCard;
},
carouselCardClassNames: function() {
return _useCarouselCardStylesstyles.carouselCardClassNames;
},
renderCarouselCard_unstable: function() {
return _renderCarouselCard.renderCarouselCard_unstable;
},
useCarouselCardStyles_unstable: function() {
return _useCarouselCardStylesstyles.useCarouselCardStyles_unstable;
},
useCarouselCard_unstable: function() {
return _useCarouselCard.useCarouselCard_unstable;
}
});
const _CarouselCard = require("./CarouselCard");
const _renderCarouselCard = require("./renderCarouselCard");
const _useCarouselCard = require("./useCarouselCard");
const _useCarouselCardStylesstyles = require("./useCarouselCardStyles.styles");

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../src/components/CarouselCard/index.ts"],"sourcesContent":["export { CarouselCard } from './CarouselCard';\nexport type { CarouselCardProps, CarouselCardSlots, CarouselCardState } from './CarouselCard.types';\nexport { renderCarouselCard_unstable } from './renderCarouselCard';\nexport { useCarouselCard_unstable } from './useCarouselCard';\nexport { carouselCardClassNames, useCarouselCardStyles_unstable } from './useCarouselCardStyles.styles';\n"],"names":["CarouselCard","renderCarouselCard_unstable","useCarouselCard_unstable","carouselCardClassNames","useCarouselCardStyles_unstable"],"mappings":";;;;;;;;;;;;eAASA,0BAAY;;;eAIZG,mDAAsB;;;eAFtBF,+CAA2B;;;eAEHG,2DAA8B;;;eADtDF,yCAAwB;;;8BAHJ,iBAAiB;oCAEF,uBAAuB;iCAC1B,oBAAoB;6CACU,iCAAiC"}

View File

@@ -0,0 +1,16 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "renderCarouselCard_unstable", {
enumerable: true,
get: function() {
return renderCarouselCard_unstable;
}
});
const _jsxruntime = require("@fluentui/react-jsx-runtime/jsx-runtime");
const _reactutilities = require("@fluentui/react-utilities");
const renderCarouselCard_unstable = (state)=>{
(0, _reactutilities.assertSlots)(state);
return /*#__PURE__*/ (0, _jsxruntime.jsx)(state.root, {});
};

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../src/components/CarouselCard/renderCarouselCard.tsx"],"sourcesContent":["/** @jsxRuntime automatic */\n/** @jsxImportSource @fluentui/react-jsx-runtime */\n\nimport { assertSlots } from '@fluentui/react-utilities';\nimport type { JSXElement } from '@fluentui/react-utilities';\nimport type { CarouselCardState, CarouselCardSlots } from './CarouselCard.types';\n\n/**\n * Render the final JSX of CarouselCard\n */\nexport const renderCarouselCard_unstable = (state: CarouselCardState): JSXElement => {\n assertSlots<CarouselCardSlots>(state);\n\n return <state.root />;\n};\n"],"names":["assertSlots","renderCarouselCard_unstable","state","root"],"mappings":";;;;;;;;;;4BACA,gDAAiD;gCAErB,4BAA4B;AAOjD,MAAMC,8BAA8B,CAACC;QAC1CF,2BAAAA,EAA+BE;IAE/B,OAAA,WAAA,OAAO,eAAA,EAACA,MAAMC,IAAI,EAAA,CAAA;AACpB,EAAE"}

View File

@@ -0,0 +1,101 @@
'use client';
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "useCarouselCard_unstable", {
enumerable: true,
get: function() {
return useCarouselCard_unstable;
}
});
const _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
const _reacttabster = require("@fluentui/react-tabster");
const _reactutilities = require("@fluentui/react-utilities");
const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
const _CarouselContext = require("../CarouselContext");
const _useEmblaCarousel = require("../useEmblaCarousel");
const _useCarouselCardStylesstyles = require("./useCarouselCardStyles.styles");
const _CarouselSliderContext = require("../CarouselSlider/CarouselSliderContext");
const useCarouselCard_unstable = (props, ref)=>{
const { autoSize } = props;
const elementRef = _react.useRef(null);
const isMouseEvent = _react.useRef(false);
const selectPageByElement = (0, _CarouselContext.useCarouselContext_unstable)((ctx)=>ctx.selectPageByElement);
const containerRef = (0, _CarouselContext.useCarouselContext_unstable)((ctx)=>ctx.containerRef);
const { cardFocus } = (0, _CarouselSliderContext.useCarouselSliderContext)();
const focusAttr = (0, _reacttabster.useFocusableGroup)({
tabBehavior: 'limited'
});
const focusAttrProps = cardFocus ? {
...focusAttr,
tabIndex: 0
} : {};
// We attach a unique card id if user does not provide
const id = (0, _reactutilities.useId)(_useCarouselCardStylesstyles.carouselCardClassNames.root, props.id);
_react.useEffect(()=>{
const element = elementRef.current;
if (element) {
const listener = (_e)=>{
const event = _e;
// When there is no tab index present, only current cards should be visible to accessibility
if (!cardFocus) {
const hidden = !event.detail.isVisible;
element.ariaHidden = hidden.toString();
element.inert = hidden;
}
};
element.addEventListener(_useEmblaCarousel.EMBLA_VISIBILITY_EVENT, listener);
return ()=>{
element.removeEventListener(_useEmblaCarousel.EMBLA_VISIBILITY_EVENT, listener);
};
}
}, [
cardFocus
]);
const handleFocus = _react.useCallback((e)=>{
if (!e.defaultPrevented && (0, _reactutilities.isHTMLElement)(e.currentTarget) && !isMouseEvent.current) {
var _containerRef_current;
containerRef === null || containerRef === void 0 ? void 0 : (_containerRef_current = containerRef.current) === null || _containerRef_current === void 0 ? void 0 : _containerRef_current.scrollTo(0, 0);
selectPageByElement(e, e.currentTarget, false);
}
// Mouse focus event has been consumed
isMouseEvent.current = false;
}, [
selectPageByElement,
containerRef
]);
const handlePointerDown = (e)=>{
if (!e.defaultPrevented) {
isMouseEvent.current = true;
}
};
const handlePointerUp = (e)=>{
if (!e.defaultPrevented) {
isMouseEvent.current = false;
}
};
const onFocusCapture = (0, _reactutilities.mergeCallbacks)(props.onFocusCapture, handleFocus);
const onPointerUp = (0, _reactutilities.mergeCallbacks)(props.onPointerUp, handlePointerUp);
const onPointerDown = (0, _reactutilities.mergeCallbacks)(props.onPointerDown, handlePointerDown);
const state = {
autoSize,
components: {
root: 'div'
},
root: _reactutilities.slot.always((0, _reactutilities.getIntrinsicElementProps)('div', {
ref: (0, _reactutilities.useMergedRefs)(elementRef, ref),
role: 'tabpanel',
tabIndex: cardFocus ? 0 : undefined,
...props,
id,
onFocusCapture,
onPointerUp,
onPointerDown,
...focusAttrProps
}), {
elementType: 'div'
})
};
return state;
};

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,94 @@
'use client';
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
carouselCardClassNames: function() {
return carouselCardClassNames;
},
useCarouselCardStyles_unstable: function() {
return useCarouselCardStyles_unstable;
}
});
const _react = require("@griffel/react");
const _CarouselContext = require("../CarouselContext");
const carouselCardClassNames = {
root: 'fui-CarouselCard'
};
/**
* Styles for the root slot
*/ const useStyles = /*#__PURE__*/ (0, _react.__styles)({
root: {
xawz: 0,
Bh6795r: 0,
Bnnss6s: 0,
fkmc3a: "fg68ejw",
B2u0y6b: "f6dzj5z"
},
autoSize: {
xawz: 0,
Bh6795r: 0,
Bnnss6s: 0,
fkmc3a: "fd9q35j",
Bf4jedk: "fy77jfu",
a9b677: "f14z66ap",
B2u0y6b: "f6dzj5z"
},
elevated: {
Beyfa6y: 0,
Bbmb7ep: 0,
Btl43ni: 0,
B7oj6ja: 0,
Dimara: "f1kijzfu",
E5pizo: "f1hg901r",
B68tc82: 0,
Bmxbyg5: 0,
Bpg54ce: "f1a3p1vp"
}
}, {
d: [
[
".fg68ejw{flex:0 0 100%;}",
{
p: -1
}
],
".f6dzj5z{max-width:100%;}",
[
".fd9q35j{flex:0 0 auto;}",
{
p: -1
}
],
".fy77jfu{min-width:0;}",
".f14z66ap{width:auto;}",
[
".f1kijzfu{border-radius:var(--borderRadiusXLarge);}",
{
p: -1
}
],
".f1hg901r{box-shadow:var(--shadow16);}",
[
".f1a3p1vp{overflow:hidden;}",
{
p: -1
}
]
]
});
const useCarouselCardStyles_unstable = (state)=>{
'use no memo';
const { autoSize } = state;
const appearance = (0, _CarouselContext.useCarouselContext_unstable)((context)=>context.appearance);
const styles = useStyles();
state.root.className = (0, _react.mergeClasses)(carouselCardClassNames.root, styles.root, appearance === 'elevated' && styles.elevated, autoSize && styles.autoSize, state.root.className);
return state;
};

View File

@@ -0,0 +1 @@
{"version":3,"sources":["useCarouselCardStyles.styles.js"],"sourcesContent":["'use client';\nimport { makeStyles, mergeClasses } from '@griffel/react';\nimport { tokens } from '@fluentui/react-theme';\nimport { useCarouselContext_unstable as useCarouselContext } from '../CarouselContext';\nexport const carouselCardClassNames = {\n root: 'fui-CarouselCard'\n};\n/**\n * Styles for the root slot\n */ const useStyles = makeStyles({\n root: {\n flex: '0 0 100%',\n maxWidth: '100%'\n },\n autoSize: {\n flex: '0 0 auto' /* Adapt slide size to its content */ ,\n minWidth: 0,\n width: 'auto',\n maxWidth: '100%'\n },\n elevated: {\n borderRadius: tokens.borderRadiusXLarge,\n boxShadow: tokens.shadow16,\n overflow: 'hidden'\n }\n});\n/**\n * Apply styling to the CarouselCard slots based on the state\n */ export const useCarouselCardStyles_unstable = (state)=>{\n 'use no memo';\n const { autoSize } = state;\n const appearance = useCarouselContext((context)=>context.appearance);\n const styles = useStyles();\n state.root.className = mergeClasses(carouselCardClassNames.root, styles.root, appearance === 'elevated' && styles.elevated, autoSize && styles.autoSize, state.root.className);\n return state;\n};\n"],"names":["__styles","mergeClasses","tokens","useCarouselContext_unstable","useCarouselContext","carouselCardClassNames","root","useStyles","xawz","Bh6795r","Bnnss6s","fkmc3a","B2u0y6b","autoSize","Bf4jedk","a9b677","elevated","Beyfa6y","Bbmb7ep","Btl43ni","B7oj6ja","Dimara","E5pizo","B68tc82","Bmxbyg5","Bpg54ce","d","p","useCarouselCardStyles_unstable","state","appearance","context","styles","className"],"mappings":"AAAA,YAAY;;;;;;;;;;;;IAICK,sBAAsB;;;kCAwBY;eAA9BuB;;;uBA3BwB,gBAAgB;iCAES,oBAAoB;AAC/E,+BAA+B;IAClCtB,IAAI,EAAE;AACV,CAAC;AACD;;CAEA,GAAI,MAAMC,SAAS,GAAA,WAAA,OAAGP,eAAA,EAAA;IAAAM,IAAA,EAAA;QAAAE,IAAA,EAAA;QAAAC,OAAA,EAAA;QAAAC,OAAA,EAAA;QAAAC,MAAA,EAAA;QAAAC,OAAA,EAAA;IAAA;IAAAC,QAAA,EAAA;QAAAL,IAAA,EAAA;QAAAC,OAAA,EAAA;QAAAC,OAAA,EAAA;QAAAC,MAAA,EAAA;QAAAG,OAAA,EAAA;QAAAC,MAAA,EAAA;QAAAH,OAAA,EAAA;IAAA;IAAAI,QAAA,EAAA;QAAAC,OAAA,EAAA;QAAAC,OAAA,EAAA;QAAAC,OAAA,EAAA;QAAAC,OAAA,EAAA;QAAAC,MAAA,EAAA;QAAAC,MAAA,EAAA;QAAAC,OAAA,EAAA;QAAAC,OAAA,EAAA;QAAAC,OAAA,EAAA;IAAA;AAAA,GAAA;IAAAC,CAAA,EAAA;QAAA;YAAA;YAAA;gBAAAC,CAAA,EAAA,CAAA;YAAA;SAAA;QAAA;QAAA;YAAA;YAAA;gBAAAA,CAAA,EAAA,CAAA;YAAA;SAAA;QAAA;QAAA;QAAA;YAAA;YAAA;gBAAAA,CAAA,EAAA,CAAA;YAAA;SAAA;QAAA;QAAA;YAAA;YAAA;gBAAAA,CAAA,EAAA,CAAA;YAAA;SAAA;KAAA;AAAA,CAgBrB,CAAC;AAGS,wCAAwCE,KAAK,IAAG;IACvD,aAAa;IACb,MAAM,EAAEhB,QAAAA,EAAU,GAAGgB,KAAK;IAC1B,MAAMC,UAAU,OAAG1B,4CAAkB,GAAE2B,OAAO,GAAGA,OAAO,CAACD,UAAU,CAAC;IACpE,MAAME,MAAM,GAAGzB,SAAS,CAAC,CAAC;IAC1BsB,KAAK,CAACvB,IAAI,CAAC2B,SAAS,OAAGhC,mBAAY,EAACI,sBAAsB,CAACC,IAAI,EAAE0B,MAAM,CAAC1B,IAAI,EAAEwB,UAAU,KAAK,UAAU,IAAIE,MAAM,CAAChB,QAAQ,EAAEH,QAAQ,IAAImB,MAAM,CAACnB,QAAQ,EAAEgB,KAAK,CAACvB,IAAI,CAAC2B,SAAS,CAAC;IAC9K,OAAOJ,KAAK;AAChB,CAAC"}

View File

@@ -0,0 +1,52 @@
'use client';
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
carouselCardClassNames: function() {
return carouselCardClassNames;
},
useCarouselCardStyles_unstable: function() {
return useCarouselCardStyles_unstable;
}
});
const _react = require("@griffel/react");
const _reacttheme = require("@fluentui/react-theme");
const _CarouselContext = require("../CarouselContext");
const carouselCardClassNames = {
root: 'fui-CarouselCard'
};
/**
* Styles for the root slot
*/ const useStyles = (0, _react.makeStyles)({
root: {
flex: '0 0 100%',
maxWidth: '100%'
},
autoSize: {
flex: '0 0 auto' /* Adapt slide size to its content */ ,
minWidth: 0,
width: 'auto',
maxWidth: '100%'
},
elevated: {
borderRadius: _reacttheme.tokens.borderRadiusXLarge,
boxShadow: _reacttheme.tokens.shadow16,
overflow: 'hidden'
}
});
const useCarouselCardStyles_unstable = (state)=>{
'use no memo';
const { autoSize } = state;
const appearance = (0, _CarouselContext.useCarouselContext_unstable)((context)=>context.appearance);
const styles = useStyles();
state.root.className = (0, _react.mergeClasses)(carouselCardClassNames.root, styles.root, appearance === 'elevated' && styles.elevated, autoSize && styles.autoSize, state.root.className);
return state;
};

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../src/components/CarouselCard/useCarouselCardStyles.styles.ts"],"sourcesContent":["'use client';\n\nimport { makeStyles, mergeClasses } from '@griffel/react';\nimport type { SlotClassNames } from '@fluentui/react-utilities';\nimport { tokens } from '@fluentui/react-theme';\nimport { useCarouselContext_unstable as useCarouselContext } from '../CarouselContext';\nimport type { CarouselCardSlots, CarouselCardState } from './CarouselCard.types';\n\nexport const carouselCardClassNames: SlotClassNames<CarouselCardSlots> = {\n root: 'fui-CarouselCard',\n};\n\n/**\n * Styles for the root slot\n */\nconst useStyles = makeStyles({\n root: {\n flex: '0 0 100%',\n maxWidth: '100%',\n },\n autoSize: {\n flex: '0 0 auto' /* Adapt slide size to its content */,\n minWidth: 0,\n width: 'auto',\n maxWidth: '100%',\n },\n elevated: {\n borderRadius: tokens.borderRadiusXLarge,\n boxShadow: tokens.shadow16,\n overflow: 'hidden',\n },\n});\n\n/**\n * Apply styling to the CarouselCard slots based on the state\n */\nexport const useCarouselCardStyles_unstable = (state: CarouselCardState): CarouselCardState => {\n 'use no memo';\n\n const { autoSize } = state;\n const appearance = useCarouselContext(context => context.appearance);\n\n const styles = useStyles();\n state.root.className = mergeClasses(\n carouselCardClassNames.root,\n styles.root,\n appearance === 'elevated' && styles.elevated,\n autoSize && styles.autoSize,\n state.root.className,\n );\n\n return state;\n};\n"],"names":["makeStyles","mergeClasses","tokens","useCarouselContext_unstable","useCarouselContext","carouselCardClassNames","root","useStyles","flex","maxWidth","autoSize","minWidth","width","elevated","borderRadius","borderRadiusXLarge","boxShadow","shadow16","overflow","useCarouselCardStyles_unstable","state","appearance","context","styles","className"],"mappings":"AAAA;;;;;;;;;;;;IAQaK,sBAAAA;;;IA4BAc,8BAAAA;;;;uBAlC4B,iBAAiB;4BAEnC,wBAAwB;iCACmB,qBAAqB;AAGhF,+BAAkE;IACvEb,MAAM;AACR,EAAE;AAEF;;CAEC,GACD,MAAMC,gBAAYP,iBAAAA,EAAW;IAC3BM,MAAM;QACJE,MAAM;QACNC,UAAU;IACZ;IACAC,UAAU;QACRF,MAAM,WAAW,mCAAmC;QACpDG,UAAU;QACVC,OAAO;QACPH,UAAU;IACZ;IACAI,UAAU;QACRC,cAAcZ,kBAAAA,CAAOa,kBAAkB;QACvCC,WAAWd,kBAAAA,CAAOe,QAAQ;QAC1BC,UAAU;IACZ;AACF;AAKO,uCAAuC,CAACE;IAC7C;IAEA,MAAM,EAAEV,QAAQ,EAAE,GAAGU;IACrB,MAAMC,iBAAajB,4CAAAA,EAAmBkB,CAAAA,UAAWA,QAAQD,UAAU;IAEnE,MAAME,SAAShB;IACfa,MAAMd,IAAI,CAACkB,SAAS,OAAGvB,mBAAAA,EACrBI,uBAAuBC,IAAI,EAC3BiB,OAAOjB,IAAI,EACXe,eAAe,cAAcE,OAAOV,QAAQ,EAC5CH,YAAYa,OAAOb,QAAQ,EAC3BU,MAAMd,IAAI,CAACkB,SAAS;IAGtB,OAAOJ;AACT,EAAE"}