@lindle/linoardo 1.0.20 → 1.0.22

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.
Files changed (75) hide show
  1. package/dist/button.cjs +32 -16
  2. package/dist/button.cjs.map +1 -1
  3. package/dist/button.d.cts +17 -7
  4. package/dist/button.d.ts +17 -7
  5. package/dist/button.js +1 -1
  6. package/dist/card.cjs +2 -2
  7. package/dist/card.cjs.map +1 -1
  8. package/dist/card.js +1 -1
  9. package/dist/chip.cjs +8 -9
  10. package/dist/chip.cjs.map +1 -1
  11. package/dist/chip.d.cts +4 -4
  12. package/dist/chip.d.ts +4 -4
  13. package/dist/chip.js +1 -1
  14. package/dist/{chunk-B5FW33K3.js → chunk-2UL3S6KC.js} +4 -4
  15. package/dist/chunk-2UL3S6KC.js.map +1 -0
  16. package/dist/chunk-67USTSXI.js +214 -0
  17. package/dist/chunk-67USTSXI.js.map +1 -0
  18. package/dist/{chunk-5PBPURGP.js → chunk-DSZ3EOQB.js} +10 -11
  19. package/dist/chunk-DSZ3EOQB.js.map +1 -0
  20. package/dist/{chunk-SZU6OYLS.js → chunk-F2G2JRKA.js} +33 -18
  21. package/dist/chunk-F2G2JRKA.js.map +1 -0
  22. package/dist/{chunk-MFLH36XK.js → chunk-JGEXEDKS.js} +3 -3
  23. package/dist/{chunk-MFLH36XK.js.map → chunk-JGEXEDKS.js.map} +1 -1
  24. package/dist/chunk-NEYVJE67.js +170 -0
  25. package/dist/chunk-NEYVJE67.js.map +1 -0
  26. package/dist/{chunk-36T6I3XH.js → chunk-SAGQYMS3.js} +14 -14
  27. package/dist/chunk-SAGQYMS3.js.map +1 -0
  28. package/dist/chunk-VPF7M2PB.js +141 -0
  29. package/dist/chunk-VPF7M2PB.js.map +1 -0
  30. package/dist/chunk-Z5A2OIDI.js +312 -0
  31. package/dist/chunk-Z5A2OIDI.js.map +1 -0
  32. package/dist/hero.cjs +143 -0
  33. package/dist/hero.cjs.map +1 -0
  34. package/dist/hero.d.cts +34 -0
  35. package/dist/hero.d.ts +34 -0
  36. package/dist/hero.js +3 -0
  37. package/dist/hero.js.map +1 -0
  38. package/dist/index.cjs +741 -58
  39. package/dist/index.cjs.map +1 -1
  40. package/dist/index.d.cts +26 -55
  41. package/dist/index.d.ts +26 -55
  42. package/dist/index.js +126 -260
  43. package/dist/index.js.map +1 -1
  44. package/dist/input.cjs +1 -1
  45. package/dist/input.cjs.map +1 -1
  46. package/dist/input.js +1 -1
  47. package/dist/notification.cjs +236 -0
  48. package/dist/notification.cjs.map +1 -0
  49. package/dist/notification.d.cts +34 -0
  50. package/dist/notification.d.ts +34 -0
  51. package/dist/notification.js +3 -0
  52. package/dist/notification.js.map +1 -0
  53. package/dist/profileCard.cjs +392 -0
  54. package/dist/profileCard.cjs.map +1 -0
  55. package/dist/profileCard.d.cts +29 -0
  56. package/dist/profileCard.d.ts +29 -0
  57. package/dist/profileCard.js +5 -0
  58. package/dist/profileCard.js.map +1 -0
  59. package/dist/progress.cjs +314 -0
  60. package/dist/progress.cjs.map +1 -0
  61. package/dist/progress.d.cts +30 -0
  62. package/dist/progress.d.ts +30 -0
  63. package/dist/progress.js +3 -0
  64. package/dist/progress.js.map +1 -0
  65. package/dist/select.cjs +12 -12
  66. package/dist/select.cjs.map +1 -1
  67. package/dist/select.js +1 -1
  68. package/dist/styles.css +381 -6
  69. package/dist/switch.d.cts +1 -1
  70. package/dist/switch.d.ts +1 -1
  71. package/package.json +12 -1
  72. package/dist/chunk-36T6I3XH.js.map +0 -1
  73. package/dist/chunk-5PBPURGP.js.map +0 -1
  74. package/dist/chunk-B5FW33K3.js.map +0 -1
  75. package/dist/chunk-SZU6OYLS.js.map +0 -1
