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, "CarouselButton", {
enumerable: true,
get: function() {
return CarouselButton;
}
});
const _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
const _useCarouselButton = require("./useCarouselButton");
const _renderCarouselButton = require("./renderCarouselButton");
const _useCarouselButtonStylesstyles = require("./useCarouselButtonStyles.styles");
const _reactsharedcontexts = require("@fluentui/react-shared-contexts");
const CarouselButton = /*#__PURE__*/ _react.forwardRef((props, ref)=>{
const state = (0, _useCarouselButton.useCarouselButton_unstable)(props, ref);
(0, _useCarouselButtonStylesstyles.useCarouselButtonStyles_unstable)(state);
(0, _reactsharedcontexts.useCustomStyleHook_unstable)('useCarouselButtonStyles_unstable')(state);
return (0, _renderCarouselButton.renderCarouselButton_unstable)(state);
});
CarouselButton.displayName = 'CarouselButton';

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../src/components/CarouselButton/CarouselButton.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport type { ForwardRefComponent } from '@fluentui/react-utilities';\nimport { useCarouselButton_unstable } from './useCarouselButton';\nimport { renderCarouselButton_unstable } from './renderCarouselButton';\nimport { useCarouselButtonStyles_unstable } from './useCarouselButtonStyles.styles';\nimport type { CarouselButtonProps } from './CarouselButton.types';\nimport { useCustomStyleHook_unstable } from '@fluentui/react-shared-contexts';\n\n/**\n * A default navigation button that will set value to the next/previous page,\n * driven by it's type 'next' or 'previous'.\n */\nexport const CarouselButton: ForwardRefComponent<CarouselButtonProps> = React.forwardRef((props, ref) => {\n const state = useCarouselButton_unstable(props, ref);\n\n useCarouselButtonStyles_unstable(state);\n useCustomStyleHook_unstable('useCarouselButtonStyles_unstable')(state);\n\n return renderCarouselButton_unstable(state);\n});\n\nCarouselButton.displayName = 'CarouselButton';\n"],"names":["React","useCarouselButton_unstable","renderCarouselButton_unstable","useCarouselButtonStyles_unstable","useCustomStyleHook_unstable","CarouselButton","forwardRef","props","ref","state","displayName"],"mappings":"AAAA;;;;;;;;;;;;iEAEuB,QAAQ;mCAEY,sBAAsB;sCACnB,yBAAyB;+CACtB,mCAAmC;qCAExC,kCAAkC;AAMvE,MAAMK,iBAAAA,WAAAA,GAA2DL,OAAMM,UAAU,CAAC,CAACC,OAAOC;IAC/F,MAAMC,YAAQR,6CAAAA,EAA2BM,OAAOC;QAEhDL,+DAAAA,EAAiCM;QACjCL,gDAAAA,EAA4B,oCAAoCK;IAEhE,WAAOP,mDAAAA,EAA8BO;AACvC,GAAG;AAEHJ,eAAeK,WAAW,GAAG"}

