@sonordev/agency-site-kit 0.1.0 → 0.1.2
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 → BeforeAfterSection-6BHFLY4Y.js} +6 -6
- package/dist/BeforeAfterSection-6BHFLY4Y.js.map +1 -0
- package/dist/{BeforeAfterSection-DVAWWE4K.cjs → BeforeAfterSection-JTORBR3A.cjs} +6 -6
- package/dist/BeforeAfterSection-JTORBR3A.cjs.map +1 -0
- package/dist/DesignSystemSection-2R5BRBGO.js +172 -0
- package/dist/DesignSystemSection-2R5BRBGO.js.map +1 -0
- package/dist/DesignSystemSection-KXIQXITF.cjs +174 -0
- package/dist/DesignSystemSection-KXIQXITF.cjs.map +1 -0
- package/dist/{DetailsSection-FB763FS7.js → DetailsSection-A6PZQUQL.js} +14 -5
- package/dist/DetailsSection-A6PZQUQL.js.map +1 -0
- package/dist/{DetailsSection-OACJFGH7.cjs → DetailsSection-TTUZAPZZ.cjs} +14 -5
- package/dist/DetailsSection-TTUZAPZZ.cjs.map +1 -0
- package/dist/PerformanceSection-24TVVFZA.cjs +356 -0
- package/dist/PerformanceSection-24TVVFZA.cjs.map +1 -0
- package/dist/PerformanceSection-MGCEIXDX.js +351 -0
- package/dist/PerformanceSection-MGCEIXDX.js.map +1 -0
- package/dist/SiteArchitectureSection-EE6VQSXM.cjs +349 -0
- package/dist/SiteArchitectureSection-EE6VQSXM.cjs.map +1 -0
- package/dist/SiteArchitectureSection-PBBRTARV.js +344 -0
- package/dist/SiteArchitectureSection-PBBRTARV.js.map +1 -0
- package/dist/SpeedComparisonSection-EZKFQVGW.cjs +174 -0
- package/dist/SpeedComparisonSection-EZKFQVGW.cjs.map +1 -0
- package/dist/SpeedComparisonSection-Y3K7OFZQ.js +172 -0
- package/dist/SpeedComparisonSection-Y3K7OFZQ.js.map +1 -0
- package/dist/{StrategySection-3ED3QW4R.cjs → StrategySection-CJ7Y6OFQ.cjs} +18 -24
- package/dist/StrategySection-CJ7Y6OFQ.cjs.map +1 -0
- package/dist/{StrategySection-VUWMIYYP.js → StrategySection-DI5RSCJU.js} +18 -24
- package/dist/StrategySection-DI5RSCJU.js.map +1 -0
- package/dist/TechStackSection-2AQ7RGY3.js +93 -0
- package/dist/TechStackSection-2AQ7RGY3.js.map +1 -0
- package/dist/TechStackSection-VTNNZR5V.cjs +95 -0
- package/dist/TechStackSection-VTNNZR5V.cjs.map +1 -0
- package/dist/{chunk-XMC4DN6G.js → chunk-APG2QSMB.js} +8 -8
- package/dist/chunk-APG2QSMB.js.map +1 -0
- package/dist/chunk-JTI3F3QY.cjs +619 -0
- package/dist/chunk-JTI3F3QY.cjs.map +1 -0
- package/dist/{chunk-NAS4K5UR.cjs → chunk-OA5ZM4OA.cjs} +8 -8
- package/dist/chunk-OA5ZM4OA.cjs.map +1 -0
- package/dist/{chunk-QIC6JFFD.js → chunk-OMOF4VR5.js} +14 -14
- package/dist/chunk-OMOF4VR5.js.map +1 -0
- package/dist/chunk-RLVW7WEK.js +612 -0
- package/dist/chunk-RLVW7WEK.js.map +1 -0
- package/dist/{chunk-5FKOLIV6.cjs → chunk-XM2QD3AK.cjs} +14 -14
- package/dist/chunk-XM2QD3AK.cjs.map +1 -0
- package/dist/index.cjs +13 -13
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +3 -3
- package/dist/layout/index.cjs +2 -2
- package/dist/layout/index.d.cts +1 -1
- package/dist/layout/index.d.ts +1 -1
- package/dist/layout/index.js +1 -1
- package/dist/portfolio/client.cjs +3 -3
- package/dist/portfolio/client.d.cts +7 -3
- package/dist/portfolio/client.d.ts +7 -3
- package/dist/portfolio/client.js +1 -1
- package/dist/portfolio/index.cjs +6 -6
- package/dist/portfolio/index.d.cts +2 -2
- package/dist/portfolio/index.d.ts +2 -2
- package/dist/portfolio/index.js +2 -2
- package/dist/portfolio/sections.d.cts +1 -1
- package/dist/portfolio/sections.d.ts +1 -1
- package/dist/portfolio/server.cjs +1 -0
- package/dist/portfolio/server.cjs.map +1 -1
- package/dist/portfolio/server.d.cts +1 -1
- package/dist/portfolio/server.d.ts +1 -1
- package/dist/portfolio/server.js +1 -0
- package/dist/portfolio/server.js.map +1 -1
- package/dist/{types-BMUhBhWx.d.cts → types-DL4t_Cfa.d.cts} +3 -1
- package/dist/{types-BMUhBhWx.d.ts → types-DL4t_Cfa.d.ts} +3 -1
- package/package.json +1 -1
- package/dist/BeforeAfterSection-6QUJOBO2.js.map +0 -1
- package/dist/BeforeAfterSection-DVAWWE4K.cjs.map +0 -1
- package/dist/DetailsSection-FB763FS7.js.map +0 -1
- package/dist/DetailsSection-OACJFGH7.cjs.map +0 -1
- package/dist/StrategySection-3ED3QW4R.cjs.map +0 -1
- package/dist/StrategySection-VUWMIYYP.js.map +0 -1
- package/dist/TechStackSection-OCUYG4XT.js +0 -90
- package/dist/TechStackSection-OCUYG4XT.js.map +0 -1
- package/dist/TechStackSection-VKJK4KQB.cjs +0 -91
- package/dist/TechStackSection-VKJK4KQB.cjs.map +0 -1
- package/dist/chunk-2VNNFAG6.js +0 -415
- package/dist/chunk-2VNNFAG6.js.map +0 -1
- package/dist/chunk-5FKOLIV6.cjs.map +0 -1
- package/dist/chunk-NAS4K5UR.cjs.map +0 -1
- package/dist/chunk-QIC6JFFD.js.map +0 -1
- package/dist/chunk-TAPNXT7X.cjs +0 -422
- package/dist/chunk-TAPNXT7X.cjs.map +0 -1
- package/dist/chunk-XMC4DN6G.js.map +0 -1
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { ScrollReveal } from './chunk-7CFFAKDM.js';
|
|
3
|
+
import { useRef, useState, useEffect } from 'react';
|
|
4
|
+
import gsap from 'gsap';
|
|
5
|
+
import { ScrollTrigger } from 'gsap/ScrollTrigger';
|
|
6
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
function getBranchColor(index) {
|
|
9
|
+
const hues = [
|
|
10
|
+
"var(--sk-primary, #6366f1)",
|
|
11
|
+
"#10b981",
|
|
12
|
+
"#f59e0b",
|
|
13
|
+
"#8b5cf6",
|
|
14
|
+
"#ec4899",
|
|
15
|
+
"#06b6d4",
|
|
16
|
+
"#f97316",
|
|
17
|
+
"#14b8a6"
|
|
18
|
+
];
|
|
19
|
+
return hues[index % hues.length];
|
|
20
|
+
}
|
|
21
|
+
function SiteArchitectureSection({ data }) {
|
|
22
|
+
const { totalPages, totalWords, groups } = data;
|
|
23
|
+
const treeRef = useRef(null);
|
|
24
|
+
useRef(null);
|
|
25
|
+
const [expandedGroup, setExpandedGroup] = useState(null);
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
gsap.registerPlugin(ScrollTrigger);
|
|
28
|
+
const ctx = gsap.context(() => {
|
|
29
|
+
gsap.utils.toArray(".arch-node").forEach((node, i) => {
|
|
30
|
+
gsap.fromTo(
|
|
31
|
+
node,
|
|
32
|
+
{ opacity: 0, scale: 0.8, y: 20 },
|
|
33
|
+
{
|
|
34
|
+
opacity: 1,
|
|
35
|
+
scale: 1,
|
|
36
|
+
y: 0,
|
|
37
|
+
duration: 0.5,
|
|
38
|
+
delay: i * 0.08,
|
|
39
|
+
ease: "back.out(1.4)",
|
|
40
|
+
scrollTrigger: {
|
|
41
|
+
trigger: treeRef.current,
|
|
42
|
+
start: "top 70%",
|
|
43
|
+
toggleActions: "play none none none"
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
);
|
|
47
|
+
});
|
|
48
|
+
gsap.utils.toArray(".arch-line").forEach((line, i) => {
|
|
49
|
+
const length = line.getTotalLength();
|
|
50
|
+
gsap.set(line, { strokeDasharray: length, strokeDashoffset: length });
|
|
51
|
+
gsap.to(line, {
|
|
52
|
+
strokeDashoffset: 0,
|
|
53
|
+
duration: 0.6,
|
|
54
|
+
delay: i * 0.1,
|
|
55
|
+
ease: "power2.out",
|
|
56
|
+
scrollTrigger: {
|
|
57
|
+
trigger: treeRef.current,
|
|
58
|
+
start: "top 70%",
|
|
59
|
+
toggleActions: "play none none none"
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
return () => ctx.revert();
|
|
65
|
+
}, [groups.length]);
|
|
66
|
+
const hasWords = totalWords > 0;
|
|
67
|
+
const subtitle = hasWords ? `${totalPages} pages structured across ${groups.length} content ${groups.length === 1 ? "category" : "categories"} with ${totalWords.toLocaleString()} words of content.` : `${totalPages} pages structured across ${groups.length} content ${groups.length === 1 ? "category" : "categories"}.`;
|
|
68
|
+
return /* @__PURE__ */ jsx(
|
|
69
|
+
"section",
|
|
70
|
+
{
|
|
71
|
+
className: "w-full py-20 md:py-28",
|
|
72
|
+
style: { background: "var(--sk-bg, #0a0a0a)" },
|
|
73
|
+
children: /* @__PURE__ */ jsxs("div", { className: "max-w-6xl mx-auto px-6", children: [
|
|
74
|
+
/* @__PURE__ */ jsxs(ScrollReveal, { y: 30, children: [
|
|
75
|
+
/* @__PURE__ */ jsx(
|
|
76
|
+
"h2",
|
|
77
|
+
{
|
|
78
|
+
className: "text-3xl md:text-4xl font-bold mb-4",
|
|
79
|
+
style: {
|
|
80
|
+
color: "var(--sk-text-primary, #ffffff)",
|
|
81
|
+
fontFamily: "var(--sk-font-heading, inherit)"
|
|
82
|
+
},
|
|
83
|
+
children: "Site Architecture"
|
|
84
|
+
}
|
|
85
|
+
),
|
|
86
|
+
/* @__PURE__ */ jsx(
|
|
87
|
+
"p",
|
|
88
|
+
{
|
|
89
|
+
className: "text-lg mb-16 max-w-3xl",
|
|
90
|
+
style: { color: "var(--sk-text-secondary, #a1a1aa)" },
|
|
91
|
+
children: subtitle
|
|
92
|
+
}
|
|
93
|
+
)
|
|
94
|
+
] }),
|
|
95
|
+
/* @__PURE__ */ jsxs("div", { ref: treeRef, className: "relative", children: [
|
|
96
|
+
/* @__PURE__ */ jsx("div", { className: "flex justify-center mb-8", children: /* @__PURE__ */ jsxs(
|
|
97
|
+
"div",
|
|
98
|
+
{
|
|
99
|
+
className: "arch-node relative px-6 py-3 rounded-xl text-center",
|
|
100
|
+
style: {
|
|
101
|
+
background: "color-mix(in srgb, var(--sk-primary, #6366f1) 15%, var(--sk-bg, #0a0a0a))",
|
|
102
|
+
border: "2px solid var(--sk-primary, #6366f1)",
|
|
103
|
+
boxShadow: "0 0 30px color-mix(in srgb, var(--sk-primary, #6366f1) 20%, transparent)"
|
|
104
|
+
},
|
|
105
|
+
children: [
|
|
106
|
+
/* @__PURE__ */ jsx(
|
|
107
|
+
"span",
|
|
108
|
+
{
|
|
109
|
+
className: "text-sm font-bold tracking-wide",
|
|
110
|
+
style: { color: "var(--sk-primary, #6366f1)" },
|
|
111
|
+
children: "/"
|
|
112
|
+
}
|
|
113
|
+
),
|
|
114
|
+
/* @__PURE__ */ jsxs(
|
|
115
|
+
"span",
|
|
116
|
+
{
|
|
117
|
+
className: "block text-xs mt-0.5",
|
|
118
|
+
style: { color: "var(--sk-text-tertiary, #71717a)" },
|
|
119
|
+
children: [
|
|
120
|
+
totalPages,
|
|
121
|
+
" pages"
|
|
122
|
+
]
|
|
123
|
+
}
|
|
124
|
+
)
|
|
125
|
+
]
|
|
126
|
+
}
|
|
127
|
+
) }),
|
|
128
|
+
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4", children: groups.map((group, gi) => {
|
|
129
|
+
const color = getBranchColor(gi);
|
|
130
|
+
const isExpanded = expandedGroup === gi;
|
|
131
|
+
const hasChildren = group.pages.length > 0;
|
|
132
|
+
return /* @__PURE__ */ jsxs(
|
|
133
|
+
"div",
|
|
134
|
+
{
|
|
135
|
+
className: "arch-node flex flex-col",
|
|
136
|
+
children: [
|
|
137
|
+
/* @__PURE__ */ jsx(
|
|
138
|
+
"div",
|
|
139
|
+
{
|
|
140
|
+
className: "w-px h-6 mx-auto mb-2",
|
|
141
|
+
style: {
|
|
142
|
+
background: `linear-gradient(to bottom, color-mix(in srgb, ${color} 40%, transparent), ${color})`
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
),
|
|
146
|
+
/* @__PURE__ */ jsxs(
|
|
147
|
+
"button",
|
|
148
|
+
{
|
|
149
|
+
onClick: () => hasChildren && setExpandedGroup(isExpanded ? null : gi),
|
|
150
|
+
className: "relative rounded-xl p-4 text-left transition-all duration-300 cursor-pointer group",
|
|
151
|
+
style: {
|
|
152
|
+
background: `color-mix(in srgb, ${color} 8%, var(--sk-bg, #0a0a0a))`,
|
|
153
|
+
border: `1.5px solid color-mix(in srgb, ${color} ${isExpanded ? "40" : "20"}%, transparent)`,
|
|
154
|
+
boxShadow: isExpanded ? `0 0 20px color-mix(in srgb, ${color} 15%, transparent)` : "none"
|
|
155
|
+
},
|
|
156
|
+
children: [
|
|
157
|
+
/* @__PURE__ */ jsx(
|
|
158
|
+
"div",
|
|
159
|
+
{
|
|
160
|
+
className: "absolute -top-2.5 -right-2 px-2 py-0.5 rounded-full text-xs font-bold",
|
|
161
|
+
style: {
|
|
162
|
+
background: color,
|
|
163
|
+
color: "#000",
|
|
164
|
+
boxShadow: `0 0 10px color-mix(in srgb, ${color} 40%, transparent)`
|
|
165
|
+
},
|
|
166
|
+
children: group.count
|
|
167
|
+
}
|
|
168
|
+
),
|
|
169
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
170
|
+
/* @__PURE__ */ jsx(
|
|
171
|
+
"div",
|
|
172
|
+
{
|
|
173
|
+
className: "w-2 h-2 rounded-full shrink-0",
|
|
174
|
+
style: { background: color }
|
|
175
|
+
}
|
|
176
|
+
),
|
|
177
|
+
/* @__PURE__ */ jsx(
|
|
178
|
+
"span",
|
|
179
|
+
{
|
|
180
|
+
className: "text-sm font-semibold truncate",
|
|
181
|
+
style: { color: "var(--sk-text-primary, #ffffff)" },
|
|
182
|
+
children: group.label
|
|
183
|
+
}
|
|
184
|
+
)
|
|
185
|
+
] }),
|
|
186
|
+
hasChildren && /* @__PURE__ */ jsx(
|
|
187
|
+
"span",
|
|
188
|
+
{
|
|
189
|
+
className: "text-[10px] mt-1 block transition-colors",
|
|
190
|
+
style: { color: "var(--sk-text-tertiary, #71717a)" },
|
|
191
|
+
children: isExpanded ? "click to collapse" : `${group.count} ${group.count === 1 ? "page" : "pages"} \u2014 click to expand`
|
|
192
|
+
}
|
|
193
|
+
)
|
|
194
|
+
]
|
|
195
|
+
}
|
|
196
|
+
),
|
|
197
|
+
isExpanded && hasChildren && /* @__PURE__ */ jsxs(
|
|
198
|
+
"div",
|
|
199
|
+
{
|
|
200
|
+
className: "mt-2 rounded-lg overflow-hidden",
|
|
201
|
+
style: {
|
|
202
|
+
background: `color-mix(in srgb, ${color} 5%, var(--sk-bg, #0a0a0a))`,
|
|
203
|
+
border: `1px solid color-mix(in srgb, ${color} 15%, transparent)`
|
|
204
|
+
},
|
|
205
|
+
children: [
|
|
206
|
+
group.pages.map((page, pi) => /* @__PURE__ */ jsxs(
|
|
207
|
+
"div",
|
|
208
|
+
{
|
|
209
|
+
className: "flex items-center gap-2 px-3 py-1.5",
|
|
210
|
+
style: {
|
|
211
|
+
borderBottom: pi < group.pages.length - 1 ? `1px solid color-mix(in srgb, ${color} 8%, transparent)` : "none"
|
|
212
|
+
},
|
|
213
|
+
children: [
|
|
214
|
+
/* @__PURE__ */ jsx(
|
|
215
|
+
"div",
|
|
216
|
+
{
|
|
217
|
+
className: "w-1 h-1 rounded-full shrink-0",
|
|
218
|
+
style: { background: color, opacity: 0.5 }
|
|
219
|
+
}
|
|
220
|
+
),
|
|
221
|
+
/* @__PURE__ */ jsx(
|
|
222
|
+
"span",
|
|
223
|
+
{
|
|
224
|
+
className: "text-xs truncate",
|
|
225
|
+
style: { color: "var(--sk-text-tertiary, #71717a)" },
|
|
226
|
+
title: page.title || page.path,
|
|
227
|
+
children: page.title || page.path
|
|
228
|
+
}
|
|
229
|
+
)
|
|
230
|
+
]
|
|
231
|
+
},
|
|
232
|
+
pi
|
|
233
|
+
)),
|
|
234
|
+
group.count > group.pages.length && /* @__PURE__ */ jsxs(
|
|
235
|
+
"div",
|
|
236
|
+
{
|
|
237
|
+
className: "px-3 py-1.5 text-xs italic",
|
|
238
|
+
style: { color: "var(--sk-text-tertiary, #71717a)", opacity: 0.6 },
|
|
239
|
+
children: [
|
|
240
|
+
"+",
|
|
241
|
+
group.count - group.pages.length,
|
|
242
|
+
" more pages"
|
|
243
|
+
]
|
|
244
|
+
}
|
|
245
|
+
)
|
|
246
|
+
]
|
|
247
|
+
}
|
|
248
|
+
)
|
|
249
|
+
]
|
|
250
|
+
},
|
|
251
|
+
gi
|
|
252
|
+
);
|
|
253
|
+
}) })
|
|
254
|
+
] }),
|
|
255
|
+
/* @__PURE__ */ jsx(ScrollReveal, { y: 20, delay: 0.4, children: /* @__PURE__ */ jsxs(
|
|
256
|
+
"div",
|
|
257
|
+
{
|
|
258
|
+
className: "mt-12 flex items-center justify-center gap-8 md:gap-12 py-4 px-6 rounded-xl mx-auto max-w-2xl",
|
|
259
|
+
style: {
|
|
260
|
+
background: "color-mix(in srgb, var(--sk-primary, #6366f1) 5%, var(--sk-bg, #0a0a0a))",
|
|
261
|
+
border: "1px solid color-mix(in srgb, var(--sk-primary, #6366f1) 15%, transparent)"
|
|
262
|
+
},
|
|
263
|
+
children: [
|
|
264
|
+
/* @__PURE__ */ jsxs("div", { className: "text-center", children: [
|
|
265
|
+
/* @__PURE__ */ jsx(
|
|
266
|
+
"span",
|
|
267
|
+
{
|
|
268
|
+
className: "text-2xl font-bold block",
|
|
269
|
+
style: { color: "var(--sk-primary, #6366f1)" },
|
|
270
|
+
children: totalPages
|
|
271
|
+
}
|
|
272
|
+
),
|
|
273
|
+
/* @__PURE__ */ jsx(
|
|
274
|
+
"span",
|
|
275
|
+
{
|
|
276
|
+
className: "text-[10px] uppercase tracking-wider block mt-0.5",
|
|
277
|
+
style: { color: "var(--sk-text-tertiary, #71717a)" },
|
|
278
|
+
children: "Pages"
|
|
279
|
+
}
|
|
280
|
+
)
|
|
281
|
+
] }),
|
|
282
|
+
/* @__PURE__ */ jsx(
|
|
283
|
+
"div",
|
|
284
|
+
{
|
|
285
|
+
className: "w-px h-8",
|
|
286
|
+
style: { background: "color-mix(in srgb, var(--sk-text-tertiary, #71717a) 20%, transparent)" }
|
|
287
|
+
}
|
|
288
|
+
),
|
|
289
|
+
/* @__PURE__ */ jsxs("div", { className: "text-center", children: [
|
|
290
|
+
/* @__PURE__ */ jsx(
|
|
291
|
+
"span",
|
|
292
|
+
{
|
|
293
|
+
className: "text-2xl font-bold block",
|
|
294
|
+
style: { color: "var(--sk-primary, #6366f1)" },
|
|
295
|
+
children: groups.length
|
|
296
|
+
}
|
|
297
|
+
),
|
|
298
|
+
/* @__PURE__ */ jsx(
|
|
299
|
+
"span",
|
|
300
|
+
{
|
|
301
|
+
className: "text-[10px] uppercase tracking-wider block mt-0.5",
|
|
302
|
+
style: { color: "var(--sk-text-tertiary, #71717a)" },
|
|
303
|
+
children: "Categories"
|
|
304
|
+
}
|
|
305
|
+
)
|
|
306
|
+
] }),
|
|
307
|
+
hasWords && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
308
|
+
/* @__PURE__ */ jsx(
|
|
309
|
+
"div",
|
|
310
|
+
{
|
|
311
|
+
className: "w-px h-8",
|
|
312
|
+
style: { background: "color-mix(in srgb, var(--sk-text-tertiary, #71717a) 20%, transparent)" }
|
|
313
|
+
}
|
|
314
|
+
),
|
|
315
|
+
/* @__PURE__ */ jsxs("div", { className: "text-center", children: [
|
|
316
|
+
/* @__PURE__ */ jsx(
|
|
317
|
+
"span",
|
|
318
|
+
{
|
|
319
|
+
className: "text-2xl font-bold block",
|
|
320
|
+
style: { color: "var(--sk-primary, #6366f1)" },
|
|
321
|
+
children: totalWords > 1e3 ? `${(totalWords / 1e3).toFixed(0)}k` : totalWords
|
|
322
|
+
}
|
|
323
|
+
),
|
|
324
|
+
/* @__PURE__ */ jsx(
|
|
325
|
+
"span",
|
|
326
|
+
{
|
|
327
|
+
className: "text-[10px] uppercase tracking-wider block mt-0.5",
|
|
328
|
+
style: { color: "var(--sk-text-tertiary, #71717a)" },
|
|
329
|
+
children: "Words"
|
|
330
|
+
}
|
|
331
|
+
)
|
|
332
|
+
] })
|
|
333
|
+
] })
|
|
334
|
+
]
|
|
335
|
+
}
|
|
336
|
+
) })
|
|
337
|
+
] })
|
|
338
|
+
}
|
|
339
|
+
);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
export { SiteArchitectureSection as default };
|
|
343
|
+
//# sourceMappingURL=SiteArchitectureSection-PBBRTARV.js.map
|
|
344
|
+
//# sourceMappingURL=SiteArchitectureSection-PBBRTARV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/portfolio/components/sections/SiteArchitectureSection.tsx"],"names":[],"mappings":"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","file":"SiteArchitectureSection-PBBRTARV.js","sourcesContent":["'use client';\n\nimport React, { useRef, useEffect, useState } from 'react';\nimport gsap from 'gsap';\nimport { ScrollTrigger } from 'gsap/ScrollTrigger';\nimport ScrollReveal from '../primitives/ScrollReveal';\nimport GlassCard from '../primitives/GlassCard';\n\ninterface PageGroup {\n label: string;\n count: number;\n pages: Array<{ path: string; title: string }>;\n}\n\nexport interface SiteArchitectureData {\n totalPages: number;\n totalWords: number;\n groups: PageGroup[];\n}\n\ninterface SiteArchitectureSectionProps {\n data: SiteArchitectureData;\n}\n\n/** Generates a pleasing color from the brand palette for each branch */\nfunction getBranchColor(index: number): string {\n const hues = [\n 'var(--sk-primary, #6366f1)',\n '#10b981',\n '#f59e0b',\n '#8b5cf6',\n '#ec4899',\n '#06b6d4',\n '#f97316',\n '#14b8a6',\n ];\n return hues[index % hues.length];\n}\n\nexport default function SiteArchitectureSection({ data }: SiteArchitectureSectionProps) {\n const { totalPages, totalWords, groups } = data;\n const treeRef = useRef<HTMLDivElement>(null);\n const svgRef = useRef<SVGSVGElement>(null);\n const [expandedGroup, setExpandedGroup] = useState<number | null>(null);\n\n // Animate connection lines on scroll\n useEffect(() => {\n gsap.registerPlugin(ScrollTrigger);\n\n const ctx = gsap.context(() => {\n // Animate each branch node in\n gsap.utils.toArray<HTMLElement>('.arch-node').forEach((node, i) => {\n gsap.fromTo(\n node,\n { opacity: 0, scale: 0.8, y: 20 },\n {\n opacity: 1,\n scale: 1,\n y: 0,\n duration: 0.5,\n delay: i * 0.08,\n ease: 'back.out(1.4)',\n scrollTrigger: {\n trigger: treeRef.current,\n start: 'top 70%',\n toggleActions: 'play none none none',\n },\n },\n );\n });\n\n // Animate SVG connection lines drawing in\n gsap.utils.toArray<SVGPathElement>('.arch-line').forEach((line, i) => {\n const length = line.getTotalLength();\n gsap.set(line, { strokeDasharray: length, strokeDashoffset: length });\n gsap.to(line, {\n strokeDashoffset: 0,\n duration: 0.6,\n delay: i * 0.1,\n ease: 'power2.out',\n scrollTrigger: {\n trigger: treeRef.current,\n start: 'top 70%',\n toggleActions: 'play none none none',\n },\n });\n });\n });\n\n return () => ctx.revert();\n }, [groups.length]);\n\n const hasWords = totalWords > 0;\n const subtitle = hasWords\n ? `${totalPages} pages structured across ${groups.length} content ${groups.length === 1 ? 'category' : 'categories'} with ${totalWords.toLocaleString()} words of content.`\n : `${totalPages} pages structured across ${groups.length} content ${groups.length === 1 ? 'category' : 'categories'}.`;\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-6xl 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 Site Architecture\n </h2>\n <p\n className=\"text-lg mb-16 max-w-3xl\"\n style={{ color: 'var(--sk-text-secondary, #a1a1aa)' }}\n >\n {subtitle}\n </p>\n </ScrollReveal>\n\n {/* Visual Tree */}\n <div ref={treeRef} className=\"relative\">\n {/* Root node — the domain */}\n <div className=\"flex justify-center mb-8\">\n <div\n className=\"arch-node relative px-6 py-3 rounded-xl text-center\"\n style={{\n background: 'color-mix(in srgb, var(--sk-primary, #6366f1) 15%, var(--sk-bg, #0a0a0a))',\n border: '2px solid var(--sk-primary, #6366f1)',\n boxShadow: '0 0 30px color-mix(in srgb, var(--sk-primary, #6366f1) 20%, transparent)',\n }}\n >\n <span\n className=\"text-sm font-bold tracking-wide\"\n style={{ color: 'var(--sk-primary, #6366f1)' }}\n >\n /\n </span>\n <span\n className=\"block text-xs mt-0.5\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n {totalPages} pages\n </span>\n </div>\n </div>\n\n {/* Branch nodes — each page group */}\n <div className=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4\">\n {groups.map((group, gi) => {\n const color = getBranchColor(gi);\n const isExpanded = expandedGroup === gi;\n const hasChildren = group.pages.length > 0;\n\n return (\n <div\n key={gi}\n className=\"arch-node flex flex-col\"\n >\n {/* Branch connector line (vertical from root) */}\n <div\n className=\"w-px h-6 mx-auto mb-2\"\n style={{\n background: `linear-gradient(to bottom, color-mix(in srgb, ${color} 40%, transparent), ${color})`,\n }}\n />\n\n {/* Branch node */}\n <button\n onClick={() => hasChildren && setExpandedGroup(isExpanded ? null : gi)}\n className=\"relative rounded-xl p-4 text-left transition-all duration-300 cursor-pointer group\"\n style={{\n background: `color-mix(in srgb, ${color} 8%, var(--sk-bg, #0a0a0a))`,\n border: `1.5px solid color-mix(in srgb, ${color} ${isExpanded ? '40' : '20'}%, transparent)`,\n boxShadow: isExpanded\n ? `0 0 20px color-mix(in srgb, ${color} 15%, transparent)`\n : 'none',\n }}\n >\n {/* Count badge */}\n <div\n className=\"absolute -top-2.5 -right-2 px-2 py-0.5 rounded-full text-xs font-bold\"\n style={{\n background: color,\n color: '#000',\n boxShadow: `0 0 10px color-mix(in srgb, ${color} 40%, transparent)`,\n }}\n >\n {group.count}\n </div>\n\n <div className=\"flex items-center gap-2\">\n {/* Branch icon — folder-like indicator */}\n <div\n className=\"w-2 h-2 rounded-full shrink-0\"\n style={{ background: color }}\n />\n <span\n className=\"text-sm font-semibold truncate\"\n style={{ color: 'var(--sk-text-primary, #ffffff)' }}\n >\n {group.label}\n </span>\n </div>\n\n {/* Expand indicator */}\n {hasChildren && (\n <span\n className=\"text-[10px] mt-1 block transition-colors\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n {isExpanded ? 'click to collapse' : `${group.count} ${group.count === 1 ? 'page' : 'pages'} — click to expand`}\n </span>\n )}\n </button>\n\n {/* Expanded page list */}\n {isExpanded && hasChildren && (\n <div\n className=\"mt-2 rounded-lg overflow-hidden\"\n style={{\n background: `color-mix(in srgb, ${color} 5%, var(--sk-bg, #0a0a0a))`,\n border: `1px solid color-mix(in srgb, ${color} 15%, transparent)`,\n }}\n >\n {group.pages.map((page, pi) => (\n <div\n key={pi}\n className=\"flex items-center gap-2 px-3 py-1.5\"\n style={{\n borderBottom:\n pi < group.pages.length - 1\n ? `1px solid color-mix(in srgb, ${color} 8%, transparent)`\n : 'none',\n }}\n >\n <div\n className=\"w-1 h-1 rounded-full shrink-0\"\n style={{ background: color, opacity: 0.5 }}\n />\n <span\n className=\"text-xs truncate\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n title={page.title || page.path}\n >\n {page.title || page.path}\n </span>\n </div>\n ))}\n {group.count > group.pages.length && (\n <div\n className=\"px-3 py-1.5 text-xs italic\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)', opacity: 0.6 }}\n >\n +{group.count - group.pages.length} more pages\n </div>\n )}\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n\n {/* Bottom stats bar */}\n <ScrollReveal y={20} delay={0.4}>\n <div\n className=\"mt-12 flex items-center justify-center gap-8 md:gap-12 py-4 px-6 rounded-xl mx-auto max-w-2xl\"\n style={{\n background: 'color-mix(in srgb, var(--sk-primary, #6366f1) 5%, var(--sk-bg, #0a0a0a))',\n border: '1px solid color-mix(in srgb, var(--sk-primary, #6366f1) 15%, transparent)',\n }}\n >\n <div className=\"text-center\">\n <span\n className=\"text-2xl font-bold block\"\n style={{ color: 'var(--sk-primary, #6366f1)' }}\n >\n {totalPages}\n </span>\n <span\n className=\"text-[10px] uppercase tracking-wider block mt-0.5\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n Pages\n </span>\n </div>\n <div\n className=\"w-px h-8\"\n style={{ background: 'color-mix(in srgb, var(--sk-text-tertiary, #71717a) 20%, transparent)' }}\n />\n <div className=\"text-center\">\n <span\n className=\"text-2xl font-bold block\"\n style={{ color: 'var(--sk-primary, #6366f1)' }}\n >\n {groups.length}\n </span>\n <span\n className=\"text-[10px] uppercase tracking-wider block mt-0.5\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n Categories\n </span>\n </div>\n {hasWords && (\n <>\n <div\n className=\"w-px h-8\"\n style={{ background: 'color-mix(in srgb, var(--sk-text-tertiary, #71717a) 20%, transparent)' }}\n />\n <div className=\"text-center\">\n <span\n className=\"text-2xl font-bold block\"\n style={{ color: 'var(--sk-primary, #6366f1)' }}\n >\n {totalWords > 1000 ? `${(totalWords / 1000).toFixed(0)}k` : totalWords}\n </span>\n <span\n className=\"text-[10px] uppercase tracking-wider block mt-0.5\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n Words\n </span>\n </div>\n </>\n )}\n </div>\n </ScrollReveal>\n </div>\n </section>\n );\n}\n"]}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkKEOHORIH_cjs = require('./chunk-KEOHORIH.cjs');
|
|
4
|
+
var chunkIKBK7HYX_cjs = require('./chunk-IKBK7HYX.cjs');
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
|
|
7
|
+
var CATEGORIES = [
|
|
8
|
+
{ key: "performance", label: "Performance", why: "Faster sites convert better \u2014 every 100ms of improvement increases conversions by up to 8%." },
|
|
9
|
+
{ key: "seo", label: "SEO", why: "Higher SEO scores mean better search rankings, more organic traffic, and lower customer acquisition costs." },
|
|
10
|
+
{ key: "accessibility", label: "Accessibility", why: "Accessible sites reach 15-20% more users and reduce legal liability." },
|
|
11
|
+
{ key: "bestPractices", label: "Best Practices", why: "Modern security headers, HTTPS, and optimized assets build trust and protect users." }
|
|
12
|
+
];
|
|
13
|
+
function getScoreColor(score) {
|
|
14
|
+
if (score >= 90) return "#10b981";
|
|
15
|
+
if (score >= 50) return "#f59e0b";
|
|
16
|
+
return "#ef4444";
|
|
17
|
+
}
|
|
18
|
+
function ScoreRing({ score, size = 72 }) {
|
|
19
|
+
const strokeWidth = 5;
|
|
20
|
+
const radius = (size - strokeWidth) / 2;
|
|
21
|
+
const circumference = 2 * Math.PI * radius;
|
|
22
|
+
const progress = score / 100 * circumference;
|
|
23
|
+
const color = getScoreColor(score);
|
|
24
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", style: { width: size, height: size }, children: [
|
|
25
|
+
/* @__PURE__ */ jsxRuntime.jsxs("svg", { width: size, height: size, className: "transform -rotate-90", children: [
|
|
26
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
27
|
+
"circle",
|
|
28
|
+
{
|
|
29
|
+
cx: size / 2,
|
|
30
|
+
cy: size / 2,
|
|
31
|
+
r: radius,
|
|
32
|
+
fill: "none",
|
|
33
|
+
stroke: "currentColor",
|
|
34
|
+
strokeWidth,
|
|
35
|
+
style: { color: "color-mix(in srgb, var(--sk-text-tertiary, #71717a) 20%, transparent)" }
|
|
36
|
+
}
|
|
37
|
+
),
|
|
38
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
39
|
+
"circle",
|
|
40
|
+
{
|
|
41
|
+
cx: size / 2,
|
|
42
|
+
cy: size / 2,
|
|
43
|
+
r: radius,
|
|
44
|
+
fill: "none",
|
|
45
|
+
stroke: color,
|
|
46
|
+
strokeWidth,
|
|
47
|
+
strokeDasharray: `${progress} ${circumference - progress}`,
|
|
48
|
+
strokeLinecap: "round"
|
|
49
|
+
}
|
|
50
|
+
)
|
|
51
|
+
] }),
|
|
52
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
53
|
+
"span",
|
|
54
|
+
{
|
|
55
|
+
className: "absolute inset-0 flex items-center justify-center text-lg font-bold",
|
|
56
|
+
style: { color },
|
|
57
|
+
children: score
|
|
58
|
+
}
|
|
59
|
+
)
|
|
60
|
+
] });
|
|
61
|
+
}
|
|
62
|
+
function SpeedComparisonSection({ data }) {
|
|
63
|
+
const { platformLabel, benchmarks, actual } = data;
|
|
64
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
65
|
+
"section",
|
|
66
|
+
{
|
|
67
|
+
className: "w-full py-20 md:py-28",
|
|
68
|
+
style: { background: "var(--sk-bg, #0a0a0a)" },
|
|
69
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-5xl mx-auto px-6", children: [
|
|
70
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkIKBK7HYX_cjs.ScrollReveal, { y: 30, children: [
|
|
71
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
72
|
+
"h2",
|
|
73
|
+
{
|
|
74
|
+
className: "text-3xl md:text-4xl font-bold mb-4",
|
|
75
|
+
style: {
|
|
76
|
+
color: "var(--sk-text-primary, #ffffff)",
|
|
77
|
+
fontFamily: "var(--sk-font-heading, inherit)"
|
|
78
|
+
},
|
|
79
|
+
children: "Why This Matters"
|
|
80
|
+
}
|
|
81
|
+
),
|
|
82
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
83
|
+
"p",
|
|
84
|
+
{
|
|
85
|
+
className: "text-lg mb-4 max-w-3xl",
|
|
86
|
+
style: { color: "var(--sk-text-secondary, #a1a1aa)" },
|
|
87
|
+
children: "Lighthouse measures real-world site quality across performance, SEO, accessibility, and best practices. These scores directly impact search rankings, conversion rates, and user experience."
|
|
88
|
+
}
|
|
89
|
+
),
|
|
90
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
91
|
+
"p",
|
|
92
|
+
{
|
|
93
|
+
className: "text-base mb-12 max-w-3xl",
|
|
94
|
+
style: { color: "var(--sk-text-tertiary, #71717a)" },
|
|
95
|
+
children: [
|
|
96
|
+
"Here's how this Next.js build compares to the average ",
|
|
97
|
+
platformLabel,
|
|
98
|
+
" site."
|
|
99
|
+
]
|
|
100
|
+
}
|
|
101
|
+
)
|
|
102
|
+
] }),
|
|
103
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: CATEGORIES.map((cat, ci) => {
|
|
104
|
+
const ours = actual[cat.key];
|
|
105
|
+
const theirs = benchmarks[cat.key];
|
|
106
|
+
const diff = ours - theirs;
|
|
107
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkIKBK7HYX_cjs.ScrollReveal, { y: 20, delay: ci * 0.1, children: /* @__PURE__ */ jsxRuntime.jsx(chunkKEOHORIH_cjs.GlassCard, { padding: "lg", hover: false, className: "h-full", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-5", children: [
|
|
108
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-3 shrink-0", children: [
|
|
109
|
+
/* @__PURE__ */ jsxRuntime.jsx(ScoreRing, { score: ours }),
|
|
110
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
111
|
+
"span",
|
|
112
|
+
{
|
|
113
|
+
className: "text-[10px] font-medium uppercase tracking-wider",
|
|
114
|
+
style: { color: "var(--sk-text-tertiary, #71717a)" },
|
|
115
|
+
children: "Next.js"
|
|
116
|
+
}
|
|
117
|
+
)
|
|
118
|
+
] }),
|
|
119
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-3 shrink-0", children: [
|
|
120
|
+
/* @__PURE__ */ jsxRuntime.jsx(ScoreRing, { score: theirs }),
|
|
121
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
122
|
+
"span",
|
|
123
|
+
{
|
|
124
|
+
className: "text-[10px] font-medium uppercase tracking-wider",
|
|
125
|
+
style: { color: "var(--sk-text-tertiary, #71717a)" },
|
|
126
|
+
children: platformLabel
|
|
127
|
+
}
|
|
128
|
+
)
|
|
129
|
+
] }),
|
|
130
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 min-w-0", children: [
|
|
131
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 mb-2", children: [
|
|
132
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
133
|
+
"h3",
|
|
134
|
+
{
|
|
135
|
+
className: "text-base font-semibold",
|
|
136
|
+
style: { color: "var(--sk-text-primary, #ffffff)" },
|
|
137
|
+
children: cat.label
|
|
138
|
+
}
|
|
139
|
+
),
|
|
140
|
+
diff > 0 && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
141
|
+
"span",
|
|
142
|
+
{
|
|
143
|
+
className: "text-xs font-bold px-2 py-0.5 rounded-full",
|
|
144
|
+
style: {
|
|
145
|
+
background: "color-mix(in srgb, #10b981 15%, transparent)",
|
|
146
|
+
color: "#10b981"
|
|
147
|
+
},
|
|
148
|
+
children: [
|
|
149
|
+
"+",
|
|
150
|
+
diff,
|
|
151
|
+
" pts"
|
|
152
|
+
]
|
|
153
|
+
}
|
|
154
|
+
)
|
|
155
|
+
] }),
|
|
156
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
157
|
+
"p",
|
|
158
|
+
{
|
|
159
|
+
className: "text-sm leading-relaxed",
|
|
160
|
+
style: { color: "var(--sk-text-tertiary, #71717a)" },
|
|
161
|
+
children: cat.why
|
|
162
|
+
}
|
|
163
|
+
)
|
|
164
|
+
] })
|
|
165
|
+
] }) }) }, cat.key);
|
|
166
|
+
}) })
|
|
167
|
+
] })
|
|
168
|
+
}
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
module.exports = SpeedComparisonSection;
|
|
173
|
+
//# sourceMappingURL=SpeedComparisonSection-EZKFQVGW.cjs.map
|
|
174
|
+
//# sourceMappingURL=SpeedComparisonSection-EZKFQVGW.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/portfolio/components/sections/SpeedComparisonSection.tsx"],"names":["jsxs","jsx","ScrollReveal","GlassCard"],"mappings":"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","file":"SpeedComparisonSection-EZKFQVGW.cjs","sourcesContent":["'use client';\n\nimport React from 'react';\nimport ScrollReveal from '../primitives/ScrollReveal';\nimport GlassCard from '../primitives/GlassCard';\n\ninterface Scores {\n performance: number;\n seo: number;\n accessibility: number;\n bestPractices: number;\n}\n\nexport interface SpeedComparisonData {\n platform: string;\n platformLabel: string;\n benchmarks: Scores;\n actual: Scores;\n}\n\ninterface SpeedComparisonSectionProps {\n data: SpeedComparisonData;\n}\n\nconst CATEGORIES: Array<{ key: keyof Scores; label: string; why: string }> = [\n { key: 'performance', label: 'Performance', why: 'Faster sites convert better — every 100ms of improvement increases conversions by up to 8%.' },\n { key: 'seo', label: 'SEO', why: 'Higher SEO scores mean better search rankings, more organic traffic, and lower customer acquisition costs.' },\n { key: 'accessibility', label: 'Accessibility', why: 'Accessible sites reach 15-20% more users and reduce legal liability.' },\n { key: 'bestPractices', label: 'Best Practices', why: 'Modern security headers, HTTPS, and optimized assets build trust and protect users.' },\n];\n\nfunction getScoreColor(score: number): string {\n if (score >= 90) return '#10b981';\n if (score >= 50) return '#f59e0b';\n return '#ef4444';\n}\n\n/** Circular score gauge */\nfunction ScoreRing({ score, size = 72 }: { score: number; size?: number }) {\n const strokeWidth = 5;\n const radius = (size - strokeWidth) / 2;\n const circumference = 2 * Math.PI * radius;\n const progress = (score / 100) * circumference;\n const color = getScoreColor(score);\n\n return (\n <div className=\"relative\" style={{ width: size, height: size }}>\n <svg width={size} height={size} className=\"transform -rotate-90\">\n <circle\n cx={size / 2}\n cy={size / 2}\n r={radius}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={strokeWidth}\n style={{ color: 'color-mix(in srgb, var(--sk-text-tertiary, #71717a) 20%, transparent)' }}\n />\n <circle\n cx={size / 2}\n cy={size / 2}\n r={radius}\n fill=\"none\"\n stroke={color}\n strokeWidth={strokeWidth}\n strokeDasharray={`${progress} ${circumference - progress}`}\n strokeLinecap=\"round\"\n />\n </svg>\n <span\n className=\"absolute inset-0 flex items-center justify-center text-lg font-bold\"\n style={{ color }}\n >\n {score}\n </span>\n </div>\n );\n}\n\nexport default function SpeedComparisonSection({ data }: SpeedComparisonSectionProps) {\n const { platformLabel, benchmarks, actual } = data;\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 Why This Matters\n </h2>\n <p\n className=\"text-lg mb-4 max-w-3xl\"\n style={{ color: 'var(--sk-text-secondary, #a1a1aa)' }}\n >\n Lighthouse measures real-world site quality across performance, SEO, accessibility, and best practices.\n These scores directly impact search rankings, conversion rates, and user experience.\n </p>\n <p\n className=\"text-base mb-12 max-w-3xl\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n Here's how this Next.js build compares to the average {platformLabel} site.\n </p>\n </ScrollReveal>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n {CATEGORIES.map((cat, ci) => {\n const ours = actual[cat.key];\n const theirs = benchmarks[cat.key];\n const diff = ours - theirs;\n\n return (\n <ScrollReveal key={cat.key} y={20} delay={ci * 0.1}>\n <GlassCard padding=\"lg\" hover={false} className=\"h-full\">\n <div className=\"flex items-start gap-5\">\n {/* Score rings side by side */}\n <div className=\"flex flex-col items-center gap-3 shrink-0\">\n <ScoreRing score={ours} />\n <span\n className=\"text-[10px] font-medium uppercase tracking-wider\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n Next.js\n </span>\n </div>\n <div className=\"flex flex-col items-center gap-3 shrink-0\">\n <ScoreRing score={theirs} />\n <span\n className=\"text-[10px] font-medium uppercase tracking-wider\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n {platformLabel}\n </span>\n </div>\n\n {/* Details */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-2\">\n <h3\n className=\"text-base font-semibold\"\n style={{ color: 'var(--sk-text-primary, #ffffff)' }}\n >\n {cat.label}\n </h3>\n {diff > 0 && (\n <span\n className=\"text-xs font-bold px-2 py-0.5 rounded-full\"\n style={{\n background: 'color-mix(in srgb, #10b981 15%, transparent)',\n color: '#10b981',\n }}\n >\n +{diff} pts\n </span>\n )}\n </div>\n <p\n className=\"text-sm leading-relaxed\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n {cat.why}\n </p>\n </div>\n </div>\n </GlassCard>\n </ScrollReveal>\n );\n })}\n </div>\n </div>\n </section>\n );\n}\n"]}
|