@sonordev/agency-site-kit 0.1.0
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/BeforeAfterSection-6QUJOBO2.js +176 -0
- package/dist/BeforeAfterSection-6QUJOBO2.js.map +1 -0
- package/dist/BeforeAfterSection-DVAWWE4K.cjs +181 -0
- package/dist/BeforeAfterSection-DVAWWE4K.cjs.map +1 -0
- package/dist/CTASection-4JKLXEUF.cjs +111 -0
- package/dist/CTASection-4JKLXEUF.cjs.map +1 -0
- package/dist/CTASection-BJA72XIL.js +106 -0
- package/dist/CTASection-BJA72XIL.js.map +1 -0
- package/dist/ChallengesSection-GEQGVSJN.js +180 -0
- package/dist/ChallengesSection-GEQGVSJN.js.map +1 -0
- package/dist/ChallengesSection-IZ3DHECS.cjs +182 -0
- package/dist/ChallengesSection-IZ3DHECS.cjs.map +1 -0
- package/dist/ConversionFunnelSection-AUUSJ5HQ.cjs +209 -0
- package/dist/ConversionFunnelSection-AUUSJ5HQ.cjs.map +1 -0
- package/dist/ConversionFunnelSection-D3GE4NKE.js +203 -0
- package/dist/ConversionFunnelSection-D3GE4NKE.js.map +1 -0
- package/dist/DetailsSection-FB763FS7.js +135 -0
- package/dist/DetailsSection-FB763FS7.js.map +1 -0
- package/dist/DetailsSection-OACJFGH7.cjs +137 -0
- package/dist/DetailsSection-OACJFGH7.cjs.map +1 -0
- package/dist/FeatureSpotlightSection-B7P3JGNL.js +205 -0
- package/dist/FeatureSpotlightSection-B7P3JGNL.js.map +1 -0
- package/dist/FeatureSpotlightSection-WRHXS7TU.cjs +210 -0
- package/dist/FeatureSpotlightSection-WRHXS7TU.cjs.map +1 -0
- package/dist/GallerySection-VMKORC47.js +218 -0
- package/dist/GallerySection-VMKORC47.js.map +1 -0
- package/dist/GallerySection-WJ4PQDBI.cjs +219 -0
- package/dist/GallerySection-WJ4PQDBI.cjs.map +1 -0
- package/dist/MetricsTimelineSection-4L6DUHJ5.cjs +258 -0
- package/dist/MetricsTimelineSection-4L6DUHJ5.cjs.map +1 -0
- package/dist/MetricsTimelineSection-6BT5GNFV.js +253 -0
- package/dist/MetricsTimelineSection-6BT5GNFV.js.map +1 -0
- package/dist/ResultsSection-DFUJ5U6M.js +93 -0
- package/dist/ResultsSection-DFUJ5U6M.js.map +1 -0
- package/dist/ResultsSection-XLGMMQKY.cjs +95 -0
- package/dist/ResultsSection-XLGMMQKY.cjs.map +1 -0
- package/dist/ServicesSection-D5V3Q4GR.js +118 -0
- package/dist/ServicesSection-D5V3Q4GR.js.map +1 -0
- package/dist/ServicesSection-WJMGK2MF.cjs +120 -0
- package/dist/ServicesSection-WJMGK2MF.cjs.map +1 -0
- package/dist/StrategySection-3ED3QW4R.cjs +180 -0
- package/dist/StrategySection-3ED3QW4R.cjs.map +1 -0
- package/dist/StrategySection-VUWMIYYP.js +175 -0
- package/dist/StrategySection-VUWMIYYP.js.map +1 -0
- package/dist/TeamSection-DZVSNZE6.cjs +112 -0
- package/dist/TeamSection-DZVSNZE6.cjs.map +1 -0
- package/dist/TeamSection-HGKFW6PQ.js +107 -0
- package/dist/TeamSection-HGKFW6PQ.js.map +1 -0
- package/dist/TechStackSection-OCUYG4XT.js +90 -0
- package/dist/TechStackSection-OCUYG4XT.js.map +1 -0
- package/dist/TechStackSection-VKJK4KQB.cjs +91 -0
- package/dist/TechStackSection-VKJK4KQB.cjs.map +1 -0
- package/dist/TestimonialSection-6RGSMXQB.js +122 -0
- package/dist/TestimonialSection-6RGSMXQB.js.map +1 -0
- package/dist/TestimonialSection-XPTFUQIN.cjs +124 -0
- package/dist/TestimonialSection-XPTFUQIN.cjs.map +1 -0
- package/dist/VideoSection-4A2HC6K6.js +117 -0
- package/dist/VideoSection-4A2HC6K6.js.map +1 -0
- package/dist/VideoSection-G3DFS7UH.cjs +118 -0
- package/dist/VideoSection-G3DFS7UH.cjs.map +1 -0
- package/dist/chunk-2VNNFAG6.js +415 -0
- package/dist/chunk-2VNNFAG6.js.map +1 -0
- package/dist/chunk-2Y4O3LWM.js +53 -0
- package/dist/chunk-2Y4O3LWM.js.map +1 -0
- package/dist/chunk-5FKOLIV6.cjs +221 -0
- package/dist/chunk-5FKOLIV6.cjs.map +1 -0
- package/dist/chunk-7CFFAKDM.js +74 -0
- package/dist/chunk-7CFFAKDM.js.map +1 -0
- package/dist/chunk-A4I4IK7V.js +69 -0
- package/dist/chunk-A4I4IK7V.js.map +1 -0
- package/dist/chunk-IKBK7HYX.cjs +79 -0
- package/dist/chunk-IKBK7HYX.cjs.map +1 -0
- package/dist/chunk-KEOHORIH.cjs +79 -0
- package/dist/chunk-KEOHORIH.cjs.map +1 -0
- package/dist/chunk-NAS4K5UR.cjs +139 -0
- package/dist/chunk-NAS4K5UR.cjs.map +1 -0
- package/dist/chunk-QBLWP25X.cjs +73 -0
- package/dist/chunk-QBLWP25X.cjs.map +1 -0
- package/dist/chunk-QIC6JFFD.js +210 -0
- package/dist/chunk-QIC6JFFD.js.map +1 -0
- package/dist/chunk-TAPNXT7X.cjs +422 -0
- package/dist/chunk-TAPNXT7X.cjs.map +1 -0
- package/dist/chunk-XCKXHK44.js +15 -0
- package/dist/chunk-XCKXHK44.js.map +1 -0
- package/dist/chunk-XMC4DN6G.js +131 -0
- package/dist/chunk-XMC4DN6G.js.map +1 -0
- package/dist/chunk-XONXEFJY.cjs +58 -0
- package/dist/chunk-XONXEFJY.cjs.map +1 -0
- package/dist/chunk-XQNJED46.cjs +19 -0
- package/dist/chunk-XQNJED46.cjs.map +1 -0
- package/dist/chunk-YB4B3OMC.js +74 -0
- package/dist/chunk-YB4B3OMC.js.map +1 -0
- package/dist/index.cjs +271 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +137 -0
- package/dist/index.d.ts +137 -0
- package/dist/index.js +197 -0
- package/dist/index.js.map +1 -0
- package/dist/layout/index.cjs +13 -0
- package/dist/layout/index.cjs.map +1 -0
- package/dist/layout/index.d.cts +54 -0
- package/dist/layout/index.d.ts +54 -0
- package/dist/layout/index.js +4 -0
- package/dist/layout/index.js.map +1 -0
- package/dist/portfolio/client.cjs +18 -0
- package/dist/portfolio/client.cjs.map +1 -0
- package/dist/portfolio/client.d.cts +97 -0
- package/dist/portfolio/client.d.ts +97 -0
- package/dist/portfolio/client.js +6 -0
- package/dist/portfolio/client.js.map +1 -0
- package/dist/portfolio/index.cjs +41 -0
- package/dist/portfolio/index.cjs.map +1 -0
- package/dist/portfolio/index.d.cts +12 -0
- package/dist/portfolio/index.d.ts +12 -0
- package/dist/portfolio/index.js +8 -0
- package/dist/portfolio/index.js.map +1 -0
- package/dist/portfolio/sections.cjs +20 -0
- package/dist/portfolio/sections.cjs.map +1 -0
- package/dist/portfolio/sections.d.cts +42 -0
- package/dist/portfolio/sections.d.ts +42 -0
- package/dist/portfolio/sections.js +4 -0
- package/dist/portfolio/sections.js.map +1 -0
- package/dist/portfolio/server.cjs +141 -0
- package/dist/portfolio/server.cjs.map +1 -0
- package/dist/portfolio/server.d.cts +68 -0
- package/dist/portfolio/server.d.ts +68 -0
- package/dist/portfolio/server.js +134 -0
- package/dist/portfolio/server.js.map +1 -0
- package/dist/types-BMUhBhWx.d.cts +346 -0
- package/dist/types-BMUhBhWx.d.ts +346 -0
- package/package.json +71 -0
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkKEOHORIH_cjs = require('./chunk-KEOHORIH.cjs');
|
|
4
|
+
var chunkIKBK7HYX_cjs = require('./chunk-IKBK7HYX.cjs');
|
|
5
|
+
var react = require('react');
|
|
6
|
+
var gsap = require('gsap');
|
|
7
|
+
var ScrollTrigger = require('gsap/ScrollTrigger');
|
|
8
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
9
|
+
|
|
10
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
+
|
|
12
|
+
var gsap__default = /*#__PURE__*/_interopDefault(gsap);
|
|
13
|
+
|
|
14
|
+
function StrategySection({ data }) {
|
|
15
|
+
const timelineRef = react.useRef(null);
|
|
16
|
+
const sectionRef = react.useRef(null);
|
|
17
|
+
react.useEffect(() => {
|
|
18
|
+
gsap__default.default.registerPlugin(ScrollTrigger.ScrollTrigger);
|
|
19
|
+
const prefersReducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
20
|
+
if (prefersReducedMotion) return;
|
|
21
|
+
const ctx = gsap__default.default.context(() => {
|
|
22
|
+
const line = timelineRef.current?.querySelector(".timeline-line");
|
|
23
|
+
if (line) {
|
|
24
|
+
const length = line.getTotalLength?.() || sectionRef.current?.offsetHeight || 800;
|
|
25
|
+
gsap__default.default.set(line, {
|
|
26
|
+
strokeDasharray: length,
|
|
27
|
+
strokeDashoffset: length
|
|
28
|
+
});
|
|
29
|
+
gsap__default.default.to(line, {
|
|
30
|
+
strokeDashoffset: 0,
|
|
31
|
+
ease: "none",
|
|
32
|
+
scrollTrigger: {
|
|
33
|
+
trigger: sectionRef.current,
|
|
34
|
+
start: "top 60%",
|
|
35
|
+
end: "bottom 40%",
|
|
36
|
+
scrub: 1
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
return () => ctx.revert();
|
|
42
|
+
}, [data.phases.length]);
|
|
43
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
44
|
+
"section",
|
|
45
|
+
{
|
|
46
|
+
className: "w-full py-20 md:py-28",
|
|
47
|
+
style: { background: "var(--sk-bg, #0a0a0a)" },
|
|
48
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-5xl mx-auto px-6", children: [
|
|
49
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkIKBK7HYX_cjs.ScrollReveal, { y: 30, children: [
|
|
50
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
51
|
+
"h2",
|
|
52
|
+
{
|
|
53
|
+
className: "text-3xl md:text-4xl font-bold mb-4",
|
|
54
|
+
style: {
|
|
55
|
+
color: "var(--sk-text-primary, #ffffff)",
|
|
56
|
+
fontFamily: "var(--sk-font-heading, inherit)"
|
|
57
|
+
},
|
|
58
|
+
children: "Our Strategy"
|
|
59
|
+
}
|
|
60
|
+
),
|
|
61
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
62
|
+
"p",
|
|
63
|
+
{
|
|
64
|
+
className: "text-lg mb-16 max-w-2xl",
|
|
65
|
+
style: { color: "var(--sk-text-secondary, #a1a1aa)" },
|
|
66
|
+
children: "A phased approach to delivering measurable results."
|
|
67
|
+
}
|
|
68
|
+
)
|
|
69
|
+
] }),
|
|
70
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { ref: sectionRef, className: "relative", children: [
|
|
71
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
72
|
+
"svg",
|
|
73
|
+
{
|
|
74
|
+
ref: timelineRef,
|
|
75
|
+
className: "absolute left-6 md:left-8 top-0 bottom-0 hidden md:block",
|
|
76
|
+
width: "2",
|
|
77
|
+
height: "100%",
|
|
78
|
+
style: { overflow: "visible" },
|
|
79
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
80
|
+
"line",
|
|
81
|
+
{
|
|
82
|
+
className: "timeline-line",
|
|
83
|
+
x1: "1",
|
|
84
|
+
y1: "0",
|
|
85
|
+
x2: "1",
|
|
86
|
+
y2: "100%",
|
|
87
|
+
stroke: "var(--sk-primary, #6366f1)",
|
|
88
|
+
strokeWidth: "2",
|
|
89
|
+
strokeLinecap: "round"
|
|
90
|
+
}
|
|
91
|
+
)
|
|
92
|
+
}
|
|
93
|
+
),
|
|
94
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-12", children: data.phases.map((phase, index) => /* @__PURE__ */ jsxRuntime.jsx(chunkIKBK7HYX_cjs.ScrollReveal, { y: 40, delay: index * 0.15, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-6 md:gap-8", children: [
|
|
95
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col items-center shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
96
|
+
"div",
|
|
97
|
+
{
|
|
98
|
+
className: "flex items-center justify-center w-12 h-12 md:w-16 md:h-16 rounded-full text-lg md:text-xl font-bold z-10",
|
|
99
|
+
style: {
|
|
100
|
+
background: "var(--sk-bg, #0a0a0a)",
|
|
101
|
+
border: "3px solid var(--sk-primary, #6366f1)",
|
|
102
|
+
color: "var(--sk-primary, #6366f1)",
|
|
103
|
+
boxShadow: "0 0 20px color-mix(in srgb, var(--sk-primary, #6366f1) 30%, transparent)"
|
|
104
|
+
},
|
|
105
|
+
children: phase.number
|
|
106
|
+
}
|
|
107
|
+
) }),
|
|
108
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkKEOHORIH_cjs.GlassCard, { padding: "lg", hover: false, className: "flex-1", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-3", children: [
|
|
109
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3 flex-wrap", children: [
|
|
110
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
111
|
+
"h3",
|
|
112
|
+
{
|
|
113
|
+
className: "text-xl font-semibold",
|
|
114
|
+
style: { color: "var(--sk-text-primary, #ffffff)" },
|
|
115
|
+
children: phase.title
|
|
116
|
+
}
|
|
117
|
+
),
|
|
118
|
+
phase.timeline && /* @__PURE__ */ jsxRuntime.jsx(
|
|
119
|
+
"span",
|
|
120
|
+
{
|
|
121
|
+
className: "px-3 py-0.5 rounded-full text-xs font-medium",
|
|
122
|
+
style: {
|
|
123
|
+
background: "color-mix(in srgb, var(--sk-primary, #6366f1) 12%, transparent)",
|
|
124
|
+
color: "var(--sk-primary, #6366f1)",
|
|
125
|
+
border: "1px solid color-mix(in srgb, var(--sk-primary, #6366f1) 20%, transparent)"
|
|
126
|
+
},
|
|
127
|
+
children: phase.timeline
|
|
128
|
+
}
|
|
129
|
+
)
|
|
130
|
+
] }),
|
|
131
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
132
|
+
"p",
|
|
133
|
+
{
|
|
134
|
+
className: "text-base leading-relaxed",
|
|
135
|
+
style: { color: "var(--sk-text-tertiary, #71717a)" },
|
|
136
|
+
children: phase.description
|
|
137
|
+
}
|
|
138
|
+
),
|
|
139
|
+
phase.deliverables && phase.deliverables.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-col gap-2 mt-2", children: phase.deliverables.map((deliverable, di) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start gap-2", children: [
|
|
140
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
141
|
+
"svg",
|
|
142
|
+
{
|
|
143
|
+
width: "18",
|
|
144
|
+
height: "18",
|
|
145
|
+
viewBox: "0 0 18 18",
|
|
146
|
+
fill: "none",
|
|
147
|
+
className: "shrink-0 mt-0.5",
|
|
148
|
+
style: { color: "#10b981" },
|
|
149
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
150
|
+
"path",
|
|
151
|
+
{
|
|
152
|
+
d: "M15 4.5L6.75 12.75 3 9",
|
|
153
|
+
stroke: "currentColor",
|
|
154
|
+
strokeWidth: "2",
|
|
155
|
+
strokeLinecap: "round",
|
|
156
|
+
strokeLinejoin: "round"
|
|
157
|
+
}
|
|
158
|
+
)
|
|
159
|
+
}
|
|
160
|
+
),
|
|
161
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
162
|
+
"span",
|
|
163
|
+
{
|
|
164
|
+
className: "text-sm",
|
|
165
|
+
style: { color: "var(--sk-text-secondary, #a1a1aa)" },
|
|
166
|
+
children: deliverable
|
|
167
|
+
}
|
|
168
|
+
)
|
|
169
|
+
] }, di)) })
|
|
170
|
+
] }) })
|
|
171
|
+
] }) }, index)) })
|
|
172
|
+
] })
|
|
173
|
+
] })
|
|
174
|
+
}
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
module.exports = StrategySection;
|
|
179
|
+
//# sourceMappingURL=StrategySection-3ED3QW4R.cjs.map
|
|
180
|
+
//# sourceMappingURL=StrategySection-3ED3QW4R.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/portfolio/components/sections/StrategySection.tsx"],"names":["useRef","useEffect","gsap","ScrollTrigger","jsx","jsxs","ScrollReveal","GlassCard"],"mappings":"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","file":"StrategySection-3ED3QW4R.cjs","sourcesContent":["'use client';\n\nimport React, { useRef, useEffect } from 'react';\nimport gsap from 'gsap';\nimport { ScrollTrigger } from 'gsap/ScrollTrigger';\nimport type { PortfolioStrategyData } from '../../../types';\nimport ScrollReveal from '../primitives/ScrollReveal';\nimport GlassCard from '../primitives/GlassCard';\n\ninterface StrategySectionProps {\n data: PortfolioStrategyData;\n}\n\nexport default function StrategySection({ data }: StrategySectionProps) {\n const timelineRef = useRef<SVGSVGElement>(null);\n const sectionRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n gsap.registerPlugin(ScrollTrigger);\n\n const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n if (prefersReducedMotion) return;\n\n const ctx = gsap.context(() => {\n // Animate the vertical timeline line drawing in\n const line = timelineRef.current?.querySelector('.timeline-line');\n if (line) {\n const length = (line as SVGLineElement).getTotalLength?.()\n || sectionRef.current?.offsetHeight\n || 800;\n\n gsap.set(line, {\n strokeDasharray: length,\n strokeDashoffset: length,\n });\n\n gsap.to(line, {\n strokeDashoffset: 0,\n ease: 'none',\n scrollTrigger: {\n trigger: sectionRef.current,\n start: 'top 60%',\n end: 'bottom 40%',\n scrub: 1,\n },\n });\n }\n });\n\n return () => ctx.revert();\n }, [data.phases.length]);\n\n return (\n <section\n className=\"w-full py-20 md:py-28\"\n style={{ background: 'var(--sk-bg, #0a0a0a)' }}\n >\n <div className=\"max-w-5xl mx-auto px-6\">\n <ScrollReveal y={30}>\n <h2\n className=\"text-3xl md:text-4xl font-bold mb-4\"\n style={{\n color: 'var(--sk-text-primary, #ffffff)',\n fontFamily: 'var(--sk-font-heading, inherit)',\n }}\n >\n Our Strategy\n </h2>\n <p\n className=\"text-lg mb-16 max-w-2xl\"\n style={{ color: 'var(--sk-text-secondary, #a1a1aa)' }}\n >\n A phased approach to delivering measurable results.\n </p>\n </ScrollReveal>\n\n <div ref={sectionRef} className=\"relative\">\n {/* SVG vertical timeline line */}\n <svg\n ref={timelineRef}\n className=\"absolute left-6 md:left-8 top-0 bottom-0 hidden md:block\"\n width=\"2\"\n height=\"100%\"\n style={{ overflow: 'visible' }}\n >\n <line\n className=\"timeline-line\"\n x1=\"1\"\n y1=\"0\"\n x2=\"1\"\n y2=\"100%\"\n stroke=\"var(--sk-primary, #6366f1)\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n\n <div className=\"flex flex-col gap-12\">\n {data.phases.map((phase, index) => (\n <ScrollReveal key={index} y={40} delay={index * 0.15}>\n <div className=\"flex gap-6 md:gap-8\">\n {/* Number circle on the timeline */}\n <div className=\"flex flex-col items-center shrink-0\">\n <div\n className=\"flex items-center justify-center w-12 h-12 md:w-16 md:h-16 rounded-full text-lg md:text-xl font-bold z-10\"\n style={{\n background: 'var(--sk-bg, #0a0a0a)',\n border: '3px solid var(--sk-primary, #6366f1)',\n color: 'var(--sk-primary, #6366f1)',\n boxShadow: '0 0 20px color-mix(in srgb, var(--sk-primary, #6366f1) 30%, transparent)',\n }}\n >\n {phase.number}\n </div>\n </div>\n\n {/* Phase content */}\n <GlassCard padding=\"lg\" hover={false} className=\"flex-1\">\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex items-center gap-3 flex-wrap\">\n <h3\n className=\"text-xl font-semibold\"\n style={{ color: 'var(--sk-text-primary, #ffffff)' }}\n >\n {phase.title}\n </h3>\n {phase.timeline && (\n <span\n className=\"px-3 py-0.5 rounded-full text-xs font-medium\"\n style={{\n background: 'color-mix(in srgb, var(--sk-primary, #6366f1) 12%, transparent)',\n color: 'var(--sk-primary, #6366f1)',\n border: '1px solid color-mix(in srgb, var(--sk-primary, #6366f1) 20%, transparent)',\n }}\n >\n {phase.timeline}\n </span>\n )}\n </div>\n\n <p\n className=\"text-base leading-relaxed\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n {phase.description}\n </p>\n\n {/* Deliverables */}\n {phase.deliverables && phase.deliverables.length > 0 && (\n <ul className=\"flex flex-col gap-2 mt-2\">\n {phase.deliverables.map((deliverable, di) => (\n <li key={di} className=\"flex items-start gap-2\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n className=\"shrink-0 mt-0.5\"\n style={{ color: '#10b981' }}\n >\n <path\n d=\"M15 4.5L6.75 12.75 3 9\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span\n className=\"text-sm\"\n style={{ color: 'var(--sk-text-secondary, #a1a1aa)' }}\n >\n {deliverable}\n </span>\n </li>\n ))}\n </ul>\n )}\n </div>\n </GlassCard>\n </div>\n </ScrollReveal>\n ))}\n </div>\n </div>\n </div>\n </section>\n );\n}\n"]}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { GlassCard } from './chunk-YB4B3OMC.js';
|
|
3
|
+
import { ScrollReveal } from './chunk-7CFFAKDM.js';
|
|
4
|
+
import { useRef, useEffect } from 'react';
|
|
5
|
+
import gsap from 'gsap';
|
|
6
|
+
import { ScrollTrigger } from 'gsap/ScrollTrigger';
|
|
7
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
8
|
+
|
|
9
|
+
function StrategySection({ data }) {
|
|
10
|
+
const timelineRef = useRef(null);
|
|
11
|
+
const sectionRef = useRef(null);
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
gsap.registerPlugin(ScrollTrigger);
|
|
14
|
+
const prefersReducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
15
|
+
if (prefersReducedMotion) return;
|
|
16
|
+
const ctx = gsap.context(() => {
|
|
17
|
+
const line = timelineRef.current?.querySelector(".timeline-line");
|
|
18
|
+
if (line) {
|
|
19
|
+
const length = line.getTotalLength?.() || sectionRef.current?.offsetHeight || 800;
|
|
20
|
+
gsap.set(line, {
|
|
21
|
+
strokeDasharray: length,
|
|
22
|
+
strokeDashoffset: length
|
|
23
|
+
});
|
|
24
|
+
gsap.to(line, {
|
|
25
|
+
strokeDashoffset: 0,
|
|
26
|
+
ease: "none",
|
|
27
|
+
scrollTrigger: {
|
|
28
|
+
trigger: sectionRef.current,
|
|
29
|
+
start: "top 60%",
|
|
30
|
+
end: "bottom 40%",
|
|
31
|
+
scrub: 1
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
return () => ctx.revert();
|
|
37
|
+
}, [data.phases.length]);
|
|
38
|
+
return /* @__PURE__ */ jsx(
|
|
39
|
+
"section",
|
|
40
|
+
{
|
|
41
|
+
className: "w-full py-20 md:py-28",
|
|
42
|
+
style: { background: "var(--sk-bg, #0a0a0a)" },
|
|
43
|
+
children: /* @__PURE__ */ jsxs("div", { className: "max-w-5xl mx-auto px-6", children: [
|
|
44
|
+
/* @__PURE__ */ jsxs(ScrollReveal, { y: 30, children: [
|
|
45
|
+
/* @__PURE__ */ jsx(
|
|
46
|
+
"h2",
|
|
47
|
+
{
|
|
48
|
+
className: "text-3xl md:text-4xl font-bold mb-4",
|
|
49
|
+
style: {
|
|
50
|
+
color: "var(--sk-text-primary, #ffffff)",
|
|
51
|
+
fontFamily: "var(--sk-font-heading, inherit)"
|
|
52
|
+
},
|
|
53
|
+
children: "Our Strategy"
|
|
54
|
+
}
|
|
55
|
+
),
|
|
56
|
+
/* @__PURE__ */ jsx(
|
|
57
|
+
"p",
|
|
58
|
+
{
|
|
59
|
+
className: "text-lg mb-16 max-w-2xl",
|
|
60
|
+
style: { color: "var(--sk-text-secondary, #a1a1aa)" },
|
|
61
|
+
children: "A phased approach to delivering measurable results."
|
|
62
|
+
}
|
|
63
|
+
)
|
|
64
|
+
] }),
|
|
65
|
+
/* @__PURE__ */ jsxs("div", { ref: sectionRef, className: "relative", children: [
|
|
66
|
+
/* @__PURE__ */ jsx(
|
|
67
|
+
"svg",
|
|
68
|
+
{
|
|
69
|
+
ref: timelineRef,
|
|
70
|
+
className: "absolute left-6 md:left-8 top-0 bottom-0 hidden md:block",
|
|
71
|
+
width: "2",
|
|
72
|
+
height: "100%",
|
|
73
|
+
style: { overflow: "visible" },
|
|
74
|
+
children: /* @__PURE__ */ jsx(
|
|
75
|
+
"line",
|
|
76
|
+
{
|
|
77
|
+
className: "timeline-line",
|
|
78
|
+
x1: "1",
|
|
79
|
+
y1: "0",
|
|
80
|
+
x2: "1",
|
|
81
|
+
y2: "100%",
|
|
82
|
+
stroke: "var(--sk-primary, #6366f1)",
|
|
83
|
+
strokeWidth: "2",
|
|
84
|
+
strokeLinecap: "round"
|
|
85
|
+
}
|
|
86
|
+
)
|
|
87
|
+
}
|
|
88
|
+
),
|
|
89
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-col gap-12", children: data.phases.map((phase, index) => /* @__PURE__ */ jsx(ScrollReveal, { y: 40, delay: index * 0.15, children: /* @__PURE__ */ jsxs("div", { className: "flex gap-6 md:gap-8", children: [
|
|
90
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-col items-center shrink-0", children: /* @__PURE__ */ jsx(
|
|
91
|
+
"div",
|
|
92
|
+
{
|
|
93
|
+
className: "flex items-center justify-center w-12 h-12 md:w-16 md:h-16 rounded-full text-lg md:text-xl font-bold z-10",
|
|
94
|
+
style: {
|
|
95
|
+
background: "var(--sk-bg, #0a0a0a)",
|
|
96
|
+
border: "3px solid var(--sk-primary, #6366f1)",
|
|
97
|
+
color: "var(--sk-primary, #6366f1)",
|
|
98
|
+
boxShadow: "0 0 20px color-mix(in srgb, var(--sk-primary, #6366f1) 30%, transparent)"
|
|
99
|
+
},
|
|
100
|
+
children: phase.number
|
|
101
|
+
}
|
|
102
|
+
) }),
|
|
103
|
+
/* @__PURE__ */ jsx(GlassCard, { padding: "lg", hover: false, className: "flex-1", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3", children: [
|
|
104
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 flex-wrap", children: [
|
|
105
|
+
/* @__PURE__ */ jsx(
|
|
106
|
+
"h3",
|
|
107
|
+
{
|
|
108
|
+
className: "text-xl font-semibold",
|
|
109
|
+
style: { color: "var(--sk-text-primary, #ffffff)" },
|
|
110
|
+
children: phase.title
|
|
111
|
+
}
|
|
112
|
+
),
|
|
113
|
+
phase.timeline && /* @__PURE__ */ jsx(
|
|
114
|
+
"span",
|
|
115
|
+
{
|
|
116
|
+
className: "px-3 py-0.5 rounded-full text-xs font-medium",
|
|
117
|
+
style: {
|
|
118
|
+
background: "color-mix(in srgb, var(--sk-primary, #6366f1) 12%, transparent)",
|
|
119
|
+
color: "var(--sk-primary, #6366f1)",
|
|
120
|
+
border: "1px solid color-mix(in srgb, var(--sk-primary, #6366f1) 20%, transparent)"
|
|
121
|
+
},
|
|
122
|
+
children: phase.timeline
|
|
123
|
+
}
|
|
124
|
+
)
|
|
125
|
+
] }),
|
|
126
|
+
/* @__PURE__ */ jsx(
|
|
127
|
+
"p",
|
|
128
|
+
{
|
|
129
|
+
className: "text-base leading-relaxed",
|
|
130
|
+
style: { color: "var(--sk-text-tertiary, #71717a)" },
|
|
131
|
+
children: phase.description
|
|
132
|
+
}
|
|
133
|
+
),
|
|
134
|
+
phase.deliverables && phase.deliverables.length > 0 && /* @__PURE__ */ jsx("ul", { className: "flex flex-col gap-2 mt-2", children: phase.deliverables.map((deliverable, di) => /* @__PURE__ */ jsxs("li", { className: "flex items-start gap-2", children: [
|
|
135
|
+
/* @__PURE__ */ jsx(
|
|
136
|
+
"svg",
|
|
137
|
+
{
|
|
138
|
+
width: "18",
|
|
139
|
+
height: "18",
|
|
140
|
+
viewBox: "0 0 18 18",
|
|
141
|
+
fill: "none",
|
|
142
|
+
className: "shrink-0 mt-0.5",
|
|
143
|
+
style: { color: "#10b981" },
|
|
144
|
+
children: /* @__PURE__ */ jsx(
|
|
145
|
+
"path",
|
|
146
|
+
{
|
|
147
|
+
d: "M15 4.5L6.75 12.75 3 9",
|
|
148
|
+
stroke: "currentColor",
|
|
149
|
+
strokeWidth: "2",
|
|
150
|
+
strokeLinecap: "round",
|
|
151
|
+
strokeLinejoin: "round"
|
|
152
|
+
}
|
|
153
|
+
)
|
|
154
|
+
}
|
|
155
|
+
),
|
|
156
|
+
/* @__PURE__ */ jsx(
|
|
157
|
+
"span",
|
|
158
|
+
{
|
|
159
|
+
className: "text-sm",
|
|
160
|
+
style: { color: "var(--sk-text-secondary, #a1a1aa)" },
|
|
161
|
+
children: deliverable
|
|
162
|
+
}
|
|
163
|
+
)
|
|
164
|
+
] }, di)) })
|
|
165
|
+
] }) })
|
|
166
|
+
] }) }, index)) })
|
|
167
|
+
] })
|
|
168
|
+
] })
|
|
169
|
+
}
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
export { StrategySection as default };
|
|
174
|
+
//# sourceMappingURL=StrategySection-VUWMIYYP.js.map
|
|
175
|
+
//# sourceMappingURL=StrategySection-VUWMIYYP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/portfolio/components/sections/StrategySection.tsx"],"names":[],"mappings":"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","file":"StrategySection-VUWMIYYP.js","sourcesContent":["'use client';\n\nimport React, { useRef, useEffect } from 'react';\nimport gsap from 'gsap';\nimport { ScrollTrigger } from 'gsap/ScrollTrigger';\nimport type { PortfolioStrategyData } from '../../../types';\nimport ScrollReveal from '../primitives/ScrollReveal';\nimport GlassCard from '../primitives/GlassCard';\n\ninterface StrategySectionProps {\n data: PortfolioStrategyData;\n}\n\nexport default function StrategySection({ data }: StrategySectionProps) {\n const timelineRef = useRef<SVGSVGElement>(null);\n const sectionRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n gsap.registerPlugin(ScrollTrigger);\n\n const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n if (prefersReducedMotion) return;\n\n const ctx = gsap.context(() => {\n // Animate the vertical timeline line drawing in\n const line = timelineRef.current?.querySelector('.timeline-line');\n if (line) {\n const length = (line as SVGLineElement).getTotalLength?.()\n || sectionRef.current?.offsetHeight\n || 800;\n\n gsap.set(line, {\n strokeDasharray: length,\n strokeDashoffset: length,\n });\n\n gsap.to(line, {\n strokeDashoffset: 0,\n ease: 'none',\n scrollTrigger: {\n trigger: sectionRef.current,\n start: 'top 60%',\n end: 'bottom 40%',\n scrub: 1,\n },\n });\n }\n });\n\n return () => ctx.revert();\n }, [data.phases.length]);\n\n return (\n <section\n className=\"w-full py-20 md:py-28\"\n style={{ background: 'var(--sk-bg, #0a0a0a)' }}\n >\n <div className=\"max-w-5xl mx-auto px-6\">\n <ScrollReveal y={30}>\n <h2\n className=\"text-3xl md:text-4xl font-bold mb-4\"\n style={{\n color: 'var(--sk-text-primary, #ffffff)',\n fontFamily: 'var(--sk-font-heading, inherit)',\n }}\n >\n Our Strategy\n </h2>\n <p\n className=\"text-lg mb-16 max-w-2xl\"\n style={{ color: 'var(--sk-text-secondary, #a1a1aa)' }}\n >\n A phased approach to delivering measurable results.\n </p>\n </ScrollReveal>\n\n <div ref={sectionRef} className=\"relative\">\n {/* SVG vertical timeline line */}\n <svg\n ref={timelineRef}\n className=\"absolute left-6 md:left-8 top-0 bottom-0 hidden md:block\"\n width=\"2\"\n height=\"100%\"\n style={{ overflow: 'visible' }}\n >\n <line\n className=\"timeline-line\"\n x1=\"1\"\n y1=\"0\"\n x2=\"1\"\n y2=\"100%\"\n stroke=\"var(--sk-primary, #6366f1)\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n\n <div className=\"flex flex-col gap-12\">\n {data.phases.map((phase, index) => (\n <ScrollReveal key={index} y={40} delay={index * 0.15}>\n <div className=\"flex gap-6 md:gap-8\">\n {/* Number circle on the timeline */}\n <div className=\"flex flex-col items-center shrink-0\">\n <div\n className=\"flex items-center justify-center w-12 h-12 md:w-16 md:h-16 rounded-full text-lg md:text-xl font-bold z-10\"\n style={{\n background: 'var(--sk-bg, #0a0a0a)',\n border: '3px solid var(--sk-primary, #6366f1)',\n color: 'var(--sk-primary, #6366f1)',\n boxShadow: '0 0 20px color-mix(in srgb, var(--sk-primary, #6366f1) 30%, transparent)',\n }}\n >\n {phase.number}\n </div>\n </div>\n\n {/* Phase content */}\n <GlassCard padding=\"lg\" hover={false} className=\"flex-1\">\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex items-center gap-3 flex-wrap\">\n <h3\n className=\"text-xl font-semibold\"\n style={{ color: 'var(--sk-text-primary, #ffffff)' }}\n >\n {phase.title}\n </h3>\n {phase.timeline && (\n <span\n className=\"px-3 py-0.5 rounded-full text-xs font-medium\"\n style={{\n background: 'color-mix(in srgb, var(--sk-primary, #6366f1) 12%, transparent)',\n color: 'var(--sk-primary, #6366f1)',\n border: '1px solid color-mix(in srgb, var(--sk-primary, #6366f1) 20%, transparent)',\n }}\n >\n {phase.timeline}\n </span>\n )}\n </div>\n\n <p\n className=\"text-base leading-relaxed\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n {phase.description}\n </p>\n\n {/* Deliverables */}\n {phase.deliverables && phase.deliverables.length > 0 && (\n <ul className=\"flex flex-col gap-2 mt-2\">\n {phase.deliverables.map((deliverable, di) => (\n <li key={di} className=\"flex items-start gap-2\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n className=\"shrink-0 mt-0.5\"\n style={{ color: '#10b981' }}\n >\n <path\n d=\"M15 4.5L6.75 12.75 3 9\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span\n className=\"text-sm\"\n style={{ color: 'var(--sk-text-secondary, #a1a1aa)' }}\n >\n {deliverable}\n </span>\n </li>\n ))}\n </ul>\n )}\n </div>\n </GlassCard>\n </div>\n </ScrollReveal>\n ))}\n </div>\n </div>\n </div>\n </section>\n );\n}\n"]}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkKEOHORIH_cjs = require('./chunk-KEOHORIH.cjs');
|
|
4
|
+
var chunkIKBK7HYX_cjs = require('./chunk-IKBK7HYX.cjs');
|
|
5
|
+
var react = require('react');
|
|
6
|
+
var gsap = require('gsap');
|
|
7
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
8
|
+
|
|
9
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
+
|
|
11
|
+
var gsap__default = /*#__PURE__*/_interopDefault(gsap);
|
|
12
|
+
|
|
13
|
+
function TeamCard({ member }) {
|
|
14
|
+
const cardRef = react.useRef(null);
|
|
15
|
+
const handleMouseEnter = react.useCallback(() => {
|
|
16
|
+
if (!cardRef.current) return;
|
|
17
|
+
const avatar = cardRef.current.querySelector(".team-avatar");
|
|
18
|
+
if (avatar) {
|
|
19
|
+
gsap__default.default.to(avatar, { scale: 1.08, duration: 0.3, ease: "power2.out" });
|
|
20
|
+
}
|
|
21
|
+
}, []);
|
|
22
|
+
const handleMouseLeave = react.useCallback(() => {
|
|
23
|
+
if (!cardRef.current) return;
|
|
24
|
+
const avatar = cardRef.current.querySelector(".team-avatar");
|
|
25
|
+
if (avatar) {
|
|
26
|
+
gsap__default.default.to(avatar, { scale: 1, duration: 0.3, ease: "power2.out" });
|
|
27
|
+
}
|
|
28
|
+
}, []);
|
|
29
|
+
const avatarUrl = member.avatar?.asset?._ref;
|
|
30
|
+
const initials = member.name.split(" ").map((w) => w[0]).join("").slice(0, 2).toUpperCase();
|
|
31
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { ref: cardRef, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, children: /* @__PURE__ */ jsxRuntime.jsx(chunkKEOHORIH_cjs.GlassCard, { padding: "md", hover: true, className: "text-center", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-4", children: [
|
|
32
|
+
avatarUrl ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
33
|
+
"img",
|
|
34
|
+
{
|
|
35
|
+
src: avatarUrl,
|
|
36
|
+
alt: member.name,
|
|
37
|
+
className: "team-avatar w-20 h-20 rounded-full object-cover",
|
|
38
|
+
style: {
|
|
39
|
+
border: "3px solid var(--sk-border, rgba(255,255,255,0.1))",
|
|
40
|
+
willChange: "transform"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
44
|
+
"div",
|
|
45
|
+
{
|
|
46
|
+
className: "team-avatar flex items-center justify-center w-20 h-20 rounded-full text-xl font-bold",
|
|
47
|
+
style: {
|
|
48
|
+
background: "color-mix(in srgb, var(--sk-primary, #6366f1) 20%, transparent)",
|
|
49
|
+
color: "var(--sk-primary, #6366f1)",
|
|
50
|
+
border: "3px solid color-mix(in srgb, var(--sk-primary, #6366f1) 25%, transparent)",
|
|
51
|
+
willChange: "transform"
|
|
52
|
+
},
|
|
53
|
+
children: initials
|
|
54
|
+
}
|
|
55
|
+
),
|
|
56
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
57
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
58
|
+
"h3",
|
|
59
|
+
{
|
|
60
|
+
className: "text-base font-semibold",
|
|
61
|
+
style: { color: "var(--sk-text-primary, #ffffff)" },
|
|
62
|
+
children: member.name
|
|
63
|
+
}
|
|
64
|
+
),
|
|
65
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
66
|
+
"p",
|
|
67
|
+
{
|
|
68
|
+
className: "text-sm mt-1",
|
|
69
|
+
style: { color: "var(--sk-text-tertiary, #71717a)" },
|
|
70
|
+
children: member.role
|
|
71
|
+
}
|
|
72
|
+
)
|
|
73
|
+
] })
|
|
74
|
+
] }) }) });
|
|
75
|
+
}
|
|
76
|
+
function TeamSection({ data }) {
|
|
77
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
78
|
+
"section",
|
|
79
|
+
{
|
|
80
|
+
className: "w-full py-20 md:py-28",
|
|
81
|
+
style: { background: "var(--sk-bg, #0a0a0a)" },
|
|
82
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-7xl mx-auto px-6", children: [
|
|
83
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkIKBK7HYX_cjs.ScrollReveal, { y: 30, children: [
|
|
84
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
85
|
+
"h2",
|
|
86
|
+
{
|
|
87
|
+
className: "text-3xl md:text-4xl font-bold mb-4",
|
|
88
|
+
style: {
|
|
89
|
+
color: "var(--sk-text-primary, #ffffff)",
|
|
90
|
+
fontFamily: "var(--sk-font-heading, inherit)"
|
|
91
|
+
},
|
|
92
|
+
children: "The Team"
|
|
93
|
+
}
|
|
94
|
+
),
|
|
95
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
96
|
+
"p",
|
|
97
|
+
{
|
|
98
|
+
className: "text-lg mb-12 max-w-2xl",
|
|
99
|
+
style: { color: "var(--sk-text-secondary, #a1a1aa)" },
|
|
100
|
+
children: "The people who brought this project to life."
|
|
101
|
+
}
|
|
102
|
+
)
|
|
103
|
+
] }),
|
|
104
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkIKBK7HYX_cjs.ScrollReveal, { stagger: 0.1, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6", children: data.members.map((member, index) => /* @__PURE__ */ jsxRuntime.jsx(TeamCard, { member }, index)) }) })
|
|
105
|
+
] })
|
|
106
|
+
}
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
module.exports = TeamSection;
|
|
111
|
+
//# sourceMappingURL=TeamSection-DZVSNZE6.cjs.map
|
|
112
|
+
//# sourceMappingURL=TeamSection-DZVSNZE6.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/portfolio/components/sections/TeamSection.tsx"],"names":["useRef","useCallback","gsap","jsx","GlassCard","jsxs","ScrollReveal"],"mappings":"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","file":"TeamSection-DZVSNZE6.cjs","sourcesContent":["'use client';\n\nimport React, { useRef, useCallback } from 'react';\nimport gsap from 'gsap';\nimport type { PortfolioTeamData, PortfolioTeamMember } from '../../../types';\nimport ScrollReveal from '../primitives/ScrollReveal';\nimport GlassCard from '../primitives/GlassCard';\n\ninterface TeamSectionProps {\n data: PortfolioTeamData;\n}\n\nfunction TeamCard({ member }: { member: PortfolioTeamMember }) {\n const cardRef = useRef<HTMLDivElement>(null);\n\n const handleMouseEnter = useCallback(() => {\n if (!cardRef.current) return;\n const avatar = cardRef.current.querySelector('.team-avatar');\n if (avatar) {\n gsap.to(avatar, { scale: 1.08, duration: 0.3, ease: 'power2.out' });\n }\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n if (!cardRef.current) return;\n const avatar = cardRef.current.querySelector('.team-avatar');\n if (avatar) {\n gsap.to(avatar, { scale: 1, duration: 0.3, ease: 'power2.out' });\n }\n }, []);\n\n const avatarUrl = member.avatar?.asset?._ref;\n const initials = member.name\n .split(' ')\n .map((w: string) => w[0])\n .join('')\n .slice(0, 2)\n .toUpperCase();\n\n return (\n <div ref={cardRef} onMouseEnter={handleMouseEnter} onMouseLeave={handleMouseLeave}>\n <GlassCard padding=\"md\" hover className=\"text-center\">\n <div className=\"flex flex-col items-center gap-4\">\n {avatarUrl ? (\n <img\n src={avatarUrl}\n alt={member.name}\n className=\"team-avatar w-20 h-20 rounded-full object-cover\"\n style={{\n border: '3px solid var(--sk-border, rgba(255,255,255,0.1))',\n willChange: 'transform',\n }}\n />\n ) : (\n <div\n className=\"team-avatar flex items-center justify-center w-20 h-20 rounded-full text-xl font-bold\"\n style={{\n background: 'color-mix(in srgb, var(--sk-primary, #6366f1) 20%, transparent)',\n color: 'var(--sk-primary, #6366f1)',\n border: '3px solid color-mix(in srgb, var(--sk-primary, #6366f1) 25%, transparent)',\n willChange: 'transform',\n }}\n >\n {initials}\n </div>\n )}\n\n <div>\n <h3\n className=\"text-base font-semibold\"\n style={{ color: 'var(--sk-text-primary, #ffffff)' }}\n >\n {member.name}\n </h3>\n <p\n className=\"text-sm mt-1\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n {member.role}\n </p>\n </div>\n </div>\n </GlassCard>\n </div>\n );\n}\n\nexport default function TeamSection({ data }: TeamSectionProps) {\n return (\n <section\n className=\"w-full py-20 md:py-28\"\n style={{ background: 'var(--sk-bg, #0a0a0a)' }}\n >\n <div className=\"max-w-7xl mx-auto px-6\">\n <ScrollReveal y={30}>\n <h2\n className=\"text-3xl md:text-4xl font-bold mb-4\"\n style={{\n color: 'var(--sk-text-primary, #ffffff)',\n fontFamily: 'var(--sk-font-heading, inherit)',\n }}\n >\n The Team\n </h2>\n <p\n className=\"text-lg mb-12 max-w-2xl\"\n style={{ color: 'var(--sk-text-secondary, #a1a1aa)' }}\n >\n The people who brought this project to life.\n </p>\n </ScrollReveal>\n\n <ScrollReveal stagger={0.1}>\n <div className=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6\">\n {data.members.map((member, index) => (\n <TeamCard key={index} member={member} />\n ))}\n </div>\n </ScrollReveal>\n </div>\n </section>\n );\n}\n"]}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { GlassCard } from './chunk-YB4B3OMC.js';
|
|
3
|
+
import { ScrollReveal } from './chunk-7CFFAKDM.js';
|
|
4
|
+
import { useRef, useCallback } from 'react';
|
|
5
|
+
import gsap from 'gsap';
|
|
6
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
function TeamCard({ member }) {
|
|
9
|
+
const cardRef = useRef(null);
|
|
10
|
+
const handleMouseEnter = useCallback(() => {
|
|
11
|
+
if (!cardRef.current) return;
|
|
12
|
+
const avatar = cardRef.current.querySelector(".team-avatar");
|
|
13
|
+
if (avatar) {
|
|
14
|
+
gsap.to(avatar, { scale: 1.08, duration: 0.3, ease: "power2.out" });
|
|
15
|
+
}
|
|
16
|
+
}, []);
|
|
17
|
+
const handleMouseLeave = useCallback(() => {
|
|
18
|
+
if (!cardRef.current) return;
|
|
19
|
+
const avatar = cardRef.current.querySelector(".team-avatar");
|
|
20
|
+
if (avatar) {
|
|
21
|
+
gsap.to(avatar, { scale: 1, duration: 0.3, ease: "power2.out" });
|
|
22
|
+
}
|
|
23
|
+
}, []);
|
|
24
|
+
const avatarUrl = member.avatar?.asset?._ref;
|
|
25
|
+
const initials = member.name.split(" ").map((w) => w[0]).join("").slice(0, 2).toUpperCase();
|
|
26
|
+
return /* @__PURE__ */ jsx("div", { ref: cardRef, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, children: /* @__PURE__ */ jsx(GlassCard, { padding: "md", hover: true, className: "text-center", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-4", children: [
|
|
27
|
+
avatarUrl ? /* @__PURE__ */ jsx(
|
|
28
|
+
"img",
|
|
29
|
+
{
|
|
30
|
+
src: avatarUrl,
|
|
31
|
+
alt: member.name,
|
|
32
|
+
className: "team-avatar w-20 h-20 rounded-full object-cover",
|
|
33
|
+
style: {
|
|
34
|
+
border: "3px solid var(--sk-border, rgba(255,255,255,0.1))",
|
|
35
|
+
willChange: "transform"
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
) : /* @__PURE__ */ jsx(
|
|
39
|
+
"div",
|
|
40
|
+
{
|
|
41
|
+
className: "team-avatar flex items-center justify-center w-20 h-20 rounded-full text-xl font-bold",
|
|
42
|
+
style: {
|
|
43
|
+
background: "color-mix(in srgb, var(--sk-primary, #6366f1) 20%, transparent)",
|
|
44
|
+
color: "var(--sk-primary, #6366f1)",
|
|
45
|
+
border: "3px solid color-mix(in srgb, var(--sk-primary, #6366f1) 25%, transparent)",
|
|
46
|
+
willChange: "transform"
|
|
47
|
+
},
|
|
48
|
+
children: initials
|
|
49
|
+
}
|
|
50
|
+
),
|
|
51
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
52
|
+
/* @__PURE__ */ jsx(
|
|
53
|
+
"h3",
|
|
54
|
+
{
|
|
55
|
+
className: "text-base font-semibold",
|
|
56
|
+
style: { color: "var(--sk-text-primary, #ffffff)" },
|
|
57
|
+
children: member.name
|
|
58
|
+
}
|
|
59
|
+
),
|
|
60
|
+
/* @__PURE__ */ jsx(
|
|
61
|
+
"p",
|
|
62
|
+
{
|
|
63
|
+
className: "text-sm mt-1",
|
|
64
|
+
style: { color: "var(--sk-text-tertiary, #71717a)" },
|
|
65
|
+
children: member.role
|
|
66
|
+
}
|
|
67
|
+
)
|
|
68
|
+
] })
|
|
69
|
+
] }) }) });
|
|
70
|
+
}
|
|
71
|
+
function TeamSection({ data }) {
|
|
72
|
+
return /* @__PURE__ */ jsx(
|
|
73
|
+
"section",
|
|
74
|
+
{
|
|
75
|
+
className: "w-full py-20 md:py-28",
|
|
76
|
+
style: { background: "var(--sk-bg, #0a0a0a)" },
|
|
77
|
+
children: /* @__PURE__ */ jsxs("div", { className: "max-w-7xl mx-auto px-6", children: [
|
|
78
|
+
/* @__PURE__ */ jsxs(ScrollReveal, { y: 30, children: [
|
|
79
|
+
/* @__PURE__ */ jsx(
|
|
80
|
+
"h2",
|
|
81
|
+
{
|
|
82
|
+
className: "text-3xl md:text-4xl font-bold mb-4",
|
|
83
|
+
style: {
|
|
84
|
+
color: "var(--sk-text-primary, #ffffff)",
|
|
85
|
+
fontFamily: "var(--sk-font-heading, inherit)"
|
|
86
|
+
},
|
|
87
|
+
children: "The Team"
|
|
88
|
+
}
|
|
89
|
+
),
|
|
90
|
+
/* @__PURE__ */ jsx(
|
|
91
|
+
"p",
|
|
92
|
+
{
|
|
93
|
+
className: "text-lg mb-12 max-w-2xl",
|
|
94
|
+
style: { color: "var(--sk-text-secondary, #a1a1aa)" },
|
|
95
|
+
children: "The people who brought this project to life."
|
|
96
|
+
}
|
|
97
|
+
)
|
|
98
|
+
] }),
|
|
99
|
+
/* @__PURE__ */ jsx(ScrollReveal, { stagger: 0.1, children: /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6", children: data.members.map((member, index) => /* @__PURE__ */ jsx(TeamCard, { member }, index)) }) })
|
|
100
|
+
] })
|
|
101
|
+
}
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export { TeamSection as default };
|
|
106
|
+
//# sourceMappingURL=TeamSection-HGKFW6PQ.js.map
|
|
107
|
+
//# sourceMappingURL=TeamSection-HGKFW6PQ.js.map
|