View File

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

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../src/components/CarouselButton/CarouselButton.types.ts"],"sourcesContent":["import type { ComponentProps, ComponentState, Slot } from '@fluentui/react-utilities';\nimport { ARIAButtonSlotProps } from '@fluentui/react-aria';\nimport { ButtonProps, ButtonSlots, ButtonState } from '@fluentui/react-button';\n\nexport type CarouselButtonSlots = ButtonSlots & {\n root: NonNullable<Slot<ARIAButtonSlotProps>>;\n};\n\n/**\n * CarouselButton Props\n */\nexport type CarouselButtonProps = Partial<ButtonProps> &\n ComponentProps<CarouselButtonSlots> & {\n /**\n * Dictates whether button will be of type go next or go previous\n * Default: 'next'\n */\n navType?: 'prev' | 'next';\n };\n\n/**\n * State used in rendering CarouselButton\n */\nexport type CarouselButtonState = ButtonState &\n ComponentState<CarouselButtonSlots> &\n Required<Pick<CarouselButtonProps, 'navType'>>;\n"],"names":[],"mappings":"AAoBA;;CAEC,GACD,WAEiD"}

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, {
CarouselButton: function() {
return _CarouselButton.CarouselButton;
},
carouselButtonClassNames: function() {
return _useCarouselButtonStylesstyles.carouselButtonClassNames;
},
renderCarouselButton_unstable: function() {
return _renderCarouselButton.renderCarouselButton_unstable;
},
useCarouselButtonStyles_unstable: function() {
return _useCarouselButtonStylesstyles.useCarouselButtonStyles_unstable;
},
useCarouselButton_unstable: function() {
return _useCarouselButton.useCarouselButton_unstable;
}
});
const _CarouselButton = require("./CarouselButton");
const _renderCarouselButton = require("./renderCarouselButton");
const _useCarouselButton = require("./useCarouselButton");
const _useCarouselButtonStylesstyles = require("./useCarouselButtonStyles.styles");

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../src/components/CarouselButton/index.ts"],"sourcesContent":["export { CarouselButton } from './CarouselButton';\nexport type { CarouselButtonProps, CarouselButtonSlots, CarouselButtonState } from './CarouselButton.types';\nexport { renderCarouselButton_unstable } from './renderCarouselButton';\nexport { useCarouselButton_unstable } from './useCarouselButton';\nexport { carouselButtonClassNames, useCarouselButtonStyles_unstable } from './useCarouselButtonStyles.styles';\n"],"names":["CarouselButton","renderCarouselButton_unstable","useCarouselButton_unstable","carouselButtonClassNames","useCarouselButtonStyles_unstable"],"mappings":";;;;;;;;;;;;eAASA,8BAAc;;;eAIdG,uDAAwB;;;eAFxBF,mDAA6B;;;eAEHG,+DAAgC;;;eAD1DF,6CAA0B;;;gCAHJ,mBAAmB;sCAEJ,yBAAyB;mCAC5B,sBAAsB;+CACU,mCAAmC"}

View File

