first commit

This commit is contained in:
Stefan Hacker
2026-04-03 09:38:48 +02:00
commit 37ad745546
47450 changed files with 3120798 additions and 0 deletions
@@ -0,0 +1,7 @@
import * as React from 'react';
import type { IPersonaPresenceProps } from '../Persona.types';
/**
* PersonaPresence with no default styles.
* [Use the `getStyles` API to add your own styles.](https://github.com/microsoft/fluentui/wiki/Styling)
*/
export declare const PersonaPresenceBase: React.FunctionComponent<IPersonaPresenceProps>;
@@ -0,0 +1,77 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.PersonaPresenceBase = void 0;
var React = require("react");
var Utilities_1 = require("../../../Utilities");
var Icon_1 = require("../../../Icon");
var Persona_types_1 = require("../Persona.types");
var PersonaConsts_1 = require("../PersonaConsts");
var react_hooks_1 = require("@fluentui/react-hooks");
var coinSizeFontScaleFactor = 6;
var coinSizePresenceScaleFactor = 3;
var presenceMaxSize = 40;
var presenceFontMaxSize = 20;
var getClassNames = (0, Utilities_1.classNamesFunction)({
// There can be many PersonaPresence rendered with different sizes.
// Therefore setting a larger cache size.
cacheSize: 100,
});
/**
* PersonaPresence with no default styles.
* [Use the `getStyles` API to add your own styles.](https://github.com/microsoft/fluentui/wiki/Styling)
*/
exports.PersonaPresenceBase = React.forwardRef(function (props, forwardedRef) {
var coinSize = props.coinSize, isOutOfOffice = props.isOutOfOffice, styles = props.styles, // Use getStyles from props.
presence = props.presence, theme = props.theme, presenceTitle = props.presenceTitle, presenceColors = props.presenceColors;
var rootRef = React.useRef(null);
var mergedRootRef = (0, react_hooks_1.useMergedRefs)(forwardedRef, rootRef);
var size = (0, PersonaConsts_1.sizeBoolean)(props.size);
// Render Presence Icon if Persona is above size 32.
var renderIcon = !(size.isSize8 || size.isSize10 || size.isSize16 || size.isSize24 || size.isSize28 || size.isSize32) &&
(coinSize ? coinSize > 32 : true);
var presenceHeightWidth = coinSize
? coinSize / coinSizePresenceScaleFactor < presenceMaxSize
? coinSize / coinSizePresenceScaleFactor + 'px'
: presenceMaxSize + 'px'
: '';
var presenceFontSize = coinSize
? coinSize / coinSizeFontScaleFactor < presenceFontMaxSize
? coinSize / coinSizeFontScaleFactor + 'px'
: presenceFontMaxSize + 'px'
: '';
var coinSizeWithPresenceIconStyle = coinSize
? { fontSize: presenceFontSize, lineHeight: presenceHeightWidth }
: undefined;
var coinSizeWithPresenceStyle = coinSize ? { width: presenceHeightWidth, height: presenceHeightWidth } : undefined;
// Use getStyles from props, or fall back to getStyles from styles file.
var classNames = getClassNames(styles, {
theme: theme,
presence: presence,
size: props.size,
isOutOfOffice: isOutOfOffice,
presenceColors: presenceColors,
});
if (presence === Persona_types_1.PersonaPresence.none) {
return null;
}
return (React.createElement("div", { role: "presentation", className: classNames.presence, style: coinSizeWithPresenceStyle, title: presenceTitle, ref: mergedRootRef }, renderIcon && (React.createElement(Icon_1.Icon, { className: classNames.presenceIcon, iconName: determineIcon(props.presence, props.isOutOfOffice), style: coinSizeWithPresenceIconStyle }))));
});
exports.PersonaPresenceBase.displayName = 'PersonaPresenceBase';
function determineIcon(presence, isOutOfOffice) {
if (!presence) {
return undefined;
}
var oofIcon = 'SkypeArrow';
switch (Persona_types_1.PersonaPresence[presence]) {
case 'online':
return 'SkypeCheck';
case 'away':
return isOutOfOffice ? oofIcon : 'SkypeClock';
case 'dnd':
return 'SkypeMinus';
case 'offline':
return isOutOfOffice ? oofIcon : '';
}
return '';
}
//# sourceMappingURL=PersonaPresence.base.js.map
File diff suppressed because one or more lines are too long
@@ -0,0 +1,6 @@
import * as React from 'react';
import type { IPersonaPresenceProps } from '../Persona.types';
/**
* PersonaPresence is used to render an individual's presence.
*/
export declare const PersonaPresence: React.FunctionComponent<IPersonaPresenceProps>;
@@ -0,0 +1,11 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.PersonaPresence = void 0;
var Utilities_1 = require("../../../Utilities");
var PersonaPresence_base_1 = require("./PersonaPresence.base");
var PersonaPresence_styles_1 = require("./PersonaPresence.styles");
/**
* PersonaPresence is used to render an individual's presence.
*/
exports.PersonaPresence = (0, Utilities_1.styled)(PersonaPresence_base_1.PersonaPresenceBase, PersonaPresence_styles_1.getStyles, undefined, { scope: 'PersonaPresence' });
//# sourceMappingURL=PersonaPresence.js.map
@@ -0,0 +1 @@
{"version":3,"file":"PersonaPresence.js","sourceRoot":"../src/","sources":["components/Persona/PersonaPresence/PersonaPresence.tsx"],"names":[],"mappings":";;;AACA,gDAA4C;AAC5C,+DAA6D;AAC7D,mEAAqD;AAGrD;;GAEG;AACU,QAAA,eAAe,GAAmD,IAAA,kBAAM,EAInF,0CAAmB,EAAE,kCAAS,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC","sourcesContent":["import * as React from 'react';\nimport { styled } from '../../../Utilities';\nimport { PersonaPresenceBase } from './PersonaPresence.base';\nimport { getStyles } from './PersonaPresence.styles';\nimport type { IPersonaPresenceProps, IPersonaPresenceStyleProps, IPersonaPresenceStyles } from '../Persona.types';\n\n/**\n * PersonaPresence is used to render an individual's presence.\n */\nexport const PersonaPresence: React.FunctionComponent<IPersonaPresenceProps> = styled<\n IPersonaPresenceProps,\n IPersonaPresenceStyleProps,\n IPersonaPresenceStyles\n>(PersonaPresenceBase, getStyles, undefined, { scope: 'PersonaPresence' });\n"]}
@@ -0,0 +1,2 @@
import type { IPersonaPresenceStyleProps, IPersonaPresenceStyles } from '../Persona.types';
export declare const getStyles: (props: IPersonaPresenceStyleProps) => IPersonaPresenceStyles;
@@ -0,0 +1,211 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getStyles = void 0;
var tslib_1 = require("tslib");
var Styling_1 = require("../../../Styling");
var PersonaConsts_1 = require("../PersonaConsts");
var GlobalClassNames = {
presence: 'ms-Persona-presence',
presenceIcon: 'ms-Persona-presenceIcon',
};
var getStyles = function (props) {
var _a, _b, _c, _d, _e, _f;
var theme = props.theme, presenceColors = props.presenceColors;
var semanticColors = theme.semanticColors, fonts = theme.fonts;
var classNames = (0, Styling_1.getGlobalClassNames)(GlobalClassNames, theme);
var size = (0, PersonaConsts_1.sizeBoolean)(props.size);
var presence = (0, PersonaConsts_1.presenceBoolean)(props.presence);
// Presence colors
var presenceColorAvailable = (presenceColors && presenceColors.available) || '#6BB700';
var presenceColorAway = (presenceColors && presenceColors.away) || '#FFAA44';
var presenceColorBusy = (presenceColors && presenceColors.busy) || '#C43148';
var presenceColorDnd = (presenceColors && presenceColors.dnd) || '#C50F1F';
var presenceColorOffline = (presenceColors && presenceColors.offline) || '#8A8886';
var presenceColorOof = (presenceColors && presenceColors.oof) || '#B4009E';
var presenceColorBackground = (presenceColors && presenceColors.background) || semanticColors.bodyBackground;
var isOpenCirclePresence = presence.isOffline ||
(props.isOutOfOffice && (presence.isAvailable || presence.isBusy || presence.isAway || presence.isDoNotDisturb));
var borderSizeForSmallPersonas = '1px';
var borderSizeForLargePersonas = '2px';
var borderSize = size.isSize72 || size.isSize100 ? borderSizeForLargePersonas : borderSizeForSmallPersonas;
return {
presence: [
classNames.presence,
tslib_1.__assign(tslib_1.__assign({ position: 'absolute', height: PersonaConsts_1.personaPresenceSize.size12, width: PersonaConsts_1.personaPresenceSize.size12, borderRadius: '50%', top: 'auto', right: '-2px', bottom: '-2px', border: "2px solid ".concat(presenceColorBackground), textAlign: 'center', boxSizing: 'content-box', backgroundClip: 'border-box' }, (0, Styling_1.getHighContrastNoAdjustStyle)()), { selectors: (_a = {},
_a[Styling_1.HighContrastSelector] = {
borderColor: 'Window',
backgroundColor: 'WindowText',
},
_a) }),
(size.isSize8 || size.isSize10) && {
right: 'auto',
top: '7px',
left: 0,
border: 0,
selectors: (_b = {},
_b[Styling_1.HighContrastSelector] = {
top: '9px',
border: '1px solid WindowText',
},
_b),
},
(size.isSize8 || size.isSize10 || size.isSize24 || size.isSize28 || size.isSize32) &&
makeSizeStyle(PersonaConsts_1.personaPresenceSize.size8),
(size.isSize40 || size.isSize48) && makeSizeStyle(PersonaConsts_1.personaPresenceSize.size12),
size.isSize16 && {
height: PersonaConsts_1.personaPresenceSize.size6,
width: PersonaConsts_1.personaPresenceSize.size6,
borderWidth: '1.5px',
},
size.isSize56 && makeSizeStyle(PersonaConsts_1.personaPresenceSize.size16),
size.isSize72 && makeSizeStyle(PersonaConsts_1.personaPresenceSize.size20),
size.isSize100 && makeSizeStyle(PersonaConsts_1.personaPresenceSize.size28),
size.isSize120 && makeSizeStyle(PersonaConsts_1.personaPresenceSize.size32),
presence.isAvailable && {
backgroundColor: presenceColorAvailable,
selectors: (_c = {},
_c[Styling_1.HighContrastSelector] = backgroundColor('Highlight'),
_c),
},
presence.isAway && backgroundColor(presenceColorAway),
presence.isBlocked && [
{
selectors: (_d = {
// Only show :after at larger sizes
':after': size.isSize40 || size.isSize48 || size.isSize72 || size.isSize100
? {
content: '""',
width: '100%',
height: borderSize,
backgroundColor: presenceColorBusy,
transform: 'translateY(-50%) rotate(-45deg)',
position: 'absolute',
top: '50%',
left: 0,
}
: undefined
},
_d[Styling_1.HighContrastSelector] = {
selectors: {
':after': {
width: "calc(100% - 4px)",
left: '2px',
backgroundColor: 'Window',
},
},
},
_d),
},
],
presence.isBusy && backgroundColor(presenceColorBusy),
presence.isDoNotDisturb && backgroundColor(presenceColorDnd),
presence.isOffline && backgroundColor(presenceColorOffline),
(isOpenCirclePresence || presence.isBlocked) && [
{
backgroundColor: presenceColorBackground,
selectors: (_e = {
':before': {
content: '""',
width: '100%',
height: '100%',
position: 'absolute',
top: 0,
left: 0,
border: "".concat(borderSize, " solid ").concat(presenceColorBusy),
borderRadius: '50%',
boxSizing: 'border-box',
}
},
_e[Styling_1.HighContrastSelector] = {
backgroundColor: 'WindowText',
selectors: {
':before': {
width: "calc(100% - 2px)",
height: "calc(100% - 2px)",
top: '1px',
left: '1px',
borderColor: 'Window',
},
},
},
_e),
},
],
isOpenCirclePresence && presence.isAvailable && makeBeforeBorderStyle(borderSize, presenceColorAvailable),
isOpenCirclePresence && presence.isBusy && makeBeforeBorderStyle(borderSize, presenceColorBusy),
isOpenCirclePresence && presence.isAway && makeBeforeBorderStyle(borderSize, presenceColorOof),
isOpenCirclePresence && presence.isDoNotDisturb && makeBeforeBorderStyle(borderSize, presenceColorDnd),
isOpenCirclePresence && presence.isOffline && makeBeforeBorderStyle(borderSize, presenceColorOffline),
isOpenCirclePresence &&
presence.isOffline &&
props.isOutOfOffice &&
makeBeforeBorderStyle(borderSize, presenceColorOof),
],
presenceIcon: [
classNames.presenceIcon,
{
color: presenceColorBackground,
fontSize: '6px', // exception case where we don't have an available theme.fonts variable to match it.
lineHeight: PersonaConsts_1.personaPresenceSize.size12,
verticalAlign: 'top',
selectors: (_f = {},
_f[Styling_1.HighContrastSelector] = {
color: 'Window',
},
_f),
},
size.isSize56 && {
fontSize: '8px', // exception case where we don't have an available theme.fonts variable to match it.
lineHeight: PersonaConsts_1.personaPresenceSize.size16,
},
size.isSize72 && {
fontSize: fonts.small.fontSize,
lineHeight: PersonaConsts_1.personaPresenceSize.size20,
},
size.isSize100 && {
fontSize: fonts.medium.fontSize,
lineHeight: PersonaConsts_1.personaPresenceSize.size28,
},
size.isSize120 && {
fontSize: fonts.medium.fontSize,
lineHeight: PersonaConsts_1.personaPresenceSize.size32,
},
presence.isAway && {
position: 'relative',
left: isOpenCirclePresence ? undefined : '1px',
},
isOpenCirclePresence && presence.isAvailable && makeOpenCircleIconStyle(presenceColorAvailable),
isOpenCirclePresence && presence.isBusy && makeOpenCircleIconStyle(presenceColorBusy),
isOpenCirclePresence && presence.isAway && makeOpenCircleIconStyle(presenceColorOof),
isOpenCirclePresence && presence.isDoNotDisturb && makeOpenCircleIconStyle(presenceColorDnd),
isOpenCirclePresence && presence.isOffline && makeOpenCircleIconStyle(presenceColorOffline),
isOpenCirclePresence && presence.isOffline && props.isOutOfOffice && makeOpenCircleIconStyle(presenceColorOof),
],
};
};
exports.getStyles = getStyles;
function makeOpenCircleIconStyle(color) {
return {
color: color,
borderColor: color,
};
}
function makeBeforeBorderStyle(borderSize, color) {
return {
selectors: {
':before': {
border: "".concat(borderSize, " solid ").concat(color),
},
},
};
}
function makeSizeStyle(size) {
return {
height: size,
width: size,
};
}
function backgroundColor(color) {
return { backgroundColor: color };
}
//# sourceMappingURL=PersonaPresence.styles.js.map
File diff suppressed because one or more lines are too long
@@ -0,0 +1,2 @@
export * from './PersonaPresence';
export * from './PersonaPresence.base';
@@ -0,0 +1,6 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
tslib_1.__exportStar(require("./PersonaPresence"), exports);
tslib_1.__exportStar(require("./PersonaPresence.base"), exports);
//# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"../src/","sources":["components/Persona/PersonaPresence/index.ts"],"names":[],"mappings":";;;AAAA,4DAAkC;AAClC,iEAAuC","sourcesContent":["export * from './PersonaPresence';\nexport * from './PersonaPresence.base';\n"]}