@opensite/ui 0.1.3 → 0.1.4
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/components.cjs +1501 -0
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.cts +13 -0
- package/dist/components.d.ts +13 -0
- package/dist/components.js +1489 -1
- package/dist/components.js.map +1 -1
- package/dist/footer-animated-social.cjs +272 -0
- package/dist/footer-animated-social.cjs.map +1 -0
- package/dist/footer-animated-social.d.cts +41 -0
- package/dist/footer-animated-social.d.ts +41 -0
- package/dist/footer-animated-social.js +250 -0
- package/dist/footer-animated-social.js.map +1 -0
- package/dist/footer-background-card.cjs +149 -0
- package/dist/footer-background-card.cjs.map +1 -0
- package/dist/footer-background-card.d.cts +74 -0
- package/dist/footer-background-card.d.ts +74 -0
- package/dist/footer-background-card.js +147 -0
- package/dist/footer-background-card.js.map +1 -0
- package/dist/footer-brand-description.cjs +244 -0
- package/dist/footer-brand-description.cjs.map +1 -0
- package/dist/footer-brand-description.d.cts +65 -0
- package/dist/footer-brand-description.d.ts +65 -0
- package/dist/footer-brand-description.js +222 -0
- package/dist/footer-brand-description.js.map +1 -0
- package/dist/footer-contact-card.cjs +238 -0
- package/dist/footer-contact-card.cjs.map +1 -0
- package/dist/footer-contact-card.d.cts +65 -0
- package/dist/footer-contact-card.d.ts +65 -0
- package/dist/footer-contact-card.js +216 -0
- package/dist/footer-contact-card.js.map +1 -0
- package/dist/footer-cta-banner.cjs +282 -0
- package/dist/footer-cta-banner.cjs.map +1 -0
- package/dist/footer-cta-banner.d.cts +77 -0
- package/dist/footer-cta-banner.d.ts +77 -0
- package/dist/footer-cta-banner.js +260 -0
- package/dist/footer-cta-banner.js.map +1 -0
- package/dist/footer-cta-social.cjs +221 -0
- package/dist/footer-cta-social.cjs.map +1 -0
- package/dist/footer-cta-social.d.cts +45 -0
- package/dist/footer-cta-social.d.ts +45 -0
- package/dist/footer-cta-social.js +199 -0
- package/dist/footer-cta-social.js.map +1 -0
- package/dist/footer-links-grid.cjs +119 -0
- package/dist/footer-links-grid.cjs.map +1 -0
- package/dist/footer-links-grid.d.cts +54 -0
- package/dist/footer-links-grid.d.ts +54 -0
- package/dist/footer-links-grid.js +117 -0
- package/dist/footer-links-grid.js.map +1 -0
- package/dist/footer-nav-social.cjs +273 -0
- package/dist/footer-nav-social.cjs.map +1 -0
- package/dist/footer-nav-social.d.cts +72 -0
- package/dist/footer-nav-social.d.ts +72 -0
- package/dist/footer-nav-social.js +251 -0
- package/dist/footer-nav-social.js.map +1 -0
- package/dist/footer-newsletter-grid.cjs +271 -0
- package/dist/footer-newsletter-grid.cjs.map +1 -0
- package/dist/footer-newsletter-grid.d.cts +74 -0
- package/dist/footer-newsletter-grid.d.ts +74 -0
- package/dist/footer-newsletter-grid.js +249 -0
- package/dist/footer-newsletter-grid.js.map +1 -0
- package/dist/footer-newsletter-minimal.cjs +271 -0
- package/dist/footer-newsletter-minimal.cjs.map +1 -0
- package/dist/footer-newsletter-minimal.d.cts +57 -0
- package/dist/footer-newsletter-minimal.d.ts +57 -0
- package/dist/footer-newsletter-minimal.js +249 -0
- package/dist/footer-newsletter-minimal.js.map +1 -0
- package/dist/footer-simple-centered.cjs +101 -0
- package/dist/footer-simple-centered.cjs.map +1 -0
- package/dist/footer-simple-centered.d.cts +52 -0
- package/dist/footer-simple-centered.d.ts +52 -0
- package/dist/footer-simple-centered.js +99 -0
- package/dist/footer-simple-centered.js.map +1 -0
- package/dist/footer-social-apps.cjs +247 -0
- package/dist/footer-social-apps.cjs.map +1 -0
- package/dist/footer-social-apps.d.cts +75 -0
- package/dist/footer-social-apps.d.ts +75 -0
- package/dist/footer-social-apps.js +225 -0
- package/dist/footer-social-apps.js.map +1 -0
- package/dist/footer-social-newsletter.cjs +267 -0
- package/dist/footer-social-newsletter.cjs.map +1 -0
- package/dist/footer-social-newsletter.d.cts +68 -0
- package/dist/footer-social-newsletter.d.ts +68 -0
- package/dist/footer-social-newsletter.js +245 -0
- package/dist/footer-social-newsletter.js.map +1 -0
- package/dist/index.cjs +1501 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +13 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +1489 -1
- package/dist/index.js.map +1 -1
- package/dist/registry.cjs +1971 -1
- package/dist/registry.cjs.map +1 -1
- package/dist/registry.js +1971 -1
- package/dist/registry.js.map +1 -1
- package/dist/team-media-showcase.cjs +182 -0
- package/dist/team-media-showcase.cjs.map +1 -0
- package/dist/team-media-showcase.d.cts +145 -0
- package/dist/team-media-showcase.d.ts +145 -0
- package/dist/team-media-showcase.js +160 -0
- package/dist/team-media-showcase.js.map +1 -0
- package/package.json +71 -1
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var clsx = require('clsx');
|
|
6
|
+
var tailwindMerge = require('tailwind-merge');
|
|
7
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
8
|
+
var img = require('@page-speed/img');
|
|
9
|
+
|
|
10
|
+
function _interopNamespace(e) {
|
|
11
|
+
if (e && e.__esModule) return e;
|
|
12
|
+
var n = Object.create(null);
|
|
13
|
+
if (e) {
|
|
14
|
+
Object.keys(e).forEach(function (k) {
|
|
15
|
+
if (k !== 'default') {
|
|
16
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
17
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
18
|
+
enumerable: true,
|
|
19
|
+
get: function () { return e[k]; }
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
n.default = e;
|
|
25
|
+
return Object.freeze(n);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
29
|
+
|
|
30
|
+
// components/blocks/team/team-media-showcase.tsx
|
|
31
|
+
function cn(...inputs) {
|
|
32
|
+
return tailwindMerge.twMerge(clsx.clsx(inputs));
|
|
33
|
+
}
|
|
34
|
+
var maxWidthStyles = {
|
|
35
|
+
sm: "max-w-screen-sm",
|
|
36
|
+
md: "max-w-screen-md",
|
|
37
|
+
lg: "max-w-screen-lg",
|
|
38
|
+
xl: "max-w-screen-xl",
|
|
39
|
+
"2xl": "max-w-screen-2xl",
|
|
40
|
+
"4xl": "max-w-[1536px]",
|
|
41
|
+
full: "max-w-full"
|
|
42
|
+
};
|
|
43
|
+
var Container = React__namespace.default.forwardRef(
|
|
44
|
+
({ children, maxWidth = "xl", className, as = "div", ...props }, ref) => {
|
|
45
|
+
const Component = as;
|
|
46
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
47
|
+
Component,
|
|
48
|
+
{
|
|
49
|
+
ref,
|
|
50
|
+
className: cn(
|
|
51
|
+
"mx-auto w-full px-4 sm:px-6 lg:px-8",
|
|
52
|
+
maxWidthStyles[maxWidth],
|
|
53
|
+
className
|
|
54
|
+
),
|
|
55
|
+
...props,
|
|
56
|
+
children
|
|
57
|
+
}
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
);
|
|
61
|
+
Container.displayName = "Container";
|
|
62
|
+
var backgroundStyles = {
|
|
63
|
+
white: "bg-background text-foreground",
|
|
64
|
+
gray: "bg-muted/30 text-foreground",
|
|
65
|
+
dark: "bg-foreground text-background",
|
|
66
|
+
gradient: "bg-gradient-to-br from-primary via-primary/90 to-foreground text-primary-foreground",
|
|
67
|
+
primary: "bg-primary text-primary-foreground",
|
|
68
|
+
secondary: "bg-secondary text-secondary-foreground",
|
|
69
|
+
muted: "bg-muted text-muted-foreground"
|
|
70
|
+
};
|
|
71
|
+
var spacingStyles = {
|
|
72
|
+
sm: "py-12 md:py-16",
|
|
73
|
+
md: "py-16 md:py-24",
|
|
74
|
+
lg: "py-20 md:py-32",
|
|
75
|
+
xl: "py-24 md:py-40"
|
|
76
|
+
};
|
|
77
|
+
var Section = React__namespace.default.forwardRef(
|
|
78
|
+
({
|
|
79
|
+
id,
|
|
80
|
+
title,
|
|
81
|
+
subtitle,
|
|
82
|
+
children,
|
|
83
|
+
className,
|
|
84
|
+
style,
|
|
85
|
+
background = "white",
|
|
86
|
+
spacing = "lg",
|
|
87
|
+
...props
|
|
88
|
+
}, ref) => {
|
|
89
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
90
|
+
"section",
|
|
91
|
+
{
|
|
92
|
+
ref,
|
|
93
|
+
id,
|
|
94
|
+
className: cn(
|
|
95
|
+
backgroundStyles[background],
|
|
96
|
+
spacingStyles[spacing],
|
|
97
|
+
className
|
|
98
|
+
),
|
|
99
|
+
style,
|
|
100
|
+
...props,
|
|
101
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs(Container, { children: [
|
|
102
|
+
(title || subtitle) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center mb-12 md:mb-16", children: [
|
|
103
|
+
subtitle && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-semibold uppercase tracking-wider mb-2 text-primary", children: subtitle }),
|
|
104
|
+
title && /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-3xl md:text-4xl lg:text-5xl font-bold tracking-tight", children: title })
|
|
105
|
+
] }),
|
|
106
|
+
children
|
|
107
|
+
] })
|
|
108
|
+
}
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
);
|
|
112
|
+
Section.displayName = "Section";
|
|
113
|
+
var TeamMemberBackgroundImageCard = React__namespace.forwardRef(({ className, imageUrl, imageAlt, children, optixFlowConfig, ...props }, ref) => {
|
|
114
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
115
|
+
"div",
|
|
116
|
+
{
|
|
117
|
+
ref,
|
|
118
|
+
className: cn(
|
|
119
|
+
"group h-[400px] relative w-full max-w-sm overflow-hidden rounded-xl border border-border bg-card shadow-lg",
|
|
120
|
+
"transition-all duration-300 ease-in-out",
|
|
121
|
+
className
|
|
122
|
+
),
|
|
123
|
+
...props,
|
|
124
|
+
children: [
|
|
125
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
126
|
+
img.Img,
|
|
127
|
+
{
|
|
128
|
+
src: imageUrl,
|
|
129
|
+
alt: imageAlt,
|
|
130
|
+
className: "absolute inset-0 h-full w-full object-cover transition-transform duration-500 ease-in-out group-hover:scale-110",
|
|
131
|
+
optixFlowConfig
|
|
132
|
+
}
|
|
133
|
+
),
|
|
134
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/80 via-black/20 to-transparent" }),
|
|
135
|
+
children
|
|
136
|
+
]
|
|
137
|
+
}
|
|
138
|
+
);
|
|
139
|
+
});
|
|
140
|
+
TeamMemberBackgroundImageCard.displayName = "TeamMemberBackgroundImageCard";
|
|
141
|
+
function TeamMediaShowcase({
|
|
142
|
+
items,
|
|
143
|
+
children,
|
|
144
|
+
listEyebrow,
|
|
145
|
+
background = "white",
|
|
146
|
+
verticalMargin = "lg",
|
|
147
|
+
gridClassName = "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6",
|
|
148
|
+
className,
|
|
149
|
+
optixFlowConfig
|
|
150
|
+
}) {
|
|
151
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Section, { background, spacing: verticalMargin, className, children: /* @__PURE__ */ jsxRuntime.jsxs(Container, { children: [
|
|
152
|
+
children,
|
|
153
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-12", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-6", children: [
|
|
154
|
+
listEyebrow && typeof listEyebrow === "string" && listEyebrow.trim() !== "" && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-md pt-8 uppercase text-dark-charcoal/70 tracking-[0.2em] font-semibold", children: listEyebrow }),
|
|
155
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: gridClassName, children: items.map((member, idx) => {
|
|
156
|
+
const imageAlt = member.imageAlt || (member.name && typeof member.name === "string" && member.name.trim() !== "" ? member.name : `member-${idx}`);
|
|
157
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
158
|
+
TeamMemberBackgroundImageCard,
|
|
159
|
+
{
|
|
160
|
+
imageUrl: member.imageSrc,
|
|
161
|
+
imageAlt,
|
|
162
|
+
className: member.cardClassName,
|
|
163
|
+
optixFlowConfig,
|
|
164
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex h-full flex-col justify-end p-6 text-card-foreground", children: [
|
|
165
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-4 transition-transform duration-500 ease-in-out group-hover:-translate-y-12", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
166
|
+
member.name && typeof member.name === "string" && member.name.trim() !== "" && /* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-3xl font-bold text-white", children: member.name }),
|
|
167
|
+
member.role && typeof member.role === "string" && member.role.trim() !== "" && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-white/80", children: member.role })
|
|
168
|
+
] }) }),
|
|
169
|
+
member.action ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute -bottom-20 left-0 w-full pt-2 p-6 opacity-0 transition-all duration-500 ease-in-out group-hover:bottom-0 group-hover:opacity-100", children: member.action }) : null
|
|
170
|
+
] })
|
|
171
|
+
},
|
|
172
|
+
idx
|
|
173
|
+
);
|
|
174
|
+
}) })
|
|
175
|
+
] }) })
|
|
176
|
+
] }) });
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
exports.TeamMediaShowcase = TeamMediaShowcase;
|
|
180
|
+
exports.TeamMemberBackgroundImageCard = TeamMemberBackgroundImageCard;
|
|
181
|
+
//# sourceMappingURL=team-media-showcase.cjs.map
|
|
182
|
+
//# sourceMappingURL=team-media-showcase.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../lib/utils.ts","../components/ui/container.tsx","../components/ui/section.tsx","../components/blocks/team/team-media-showcase.tsx"],"names":["twMerge","clsx","React","jsx","jsxs","React3","Img"],"mappings":"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","file":"team-media-showcase.cjs","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport type { ContainerProps } from \"../../src/types\";\n\nconst maxWidthStyles = {\n sm: \"max-w-screen-sm\",\n md: \"max-w-screen-md\",\n lg: \"max-w-screen-lg\",\n xl: \"max-w-screen-xl\",\n \"2xl\": \"max-w-screen-2xl\",\n \"4xl\": \"max-w-[1536px]\",\n full: \"max-w-full\",\n};\n\n/**\n * Container component for consistent content width and centering\n *\n * @example\n * ```tsx\n * <Container maxWidth=\"xl\">\n * <h1>Page Content</h1>\n * </Container>\n * ```\n */\nexport const Container = React.forwardRef<HTMLDivElement, ContainerProps>(\n ({ children, maxWidth = \"xl\", className, as = \"div\", ...props }, ref) => {\n const Component = as as any;\n return (\n <Component\n ref={ref}\n className={cn(\n \"mx-auto w-full px-4 sm:px-6 lg:px-8\",\n maxWidthStyles[maxWidth],\n className\n )}\n {...props}\n >\n {children}\n </Component>\n );\n }\n);\n\nContainer.displayName = \"Container\";\n","import React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Container } from \"./container\";\nimport type { SectionProps } from \"../../src/types\";\n\n/**\n * Background style variants\n * Uses standard Tailwind/shadcn CSS variables for theming\n */\nconst backgroundStyles = {\n white: \"bg-background text-foreground\",\n gray: \"bg-muted/30 text-foreground\",\n dark: \"bg-foreground text-background\",\n gradient: \"bg-gradient-to-br from-primary via-primary/90 to-foreground text-primary-foreground\",\n primary: \"bg-primary text-primary-foreground\",\n secondary: \"bg-secondary text-secondary-foreground\",\n muted: \"bg-muted text-muted-foreground\",\n};\n\n/**\n * Vertical spacing variants\n */\nconst spacingStyles = {\n sm: \"py-12 md:py-16\",\n md: \"py-16 md:py-24\",\n lg: \"py-20 md:py-32\",\n xl: \"py-24 md:py-40\",\n};\n\n/**\n * Section component for consistent page sections with optional title, subtitle, and background\n *\n * @example\n * ```tsx\n * <Section\n * title=\"Our Services\"\n * subtitle=\"What we offer\"\n * background=\"gray\"\n * spacing=\"lg\"\n * >\n * <div>Section content goes here</div>\n * </Section>\n * ```\n */\nexport const Section = React.forwardRef<HTMLElement, SectionProps>(\n (\n {\n id,\n title,\n subtitle,\n children,\n className,\n style,\n background = \"white\",\n spacing = \"lg\",\n ...props\n },\n ref\n ) => {\n return (\n <section\n ref={ref}\n id={id}\n className={cn(\n backgroundStyles[background],\n spacingStyles[spacing],\n className\n )}\n style={style}\n {...props}\n >\n <Container>\n {(title || subtitle) && (\n <div className=\"text-center mb-12 md:mb-16\">\n {subtitle && (\n <p className=\"text-sm font-semibold uppercase tracking-wider mb-2 text-primary\">\n {subtitle}\n </p>\n )}\n {title && (\n <h2 className=\"text-3xl md:text-4xl lg:text-5xl font-bold tracking-tight\">\n {title}\n </h2>\n )}\n </div>\n )}\n {children}\n </Container>\n </section>\n );\n }\n);\n\nSection.displayName = \"Section\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport { Container } from \"../../ui/container\";\nimport { Section } from \"../../ui/section\";\nimport { Img } from \"@page-speed/img\";\nimport type { SectionBackground, SectionSpacing } from \"../../../src/types\";\n\n/**\n * Configuration for Optix Flow image optimization\n */\nexport interface OptixFlowConfig {\n /**\n * API key for Optix Flow service\n */\n apiKey: string;\n /**\n * Compression level (0-100)\n */\n compression?: number;\n}\n\n/**\n * Individual team member item for TeamMediaShowcase\n */\nexport interface TeamMediaShowcaseItem {\n /**\n * Image source URL for the team member (required)\n */\n imageSrc: string;\n /**\n * Team member's name (optional)\n */\n name?: string;\n /**\n * Team member's role/title (optional)\n */\n role?: string;\n /**\n * Custom action element to display on hover (optional)\n * Can be a button, link, or any React node\n */\n action?: React.ReactNode;\n /**\n * Alt text for the image (defaults to name or generic text)\n */\n imageAlt?: string;\n /**\n * Additional CSS classes for the card\n */\n cardClassName?: string;\n}\n\n/**\n * Props for TeamMediaShowcase component\n */\nexport interface TeamMediaShowcaseProps {\n /**\n * Array of team member items to display (required)\n * Each item must have at least an imageSrc\n */\n items: TeamMediaShowcaseItem[];\n /**\n * Optional children to render above the grid (e.g., section header content)\n */\n children?: React.ReactNode;\n /**\n * Eyebrow text displayed above the grid\n */\n listEyebrow?: string;\n /**\n * Background style variant for the section\n * @default \"white\"\n */\n background?: SectionBackground;\n /**\n * Vertical spacing/margin variant\n * @default \"lg\"\n */\n verticalMargin?: SectionSpacing;\n /**\n * Custom grid CSS classes\n * @default \"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6\"\n */\n gridClassName?: string;\n /**\n * Additional CSS classes for the section wrapper\n */\n className?: string;\n /**\n * Optional Optix Flow configuration for @page-speed/img\n */\n optixFlowConfig?: OptixFlowConfig;\n}\n\n/**\n * Props for TeamMemberBackgroundImageCard component\n */\ninterface TeamMemberBackgroundImageCardProps\n extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Image URL for the background\n */\n imageUrl: string;\n /**\n * Alt text for the image\n */\n imageAlt: string;\n /**\n * Card content (overlaid on the image)\n */\n children?: React.ReactNode;\n /**\n * Optional Optix Flow configuration for @page-speed/img\n */\n optixFlowConfig?: OptixFlowConfig;\n}\n\n/**\n * TeamMemberBackgroundImageCard - Individual card with background image and hover effects\n *\n * Displays a team member with a full-bleed background image that zooms on hover,\n * with a gradient overlay for text readability.\n */\nconst TeamMemberBackgroundImageCard = React.forwardRef<\n HTMLDivElement,\n TeamMemberBackgroundImageCardProps\n>(({ className, imageUrl, imageAlt, children, optixFlowConfig, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n \"group h-[400px] relative w-full max-w-sm overflow-hidden rounded-xl border border-border bg-card shadow-lg\",\n \"transition-all duration-300 ease-in-out\",\n className\n )}\n {...props}\n >\n <Img\n src={imageUrl}\n alt={imageAlt}\n className=\"absolute inset-0 h-full w-full object-cover transition-transform duration-500 ease-in-out group-hover:scale-110\"\n optixFlowConfig={optixFlowConfig}\n />\n\n <div className=\"absolute inset-0 bg-gradient-to-t from-black/80 via-black/20 to-transparent\"></div>\n\n {children}\n </div>\n );\n});\nTeamMemberBackgroundImageCard.displayName = \"TeamMemberBackgroundImageCard\";\n\n/**\n * TeamMediaShowcase - Display team members in a grid with background images\n *\n * A responsive grid of team member cards featuring full-bleed background images\n * with hover effects. Each card shows the member's name and role with an optional\n * action element that appears on hover.\n *\n * @example\n * ```tsx\n * <TeamMediaShowcase\n * listEyebrow=\"Our Team\"\n * items={[\n * {\n * imageSrc: \"/team/john.jpg\",\n * name: \"John Doe\",\n * role: \"CEO\",\n * action: <Button>View Profile</Button>\n * },\n * {\n * imageSrc: \"/team/jane.jpg\",\n * name: \"Jane Smith\",\n * role: \"CTO\"\n * }\n * ]}\n * />\n * ```\n */\nexport function TeamMediaShowcase({\n items,\n children,\n listEyebrow,\n background = \"white\",\n verticalMargin = \"lg\",\n gridClassName = \"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6\",\n className,\n optixFlowConfig,\n}: TeamMediaShowcaseProps): React.JSX.Element {\n return (\n <Section background={background} spacing={verticalMargin} className={className}>\n <Container>\n {children}\n\n <div className=\"space-y-12\">\n <div className=\"space-y-6\">\n {listEyebrow && typeof listEyebrow === \"string\" && listEyebrow.trim() !== \"\" && (\n <div className=\"text-md pt-8 uppercase text-dark-charcoal/70 tracking-[0.2em] font-semibold\">\n {listEyebrow}\n </div>\n )}\n <div className={gridClassName}>\n {items.map((member, idx) => {\n const imageAlt =\n member.imageAlt ||\n (member.name && typeof member.name === \"string\" && member.name.trim() !== \"\"\n ? member.name\n : `member-${idx}`);\n\n return (\n <TeamMemberBackgroundImageCard\n key={idx}\n imageUrl={member.imageSrc}\n imageAlt={imageAlt}\n className={member.cardClassName}\n optixFlowConfig={optixFlowConfig}\n >\n <div className=\"relative flex h-full flex-col justify-end p-6 text-card-foreground\">\n <div className=\"space-y-4 transition-transform duration-500 ease-in-out group-hover:-translate-y-12\">\n <div>\n {member.name &&\n typeof member.name === \"string\" &&\n member.name.trim() !== \"\" && (\n <h4 className=\"text-3xl font-bold text-white\">\n {member.name}\n </h4>\n )}\n {member.role &&\n typeof member.role === \"string\" &&\n member.role.trim() !== \"\" && (\n <p className=\"text-sm text-white/80\">{member.role}</p>\n )}\n </div>\n </div>\n\n {member.action ? (\n <div className=\"absolute -bottom-20 left-0 w-full pt-2 p-6 opacity-0 transition-all duration-500 ease-in-out group-hover:bottom-0 group-hover:opacity-100\">\n {member.action}\n </div>\n ) : null}\n </div>\n </TeamMemberBackgroundImageCard>\n );\n })}\n </div>\n </div>\n </div>\n </Container>\n </Section>\n );\n}\n\nexport { TeamMemberBackgroundImageCard };\n"]}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { SectionBackground, SectionSpacing } from './types.cjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Configuration for Optix Flow image optimization
|
|
6
|
+
*/
|
|
7
|
+
interface OptixFlowConfig {
|
|
8
|
+
/**
|
|
9
|
+
* API key for Optix Flow service
|
|
10
|
+
*/
|
|
11
|
+
apiKey: string;
|
|
12
|
+
/**
|
|
13
|
+
* Compression level (0-100)
|
|
14
|
+
*/
|
|
15
|
+
compression?: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Individual team member item for TeamMediaShowcase
|
|
19
|
+
*/
|
|
20
|
+
interface TeamMediaShowcaseItem {
|
|
21
|
+
/**
|
|
22
|
+
* Image source URL for the team member (required)
|
|
23
|
+
*/
|
|
24
|
+
imageSrc: string;
|
|
25
|
+
/**
|
|
26
|
+
* Team member's name (optional)
|
|
27
|
+
*/
|
|
28
|
+
name?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Team member's role/title (optional)
|
|
31
|
+
*/
|
|
32
|
+
role?: string;
|
|
33
|
+
/**
|
|
34
|
+
* Custom action element to display on hover (optional)
|
|
35
|
+
* Can be a button, link, or any React node
|
|
36
|
+
*/
|
|
37
|
+
action?: React.ReactNode;
|
|
38
|
+
/**
|
|
39
|
+
* Alt text for the image (defaults to name or generic text)
|
|
40
|
+
*/
|
|
41
|
+
imageAlt?: string;
|
|
42
|
+
/**
|
|
43
|
+
* Additional CSS classes for the card
|
|
44
|
+
*/
|
|
45
|
+
cardClassName?: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Props for TeamMediaShowcase component
|
|
49
|
+
*/
|
|
50
|
+
interface TeamMediaShowcaseProps {
|
|
51
|
+
/**
|
|
52
|
+
* Array of team member items to display (required)
|
|
53
|
+
* Each item must have at least an imageSrc
|
|
54
|
+
*/
|
|
55
|
+
items: TeamMediaShowcaseItem[];
|
|
56
|
+
/**
|
|
57
|
+
* Optional children to render above the grid (e.g., section header content)
|
|
58
|
+
*/
|
|
59
|
+
children?: React.ReactNode;
|
|
60
|
+
/**
|
|
61
|
+
* Eyebrow text displayed above the grid
|
|
62
|
+
*/
|
|
63
|
+
listEyebrow?: string;
|
|
64
|
+
/**
|
|
65
|
+
* Background style variant for the section
|
|
66
|
+
* @default "white"
|
|
67
|
+
*/
|
|
68
|
+
background?: SectionBackground;
|
|
69
|
+
/**
|
|
70
|
+
* Vertical spacing/margin variant
|
|
71
|
+
* @default "lg"
|
|
72
|
+
*/
|
|
73
|
+
verticalMargin?: SectionSpacing;
|
|
74
|
+
/**
|
|
75
|
+
* Custom grid CSS classes
|
|
76
|
+
* @default "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6"
|
|
77
|
+
*/
|
|
78
|
+
gridClassName?: string;
|
|
79
|
+
/**
|
|
80
|
+
* Additional CSS classes for the section wrapper
|
|
81
|
+
*/
|
|
82
|
+
className?: string;
|
|
83
|
+
/**
|
|
84
|
+
* Optional Optix Flow configuration for @page-speed/img
|
|
85
|
+
*/
|
|
86
|
+
optixFlowConfig?: OptixFlowConfig;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Props for TeamMemberBackgroundImageCard component
|
|
90
|
+
*/
|
|
91
|
+
interface TeamMemberBackgroundImageCardProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
92
|
+
/**
|
|
93
|
+
* Image URL for the background
|
|
94
|
+
*/
|
|
95
|
+
imageUrl: string;
|
|
96
|
+
/**
|
|
97
|
+
* Alt text for the image
|
|
98
|
+
*/
|
|
99
|
+
imageAlt: string;
|
|
100
|
+
/**
|
|
101
|
+
* Card content (overlaid on the image)
|
|
102
|
+
*/
|
|
103
|
+
children?: React.ReactNode;
|
|
104
|
+
/**
|
|
105
|
+
* Optional Optix Flow configuration for @page-speed/img
|
|
106
|
+
*/
|
|
107
|
+
optixFlowConfig?: OptixFlowConfig;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* TeamMemberBackgroundImageCard - Individual card with background image and hover effects
|
|
111
|
+
*
|
|
112
|
+
* Displays a team member with a full-bleed background image that zooms on hover,
|
|
113
|
+
* with a gradient overlay for text readability.
|
|
114
|
+
*/
|
|
115
|
+
declare const TeamMemberBackgroundImageCard: React.ForwardRefExoticComponent<TeamMemberBackgroundImageCardProps & React.RefAttributes<HTMLDivElement>>;
|
|
116
|
+
/**
|
|
117
|
+
* TeamMediaShowcase - Display team members in a grid with background images
|
|
118
|
+
*
|
|
119
|
+
* A responsive grid of team member cards featuring full-bleed background images
|
|
120
|
+
* with hover effects. Each card shows the member's name and role with an optional
|
|
121
|
+
* action element that appears on hover.
|
|
122
|
+
*
|
|
123
|
+
* @example
|
|
124
|
+
* ```tsx
|
|
125
|
+
* <TeamMediaShowcase
|
|
126
|
+
* listEyebrow="Our Team"
|
|
127
|
+
* items={[
|
|
128
|
+
* {
|
|
129
|
+
* imageSrc: "/team/john.jpg",
|
|
130
|
+
* name: "John Doe",
|
|
131
|
+
* role: "CEO",
|
|
132
|
+
* action: <Button>View Profile</Button>
|
|
133
|
+
* },
|
|
134
|
+
* {
|
|
135
|
+
* imageSrc: "/team/jane.jpg",
|
|
136
|
+
* name: "Jane Smith",
|
|
137
|
+
* role: "CTO"
|
|
138
|
+
* }
|
|
139
|
+
* ]}
|
|
140
|
+
* />
|
|
141
|
+
* ```
|
|
142
|
+
*/
|
|
143
|
+
declare function TeamMediaShowcase({ items, children, listEyebrow, background, verticalMargin, gridClassName, className, optixFlowConfig, }: TeamMediaShowcaseProps): React.JSX.Element;
|
|
144
|
+
|
|
145
|
+
export { type OptixFlowConfig, TeamMediaShowcase, type TeamMediaShowcaseItem, type TeamMediaShowcaseProps, TeamMemberBackgroundImageCard };
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { SectionBackground, SectionSpacing } from './types.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Configuration for Optix Flow image optimization
|
|
6
|
+
*/
|
|
7
|
+
interface OptixFlowConfig {
|
|
8
|
+
/**
|
|
9
|
+
* API key for Optix Flow service
|
|
10
|
+
*/
|
|
11
|
+
apiKey: string;
|
|
12
|
+
/**
|
|
13
|
+
* Compression level (0-100)
|
|
14
|
+
*/
|
|
15
|
+
compression?: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Individual team member item for TeamMediaShowcase
|
|
19
|
+
*/
|
|
20
|
+
interface TeamMediaShowcaseItem {
|
|
21
|
+
/**
|
|
22
|
+
* Image source URL for the team member (required)
|
|
23
|
+
*/
|
|
24
|
+
imageSrc: string;
|
|
25
|
+
/**
|
|
26
|
+
* Team member's name (optional)
|
|
27
|
+
*/
|
|
28
|
+
name?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Team member's role/title (optional)
|
|
31
|
+
*/
|
|
32
|
+
role?: string;
|
|
33
|
+
/**
|
|
34
|
+
* Custom action element to display on hover (optional)
|
|
35
|
+
* Can be a button, link, or any React node
|
|
36
|
+
*/
|
|
37
|
+
action?: React.ReactNode;
|
|
38
|
+
/**
|
|
39
|
+
* Alt text for the image (defaults to name or generic text)
|
|
40
|
+
*/
|
|
41
|
+
imageAlt?: string;
|
|
42
|
+
/**
|
|
43
|
+
* Additional CSS classes for the card
|
|
44
|
+
*/
|
|
45
|
+
cardClassName?: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Props for TeamMediaShowcase component
|
|
49
|
+
*/
|
|
50
|
+
interface TeamMediaShowcaseProps {
|
|
51
|
+
/**
|
|
52
|
+
* Array of team member items to display (required)
|
|
53
|
+
* Each item must have at least an imageSrc
|
|
54
|
+
*/
|
|
55
|
+
items: TeamMediaShowcaseItem[];
|
|
56
|
+
/**
|
|
57
|
+
* Optional children to render above the grid (e.g., section header content)
|
|
58
|
+
*/
|
|
59
|
+
children?: React.ReactNode;
|
|
60
|
+
/**
|
|
61
|
+
* Eyebrow text displayed above the grid
|
|
62
|
+
*/
|
|
63
|
+
listEyebrow?: string;
|
|
64
|
+
/**
|
|
65
|
+
* Background style variant for the section
|
|
66
|
+
* @default "white"
|
|
67
|
+
*/
|
|
68
|
+
background?: SectionBackground;
|
|
69
|
+
/**
|
|
70
|
+
* Vertical spacing/margin variant
|
|
71
|
+
* @default "lg"
|
|
72
|
+
*/
|
|
73
|
+
verticalMargin?: SectionSpacing;
|
|
74
|
+
/**
|
|
75
|
+
* Custom grid CSS classes
|
|
76
|
+
* @default "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6"
|
|
77
|
+
*/
|
|
78
|
+
gridClassName?: string;
|
|
79
|
+
/**
|
|
80
|
+
* Additional CSS classes for the section wrapper
|
|
81
|
+
*/
|
|
82
|
+
className?: string;
|
|
83
|
+
/**
|
|
84
|
+
* Optional Optix Flow configuration for @page-speed/img
|
|
85
|
+
*/
|
|
86
|
+
optixFlowConfig?: OptixFlowConfig;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Props for TeamMemberBackgroundImageCard component
|
|
90
|
+
*/
|
|
91
|
+
interface TeamMemberBackgroundImageCardProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
92
|
+
/**
|
|
93
|
+
* Image URL for the background
|
|
94
|
+
*/
|
|
95
|
+
imageUrl: string;
|
|
96
|
+
/**
|
|
97
|
+
* Alt text for the image
|
|
98
|
+
*/
|
|
99
|
+
imageAlt: string;
|
|
100
|
+
/**
|
|
101
|
+
* Card content (overlaid on the image)
|
|
102
|
+
*/
|
|
103
|
+
children?: React.ReactNode;
|
|
104
|
+
/**
|
|
105
|
+
* Optional Optix Flow configuration for @page-speed/img
|
|
106
|
+
*/
|
|
107
|
+
optixFlowConfig?: OptixFlowConfig;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* TeamMemberBackgroundImageCard - Individual card with background image and hover effects
|
|
111
|
+
*
|
|
112
|
+
* Displays a team member with a full-bleed background image that zooms on hover,
|
|
113
|
+
* with a gradient overlay for text readability.
|
|
114
|
+
*/
|
|
115
|
+
declare const TeamMemberBackgroundImageCard: React.ForwardRefExoticComponent<TeamMemberBackgroundImageCardProps & React.RefAttributes<HTMLDivElement>>;
|
|
116
|
+
/**
|
|
117
|
+
* TeamMediaShowcase - Display team members in a grid with background images
|
|
118
|
+
*
|
|
119
|
+
* A responsive grid of team member cards featuring full-bleed background images
|
|
120
|
+
* with hover effects. Each card shows the member's name and role with an optional
|
|
121
|
+
* action element that appears on hover.
|
|
122
|
+
*
|
|
123
|
+
* @example
|
|
124
|
+
* ```tsx
|
|
125
|
+
* <TeamMediaShowcase
|
|
126
|
+
* listEyebrow="Our Team"
|
|
127
|
+
* items={[
|
|
128
|
+
* {
|
|
129
|
+
* imageSrc: "/team/john.jpg",
|
|
130
|
+
* name: "John Doe",
|
|
131
|
+
* role: "CEO",
|
|
132
|
+
* action: <Button>View Profile</Button>
|
|
133
|
+
* },
|
|
134
|
+
* {
|
|
135
|
+
* imageSrc: "/team/jane.jpg",
|
|
136
|
+
* name: "Jane Smith",
|
|
137
|
+
* role: "CTO"
|
|
138
|
+
* }
|
|
139
|
+
* ]}
|
|
140
|
+
* />
|
|
141
|
+
* ```
|
|
142
|
+
*/
|
|
143
|
+
declare function TeamMediaShowcase({ items, children, listEyebrow, background, verticalMargin, gridClassName, className, optixFlowConfig, }: TeamMediaShowcaseProps): React.JSX.Element;
|
|
144
|
+
|
|
145
|
+
export { type OptixFlowConfig, TeamMediaShowcase, type TeamMediaShowcaseItem, type TeamMediaShowcaseProps, TeamMemberBackgroundImageCard };
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import React__default from 'react';
|
|
4
|
+
import { clsx } from 'clsx';
|
|
5
|
+
import { twMerge } from 'tailwind-merge';
|
|
6
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
7
|
+
import { Img } from '@page-speed/img';
|
|
8
|
+
|
|
9
|
+
// components/blocks/team/team-media-showcase.tsx
|
|
10
|
+
function cn(...inputs) {
|
|
11
|
+
return twMerge(clsx(inputs));
|
|
12
|
+
}
|
|
13
|
+
var maxWidthStyles = {
|
|
14
|
+
sm: "max-w-screen-sm",
|
|
15
|
+
md: "max-w-screen-md",
|
|
16
|
+
lg: "max-w-screen-lg",
|
|
17
|
+
xl: "max-w-screen-xl",
|
|
18
|
+
"2xl": "max-w-screen-2xl",
|
|
19
|
+
"4xl": "max-w-[1536px]",
|
|
20
|
+
full: "max-w-full"
|
|
21
|
+
};
|
|
22
|
+
var Container = React__default.forwardRef(
|
|
23
|
+
({ children, maxWidth = "xl", className, as = "div", ...props }, ref) => {
|
|
24
|
+
const Component = as;
|
|
25
|
+
return /* @__PURE__ */ jsx(
|
|
26
|
+
Component,
|
|
27
|
+
{
|
|
28
|
+
ref,
|
|
29
|
+
className: cn(
|
|
30
|
+
"mx-auto w-full px-4 sm:px-6 lg:px-8",
|
|
31
|
+
maxWidthStyles[maxWidth],
|
|
32
|
+
className
|
|
33
|
+
),
|
|
34
|
+
...props,
|
|
35
|
+
children
|
|
36
|
+
}
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
);
|
|
40
|
+
Container.displayName = "Container";
|
|
41
|
+
var backgroundStyles = {
|
|
42
|
+
white: "bg-background text-foreground",
|
|
43
|
+
gray: "bg-muted/30 text-foreground",
|
|
44
|
+
dark: "bg-foreground text-background",
|
|
45
|
+
gradient: "bg-gradient-to-br from-primary via-primary/90 to-foreground text-primary-foreground",
|
|
46
|
+
primary: "bg-primary text-primary-foreground",
|
|
47
|
+
secondary: "bg-secondary text-secondary-foreground",
|
|
48
|
+
muted: "bg-muted text-muted-foreground"
|
|
49
|
+
};
|
|
50
|
+
var spacingStyles = {
|
|
51
|
+
sm: "py-12 md:py-16",
|
|
52
|
+
md: "py-16 md:py-24",
|
|
53
|
+
lg: "py-20 md:py-32",
|
|
54
|
+
xl: "py-24 md:py-40"
|
|
55
|
+
};
|
|
56
|
+
var Section = React__default.forwardRef(
|
|
57
|
+
({
|
|
58
|
+
id,
|
|
59
|
+
title,
|
|
60
|
+
subtitle,
|
|
61
|
+
children,
|
|
62
|
+
className,
|
|
63
|
+
style,
|
|
64
|
+
background = "white",
|
|
65
|
+
spacing = "lg",
|
|
66
|
+
...props
|
|
67
|
+
}, ref) => {
|
|
68
|
+
return /* @__PURE__ */ jsx(
|
|
69
|
+
"section",
|
|
70
|
+
{
|
|
71
|
+
ref,
|
|
72
|
+
id,
|
|
73
|
+
className: cn(
|
|
74
|
+
backgroundStyles[background],
|
|
75
|
+
spacingStyles[spacing],
|
|
76
|
+
className
|
|
77
|
+
),
|
|
78
|
+
style,
|
|
79
|
+
...props,
|
|
80
|
+
children: /* @__PURE__ */ jsxs(Container, { children: [
|
|
81
|
+
(title || subtitle) && /* @__PURE__ */ jsxs("div", { className: "text-center mb-12 md:mb-16", children: [
|
|
82
|
+
subtitle && /* @__PURE__ */ jsx("p", { className: "text-sm font-semibold uppercase tracking-wider mb-2 text-primary", children: subtitle }),
|
|
83
|
+
title && /* @__PURE__ */ jsx("h2", { className: "text-3xl md:text-4xl lg:text-5xl font-bold tracking-tight", children: title })
|
|
84
|
+
] }),
|
|
85
|
+
children
|
|
86
|
+
] })
|
|
87
|
+
}
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
);
|
|
91
|
+
Section.displayName = "Section";
|
|
92
|
+
var TeamMemberBackgroundImageCard = React.forwardRef(({ className, imageUrl, imageAlt, children, optixFlowConfig, ...props }, ref) => {
|
|
93
|
+
return /* @__PURE__ */ jsxs(
|
|
94
|
+
"div",
|
|
95
|
+
{
|
|
96
|
+
ref,
|
|
97
|
+
className: cn(
|
|
98
|
+
"group h-[400px] relative w-full max-w-sm overflow-hidden rounded-xl border border-border bg-card shadow-lg",
|
|
99
|
+
"transition-all duration-300 ease-in-out",
|
|
100
|
+
className
|
|
101
|
+
),
|
|
102
|
+
...props,
|
|
103
|
+
children: [
|
|
104
|
+
/* @__PURE__ */ jsx(
|
|
105
|
+
Img,
|
|
106
|
+
{
|
|
107
|
+
src: imageUrl,
|
|
108
|
+
alt: imageAlt,
|
|
109
|
+
className: "absolute inset-0 h-full w-full object-cover transition-transform duration-500 ease-in-out group-hover:scale-110",
|
|
110
|
+
optixFlowConfig
|
|
111
|
+
}
|
|
112
|
+
),
|
|
113
|
+
/* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-black/80 via-black/20 to-transparent" }),
|
|
114
|
+
children
|
|
115
|
+
]
|
|
116
|
+
}
|
|
117
|
+
);
|
|
118
|
+
});
|
|
119
|
+
TeamMemberBackgroundImageCard.displayName = "TeamMemberBackgroundImageCard";
|
|
120
|
+
function TeamMediaShowcase({
|
|
121
|
+
items,
|
|
122
|
+
children,
|
|
123
|
+
listEyebrow,
|
|
124
|
+
background = "white",
|
|
125
|
+
verticalMargin = "lg",
|
|
126
|
+
gridClassName = "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6",
|
|
127
|
+
className,
|
|
128
|
+
optixFlowConfig
|
|
129
|
+
}) {
|
|
130
|
+
return /* @__PURE__ */ jsx(Section, { background, spacing: verticalMargin, className, children: /* @__PURE__ */ jsxs(Container, { children: [
|
|
131
|
+
children,
|
|
132
|
+
/* @__PURE__ */ jsx("div", { className: "space-y-12", children: /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
|
|
133
|
+
listEyebrow && typeof listEyebrow === "string" && listEyebrow.trim() !== "" && /* @__PURE__ */ jsx("div", { className: "text-md pt-8 uppercase text-dark-charcoal/70 tracking-[0.2em] font-semibold", children: listEyebrow }),
|
|
134
|
+
/* @__PURE__ */ jsx("div", { className: gridClassName, children: items.map((member, idx) => {
|
|
135
|
+
const imageAlt = member.imageAlt || (member.name && typeof member.name === "string" && member.name.trim() !== "" ? member.name : `member-${idx}`);
|
|
136
|
+
return /* @__PURE__ */ jsx(
|
|
137
|
+
TeamMemberBackgroundImageCard,
|
|
138
|
+
{
|
|
139
|
+
imageUrl: member.imageSrc,
|
|
140
|
+
imageAlt,
|
|
141
|
+
className: member.cardClassName,
|
|
142
|
+
optixFlowConfig,
|
|
143
|
+
children: /* @__PURE__ */ jsxs("div", { className: "relative flex h-full flex-col justify-end p-6 text-card-foreground", children: [
|
|
144
|
+
/* @__PURE__ */ jsx("div", { className: "space-y-4 transition-transform duration-500 ease-in-out group-hover:-translate-y-12", children: /* @__PURE__ */ jsxs("div", { children: [
|
|
145
|
+
member.name && typeof member.name === "string" && member.name.trim() !== "" && /* @__PURE__ */ jsx("h4", { className: "text-3xl font-bold text-white", children: member.name }),
|
|
146
|
+
member.role && typeof member.role === "string" && member.role.trim() !== "" && /* @__PURE__ */ jsx("p", { className: "text-sm text-white/80", children: member.role })
|
|
147
|
+
] }) }),
|
|
148
|
+
member.action ? /* @__PURE__ */ jsx("div", { className: "absolute -bottom-20 left-0 w-full pt-2 p-6 opacity-0 transition-all duration-500 ease-in-out group-hover:bottom-0 group-hover:opacity-100", children: member.action }) : null
|
|
149
|
+
] })
|
|
150
|
+
},
|
|
151
|
+
idx
|
|
152
|
+
);
|
|
153
|
+
}) })
|
|
154
|
+
] }) })
|
|
155
|
+
] }) });
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export { TeamMediaShowcase, TeamMemberBackgroundImageCard };
|
|
159
|
+
//# sourceMappingURL=team-media-showcase.js.map
|
|
160
|
+
//# sourceMappingURL=team-media-showcase.js.map
|