@@ -0,0 +1,17 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "renderCarouselButton_unstable", {
enumerable: true,
get: function() {
return renderCarouselButton_unstable;
}
});
const _reactutilities = require("@fluentui/react-utilities");
const _reactbutton = require("@fluentui/react-button");
const renderCarouselButton_unstable = (state)=>{
(0, _reactutilities.assertSlots)(state);
// We render the underlying react-button with injected carousel functionality
return (0, _reactbutton.renderButton_unstable)(state);
};

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../src/components/CarouselButton/renderCarouselButton.tsx"],"sourcesContent":["import { assertSlots } from '@fluentui/react-utilities';\nimport type { JSXElement } from '@fluentui/react-utilities';\nimport type { CarouselButtonState, CarouselButtonSlots } from './CarouselButton.types';\nimport { renderButton_unstable } from '@fluentui/react-button';\n\n/**\n * Render the final JSX of CarouselButton\n */\nexport const renderCarouselButton_unstable = (state: CarouselButtonState): JSXElement => {\n assertSlots<CarouselButtonSlots>(state);\n\n // We render the underlying react-button with injected carousel functionality\n return renderButton_unstable(state);\n};\n"],"names":["assertSlots","renderButton_unstable","renderCarouselButton_unstable","state"],"mappings":";;;;;;;;;;gCAA4B,4BAA4B;6BAGlB,yBAAyB;AAKxD,MAAME,gCAAgC,CAACC;QAC5CH,2BAAAA,EAAiCG;IAEjC,6EAA6E;IAC7E,WAAOF,kCAAAA,EAAsBE;AAC/B,EAAE"}

View File

@@ -0,0 +1,95 @@
'use client';
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "useCarouselButton_unstable", {
enumerable: true,
get: function() {
return useCarouselButton_unstable;
}
});
const _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
const _reactbutton = require("@fluentui/react-button");
const _reacticons = require("@fluentui/react-icons");
const _reactutilities = require("@fluentui/react-utilities");
const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
const _CarouselContext = require("../CarouselContext");
const _useCarouselButtonStylesstyles = require("./useCarouselButtonStyles.styles");
const _reactsharedcontexts = require("@fluentui/react-shared-contexts");
const useCarouselButton_unstable = (props, ref)=>{
const { navType = 'next', ...buttonProps } = props;
// Locally tracks the total number of slides, will only update if this changes.
const [totalSlides, setTotalSlides] = _react.useState(0);
const { dir } = (0, _reactsharedcontexts.useFluent_unstable)();
const buttonRef = _react.useRef(undefined);
const circular = (0, _CarouselContext.useCarouselContext_unstable)((ctx)=>ctx.circular);
const [canLoop, setCanLoop] = _react.useState(circular);
const containerRef = (0, _CarouselContext.useCarouselContext_unstable)((ctx)=>ctx.containerRef);
const selectPageByDirection = (0, _CarouselContext.useCarouselContext_unstable)((ctx)=>ctx.selectPageByDirection);
const subscribeForValues = (0, _CarouselContext.useCarouselContext_unstable)((ctx)=>ctx.subscribeForValues);
const resetAutoplay = (0, _CarouselContext.useCarouselContext_unstable)((ctx)=>ctx.resetAutoplay);
const isTrailing = (0, _CarouselContext.useCarouselContext_unstable)((ctx)=>{
if (circular && canLoop) {
return false;
}
if (navType === 'prev') {
return ctx.activeIndex === 0;
}
return ctx.activeIndex === totalSlides - 1;
});
const handleClick = (event)=>{
if (event.isDefaultPrevented()) {
return;
}
const nextIndex = selectPageByDirection(event, navType);
let _trailing = false;
if (navType === 'prev') {
_trailing = nextIndex === 0;
} else {
_trailing = nextIndex === totalSlides - 1;
}
if (!circular && _trailing && (containerRef === null || containerRef === void 0 ? void 0 : containerRef.current)) {
// Focus non-disabled element
const buttonRefs = containerRef.current.querySelectorAll(`.${_useCarouselButtonStylesstyles.carouselButtonClassNames.root}`);
buttonRefs.forEach((_buttonRef)=>{
if (_buttonRef !== buttonRef.current) {
_buttonRef.focus();
}
});
}
resetAutoplay();
};
(0, _reactutilities.useIsomorphicLayoutEffect)(()=>{
return subscribeForValues((data)=>{
if (data.canLoop !== undefined) {
// Only update canLoop if it has been defined by the carousel engine
setCanLoop(data.canLoop);
}
setTotalSlides(data.navItemsCount);
});
}, [
subscribeForValues
]);
const nextArrowIcon = dir === 'ltr' ? /*#__PURE__*/ _react.createElement(_reacticons.ChevronRightRegular, null) : /*#__PURE__*/ _react.createElement(_reacticons.ChevronLeftRegular, null);
const prevArrowIcon = dir === 'ltr' ? /*#__PURE__*/ _react.createElement(_reacticons.ChevronLeftRegular, null) : /*#__PURE__*/ _react.createElement(_reacticons.ChevronRightRegular, null);
return {
navType,
// We lean on react-button class to handle styling and icon enhancements
...(0, _reactbutton.useButton_unstable)({
icon: _reactutilities.slot.optional(props.icon, {
defaultProps: {
children: navType === 'next' ? nextArrowIcon : prevArrowIcon
},
renderByDefault: true,
elementType: 'span'
}),
disabled: isTrailing,
tabIndex: isTrailing ? -1 : 0,
'aria-disabled': isTrailing,
appearance: 'subtle',
...buttonProps,
onClick: (0, _reactutilities.useEventCallback)((0, _reactutilities.mergeCallbacks)(handleClick, props.onClick))
}, (0, _reactutilities.useMergedRefs)(ref, buttonRef))
};
};

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,61 @@
'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, {
carouselButtonClassNames: function() {
return carouselButtonClassNames;
},
useCarouselButtonStyles_unstable: function() {
return useCarouselButtonStyles_unstable;
}
});
const _react = require("@griffel/react");
const _reactbutton = require("@fluentui/react-button");
const carouselButtonClassNames = {
root: 'fui-CarouselButton',
icon: 'fui-CarouselButton__icon'
};
/**
* Styles for the root slot
*/ const useStyles = /*#__PURE__*/ (0, _react.__styles)({
root: {
B6of3ja: "fgr6219",
jrapky: "f10jk5vf",
sj55zd: "fkfq4zb",
De3pzq: "fkfdr9r",
Bkecrkj: "fc5wo7j",
eoavqd: "f8491dx"
}
}, {
d: [
".fgr6219{margin-top:auto;}",
".f10jk5vf{margin-bottom:auto;}",
".fkfq4zb{color:var(--colorNeutralForeground2);}",
".fkfdr9r{background-color:var(--colorNeutralBackgroundAlpha);}",
".fc5wo7j{pointer-events:all;}"
],
h: [
".f8491dx:hover{cursor:pointer;}"
]
});
const useCarouselButtonStyles_unstable = (state)=>{
'use no memo';
const styles = useStyles();
state = {
...state,
...(0, _reactbutton.useButtonStyles_unstable)(state)
};
state.root.className = (0, _react.mergeClasses)(carouselButtonClassNames.root, styles.root, state.root.className);
if (state.icon) {
state.icon.className = (0, _react.mergeClasses)(carouselButtonClassNames.icon, state.icon.className);
}
return state;
};

