@lindle/linoardo 1.0.19 → 1.0.20
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/dist/card.cjs +81 -19
- package/dist/card.cjs.map +1 -1
- package/dist/card.d.cts +8 -1
- package/dist/card.d.ts +8 -1
- package/dist/card.js +1 -1
- package/dist/chip.cjs +9 -1
- package/dist/chip.cjs.map +1 -1
- package/dist/chip.d.cts +3 -0
- package/dist/chip.d.ts +3 -0
- package/dist/chip.js +1 -1
- package/dist/chunk-36T6I3XH.js +167 -0
- package/dist/chunk-36T6I3XH.js.map +1 -0
- package/dist/{chunk-N65GNKRG.js → chunk-5LWU5T2C.js} +48 -42
- package/dist/chunk-5LWU5T2C.js.map +1 -0
- package/dist/{chunk-PWK6MLZT.js → chunk-5PBPURGP.js} +11 -3
- package/dist/chunk-5PBPURGP.js.map +1 -0
- package/dist/{chunk-XFPBICJG.js → chunk-5WQW6YSJ.js} +12 -3
- package/dist/chunk-5WQW6YSJ.js.map +1 -0
- package/dist/{chunk-5GY2JCBO.js → chunk-AK7LFJI4.js} +16 -5
- package/dist/chunk-AK7LFJI4.js.map +1 -0
- package/dist/chunk-B5FW33K3.js +147 -0
- package/dist/chunk-B5FW33K3.js.map +1 -0
- package/dist/{chunk-AOHXZ7OM.js → chunk-GMDNSU26.js} +19 -5
- package/dist/chunk-GMDNSU26.js.map +1 -0
- package/dist/chunk-HAXGOTZO.js +94 -0
- package/dist/chunk-HAXGOTZO.js.map +1 -0
- package/dist/chunk-HEXJCQRO.js +51 -0
- package/dist/chunk-HEXJCQRO.js.map +1 -0
- package/dist/{chunk-GA6HSRN6.js → chunk-KRYWWWXR.js} +20 -7
- package/dist/chunk-KRYWWWXR.js.map +1 -0
- package/dist/{chunk-U6NAIIDI.js → chunk-LIEBZOLG.js} +42 -20
- package/dist/chunk-LIEBZOLG.js.map +1 -0
- package/dist/{chunk-E32P5AHO.js → chunk-LYP7V32H.js} +10 -4
- package/dist/chunk-LYP7V32H.js.map +1 -0
- package/dist/chunk-MFLH36XK.js +168 -0
- package/dist/chunk-MFLH36XK.js.map +1 -0
- package/dist/{chunk-QGQ66FJD.js → chunk-T37VPLS4.js} +2 -2
- package/dist/chunk-T37VPLS4.js.map +1 -0
- package/dist/{chunk-32KFNI6K.js → chunk-U2AL7XFY.js} +48 -28
- package/dist/chunk-U2AL7XFY.js.map +1 -0
- package/dist/dialog.cjs +40 -18
- package/dist/dialog.cjs.map +1 -1
- package/dist/dialog.d.cts +3 -0
- package/dist/dialog.d.ts +3 -0
- package/dist/dialog.js +1 -1
- package/dist/expansion-panel/item.cjs +11 -2
- package/dist/expansion-panel/item.cjs.map +1 -1
- package/dist/expansion-panel/item.js +1 -1
- package/dist/expansion-panel.cjs +25 -6
- package/dist/expansion-panel.cjs.map +1 -1
- package/dist/expansion-panel.js +2 -2
- package/dist/icon.cjs +53 -0
- package/dist/icon.cjs.map +1 -0
- package/dist/icon.d.cts +15 -0
- package/dist/icon.d.ts +15 -0
- package/dist/icon.js +3 -0
- package/dist/icon.js.map +1 -0
- package/dist/{index-Md3BuoGM.d.cts → index-B5n8tN2G.d.cts} +3 -0
- package/dist/{index-d_JuI06O.d.ts → index-D4-O-oJt.d.ts} +3 -0
- package/dist/index.cjs +956 -149
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +64 -3
- package/dist/index.d.ts +64 -3
- package/dist/index.js +296 -12
- package/dist/index.js.map +1 -1
- package/dist/input.cjs +104 -30
- package/dist/input.cjs.map +1 -1
- package/dist/input.d.cts +8 -19
- package/dist/input.d.ts +8 -19
- package/dist/input.js +1 -1
- package/dist/list/item.cjs +10 -1
- package/dist/list/item.cjs.map +1 -1
- package/dist/list/item.d.cts +1 -1
- package/dist/list/item.d.ts +1 -1
- package/dist/list/item.js +1 -1
- package/dist/list.cjs +23 -3
- package/dist/list.cjs.map +1 -1
- package/dist/list.d.cts +5 -2
- package/dist/list.d.ts +5 -2
- package/dist/list.js +2 -2
- package/dist/masonry.cjs +116 -0
- package/dist/masonry.cjs.map +1 -0
- package/dist/masonry.d.cts +45 -0
- package/dist/masonry.d.ts +45 -0
- package/dist/masonry.js +3 -0
- package/dist/masonry.js.map +1 -0
- package/dist/menu.cjs.map +1 -1
- package/dist/menu.d.cts +3 -0
- package/dist/menu.d.ts +3 -0
- package/dist/menu.js +1 -1
- package/dist/select.cjs +173 -0
- package/dist/select.cjs.map +1 -0
- package/dist/select.d.cts +29 -0
- package/dist/select.d.ts +29 -0
- package/dist/select.js +3 -0
- package/dist/select.js.map +1 -0
- package/dist/slider.cjs +17 -3
- package/dist/slider.cjs.map +1 -1
- package/dist/slider.d.cts +3 -0
- package/dist/slider.d.ts +3 -0
- package/dist/slider.js +1 -1
- package/dist/styles.css +1096 -5
- package/dist/switch.cjs +46 -40
- package/dist/switch.cjs.map +1 -1
- package/dist/switch.d.cts +3 -0
- package/dist/switch.d.ts +3 -0
- package/dist/switch.js +1 -1
- package/dist/tooltip.cjs +46 -26
- package/dist/tooltip.cjs.map +1 -1
- package/dist/tooltip.d.cts +3 -0
- package/dist/tooltip.d.ts +3 -0
- package/dist/tooltip.js +1 -1
- package/dist/types-BCqIOkp1.d.cts +24 -0
- package/dist/types-ChXN4u7x.d.ts +24 -0
- package/package.json +29 -5
- package/readme.md +1 -0
- package/dist/chunk-32KFNI6K.js.map +0 -1
- package/dist/chunk-5GY2JCBO.js.map +0 -1
- package/dist/chunk-AOHXZ7OM.js.map +0 -1
- package/dist/chunk-E32P5AHO.js.map +0 -1
- package/dist/chunk-GA6HSRN6.js.map +0 -1
- package/dist/chunk-N65GNKRG.js.map +0 -1
- package/dist/chunk-PWK6MLZT.js.map +0 -1
- package/dist/chunk-PYG5SDNO.js +0 -98
- package/dist/chunk-PYG5SDNO.js.map +0 -1
- package/dist/chunk-QGQ66FJD.js.map +0 -1
- package/dist/chunk-U6NAIIDI.js.map +0 -1
- package/dist/chunk-V4BVJOSC.js +0 -85
- package/dist/chunk-V4BVJOSC.js.map +0 -1
- package/dist/chunk-XFPBICJG.js.map +0 -1
package/dist/index.d.cts
CHANGED
|
@@ -6,10 +6,71 @@ export { default as ExpansionPanel } from './expansion-panel.cjs';
|
|
|
6
6
|
export { default as Dialog, DialogProps } from './dialog.cjs';
|
|
7
7
|
export { default as ToolTip, ToolTipPlacement, ToolTipProps } from './tooltip.cjs';
|
|
8
8
|
export { default as Card, CardMediaProps, CardProps, CardSectionProps, CardTextProps } from './card.cjs';
|
|
9
|
+
export { default as Masonry, MasonryProps, MasonryRenderItem } from './masonry.cjs';
|
|
10
|
+
import { G as GlobalVariant } from './global.types-E2uVLemv.cjs';
|
|
11
|
+
import * as react from 'react';
|
|
9
12
|
export { default as Input } from './input.cjs';
|
|
13
|
+
export { default as Select, SelectOption, SelectOptionObject, SelectProps } from './select.cjs';
|
|
10
14
|
export { default as Slider } from './slider.cjs';
|
|
11
15
|
export { default as Switch } from './switch.cjs';
|
|
16
|
+
export { default as Icon } from './icon.cjs';
|
|
12
17
|
export { e as ExpansionPanelDensity, E as ExpansionPanelItem, a as ExpansionPanelItemProps, b as ExpansionPanelProps, f as ExpansionPanelRounded, c as ExpansionPanelValue, d as ExpansionPanelVariant } from './ExpansionPanelItem-Bd6ZWGkR.cjs';
|
|
13
|
-
export { c as ListDensity, L as ListItem, a as ListItemProps, d as ListLines, e as ListRounded, b as ListVariant } from './index-
|
|
14
|
-
import './
|
|
15
|
-
|
|
18
|
+
export { c as ListDensity, L as ListItem, a as ListItemProps, d as ListLines, e as ListRounded, b as ListVariant } from './index-B5n8tN2G.cjs';
|
|
19
|
+
import './types-BCqIOkp1.cjs';
|
|
20
|
+
|
|
21
|
+
type HeroAction = {
|
|
22
|
+
label: string;
|
|
23
|
+
href?: string;
|
|
24
|
+
variant?: 'primary' | 'secondary';
|
|
25
|
+
onClick?: react.MouseEventHandler<HTMLButtonElement | HTMLAnchorElement>;
|
|
26
|
+
};
|
|
27
|
+
type HeroStat = {
|
|
28
|
+
value: string;
|
|
29
|
+
label: string;
|
|
30
|
+
};
|
|
31
|
+
type HeroLogo = {
|
|
32
|
+
src: string;
|
|
33
|
+
alt?: string;
|
|
34
|
+
};
|
|
35
|
+
type HeroImage = {
|
|
36
|
+
src: string;
|
|
37
|
+
alt?: string;
|
|
38
|
+
};
|
|
39
|
+
type HeroProps = react.HTMLAttributes<HTMLElement> & {
|
|
40
|
+
title: react.ReactNode;
|
|
41
|
+
description?: react.ReactNode;
|
|
42
|
+
eyebrow?: string;
|
|
43
|
+
actions?: HeroAction[];
|
|
44
|
+
stats?: HeroStat[];
|
|
45
|
+
logos?: HeroLogo[];
|
|
46
|
+
image?: HeroImage;
|
|
47
|
+
variant?: GlobalVariant;
|
|
48
|
+
};
|
|
49
|
+
declare const Hero: react.FC<HeroProps>;
|
|
50
|
+
|
|
51
|
+
type SocialLink = {
|
|
52
|
+
icon: string;
|
|
53
|
+
href: string;
|
|
54
|
+
label?: string;
|
|
55
|
+
};
|
|
56
|
+
type Badge = {
|
|
57
|
+
label: string;
|
|
58
|
+
};
|
|
59
|
+
type Avatar = {
|
|
60
|
+
src: string;
|
|
61
|
+
alt?: string;
|
|
62
|
+
};
|
|
63
|
+
type ProfileCardLayout = 'classic' | 'split' | 'spotlight';
|
|
64
|
+
type ProfileCardProps = react.HTMLAttributes<HTMLElement> & {
|
|
65
|
+
name: string;
|
|
66
|
+
role?: string;
|
|
67
|
+
description?: react.ReactNode;
|
|
68
|
+
avatar: Avatar;
|
|
69
|
+
socials?: SocialLink[];
|
|
70
|
+
badges?: Badge[];
|
|
71
|
+
layout?: ProfileCardLayout;
|
|
72
|
+
variant?: GlobalVariant;
|
|
73
|
+
};
|
|
74
|
+
declare const ProfileCard: react.FC<ProfileCardProps>;
|
|
75
|
+
|
|
76
|
+
export { Hero, type HeroProps, ProfileCard, type ProfileCardLayout, type ProfileCardProps };
|
package/dist/index.d.ts
CHANGED
|
@@ -6,10 +6,71 @@ export { default as ExpansionPanel } from './expansion-panel.js';
|
|
|
6
6
|
export { default as Dialog, DialogProps } from './dialog.js';
|
|
7
7
|
export { default as ToolTip, ToolTipPlacement, ToolTipProps } from './tooltip.js';
|
|
8
8
|
export { default as Card, CardMediaProps, CardProps, CardSectionProps, CardTextProps } from './card.js';
|
|
9
|
+
export { default as Masonry, MasonryProps, MasonryRenderItem } from './masonry.js';
|
|
10
|
+
import { G as GlobalVariant } from './global.types-E2uVLemv.js';
|
|
11
|
+
import * as react from 'react';
|
|
9
12
|
export { default as Input } from './input.js';
|
|
13
|
+
export { default as Select, SelectOption, SelectOptionObject, SelectProps } from './select.js';
|
|
10
14
|
export { default as Slider } from './slider.js';
|
|
11
15
|
export { default as Switch } from './switch.js';
|
|
16
|
+
export { default as Icon } from './icon.js';
|
|
12
17
|
export { e as ExpansionPanelDensity, E as ExpansionPanelItem, a as ExpansionPanelItemProps, b as ExpansionPanelProps, f as ExpansionPanelRounded, c as ExpansionPanelValue, d as ExpansionPanelVariant } from './ExpansionPanelItem-DOjgDeB6.js';
|
|
13
|
-
export { c as ListDensity, L as ListItem, a as ListItemProps, d as ListLines, e as ListRounded, b as ListVariant } from './index-
|
|
14
|
-
import './
|
|
15
|
-
|
|
18
|
+
export { c as ListDensity, L as ListItem, a as ListItemProps, d as ListLines, e as ListRounded, b as ListVariant } from './index-D4-O-oJt.js';
|
|
19
|
+
import './types-ChXN4u7x.js';
|
|
20
|
+
|
|
21
|
+
type HeroAction = {
|
|
22
|
+
label: string;
|
|
23
|
+
href?: string;
|
|
24
|
+
variant?: 'primary' | 'secondary';
|
|
25
|
+
onClick?: react.MouseEventHandler<HTMLButtonElement | HTMLAnchorElement>;
|
|
26
|
+
};
|
|
27
|
+
type HeroStat = {
|
|
28
|
+
value: string;
|
|
29
|
+
label: string;
|
|
30
|
+
};
|
|
31
|
+
type HeroLogo = {
|
|
32
|
+
src: string;
|
|
33
|
+
alt?: string;
|
|
34
|
+
};
|
|
35
|
+
type HeroImage = {
|
|
36
|
+
src: string;
|
|
37
|
+
alt?: string;
|
|
38
|
+
};
|
|
39
|
+
type HeroProps = react.HTMLAttributes<HTMLElement> & {
|
|
40
|
+
title: react.ReactNode;
|
|
41
|
+
description?: react.ReactNode;
|
|
42
|
+
eyebrow?: string;
|
|
43
|
+
actions?: HeroAction[];
|
|
44
|
+
stats?: HeroStat[];
|
|
45
|
+
logos?: HeroLogo[];
|
|
46
|
+
image?: HeroImage;
|
|
47
|
+
variant?: GlobalVariant;
|
|
48
|
+
};
|
|
49
|
+
declare const Hero: react.FC<HeroProps>;
|
|
50
|
+
|
|
51
|
+
type SocialLink = {
|
|
52
|
+
icon: string;
|
|
53
|
+
href: string;
|
|
54
|
+
label?: string;
|
|
55
|
+
};
|
|
56
|
+
type Badge = {
|
|
57
|
+
label: string;
|
|
58
|
+
};
|
|
59
|
+
type Avatar = {
|
|
60
|
+
src: string;
|
|
61
|
+
alt?: string;
|
|
62
|
+
};
|
|
63
|
+
type ProfileCardLayout = 'classic' | 'split' | 'spotlight';
|
|
64
|
+
type ProfileCardProps = react.HTMLAttributes<HTMLElement> & {
|
|
65
|
+
name: string;
|
|
66
|
+
role?: string;
|
|
67
|
+
description?: react.ReactNode;
|
|
68
|
+
avatar: Avatar;
|
|
69
|
+
socials?: SocialLink[];
|
|
70
|
+
badges?: Badge[];
|
|
71
|
+
layout?: ProfileCardLayout;
|
|
72
|
+
variant?: GlobalVariant;
|
|
73
|
+
};
|
|
74
|
+
declare const ProfileCard: react.FC<ProfileCardProps>;
|
|
75
|
+
|
|
76
|
+
export { Hero, type HeroProps, ProfileCard, type ProfileCardLayout, type ProfileCardProps };
|
package/dist/index.js
CHANGED
|
@@ -1,16 +1,300 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
4
|
-
export {
|
|
5
|
-
export {
|
|
6
|
-
export {
|
|
1
|
+
export { Icon_default as Icon } from './chunk-HEXJCQRO.js';
|
|
2
|
+
export { Dialog_default as Dialog } from './chunk-LIEBZOLG.js';
|
|
3
|
+
export { ToolTip_default as ToolTip } from './chunk-U2AL7XFY.js';
|
|
4
|
+
export { Card_default as Card } from './chunk-B5FW33K3.js';
|
|
5
|
+
export { Masonry_default as Masonry } from './chunk-HAXGOTZO.js';
|
|
6
|
+
export { Input_default as Input } from './chunk-MFLH36XK.js';
|
|
7
|
+
export { Slider_default as Slider } from './chunk-GMDNSU26.js';
|
|
8
|
+
export { Switch_default as Switch } from './chunk-5LWU5T2C.js';
|
|
9
|
+
export { Select_default as Select } from './chunk-36T6I3XH.js';
|
|
7
10
|
export { Button_default as Button } from './chunk-SZU6OYLS.js';
|
|
8
|
-
export { Chip_default as Chip } from './chunk-
|
|
11
|
+
export { Chip_default as Chip } from './chunk-5PBPURGP.js';
|
|
9
12
|
import './chunk-IEILIKS2.js';
|
|
10
|
-
export { List_default as List } from './chunk-
|
|
11
|
-
export { Item_default as ListItem } from './chunk-
|
|
12
|
-
export { Menu_default as Menu } from './chunk-
|
|
13
|
-
export { ExpansionPanel_default as ExpansionPanel } from './chunk-
|
|
14
|
-
export { ExpansionPanelItem_default as ExpansionPanelItem } from './chunk-
|
|
13
|
+
export { List_default as List } from './chunk-AK7LFJI4.js';
|
|
14
|
+
export { Item_default as ListItem } from './chunk-5WQW6YSJ.js';
|
|
15
|
+
export { Menu_default as Menu } from './chunk-T37VPLS4.js';
|
|
16
|
+
export { ExpansionPanel_default as ExpansionPanel } from './chunk-LYP7V32H.js';
|
|
17
|
+
export { ExpansionPanelItem_default as ExpansionPanelItem } from './chunk-KRYWWWXR.js';
|
|
18
|
+
import { twMerge } from 'tailwind-merge';
|
|
19
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
20
|
+
|
|
21
|
+
var containerVariants = {
|
|
22
|
+
solid: "bg-gradient-to-br from-primary via-primary/90 to-indigo-600 text-white shadow-2xl shadow-primary/30",
|
|
23
|
+
outline: "border border-gray-200 bg-white text-gray-900",
|
|
24
|
+
text: "bg-transparent text-gray-900",
|
|
25
|
+
ghost: "bg-primary/5 text-gray-900 border border-primary/10",
|
|
26
|
+
filled: "bg-slate-900 text-white shadow-2xl shadow-slate-900/40",
|
|
27
|
+
underlined: "border-b-4 border-primary/70 bg-white text-gray-900",
|
|
28
|
+
rounded: "rounded-3xl border border-gray-100 bg-white text-gray-900 shadow-xl",
|
|
29
|
+
sharp: "rounded-none border border-gray-200 bg-white text-gray-900 shadow"
|
|
30
|
+
};
|
|
31
|
+
var frameRadii = {
|
|
32
|
+
solid: "rounded-3xl",
|
|
33
|
+
outline: "rounded-2xl",
|
|
34
|
+
text: "rounded-2xl",
|
|
35
|
+
ghost: "rounded-2xl",
|
|
36
|
+
filled: "rounded-3xl",
|
|
37
|
+
underlined: "rounded-2xl",
|
|
38
|
+
rounded: "rounded-3xl",
|
|
39
|
+
sharp: "rounded-none"
|
|
40
|
+
};
|
|
41
|
+
var badgeVariants = {
|
|
42
|
+
solid: "bg-white/10 text-white border border-white/20",
|
|
43
|
+
outline: "bg-primary/10 text-primary border border-primary/20",
|
|
44
|
+
text: "bg-primary/10 text-primary border border-primary/20",
|
|
45
|
+
ghost: "bg-primary/15 text-primary border border-primary/25",
|
|
46
|
+
filled: "bg-white/10 text-white border border-white/20",
|
|
47
|
+
underlined: "bg-primary/10 text-primary border border-primary/20",
|
|
48
|
+
rounded: "bg-primary/10 text-primary border border-primary/20",
|
|
49
|
+
sharp: "bg-primary/10 text-primary border border-primary/20"
|
|
50
|
+
};
|
|
51
|
+
var Hero = ({
|
|
52
|
+
title,
|
|
53
|
+
description,
|
|
54
|
+
eyebrow,
|
|
55
|
+
actions = [],
|
|
56
|
+
stats = [],
|
|
57
|
+
logos = [],
|
|
58
|
+
image,
|
|
59
|
+
variant = "solid",
|
|
60
|
+
className,
|
|
61
|
+
...rest
|
|
62
|
+
}) => {
|
|
63
|
+
const containerClass = twMerge(
|
|
64
|
+
"hero-block relative isolate overflow-hidden",
|
|
65
|
+
containerVariants[variant] ?? containerVariants.solid,
|
|
66
|
+
className
|
|
67
|
+
);
|
|
68
|
+
const badgeClass = twMerge(
|
|
69
|
+
"inline-flex items-center gap-2 rounded-full px-3 py-1 text-xs font-semibold uppercase tracking-wide",
|
|
70
|
+
badgeVariants[variant] ?? badgeVariants.solid
|
|
71
|
+
);
|
|
72
|
+
const isDark = variant === "solid" || variant === "filled";
|
|
73
|
+
const subdued = isDark ? "text-white/80" : "text-gray-600";
|
|
74
|
+
const statMuted = isDark ? "text-white/70" : "text-gray-500";
|
|
75
|
+
const actionPrimary = isDark ? "bg-white text-gray-900 hover:bg-white/90 focus-visible:outline-white/70" : "bg-primary text-white hover:bg-primary/90 focus-visible:outline-primary/50";
|
|
76
|
+
const actionSecondary = isDark ? "border border-white/40 text-white hover:bg-white/10 focus-visible:outline-white/60" : "border border-gray-300 text-gray-900 hover:border-primary/60 hover:text-primary focus-visible:outline-primary/50";
|
|
77
|
+
const frameRadius = frameRadii[variant] ?? "rounded-2xl";
|
|
78
|
+
const frameDecoration = isDark ? "border-white/10 bg-white/10 shadow-2xl shadow-black/20" : "border-gray-200 bg-white shadow-2xl shadow-gray-200/60";
|
|
79
|
+
const renderAction = (action, index) => {
|
|
80
|
+
const { href, label, onClick, variant: actionVariant = "primary" } = action;
|
|
81
|
+
const Component = href ? "a" : "button";
|
|
82
|
+
const resolvedClass = actionVariant === "secondary" ? twMerge("bg-white/70", actionSecondary) : twMerge("shadow-lg shadow-primary/25", actionPrimary);
|
|
83
|
+
return /* @__PURE__ */ jsx(
|
|
84
|
+
Component,
|
|
85
|
+
{
|
|
86
|
+
href,
|
|
87
|
+
onClick,
|
|
88
|
+
className: twMerge(
|
|
89
|
+
"inline-flex items-center gap-2 rounded-xl px-4 py-3 text-sm font-semibold transition focus-visible:outline focus-visible:outline-offset-2",
|
|
90
|
+
resolvedClass
|
|
91
|
+
),
|
|
92
|
+
children: label
|
|
93
|
+
},
|
|
94
|
+
`${label}-${index}`
|
|
95
|
+
);
|
|
96
|
+
};
|
|
97
|
+
return /* @__PURE__ */ jsxs("section", { ...rest, className: containerClass, children: [
|
|
98
|
+
/* @__PURE__ */ jsxs("div", { className: "pointer-events-none absolute inset-0 overflow-hidden", children: [
|
|
99
|
+
/* @__PURE__ */ jsx("div", { className: "absolute left-24 top-10 h-64 w-64 rounded-full bg-primary/15 blur-3xl" }),
|
|
100
|
+
/* @__PURE__ */ jsx("div", { className: "absolute -right-16 -bottom-10 h-80 w-80 rounded-full bg-primary/20 blur-3xl" })
|
|
101
|
+
] }),
|
|
102
|
+
/* @__PURE__ */ jsxs("div", { className: "mx-auto flex max-w-6xl flex-col gap-12 px-6 py-16 lg:px-10 lg:py-24", children: [
|
|
103
|
+
/* @__PURE__ */ jsxs("div", { className: "grid items-center gap-12 lg:grid-cols-2", children: [
|
|
104
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
|
|
105
|
+
eyebrow && /* @__PURE__ */ jsx("span", { className: badgeClass, children: eyebrow }),
|
|
106
|
+
/* @__PURE__ */ jsx(
|
|
107
|
+
"h1",
|
|
108
|
+
{
|
|
109
|
+
className: twMerge(
|
|
110
|
+
"text-4xl font-semibold leading-tight sm:text-5xl",
|
|
111
|
+
isDark ? "text-white" : "text-gray-900"
|
|
112
|
+
),
|
|
113
|
+
children: title
|
|
114
|
+
}
|
|
115
|
+
),
|
|
116
|
+
description && /* @__PURE__ */ jsx("p", { className: twMerge("text-lg leading-relaxed", subdued), children: description }),
|
|
117
|
+
actions.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-3", children: actions.map(renderAction) }),
|
|
118
|
+
stats.length > 0 && /* @__PURE__ */ jsx("dl", { className: "grid gap-6 sm:grid-cols-3", children: stats.map((stat) => /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
|
|
119
|
+
/* @__PURE__ */ jsx("dd", { className: twMerge("text-3xl font-semibold", isDark ? "text-white" : "text-gray-900"), children: stat.value }),
|
|
120
|
+
/* @__PURE__ */ jsx("dt", { className: twMerge("text-sm font-medium", statMuted), children: stat.label })
|
|
121
|
+
] }, stat.label)) })
|
|
122
|
+
] }),
|
|
123
|
+
image && /* @__PURE__ */ jsx("div", { className: "relative", children: /* @__PURE__ */ jsxs("div", { className: twMerge("relative overflow-hidden backdrop-blur", frameDecoration, frameRadius), children: [
|
|
124
|
+
/* @__PURE__ */ jsx(
|
|
125
|
+
"img",
|
|
126
|
+
{
|
|
127
|
+
src: image.src,
|
|
128
|
+
alt: image.alt ?? "",
|
|
129
|
+
className: twMerge("h-full w-full object-cover", frameRadius),
|
|
130
|
+
loading: "lazy"
|
|
131
|
+
}
|
|
132
|
+
),
|
|
133
|
+
/* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-0 bg-linear-to-t from-black/30 via-transparent to-transparent" })
|
|
134
|
+
] }) })
|
|
135
|
+
] }),
|
|
136
|
+
logos.length > 0 && /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-6 lg:items-center lg:gap-10", children: [
|
|
137
|
+
/* @__PURE__ */ jsx("span", { className: twMerge("text-sm font-semibold tracking-wide", subdued), children: "Duveruji nam" }),
|
|
138
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-wrap items-center gap-4 opacity-80", children: logos.map((logo) => /* @__PURE__ */ jsx(
|
|
139
|
+
"img",
|
|
140
|
+
{
|
|
141
|
+
src: logo.src,
|
|
142
|
+
alt: logo.alt ?? "",
|
|
143
|
+
className: "h-8 w-auto grayscale transition hover:grayscale-0",
|
|
144
|
+
loading: "lazy"
|
|
145
|
+
},
|
|
146
|
+
logo.src
|
|
147
|
+
)) })
|
|
148
|
+
] })
|
|
149
|
+
] })
|
|
150
|
+
] });
|
|
151
|
+
};
|
|
152
|
+
Hero.displayName = "Hero";
|
|
153
|
+
var Hero_default = Hero;
|
|
154
|
+
var variantMap = {
|
|
155
|
+
solid: "bg-white text-gray-900 border border-gray-200 shadow-lg shadow-gray-200/60",
|
|
156
|
+
outline: "bg-white text-gray-900 border border-gray-300",
|
|
157
|
+
text: "bg-transparent text-gray-900",
|
|
158
|
+
ghost: "bg-slate-50 text-gray-900 border border-slate-100",
|
|
159
|
+
filled: "bg-slate-900 text-white shadow-2xl shadow-slate-900/30",
|
|
160
|
+
underlined: "bg-white text-gray-900 border-b-4 border-primary/70",
|
|
161
|
+
rounded: "bg-white text-gray-900 border border-gray-200 rounded-3xl shadow-md",
|
|
162
|
+
sharp: "bg-white text-gray-900 border border-gray-200 rounded-none shadow"
|
|
163
|
+
};
|
|
164
|
+
var radiusMap = {
|
|
165
|
+
solid: "rounded-2xl",
|
|
166
|
+
outline: "rounded-2xl",
|
|
167
|
+
text: "rounded-2xl",
|
|
168
|
+
ghost: "rounded-2xl",
|
|
169
|
+
filled: "rounded-3xl",
|
|
170
|
+
underlined: "rounded-2xl",
|
|
171
|
+
rounded: "rounded-3xl",
|
|
172
|
+
sharp: "rounded-none"
|
|
173
|
+
};
|
|
174
|
+
var isDarkVariant = (variant) => variant === "filled";
|
|
175
|
+
var SocialIcons = ({ socials = [], dark }) => {
|
|
176
|
+
if (socials.length === 0) return null;
|
|
177
|
+
const iconBase = twMerge(
|
|
178
|
+
"flex h-10 w-10 items-center justify-center rounded-full border text-lg transition",
|
|
179
|
+
dark ? "border-white/30 text-white hover:bg-white/10" : "border-gray-200 text-gray-600 hover:border-primary/50 hover:text-primary"
|
|
180
|
+
);
|
|
181
|
+
return /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2", children: socials.map((link) => /* @__PURE__ */ jsx("a", { href: link.href, "aria-label": link.label ?? link.icon, className: iconBase, children: /* @__PURE__ */ jsx("i", { className: twMerge("mdi", link.icon), "aria-hidden": true }) }, link.href)) });
|
|
182
|
+
};
|
|
183
|
+
var Badges = ({ badges = [], dark }) => {
|
|
184
|
+
if (badges.length === 0) return null;
|
|
185
|
+
const badgeBase = twMerge(
|
|
186
|
+
"inline-flex items-center rounded-full px-3 py-1 mb-2 text-xs font-semibold",
|
|
187
|
+
dark ? "bg-white/10 text-white border border-white/20" : "bg-primary/10 text-primary border border-primary/15"
|
|
188
|
+
);
|
|
189
|
+
return /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2", children: badges.map((badge) => /* @__PURE__ */ jsx("span", { className: badgeBase, children: badge.label }, badge.label)) });
|
|
190
|
+
};
|
|
191
|
+
var AvatarFrame = ({
|
|
192
|
+
avatar,
|
|
193
|
+
size = "md",
|
|
194
|
+
ring,
|
|
195
|
+
radius
|
|
196
|
+
}) => {
|
|
197
|
+
const dimension = size === "lg" ? "h-28 w-28" : "h-20 w-20";
|
|
198
|
+
const ringClass = ring ? "ring-4 ring-white/80 ring-offset-4 ring-offset-transparent" : "";
|
|
199
|
+
return /* @__PURE__ */ jsx(
|
|
200
|
+
"div",
|
|
201
|
+
{
|
|
202
|
+
className: twMerge(
|
|
203
|
+
"overflow-hidden bg-gradient-to-br from-primary/10 to-primary/30",
|
|
204
|
+
radius,
|
|
205
|
+
dimension,
|
|
206
|
+
ringClass
|
|
207
|
+
),
|
|
208
|
+
children: /* @__PURE__ */ jsx(
|
|
209
|
+
"img",
|
|
210
|
+
{
|
|
211
|
+
src: avatar.src,
|
|
212
|
+
alt: avatar.alt ?? "",
|
|
213
|
+
className: twMerge("h-full w-full object-cover", radius),
|
|
214
|
+
loading: "lazy"
|
|
215
|
+
}
|
|
216
|
+
)
|
|
217
|
+
}
|
|
218
|
+
);
|
|
219
|
+
};
|
|
220
|
+
var ProfileCard = ({
|
|
221
|
+
name,
|
|
222
|
+
role,
|
|
223
|
+
description,
|
|
224
|
+
avatar,
|
|
225
|
+
socials,
|
|
226
|
+
badges,
|
|
227
|
+
layout = "classic",
|
|
228
|
+
variant = "solid",
|
|
229
|
+
className,
|
|
230
|
+
...rest
|
|
231
|
+
}) => {
|
|
232
|
+
const baseVariant = variantMap[variant] ?? variantMap.solid;
|
|
233
|
+
const radius = radiusMap[variant] ?? "rounded-2xl";
|
|
234
|
+
const dark = isDarkVariant(variant);
|
|
235
|
+
const muted = dark ? "text-white/70" : "text-gray-600";
|
|
236
|
+
const accent = dark ? "text-white" : "text-gray-900";
|
|
237
|
+
const content = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
238
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
239
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
240
|
+
/* @__PURE__ */ jsx(AvatarFrame, { avatar, radius }),
|
|
241
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
242
|
+
/* @__PURE__ */ jsx("h3", { className: twMerge("text-xl font-semibold", accent), children: name }),
|
|
243
|
+
role && /* @__PURE__ */ jsx("p", { className: twMerge("text-sm font-medium", muted), children: role })
|
|
244
|
+
] })
|
|
245
|
+
] }),
|
|
246
|
+
description && /* @__PURE__ */ jsx("p", { className: twMerge("text-sm leading-relaxed", muted), children: description }),
|
|
247
|
+
/* @__PURE__ */ jsx(Badges, { badges, dark })
|
|
248
|
+
] }),
|
|
249
|
+
/* @__PURE__ */ jsx(SocialIcons, { socials, dark })
|
|
250
|
+
] });
|
|
251
|
+
const spotlightContent = /* @__PURE__ */ jsxs("div", { className: "relative overflow-hidden", children: [
|
|
252
|
+
/* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-gradient-to-br from-primary/10 via-transparent to-primary/20 blur-3xl" }),
|
|
253
|
+
/* @__PURE__ */ jsxs("div", { className: "relative flex flex-col gap-6 md:flex-row md:items-center", children: [
|
|
254
|
+
/* @__PURE__ */ jsx(AvatarFrame, { avatar, size: "lg", ring: true, radius }),
|
|
255
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
|
|
256
|
+
/* @__PURE__ */ jsx("h3", { className: twMerge("text-2xl font-semibold", accent), children: name }),
|
|
257
|
+
role && /* @__PURE__ */ jsx("p", { className: twMerge("text-sm font-medium uppercase tracking-wide", muted), children: role }),
|
|
258
|
+
description && /* @__PURE__ */ jsx("p", { className: twMerge("text-sm leading-relaxed", muted), children: description }),
|
|
259
|
+
/* @__PURE__ */ jsx(Badges, { badges, dark }),
|
|
260
|
+
/* @__PURE__ */ jsx(SocialIcons, { socials, dark })
|
|
261
|
+
] })
|
|
262
|
+
] })
|
|
263
|
+
] });
|
|
264
|
+
const splitContent = /* @__PURE__ */ jsxs("div", { className: "grid gap-6 md:grid-cols-[auto,1fr] md:items-center", children: [
|
|
265
|
+
/* @__PURE__ */ jsx(AvatarFrame, { avatar, size: "lg", ring: true, radius }),
|
|
266
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
|
|
267
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
268
|
+
/* @__PURE__ */ jsx("h3", { className: twMerge("text-2xl font-semibold", accent), children: name }),
|
|
269
|
+
role && /* @__PURE__ */ jsx("p", { className: twMerge("text-sm font-medium", muted), children: role })
|
|
270
|
+
] }),
|
|
271
|
+
description && /* @__PURE__ */ jsx("p", { className: twMerge("text-sm leading-relaxed", muted), children: description }),
|
|
272
|
+
/* @__PURE__ */ jsx(Badges, { badges, dark }),
|
|
273
|
+
/* @__PURE__ */ jsx(SocialIcons, { socials, dark })
|
|
274
|
+
] })
|
|
275
|
+
] });
|
|
276
|
+
const layoutMap = {
|
|
277
|
+
classic: content,
|
|
278
|
+
split: splitContent,
|
|
279
|
+
spotlight: spotlightContent
|
|
280
|
+
};
|
|
281
|
+
return /* @__PURE__ */ jsx(
|
|
282
|
+
"article",
|
|
283
|
+
{
|
|
284
|
+
...rest,
|
|
285
|
+
className: twMerge(
|
|
286
|
+
"profile-card relative overflow-hidden p-6 transition duration-200 hover:-translate-y-0.5 hover:shadow-xl",
|
|
287
|
+
baseVariant,
|
|
288
|
+
radius,
|
|
289
|
+
className
|
|
290
|
+
),
|
|
291
|
+
children: layoutMap[layout] ?? layoutMap.classic
|
|
292
|
+
}
|
|
293
|
+
);
|
|
294
|
+
};
|
|
295
|
+
ProfileCard.displayName = "ProfileCard";
|
|
296
|
+
var ProfileCard_default = ProfileCard;
|
|
297
|
+
|
|
298
|
+
export { Hero_default as Hero, ProfileCard_default as ProfileCard };
|
|
15
299
|
//# sourceMappingURL=index.js.map
|
|
16
300
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
|
1
|
+
{"version":3,"sources":["../src/Blocks/Hero/index.tsx","../src/Blocks/ProfileCard/index.tsx"],"names":["twMerge","jsx","jsxs"],"mappings":"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","file":"index.js","sourcesContent":["import type { GlobalVariant } from '@lindle/linoardo/global.types';\nimport * as React from 'react';\nimport { twMerge } from 'tailwind-merge';\n\ntype HeroAction = {\n label: string;\n href?: string;\n variant?: 'primary' | 'secondary';\n onClick?: React.MouseEventHandler<HTMLButtonElement | HTMLAnchorElement>;\n};\n\ntype HeroStat = {\n value: string;\n label: string;\n};\n\ntype HeroLogo = {\n src: string;\n alt?: string;\n};\n\ntype HeroImage = {\n src: string;\n alt?: string;\n};\n\nexport type HeroProps = React.HTMLAttributes<HTMLElement> & {\n title: React.ReactNode;\n description?: React.ReactNode;\n eyebrow?: string;\n actions?: HeroAction[];\n stats?: HeroStat[];\n logos?: HeroLogo[];\n image?: HeroImage;\n variant?: GlobalVariant;\n};\n\nconst containerVariants: Record<GlobalVariant, string> = {\n solid: 'bg-gradient-to-br from-primary via-primary/90 to-indigo-600 text-white shadow-2xl shadow-primary/30',\n outline: 'border border-gray-200 bg-white text-gray-900',\n text: 'bg-transparent text-gray-900',\n ghost: 'bg-primary/5 text-gray-900 border border-primary/10',\n filled: 'bg-slate-900 text-white shadow-2xl shadow-slate-900/40',\n underlined: 'border-b-4 border-primary/70 bg-white text-gray-900',\n rounded: 'rounded-3xl border border-gray-100 bg-white text-gray-900 shadow-xl',\n sharp: 'rounded-none border border-gray-200 bg-white text-gray-900 shadow'\n};\n\nconst frameRadii: Record<GlobalVariant, string> = {\n solid: 'rounded-3xl',\n outline: 'rounded-2xl',\n text: 'rounded-2xl',\n ghost: 'rounded-2xl',\n filled: 'rounded-3xl',\n underlined: 'rounded-2xl',\n rounded: 'rounded-3xl',\n sharp: 'rounded-none'\n};\n\nconst badgeVariants: Record<GlobalVariant, string> = {\n solid: 'bg-white/10 text-white border border-white/20',\n outline: 'bg-primary/10 text-primary border border-primary/20',\n text: 'bg-primary/10 text-primary border border-primary/20',\n ghost: 'bg-primary/15 text-primary border border-primary/25',\n filled: 'bg-white/10 text-white border border-white/20',\n underlined: 'bg-primary/10 text-primary border border-primary/20',\n rounded: 'bg-primary/10 text-primary border border-primary/20',\n sharp: 'bg-primary/10 text-primary border border-primary/20'\n};\n\nconst Hero: React.FC<HeroProps> = ({\n title,\n description,\n eyebrow,\n actions = [],\n stats = [],\n logos = [],\n image,\n variant = 'solid',\n className,\n ...rest\n}) => {\n const containerClass = twMerge(\n 'hero-block relative isolate overflow-hidden',\n containerVariants[variant] ?? containerVariants.solid,\n className\n );\n const badgeClass = twMerge(\n 'inline-flex items-center gap-2 rounded-full px-3 py-1 text-xs font-semibold uppercase tracking-wide',\n badgeVariants[variant] ?? badgeVariants.solid\n );\n const isDark = variant === 'solid' || variant === 'filled';\n const subdued = isDark ? 'text-white/80' : 'text-gray-600';\n const statMuted = isDark ? 'text-white/70' : 'text-gray-500';\n const actionPrimary = isDark\n ? 'bg-white text-gray-900 hover:bg-white/90 focus-visible:outline-white/70'\n : 'bg-primary text-white hover:bg-primary/90 focus-visible:outline-primary/50';\n const actionSecondary = isDark\n ? 'border border-white/40 text-white hover:bg-white/10 focus-visible:outline-white/60'\n : 'border border-gray-300 text-gray-900 hover:border-primary/60 hover:text-primary focus-visible:outline-primary/50';\n const frameRadius = frameRadii[variant] ?? 'rounded-2xl';\n const frameDecoration = isDark\n ? 'border-white/10 bg-white/10 shadow-2xl shadow-black/20'\n : 'border-gray-200 bg-white shadow-2xl shadow-gray-200/60';\n\n const renderAction = (action: HeroAction, index: number) => {\n const { href, label, onClick, variant: actionVariant = 'primary' } = action;\n const Component = href ? 'a' : 'button';\n const resolvedClass =\n actionVariant === 'secondary'\n ? twMerge('bg-white/70', actionSecondary)\n : twMerge('shadow-lg shadow-primary/25', actionPrimary);\n\n return (\n <Component\n key={`${label}-${index}`}\n href={href}\n onClick={onClick as never}\n className={twMerge(\n 'inline-flex items-center gap-2 rounded-xl px-4 py-3 text-sm font-semibold transition focus-visible:outline focus-visible:outline-offset-2',\n resolvedClass\n )}\n >\n {label}\n </Component>\n );\n };\n\n return (\n <section {...rest} className={containerClass}>\n <div className='pointer-events-none absolute inset-0 overflow-hidden'>\n <div className='absolute left-24 top-10 h-64 w-64 rounded-full bg-primary/15 blur-3xl' />\n <div className='absolute -right-16 -bottom-10 h-80 w-80 rounded-full bg-primary/20 blur-3xl' />\n </div>\n <div className='mx-auto flex max-w-6xl flex-col gap-12 px-6 py-16 lg:px-10 lg:py-24'>\n <div className='grid items-center gap-12 lg:grid-cols-2'>\n <div className='space-y-6'>\n {eyebrow && <span className={badgeClass}>{eyebrow}</span>}\n <h1\n className={twMerge(\n 'text-4xl font-semibold leading-tight sm:text-5xl',\n isDark ? 'text-white' : 'text-gray-900'\n )}\n >\n {title}\n </h1>\n {description && <p className={twMerge('text-lg leading-relaxed', subdued)}>{description}</p>}\n {actions.length > 0 && <div className='flex flex-wrap gap-3'>{actions.map(renderAction)}</div>}\n {stats.length > 0 && (\n <dl className='grid gap-6 sm:grid-cols-3'>\n {stats.map(stat => (\n <div key={stat.label} className='space-y-1'>\n <dd className={twMerge('text-3xl font-semibold', isDark ? 'text-white' : 'text-gray-900')}>\n {stat.value}\n </dd>\n <dt className={twMerge('text-sm font-medium', statMuted)}>{stat.label}</dt>\n </div>\n ))}\n </dl>\n )}\n </div>\n {image && (\n <div className='relative'>\n <div className={twMerge('relative overflow-hidden backdrop-blur', frameDecoration, frameRadius)}>\n <img\n src={image.src}\n alt={image.alt ?? ''}\n className={twMerge('h-full w-full object-cover', frameRadius)}\n loading='lazy'\n />\n <div className='pointer-events-none absolute inset-0 bg-linear-to-t from-black/30 via-transparent to-transparent' />\n </div>\n </div>\n )}\n </div>\n {logos.length > 0 && (\n <div className='flex flex-wrap items-center gap-6 lg:items-center lg:gap-10'>\n <span className={twMerge('text-sm font-semibold tracking-wide', subdued)}>Duveruji nam</span>\n <div className='flex flex-wrap items-center gap-4 opacity-80'>\n {logos.map(logo => (\n <img\n key={logo.src}\n src={logo.src}\n alt={logo.alt ?? ''}\n className='h-8 w-auto grayscale transition hover:grayscale-0'\n loading='lazy'\n />\n ))}\n </div>\n </div>\n )}\n </div>\n </section>\n );\n};\n\nHero.displayName = 'Hero';\n\nexport default Hero;\n","import type { GlobalVariant } from '@lindle/linoardo/global.types';\nimport * as React from 'react';\nimport { twMerge } from 'tailwind-merge';\n\ntype SocialLink = {\n icon: string;\n href: string;\n label?: string;\n};\n\ntype Badge = {\n label: string;\n};\n\ntype Avatar = {\n src: string;\n alt?: string;\n};\n\nexport type ProfileCardLayout = 'classic' | 'split' | 'spotlight';\n\nexport type ProfileCardProps = React.HTMLAttributes<HTMLElement> & {\n name: string;\n role?: string;\n description?: React.ReactNode;\n avatar: Avatar;\n socials?: SocialLink[];\n badges?: Badge[];\n layout?: ProfileCardLayout;\n variant?: GlobalVariant;\n};\n\nconst variantMap: Record<GlobalVariant, string> = {\n solid: 'bg-white text-gray-900 border border-gray-200 shadow-lg shadow-gray-200/60',\n outline: 'bg-white text-gray-900 border border-gray-300',\n text: 'bg-transparent text-gray-900',\n ghost: 'bg-slate-50 text-gray-900 border border-slate-100',\n filled: 'bg-slate-900 text-white shadow-2xl shadow-slate-900/30',\n underlined: 'bg-white text-gray-900 border-b-4 border-primary/70',\n rounded: 'bg-white text-gray-900 border border-gray-200 rounded-3xl shadow-md',\n sharp: 'bg-white text-gray-900 border border-gray-200 rounded-none shadow'\n};\n\nconst radiusMap: Record<GlobalVariant, string> = {\n solid: 'rounded-2xl',\n outline: 'rounded-2xl',\n text: 'rounded-2xl',\n ghost: 'rounded-2xl',\n filled: 'rounded-3xl',\n underlined: 'rounded-2xl',\n rounded: 'rounded-3xl',\n sharp: 'rounded-none'\n};\n\nconst isDarkVariant = (variant: GlobalVariant) => variant === 'filled';\n\nconst SocialIcons: React.FC<{ socials?: SocialLink[]; dark?: boolean }> = ({ socials = [], dark }) => {\n if (socials.length === 0) return null;\n\n const iconBase = twMerge(\n 'flex h-10 w-10 items-center justify-center rounded-full border text-lg transition',\n dark\n ? 'border-white/30 text-white hover:bg-white/10'\n : 'border-gray-200 text-gray-600 hover:border-primary/50 hover:text-primary'\n );\n\n return (\n <div className='flex flex-wrap gap-2'>\n {socials.map(link => (\n <a key={link.href} href={link.href} aria-label={link.label ?? link.icon} className={iconBase}>\n <i className={twMerge('mdi', link.icon)} aria-hidden />\n </a>\n ))}\n </div>\n );\n};\n\nconst Badges: React.FC<{ badges?: Badge[]; dark?: boolean }> = ({ badges = [], dark }) => {\n if (badges.length === 0) return null;\n\n const badgeBase = twMerge(\n 'inline-flex items-center rounded-full px-3 py-1 mb-2 text-xs font-semibold',\n dark ? 'bg-white/10 text-white border border-white/20' : 'bg-primary/10 text-primary border border-primary/15'\n );\n\n return (\n <div className='flex flex-wrap gap-2'>\n {badges.map(badge => (\n <span key={badge.label} className={badgeBase}>\n {badge.label}\n </span>\n ))}\n </div>\n );\n};\n\nconst AvatarFrame: React.FC<{ avatar: Avatar; size?: 'md' | 'lg'; ring?: boolean; radius: string }> = ({\n avatar,\n size = 'md',\n ring,\n radius\n}) => {\n const dimension = size === 'lg' ? 'h-28 w-28' : 'h-20 w-20';\n const ringClass = ring ? 'ring-4 ring-white/80 ring-offset-4 ring-offset-transparent' : '';\n return (\n <div\n className={twMerge(\n 'overflow-hidden bg-gradient-to-br from-primary/10 to-primary/30',\n radius,\n dimension,\n ringClass\n )}\n >\n <img\n src={avatar.src}\n alt={avatar.alt ?? ''}\n className={twMerge('h-full w-full object-cover', radius)}\n loading='lazy'\n />\n </div>\n );\n};\n\nconst ProfileCard: React.FC<ProfileCardProps> = ({\n name,\n role,\n description,\n avatar,\n socials,\n badges,\n layout = 'classic',\n variant = 'solid',\n className,\n ...rest\n}) => {\n const baseVariant = variantMap[variant] ?? variantMap.solid;\n const radius = radiusMap[variant] ?? 'rounded-2xl';\n const dark = isDarkVariant(variant);\n const muted = dark ? 'text-white/70' : 'text-gray-600';\n const accent = dark ? 'text-white' : 'text-gray-900';\n\n const content = (\n <>\n <div className='space-y-2'>\n <div className='flex items-center gap-3'>\n <AvatarFrame avatar={avatar} radius={radius} />\n <div>\n <h3 className={twMerge('text-xl font-semibold', accent)}>{name}</h3>\n {role && <p className={twMerge('text-sm font-medium', muted)}>{role}</p>}\n </div>\n </div>\n {description && <p className={twMerge('text-sm leading-relaxed', muted)}>{description}</p>}\n <Badges badges={badges} dark={dark} />\n </div>\n <SocialIcons socials={socials} dark={dark} />\n </>\n );\n\n const spotlightContent = (\n <div className='relative overflow-hidden'>\n <div className='absolute inset-0 bg-gradient-to-br from-primary/10 via-transparent to-primary/20 blur-3xl' />\n <div className='relative flex flex-col gap-6 md:flex-row md:items-center'>\n <AvatarFrame avatar={avatar} size='lg' ring radius={radius} />\n <div className='space-y-3'>\n <h3 className={twMerge('text-2xl font-semibold', accent)}>{name}</h3>\n {role && <p className={twMerge('text-sm font-medium uppercase tracking-wide', muted)}>{role}</p>}\n {description && <p className={twMerge('text-sm leading-relaxed', muted)}>{description}</p>}\n <Badges badges={badges} dark={dark} />\n <SocialIcons socials={socials} dark={dark} />\n </div>\n </div>\n </div>\n );\n\n const splitContent = (\n <div className='grid gap-6 md:grid-cols-[auto,1fr] md:items-center'>\n <AvatarFrame avatar={avatar} size='lg' ring radius={radius} />\n <div className='space-y-3'>\n <div>\n <h3 className={twMerge('text-2xl font-semibold', accent)}>{name}</h3>\n {role && <p className={twMerge('text-sm font-medium', muted)}>{role}</p>}\n </div>\n {description && <p className={twMerge('text-sm leading-relaxed', muted)}>{description}</p>}\n <Badges badges={badges} dark={dark} />\n <SocialIcons socials={socials} dark={dark} />\n </div>\n </div>\n );\n\n const layoutMap: Record<ProfileCardLayout, React.ReactNode> = {\n classic: content,\n split: splitContent,\n spotlight: spotlightContent\n };\n\n return (\n <article\n {...rest}\n className={twMerge(\n 'profile-card relative overflow-hidden p-6 transition duration-200 hover:-translate-y-0.5 hover:shadow-xl',\n baseVariant,\n radius,\n className\n )}\n >\n {layoutMap[layout] ?? layoutMap.classic}\n </article>\n );\n};\n\nProfileCard.displayName = 'ProfileCard';\n\nexport default ProfileCard;\n"]}
|