package/dist/index.d.cts CHANGED
@@ -7,70 +7,41 @@ 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
9
  export { default as Masonry, MasonryProps, MasonryRenderItem } from './masonry.cjs';
10
- import { G as GlobalVariant } from './global.types-E2uVLemv.cjs';
11
10
  import * as react from 'react';
11
+ export { default as Hero, HeroProps } from './hero.cjs';
12
+ export { Avatar, Badge, default as ProfileCard, ProfileCardLayout, ProfileCardProps, SocialLink } from './profileCard.cjs';
12
13
  export { default as Input } from './input.cjs';
13
14
  export { default as Select, SelectOption, SelectOptionObject, SelectProps } from './select.cjs';
14
15
  export { default as Slider } from './slider.cjs';
15
16
  export { default as Switch } from './switch.cjs';
16
17
  export { default as Icon } from './icon.cjs';
18
+ export { default as Notification, NotificationArgs, NotificationPlacement, NotificationProps, NotificationType, NotificationVariant } from './notification.cjs';
19
+ export { default as Progress, ProgressProps, ProgressStatus, ProgressType } from './progress.cjs';
17
20
  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';
18
21
  export { c as ListDensity, L as ListItem, a as ListItemProps, d as ListLines, e as ListRounded, b as ListVariant } from './index-B5n8tN2G.cjs';
22
+ import './global.types-E2uVLemv.cjs';
19
23
  import './types-BCqIOkp1.cjs';
20
24
 