View File

@@ -0,0 +1 @@
{"version":3,"sources":["useCarouselButtonStyles.styles.js"],"sourcesContent":["'use client';\nimport { makeStyles, mergeClasses } from '@griffel/react';\nimport { useButtonStyles_unstable } from '@fluentui/react-button';\nimport { tokens } from '@fluentui/react-theme';\nexport const carouselButtonClassNames = {\n root: 'fui-CarouselButton',\n icon: 'fui-CarouselButton__icon'\n};\n/**\n * Styles for the root slot\n */ const useStyles = makeStyles({\n root: {\n marginTop: 'auto',\n marginBottom: 'auto',\n color: tokens.colorNeutralForeground2,\n backgroundColor: tokens.colorNeutralBackgroundAlpha,\n pointerEvents: 'all',\n ':hover': {\n cursor: 'pointer'\n }\n }\n});\n/**\n * Apply styling to the CarouselButton slots based on the state\n */ export const useCarouselButtonStyles_unstable = (state)=>{\n 'use no memo';\n const styles = useStyles();\n state = {\n ...state,\n ...useButtonStyles_unstable(state)\n };\n state.root.className = mergeClasses(carouselButtonClassNames.root, styles.root, state.root.className);\n if (state.icon) {\n state.icon.className = mergeClasses(carouselButtonClassNames.icon, state.icon.className);\n }\n return state;\n};\n"],"names":["__styles","mergeClasses","useButtonStyles_unstable","tokens","carouselButtonClassNames","root","icon","useStyles","B6of3ja","jrapky","sj55zd","De3pzq","Bkecrkj","eoavqd","d","h","useCarouselButtonStyles_unstable","state","styles","className"],"mappings":"AAAA,YAAY;;;;;;;;;;;;IAICI,wBAAwB;;;oCAoBY;;;;uBAvBR,gBAAgB;6BAChB,wBAAwB;AAE1D,iCAAiC;IACpCC,IAAI,EAAE,oBAAoB;IAC1BC,IAAI,EAAE;AACV,CAAC;AACD;;CAEA,GAAI,MAAMC,SAAS,GAAA,WAAA,GAAGP,mBAAA,EAAA;IAAAK,IAAA,EAAA;QAAAG,OAAA,EAAA;QAAAC,MAAA,EAAA;QAAAC,MAAA,EAAA;QAAAC,MAAA,EAAA;QAAAC,OAAA,EAAA;QAAAC,MAAA,EAAA;IAAA;AAAA,GAAA;IAAAC,CAAA,EAAA;QAAA;QAAA;QAAA;QAAA;QAAA;KAAA;IAAAC,CAAA,EAAA;QAAA;KAAA;AAAA,CAWrB,CAAC;AAGS,MAAMC,oCAAoCC,KAAK,IAAG;IACzD,aAAa;IACb,MAAMC,MAAM,GAAGX,SAAS,CAAC,CAAC;IAC1BU,KAAK,GAAG;QACJ,GAAGA,KAAK;QACR,OAAGf,qCAAwB,EAACe,KAAK,CAAA;IACrC,CAAC;IACDA,KAAK,CAACZ,IAAI,CAACc,SAAS,OAAGlB,mBAAY,EAACG,wBAAwB,CAACC,IAAI,EAAEa,MAAM,CAACb,IAAI,EAAEY,KAAK,CAACZ,IAAI,CAACc,SAAS,CAAC;IACrG,IAAIF,KAAK,CAACX,IAAI,EAAE;QACZW,KAAK,CAACX,IAAI,CAACa,SAAS,OAAGlB,mBAAY,EAACG,wBAAwB,CAACE,IAAI,EAAEW,KAAK,CAACX,IAAI,CAACa,SAAS,CAAC;IAC5F;IACA,OAAOF,KAAK;AAChB,CAAC"}

View File

