@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.
Files changed (131) hide show
  1. package/dist/BeforeAfterSection-6QUJOBO2.js +176 -0
  2. package/dist/BeforeAfterSection-6QUJOBO2.js.map +1 -0
  3. package/dist/BeforeAfterSection-DVAWWE4K.cjs +181 -0
  4. package/dist/BeforeAfterSection-DVAWWE4K.cjs.map +1 -0
  5. package/dist/CTASection-4JKLXEUF.cjs +111 -0
  6. package/dist/CTASection-4JKLXEUF.cjs.map +1 -0
  7. package/dist/CTASection-BJA72XIL.js +106 -0
  8. package/dist/CTASection-BJA72XIL.js.map +1 -0
  9. package/dist/ChallengesSection-GEQGVSJN.js +180 -0
  10. package/dist/ChallengesSection-GEQGVSJN.js.map +1 -0
  11. package/dist/ChallengesSection-IZ3DHECS.cjs +182 -0
  12. package/dist/ChallengesSection-IZ3DHECS.cjs.map +1 -0
  13. package/dist/ConversionFunnelSection-AUUSJ5HQ.cjs +209 -0
  14. package/dist/ConversionFunnelSection-AUUSJ5HQ.cjs.map +1 -0
  15. package/dist/ConversionFunnelSection-D3GE4NKE.js +203 -0
  16. package/dist/ConversionFunnelSection-D3GE4NKE.js.map +1 -0
  17. package/dist/DetailsSection-FB763FS7.js +135 -0
  18. package/dist/DetailsSection-FB763FS7.js.map +1 -0
  19. package/dist/DetailsSection-OACJFGH7.cjs +137 -0
  20. package/dist/DetailsSection-OACJFGH7.cjs.map +1 -0
  21. package/dist/FeatureSpotlightSection-B7P3JGNL.js +205 -0
  22. package/dist/FeatureSpotlightSection-B7P3JGNL.js.map +1 -0
  23. package/dist/FeatureSpotlightSection-WRHXS7TU.cjs +210 -0
  24. package/dist/FeatureSpotlightSection-WRHXS7TU.cjs.map +1 -0
  25. package/dist/GallerySection-VMKORC47.js +218 -0
  26. package/dist/GallerySection-VMKORC47.js.map +1 -0
  27. package/dist/GallerySection-WJ4PQDBI.cjs +219 -0
  28. package/dist/GallerySection-WJ4PQDBI.cjs.map +1 -0
  29. package/dist/MetricsTimelineSection-4L6DUHJ5.cjs +258 -0
  30. package/dist/MetricsTimelineSection-4L6DUHJ5.cjs.map +1 -0
  31. package/dist/MetricsTimelineSection-6BT5GNFV.js +253 -0
  32. package/dist/MetricsTimelineSection-6BT5GNFV.js.map +1 -0
  33. package/dist/ResultsSection-DFUJ5U6M.js +93 -0
  34. package/dist/ResultsSection-DFUJ5U6M.js.map +1 -0
  35. package/dist/ResultsSection-XLGMMQKY.cjs +95 -0
  36. package/dist/ResultsSection-XLGMMQKY.cjs.map +1 -0
  37. package/dist/ServicesSection-D5V3Q4GR.js +118 -0
  38. package/dist/ServicesSection-D5V3Q4GR.js.map +1 -0
  39. package/dist/ServicesSection-WJMGK2MF.cjs +120 -0
  40. package/dist/ServicesSection-WJMGK2MF.cjs.map +1 -0
  41. package/dist/StrategySection-3ED3QW4R.cjs +180 -0
  42. package/dist/StrategySection-3ED3QW4R.cjs.map +1 -0
  43. package/dist/StrategySection-VUWMIYYP.js +175 -0
  44. package/dist/StrategySection-VUWMIYYP.js.map +1 -0
  45. package/dist/TeamSection-DZVSNZE6.cjs +112 -0
  46. package/dist/TeamSection-DZVSNZE6.cjs.map +1 -0
  47. package/dist/TeamSection-HGKFW6PQ.js +107 -0
  48. package/dist/TeamSection-HGKFW6PQ.js.map +1 -0
  49. package/dist/TechStackSection-OCUYG4XT.js +90 -0
  50. package/dist/TechStackSection-OCUYG4XT.js.map +1 -0
  51. package/dist/TechStackSection-VKJK4KQB.cjs +91 -0
  52. package/dist/TechStackSection-VKJK4KQB.cjs.map +1 -0
  53. package/dist/TestimonialSection-6RGSMXQB.js +122 -0
  54. package/dist/TestimonialSection-6RGSMXQB.js.map +1 -0
  55. package/dist/TestimonialSection-XPTFUQIN.cjs +124 -0
  56. package/dist/TestimonialSection-XPTFUQIN.cjs.map +1 -0
  57. package/dist/VideoSection-4A2HC6K6.js +117 -0
  58. package/dist/VideoSection-4A2HC6K6.js.map +1 -0
  59. package/dist/VideoSection-G3DFS7UH.cjs +118 -0
  60. package/dist/VideoSection-G3DFS7UH.cjs.map +1 -0
  61. package/dist/chunk-2VNNFAG6.js +415 -0
  62. package/dist/chunk-2VNNFAG6.js.map +1 -0
  63. package/dist/chunk-2Y4O3LWM.js +53 -0
  64. package/dist/chunk-2Y4O3LWM.js.map +1 -0
  65. package/dist/chunk-5FKOLIV6.cjs +221 -0
  66. package/dist/chunk-5FKOLIV6.cjs.map +1 -0
  67. package/dist/chunk-7CFFAKDM.js +74 -0
  68. package/dist/chunk-7CFFAKDM.js.map +1 -0
  69. package/dist/chunk-A4I4IK7V.js +69 -0
  70. package/dist/chunk-A4I4IK7V.js.map +1 -0
  71. package/dist/chunk-IKBK7HYX.cjs +79 -0
  72. package/dist/chunk-IKBK7HYX.cjs.map +1 -0
  73. package/dist/chunk-KEOHORIH.cjs +79 -0
  74. package/dist/chunk-KEOHORIH.cjs.map +1 -0
  75. package/dist/chunk-NAS4K5UR.cjs +139 -0
  76. package/dist/chunk-NAS4K5UR.cjs.map +1 -0
  77. package/dist/chunk-QBLWP25X.cjs +73 -0
  78. package/dist/chunk-QBLWP25X.cjs.map +1 -0
  79. package/dist/chunk-QIC6JFFD.js +210 -0
  80. package/dist/chunk-QIC6JFFD.js.map +1 -0
  81. package/dist/chunk-TAPNXT7X.cjs +422 -0
  82. package/dist/chunk-TAPNXT7X.cjs.map +1 -0
  83. package/dist/chunk-XCKXHK44.js +15 -0
  84. package/dist/chunk-XCKXHK44.js.map +1 -0
  85. package/dist/chunk-XMC4DN6G.js +131 -0
  86. package/dist/chunk-XMC4DN6G.js.map +1 -0
  87. package/dist/chunk-XONXEFJY.cjs +58 -0
  88. package/dist/chunk-XONXEFJY.cjs.map +1 -0
  89. package/dist/chunk-XQNJED46.cjs +19 -0
  90. package/dist/chunk-XQNJED46.cjs.map +1 -0
  91. package/dist/chunk-YB4B3OMC.js +74 -0
  92. package/dist/chunk-YB4B3OMC.js.map +1 -0
  93. package/dist/index.cjs +271 -0
  94. package/dist/index.cjs.map +1 -0
  95. package/dist/index.d.cts +137 -0
  96. package/dist/index.d.ts +137 -0
  97. package/dist/index.js +197 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/layout/index.cjs +13 -0
  100. package/dist/layout/index.cjs.map +1 -0
  101. package/dist/layout/index.d.cts +54 -0
  102. package/dist/layout/index.d.ts +54 -0
  103. package/dist/layout/index.js +4 -0
  104. package/dist/layout/index.js.map +1 -0
  105. package/dist/portfolio/client.cjs +18 -0
  106. package/dist/portfolio/client.cjs.map +1 -0
  107. package/dist/portfolio/client.d.cts +97 -0
  108. package/dist/portfolio/client.d.ts +97 -0
  109. package/dist/portfolio/client.js +6 -0
  110. package/dist/portfolio/client.js.map +1 -0
  111. package/dist/portfolio/index.cjs +41 -0
  112. package/dist/portfolio/index.cjs.map +1 -0
  113. package/dist/portfolio/index.d.cts +12 -0
  114. package/dist/portfolio/index.d.ts +12 -0
  115. package/dist/portfolio/index.js +8 -0
  116. package/dist/portfolio/index.js.map +1 -0
  117. package/dist/portfolio/sections.cjs +20 -0
  118. package/dist/portfolio/sections.cjs.map +1 -0
  119. package/dist/portfolio/sections.d.cts +42 -0
  120. package/dist/portfolio/sections.d.ts +42 -0
  121. package/dist/portfolio/sections.js +4 -0
  122. package/dist/portfolio/sections.js.map +1 -0
  123. package/dist/portfolio/server.cjs +141 -0
  124. package/dist/portfolio/server.cjs.map +1 -0
  125. package/dist/portfolio/server.d.cts +68 -0
  126. package/dist/portfolio/server.d.ts +68 -0
  127. package/dist/portfolio/server.js +134 -0
  128. package/dist/portfolio/server.js.map +1 -0
  129. package/dist/types-BMUhBhWx.d.cts +346 -0
  130. package/dist/types-BMUhBhWx.d.ts +346 -0
  131. 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":";;;;;;;;;;;;AAYA,SAAS,QAAA,CAAS,EAAE,MAAA,EAAO,EAAoC;AAC7D,EAAA,MAAM,OAAA,GAAUA,aAAuB,IAAI,CAAA;AAE3C,EAAA,MAAM,gBAAA,GAAmBC,kBAAY,MAAM;AACzC,IAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACtB,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,CAAQ,aAAA,CAAc,cAAc,CAAA;AAC3D,IAAA,IAAI,MAAA,EAAQ;AACV,MAAAC,qBAAA,CAAK,EAAA,CAAG,QAAQ,EAAE,KAAA,EAAO,MAAM,QAAA,EAAU,GAAA,EAAK,IAAA,EAAM,YAAA,EAAc,CAAA;AAAA,IACpE;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,gBAAA,GAAmBD,kBAAY,MAAM;AACzC,IAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACtB,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,CAAQ,aAAA,CAAc,cAAc,CAAA;AAC3D,IAAA,IAAI,MAAA,EAAQ;AACV,MAAAC,qBAAA,CAAK,EAAA,CAAG,QAAQ,EAAE,KAAA,EAAO,GAAG,QAAA,EAAU,GAAA,EAAK,IAAA,EAAM,YAAA,EAAc,CAAA;AAAA,IACjE;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,EAAQ,KAAA,EAAO,IAAA;AACxC,EAAA,MAAM,QAAA,GAAW,OAAO,IAAA,CACrB,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAc,CAAA,CAAE,CAAC,CAAC,CAAA,CACvB,KAAK,EAAE,CAAA,CACP,MAAM,CAAA,EAAG,CAAC,EACV,WAAA,EAAY;AAEf,EAAA,sCACG,KAAA,EAAA,EAAI,GAAA,EAAK,SAAS,YAAA,EAAc,gBAAA,EAAkB,cAAc,gBAAA,EAC/D,QAAA,kBAAAC,cAAA,CAACC,+BAAU,OAAA,EAAQ,IAAA,EAAK,OAAK,IAAA,EAAC,SAAA,EAAU,eACtC,QAAA,kBAAAC,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kCAAA,EACZ,QAAA,EAAA;AAAA,IAAA,SAAA,mBACCF,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,SAAA;AAAA,QACL,KAAK,MAAA,CAAO,IAAA;AAAA,QACZ,SAAA,EAAU,iDAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,MAAA,EAAQ,mDAAA;AAAA,UACR,UAAA,EAAY;AAAA;AACd;AAAA,KACF,mBAEAA,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,uFAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,UAAA,EAAY,iEAAA;AAAA,UACZ,KAAA,EAAO,4BAAA;AAAA,UACP,MAAA,EAAQ,2EAAA;AAAA,UACR,UAAA,EAAY;AAAA,SACd;AAAA,QAEC,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,oCAGD,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAA,cAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,yBAAA;AAAA,UACV,KAAA,EAAO,EAAE,KAAA,EAAO,iCAAA,EAAkC;AAAA,UAEjD,QAAA,EAAA,MAAA,CAAO;AAAA;AAAA,OACV;AAAA,sBACAA,cAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,cAAA;AAAA,UACV,KAAA,EAAO,EAAE,KAAA,EAAO,kCAAA,EAAmC;AAAA,UAElD,QAAA,EAAA,MAAA,CAAO;AAAA;AAAA;AACV,KAAA,EACF;AAAA,GAAA,EACF,GACF,CAAA,EACF,CAAA;AAEJ;AAEe,SAAR,WAAA,CAA6B,EAAE,IAAA,EAAK,EAAqB;AAC9D,EAAA,uBACEA,cAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,uBAAA;AAAA,MACV,KAAA,EAAO,EAAE,UAAA,EAAY,uBAAA,EAAwB;AAAA,MAE7C,QAAA,kBAAAE,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,eAAA,CAACC,8BAAA,EAAA,EAAa,GAAG,EAAA,EACf,QAAA,EAAA;AAAA,0BAAAH,cAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,qCAAA;AAAA,cACV,KAAA,EAAO;AAAA,gBACL,KAAA,EAAO,iCAAA;AAAA,gBACP,UAAA,EAAY;AAAA,eACd;AAAA,cACD,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,0BACAA,cAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,yBAAA;AAAA,cACV,KAAA,EAAO,EAAE,KAAA,EAAO,mCAAA,EAAoC;AAAA,cACrD,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EACF,CAAA;AAAA,wBAEAA,cAAA,CAACG,kCAAa,OAAA,EAAS,GAAA,EACrB,yCAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wDACZ,QAAA,EAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAC,MAAA,EAAQ,0BACzBH,cAAA,CAAC,QAAA,EAAA,EAAqB,UAAP,KAAuB,CACvC,GACH,CAAA,EACF;AAAA,OAAA,EACF;AAAA;AAAA,GACF;AAEJ","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