21
- type HeroAction = {
22
- label: string;
25
+ type AppBarNavItem = {
26
+ label: react.ReactNode;
23
27
  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>;
28
+ active?: boolean;
29
+ onClick?: react.MouseEventHandler<HTMLAnchorElement | HTMLButtonElement>;
30
+ };
31
+ type AppBarProps = react.HTMLAttributes<HTMLElement> & {
32
+ title?: react.ReactNode;
33
+ logo?: string;
34
+ logoAlt?: string;
35
+ brandHref?: string;
36
+ navigation?: AppBarNavItem[];
37
+ actions?: react.ReactNode;
38
+ position?: 'fixed' | 'absolute' | 'sticky' | 'static' | 'relative';
39
+ color?: 'primary' | 'surface' | 'muted' | 'dark' | 'transparent';
40
+ dense?: boolean;
41
+ elevated?: boolean;
42
+ contained?: boolean;
43
+ titlePosition?: 'start' | 'center' | 'end';
44
+ };
45
+ declare const AppBar: react.FC<AppBarProps>;
75
46
 
76
- export { Hero, type HeroProps, ProfileCard, type ProfileCardLayout, type ProfileCardProps };
47
+ export { AppBar, type AppBarNavItem, type AppBarProps };
package/dist/index.d.ts CHANGED
@@ -7,70 +7,41 @@ 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
9
  export { default as Masonry, MasonryProps, MasonryRenderItem } from './masonry.js';
10
- import { G as GlobalVariant } from './global.types-E2uVLemv.js';
11
10
  import * as react from 'react';
11
+ export { default as Hero, HeroProps } from './hero.js';
12
+ export { Avatar, Badge, default as ProfileCard, ProfileCardLayout, ProfileCardProps, SocialLink } from './profileCard.js';
12
13
  export { default as Input } from './input.js';
13
14
  export { default as Select, SelectOption, SelectOptionObject, SelectProps } from './select.js';
14
15
  export { default as Slider } from './slider.js';
15
16
  export { default as Switch } from './switch.js';
16
17
  export { default as Icon } from './icon.js';
18
+ export { default as Notification, NotificationArgs, NotificationPlacement, NotificationProps, NotificationType, NotificationVariant } from './notification.js';
19
+ export { default as Progress, ProgressProps, ProgressStatus, ProgressType } from './progress.js';
17
20
  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';
18
21
  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';
22
+ import './global.types-E2uVLemv.js';
19
23
  import './types-ChXN4u7x.js';
20
24
 
21
- type HeroAction = {
22
- label: string;
25
+ type AppBarNavItem = {
26
+ label: react.ReactNode;
23
27
  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>;
28
+ active?: boolean;
29
+ onClick?: react.MouseEventHandler<HTMLAnchorElement | HTMLButtonElement>;
30
+ };
31
+ type AppBarProps = react.HTMLAttributes<HTMLElement> & {
32
+ title?: react.ReactNode;
33
+ logo?: string;
34
+ logoAlt?: string;
35
+ brandHref?: string;
36
+ navigation?: AppBarNavItem[];
37
+ actions?: react.ReactNode;
38
+ position?: 'fixed' | 'absolute' | 'sticky' | 'static' | 'relative';
39
+ color?: 'primary' | 'surface' | 'muted' | 'dark' | 'transparent';
40
+ dense?: boolean;
41
+ elevated?: boolean;
42
+ contained?: boolean;
43
+ titlePosition?: 'start' | 'center' | 'end';
44
+ };
45
+ declare const AppBar: react.FC<AppBarProps>;
75
46
 
76
- export { Hero, type HeroProps, ProfileCard, type ProfileCardLayout, type ProfileCardProps };
47
+ export { AppBar, type AppBarNavItem, type AppBarProps };
package/dist/index.js CHANGED
@@ -1,300 +1,166 @@
1
1
  export { Icon_default as Icon } from './chunk-HEXJCQRO.js';
2
+ export { Hero_default as Hero } from './chunk-VPF7M2PB.js';
3
+ export { ProfileCard_default as ProfileCard } from './chunk-NEYVJE67.js';
4
+ export { Notification_default as Notification } from './chunk-67USTSXI.js';
5
+ export { Progress_default as Progress } from './chunk-Z5A2OIDI.js';
2
6
  export { Dialog_default as Dialog } from './chunk-LIEBZOLG.js';
3
7
  export { ToolTip_default as ToolTip } from './chunk-U2AL7XFY.js';
4
- export { Card_default as Card } from './chunk-B5FW33K3.js';
8
+ export { Card_default as Card } from './chunk-2UL3S6KC.js';
5
9
  export { Masonry_default as Masonry } from './chunk-HAXGOTZO.js';
6
- export { Input_default as Input } from './chunk-MFLH36XK.js';
10
+ export { Input_default as Input } from './chunk-JGEXEDKS.js';
7
11
  export { Slider_default as Slider } from './chunk-GMDNSU26.js';
8
12
  export { Switch_default as Switch } from './chunk-5LWU5T2C.js';
9
- export { Select_default as Select } from './chunk-36T6I3XH.js';
10
- export { Button_default as Button } from './chunk-SZU6OYLS.js';
11
- export { Chip_default as Chip } from './chunk-5PBPURGP.js';
13
+ export { Select_default as Select } from './chunk-SAGQYMS3.js';
14
+ export { Button_default as Button } from './chunk-F2G2JRKA.js';
15
+ export { Chip_default as Chip } from './chunk-DSZ3EOQB.js';
12
16
  import './chunk-IEILIKS2.js';
13
17
  export { List_default as List } from './chunk-AK7LFJI4.js';
14
18
  export { Item_default as ListItem } from './chunk-5WQW6YSJ.js';
15
19
  export { Menu_default as Menu } from './chunk-T37VPLS4.js';
16
20
  export { ExpansionPanel_default as ExpansionPanel } from './chunk-LYP7V32H.js';
17
21
  export { ExpansionPanelItem_default as ExpansionPanelItem } from './chunk-KRYWWWXR.js';
22
+ import * as React from 'react';
18
23
  import { twMerge } from 'tailwind-merge';
19
- import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
24
+ import { jsxs, jsx } from 'react/jsx-runtime';
20
25
 
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"
26
+ var positionClasses = {
27
+ fixed: "fixed inset-x-0 top-0",
28
+ absolute: "absolute inset-x-0 top-0",
29
+ sticky: "sticky inset-x-0 top-0",
30
+ static: "static",
31
+ relative: "relative"
30
32
  };
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"
33
+ var colorClasses = {
34
+ primary: "bg-primary text-white",
35
+ surface: "bg-white text-gray-900 border-b border-gray-200",
36
+ muted: "bg-gray-50 text-gray-900 border-b border-gray-200",
37
+ dark: "bg-gray-900 text-white",
38
+ transparent: "bg-transparent text-inherit"
40
39
  };
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 = ({
40
+ var AppBar = ({
52
41
  title,
53
- description,
54
- eyebrow,
55
- actions = [],
56
- stats = [],
57
- logos = [],
58
- image,
59
- variant = "solid",
42
+ logo,
43
+ logoAlt = "Logo",
44
+ brandHref,
45
+ navigation = [],
46
+ actions,
47
+ position = "static",
48
+ color = "surface",
49
+ dense = false,
50
+ elevated = true,
51
+ contained = true,
52
+ titlePosition = "start",
60
53
  className,
54
+ children,
61
55
  ...rest
62
56
  }) => {
63
- const containerClass = twMerge(
64
- "hero-block relative isolate overflow-hidden",
65
- containerVariants[variant] ?? containerVariants.solid,
57
+ const [mobileOpen, setMobileOpen] = React.useState(false);
58
+ const isDark = color === "primary" || color === "dark";
59
+ const isTransparent = color === "transparent";
60
+ const barClass = twMerge(
61
+ "app-bar z-40 w-full backdrop-blur-md",
62
+ positionClasses[position] ?? positionClasses.static,
63
+ colorClasses[color] ?? colorClasses.surface,
64
+ elevated && !isTransparent ? "shadow-sm shadow-black/10" : void 0,
65
+ "relative",
66
66
  className
67
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
68
+ const innerClass = twMerge(
69
+ "mx-auto flex w-full items-center gap-4",
70
+ contained ? "max-w-6xl px-4 sm:px-6 lg:px-8" : "px-4",
71
+ dense ? "py-2.5" : "py-4"
72
+ );
73
+ const brandTextClass = isDark ? "text-white" : "text-gray-900";
74
+ const navBaseClass = twMerge(
75
+ "inline-flex items-center gap-2 rounded-xl px-3 py-2 text-sm font-medium transition focus-visible:outline-none",
76
+ isDark ? "hover:bg-white/10 focus-visible:ring-2 focus-visible:ring-white/70" : "hover:bg-gray-100 focus-visible:ring-2 focus-visible:ring-primary/50 focus-visible:ring-offset-2 focus-visible:ring-offset-transparent"
71
77
  );
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;
78
+ const navActiveClass = isDark ? "bg-white/15 text-white" : "bg-primary/10 text-primary";
79
+ const renderNavItem = (item, index) => {
80
+ const { href, label, active, onClick } = item;
81
81
  const Component = href ? "a" : "button";
82
- const resolvedClass = actionVariant === "secondary" ? twMerge("bg-white/70", actionSecondary) : twMerge("shadow-lg shadow-primary/25", actionPrimary);
82
+ const resolvedHref = href && href.trim().length > 0 ? href : void 0;
83
83
  return /* @__PURE__ */ jsx(
84
84
  Component,
85
85
  {
86
- href,
86
+ href: resolvedHref,
87
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
- ),
88
+ className: twMerge(navBaseClass, active ? navActiveClass : void 0),
89
+ "aria-current": active ? "page" : void 0,
92
90
  children: label
93
91
  },
94
- `${label}-${index}`
92
+ `${resolvedHref ?? "item"}-${index}`
95
93
  );
96
94
  };
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",
95
+ const brandAlignClass = titlePosition === "center" ? "justify-self-center text-center" : titlePosition === "end" ? "justify-self-end text-right" : "justify-self-start";
96
+ const brandNode = title || logo ? /* @__PURE__ */ jsxs("div", { className: twMerge("flex min-w-0 items-center gap-3", brandAlignClass), children: [
97
+ logo ? /* @__PURE__ */ jsx("div", { className: "flex h-10 w-10 shrink-0 items-center justify-center overflow-hidden rounded-xl bg-white/10 ring-1 ring-black/5", children: /* @__PURE__ */ jsx(
98
+ "img",
99
+ {
100
+ src: logo,
101
+ alt: logoAlt,
102
+ className: "h-full w-full object-cover",
103
+ loading: "lazy",
104
+ decoding: "async"
105
+ }
106
+ ) }) : null,
107
+ /* @__PURE__ */ jsx("div", { className: "min-w-0", children: title ? /* @__PURE__ */ jsx("div", { className: twMerge("text-base font-semibold leading-tight", brandTextClass), children: brandHref ? /* @__PURE__ */ jsx("a", { href: brandHref, className: "hover:underline focus-visible:outline-none", children: title }) : title }) : null })
108
+ ] }) : null;
109
+ return /* @__PURE__ */ jsxs("header", { ...rest, className: barClass, children: [
110
+ /* @__PURE__ */ jsx("div", { className: innerClass, children: /* @__PURE__ */ jsxs("div", { className: "grid w-full grid-cols-[auto_1fr_auto] items-center gap-3", children: [
111
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
112
+ navigation.length > 0 ? /* @__PURE__ */ jsx(
113
+ "button",
140
114
  {
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
- ] })
115
+ type: "button",
116
+ "aria-label": "Otev\u0159\xEDt navigaci",
117
+ className: twMerge(
118
+ "inline-flex h-10 w-10 items-center justify-center rounded-xl text-xl sm:hidden",
119
+ isDark ? "text-white hover:bg-white/10 focus-visible:ring-2 focus-visible:ring-white/60" : "text-gray-700 hover:bg-gray-100 focus-visible:ring-2 focus-visible:ring-primary/40 focus-visible:ring-offset-2 focus-visible:ring-offset-transparent"
120
+ ),
121
+ "aria-expanded": mobileOpen,
122
+ onClick: () => setMobileOpen((open) => !open),
123
+ children: /* @__PURE__ */ jsx("i", { className: mobileOpen ? "mdi mdi-close" : "mdi mdi-menu", "aria-hidden": true })
124
+ }
125
+ ) : null,
126
+ navigation.length > 0 ? /* @__PURE__ */ jsx("nav", { className: "hidden items-center gap-1 sm:flex", "aria-label": "Hlavni navigace", children: navigation.map(renderNavItem) }) : null
245
127
  ] }),
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 })
128
+ brandNode,
129
+ /* @__PURE__ */ jsxs("div", { className: "ml-auto flex items-center justify-end gap-2", children: [
130
+ children,
131
+ actions
261
132
  ] })
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
- ] })
133
+ ] }) }),
134
+ navigation.length > 0 && mobileOpen ? /* @__PURE__ */ jsx("div", { className: "sm:hidden", children: /* @__PURE__ */ jsx("nav", { className: "absolute inset-x-0 top-full border-t border-gray-200/70 bg-white/95 p-3 shadow-lg shadow-gray-900/5 backdrop-blur-md", children: /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-2", "aria-label": "Mobilni navigace", children: navigation.map((item, index) => {
135
+ const { href, label, active, onClick } = item;
136
+ const Component = href ? "a" : "button";
137
+ const resolvedHref = href && href.trim().length > 0 ? href : void 0;
138
+ return /* @__PURE__ */ jsxs(
139
+ Component,
140
+ {
141
+ href: resolvedHref,
142
+ onClick: (event) => {
143
+ onClick?.(event);
144
+ setMobileOpen(false);
145
+ },
146
+ className: twMerge(
147
+ "flex items-center justify-between rounded-xl px-3 py-2 text-sm font-medium transition",
148
+ active ? "bg-primary/10 text-primary" : "text-gray-800 hover:bg-gray-100"
149
+ ),
150
+ "aria-current": active ? "page" : void 0,
151
+ children: [
152
+ label,
153
+ active ? /* @__PURE__ */ jsx("i", { className: "mdi mdi-circle-small text-primary", "aria-hidden": true }) : null
154
+ ]
155
+ },
156
+ `${resolvedHref ?? "mobile-item"}-${index}`
157
+ );
158
+ }) }) }) }) : null
275
159
  ] });
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
160
  };
295
- ProfileCard.displayName = "ProfileCard";
296
- var ProfileCard_default = ProfileCard;
161
+ AppBar.displayName = "AppBar";
162
+ var AppBar_default = AppBar;
297
163
 
298
- export { Hero_default as Hero, ProfileCard_default as ProfileCard };
164
+ export { AppBar_default as AppBar };
299
165
  //# sourceMappingURL=index.js.map
300
166
  //# sourceMappingURL=index.js.map