@@ -0,0 +1,53 @@
'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, {
carouselButtonClassNames: function() {
return carouselButtonClassNames;
},
useCarouselButtonStyles_unstable: function() {
return useCarouselButtonStyles_unstable;
}
});
const _react = require("@griffel/react");
const _reactbutton = require("@fluentui/react-button");
const _reacttheme = require("@fluentui/react-theme");
const carouselButtonClassNames = {
root: 'fui-CarouselButton',
icon: 'fui-CarouselButton__icon'
};
/**
* Styles for the root slot
*/ const useStyles = (0, _react.makeStyles)({
root: {
marginTop: 'auto',
marginBottom: 'auto',
color: _reacttheme.tokens.colorNeutralForeground2,
backgroundColor: _reacttheme.tokens.colorNeutralBackgroundAlpha,
pointerEvents: 'all',
':hover': {
cursor: 'pointer'
}
}
});
const useCarouselButtonStyles_unstable = (state)=>{
'use no memo';
const styles = useStyles();
state = {
...state,
...(0, _reactbutton.useButtonStyles_unstable)(state)
};
state.root.className = (0, _react.mergeClasses)(carouselButtonClassNames.root, styles.root, state.root.className);
if (state.icon) {
state.icon.className = (0, _react.mergeClasses)(carouselButtonClassNames.icon, state.icon.className);
}
return state;
};

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../src/components/CarouselButton/useCarouselButtonStyles.styles.ts"],"sourcesContent":["'use client';\n\nimport { makeStyles, mergeClasses } from '@griffel/react';\nimport type { SlotClassNames } from '@fluentui/react-utilities';\nimport type { CarouselButtonSlots, CarouselButtonState } from './CarouselButton.types';\nimport { useButtonStyles_unstable } from '@fluentui/react-button';\nimport { tokens } from '@fluentui/react-theme';\n\nexport const carouselButtonClassNames: SlotClassNames<CarouselButtonSlots> = {\n root: 'fui-CarouselButton',\n icon: 'fui-CarouselButton__icon',\n};\n\n/**\n * Styles for the root slot\n */\nconst useStyles = makeStyles({\n root: {\n marginTop: 'auto',\n marginBottom: 'auto',\n color: tokens.colorNeutralForeground2,\n backgroundColor: tokens.colorNeutralBackgroundAlpha,\n pointerEvents: 'all',\n ':hover': {\n cursor: 'pointer',\n },\n },\n});\n\n/**\n * Apply styling to the CarouselButton slots based on the state\n */\nexport const useCarouselButtonStyles_unstable = (state: CarouselButtonState): CarouselButtonState => {\n 'use no memo';\n\n const styles = useStyles();\n\n state = {\n ...state,\n ...useButtonStyles_unstable(state),\n };\n\n state.root.className = mergeClasses(carouselButtonClassNames.root, styles.root, state.root.className);\n\n if (state.icon) {\n state.icon.className = mergeClasses(carouselButtonClassNames.icon, state.icon.className);\n }\n\n return state;\n};\n"],"names":["makeStyles","mergeClasses","useButtonStyles_unstable","tokens","carouselButtonClassNames","root","icon","useStyles","marginTop","marginBottom","color","colorNeutralForeground2","backgroundColor","colorNeutralBackgroundAlpha","pointerEvents","cursor","useCarouselButtonStyles_unstable","state","styles","className"],"mappings":"AAAA;;;;;;;;;;;;IAQaI,wBAAAA;;;oCAwBAY;eAAAA;;;uBA9B4B,iBAAiB;6BAGjB,yBAAyB;4BAC3C,wBAAwB;AAExC,iCAAsE;IAC3EX,MAAM;IACNC,MAAM;AACR,EAAE;AAEF;;CAEC,GACD,MAAMC,gBAAYP,iBAAAA,EAAW;IAC3BK,MAAM;QACJG,WAAW;QACXC,cAAc;QACdC,OAAOP,kBAAAA,CAAOQ,uBAAuB;QACrCC,iBAAiBT,kBAAAA,CAAOU,2BAA2B;QACnDC,eAAe;QACf,UAAU;YACRC,QAAQ;QACV;IACF;AACF;AAKO,yCAAyC,CAACE;IAC/C;IAEA,MAAMC,SAASX;IAEfU,QAAQ;QACN,GAAGA,KAAK;QACR,OAAGf,qCAAAA,EAAyBe,MAAM;IACpC;IAEAA,MAAMZ,IAAI,CAACc,SAAS,OAAGlB,mBAAAA,EAAaG,yBAAyBC,IAAI,EAAEa,OAAOb,IAAI,EAAEY,MAAMZ,IAAI,CAACc,SAAS;IAEpG,IAAIF,MAAMX,IAAI,EAAE;QACdW,MAAMX,IAAI,CAACa,SAAS,OAAGlB,mBAAAA,EAAaG,yBAAyBE,IAAI,EAAEW,MAAMX,IAAI,CAACa,SAAS;IACzF;IAEA,OAAOF;AACT,EAAE"}