@topconsultnpm/sdkui-react-beta 6.12.35 → 6.12.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/base/TMUserAvatar.d.ts +5 -0
- package/lib/components/base/TMUserAvatar.js +64 -0
- package/lib/components/index.d.ts +1 -0
- package/lib/components/index.js +1 -0
- package/lib/stories/TMUserAvatar.stories.d.ts +6 -0
- package/lib/stories/TMUserAvatar.stories.js +19 -0
- package/package.json +1 -1
@@ -0,0 +1,64 @@
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
2
|
+
import TMTooltip from './TMTooltip';
|
3
|
+
const TMUserAvatar = ({ name, returnType = 'jsx' }) => {
|
4
|
+
// Helper function to generate dark color from name
|
5
|
+
const generateDarkColorFromName = (str) => {
|
6
|
+
let hash = 0;
|
7
|
+
for (let i = 0; i < str.length; i++) {
|
8
|
+
hash = str.charCodeAt(i) + ((hash << 5) - hash);
|
9
|
+
}
|
10
|
+
const hue = Math.floor((hash & 0x00FFFFFF) / 0x10000);
|
11
|
+
let colorRange;
|
12
|
+
if (hue >= 0 && hue < 30)
|
13
|
+
colorRange = 0; // Dark red
|
14
|
+
else if (hue >= 30 && hue < 90)
|
15
|
+
colorRange = 60; // Dark orange to yellow
|
16
|
+
else if (hue >= 90 && hue < 150)
|
17
|
+
colorRange = 120; // Dark green
|
18
|
+
else if (hue >= 150 && hue < 210)
|
19
|
+
colorRange = 180; // Dark cyan
|
20
|
+
else if (hue >= 210 && hue < 270)
|
21
|
+
colorRange = 240; // Dark blue
|
22
|
+
else if (hue >= 270 && hue < 330)
|
23
|
+
colorRange = 300; // Dark purple
|
24
|
+
else
|
25
|
+
colorRange = 360; // Dark magenta
|
26
|
+
return `hsl(${colorRange}, 70%, 30%)`; // Dark color
|
27
|
+
};
|
28
|
+
// Helper function to extract initials from name
|
29
|
+
const extractInitialsFromName = (name) => {
|
30
|
+
if (name.length >= 3) {
|
31
|
+
const lettersOnly = name.replace(/[^a-zA-Z]/g, '');
|
32
|
+
return lettersOnly.substring(0, 3).toUpperCase();
|
33
|
+
}
|
34
|
+
return name[0].toUpperCase();
|
35
|
+
};
|
36
|
+
const initials = extractInitialsFromName(name ?? '-');
|
37
|
+
const bgColor = generateDarkColorFromName(name ?? '-');
|
38
|
+
if (returnType === 'svg') {
|
39
|
+
return `
|
40
|
+
<svg width="30" height="30" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
|
41
|
+
<circle cx="20" cy="20" r="20" fill="${bgColor}" />
|
42
|
+
<text x="50%" y="50%" text-anchor="middle" dominant-baseline="middle" fill="#fff" font-size="14" font-weight="bold" font-family="sans-serif">
|
43
|
+
${initials}
|
44
|
+
</text>
|
45
|
+
</svg>
|
46
|
+
`.trim();
|
47
|
+
}
|
48
|
+
return (_jsx(TMTooltip, { content: name ?? '-', children: _jsx("div", { style: {
|
49
|
+
width: "40px",
|
50
|
+
height: "40px",
|
51
|
+
borderRadius: "50%",
|
52
|
+
backgroundColor: bgColor,
|
53
|
+
display: "flex",
|
54
|
+
alignItems: "center",
|
55
|
+
justifyContent: "center",
|
56
|
+
marginRight: "10px",
|
57
|
+
fontWeight: "bold",
|
58
|
+
color: '#fff',
|
59
|
+
fontSize: "18px",
|
60
|
+
userSelect: "none",
|
61
|
+
cursor: "default",
|
62
|
+
}, children: _jsx("span", { style: { fontSize: "12px" }, children: initials }) }) }));
|
63
|
+
};
|
64
|
+
export default TMUserAvatar;
|
@@ -19,6 +19,7 @@ export { Spinner } from './base/TMSpinner';
|
|
19
19
|
export { default as TMToggleButton } from './base/TMToggleButton';
|
20
20
|
export { default as TMTooltip } from './base/TMTooltip';
|
21
21
|
export { default as TMVilViewer } from './base/TMVilViewer';
|
22
|
+
export { default as TMUserAvatar } from './base/TMUserAvatar';
|
22
23
|
export { default as TMDropDown } from './editors/TMDropDown';
|
23
24
|
export { default as TMTreeDropDown } from './editors/TMTreeDropDown';
|
24
25
|
export { default as TMSummary } from './editors/TMSummary';
|
package/lib/components/index.js
CHANGED
@@ -20,6 +20,7 @@ export { Spinner } from './base/TMSpinner';
|
|
20
20
|
export { default as TMToggleButton } from './base/TMToggleButton';
|
21
21
|
export { default as TMTooltip } from './base/TMTooltip';
|
22
22
|
export { default as TMVilViewer } from './base/TMVilViewer';
|
23
|
+
export { default as TMUserAvatar } from './base/TMUserAvatar';
|
23
24
|
//editors
|
24
25
|
export { default as TMDropDown } from './editors/TMDropDown';
|
25
26
|
export { default as TMTreeDropDown } from './editors/TMTreeDropDown';
|
@@ -0,0 +1,6 @@
|
|
1
|
+
import { Meta, StoryObj } from '@storybook/react';
|
2
|
+
import TMUserAvatar from '../components/base/TMUserAvatar';
|
3
|
+
declare const meta: Meta<typeof TMUserAvatar>;
|
4
|
+
export default meta;
|
5
|
+
type Story = StoryObj<typeof TMUserAvatar>;
|
6
|
+
export declare const MultipleAvatars: Story;
|
@@ -0,0 +1,19 @@
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
2
|
+
import TMUserAvatar from '../components/base/TMUserAvatar';
|
3
|
+
import { TMDeviceProvider } from '../components';
|
4
|
+
const meta = {
|
5
|
+
title: 'Components/TMUserAvatar',
|
6
|
+
component: TMUserAvatar,
|
7
|
+
decorators: [(Story) => (_jsxs(TMDeviceProvider, { children: [" ", _jsx(Story, {}), " "] })),],
|
8
|
+
tags: ['autodocs'],
|
9
|
+
args: {
|
10
|
+
name: 'Test User',
|
11
|
+
},
|
12
|
+
};
|
13
|
+
export default meta;
|
14
|
+
export const MultipleAvatars = {
|
15
|
+
render: () => {
|
16
|
+
const names = ['Luca', 'Claudio', 'Marco', 'Alessia', 'Giorgio', 'Ashkan', 'Joele', 'Alessandro'];
|
17
|
+
return (_jsx("div", { style: { display: 'flex', gap: '10px', flexWrap: 'wrap' }, children: names.map((name, index) => (_jsx(TMUserAvatar, { name: name }, index))) }));
|
18
|
+
},
|
19
|
+
};
|