@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,349 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkIKBK7HYX_cjs = require('./chunk-IKBK7HYX.cjs');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
var gsap = require('gsap');
|
|
6
|
+
var ScrollTrigger = require('gsap/ScrollTrigger');
|
|
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 getBranchColor(index) {
|
|
14
|
+
const hues = [
|
|
15
|
+
"var(--sk-primary, #6366f1)",
|
|
16
|
+
"#10b981",
|
|
17
|
+
"#f59e0b",
|
|
18
|
+
"#8b5cf6",
|
|
19
|
+
"#ec4899",
|
|
20
|
+
"#06b6d4",
|
|
21
|
+
"#f97316",
|
|
22
|
+
"#14b8a6"
|
|
23
|
+
];
|
|
24
|
+
return hues[index % hues.length];
|
|
25
|
+
}
|
|
26
|
+
function SiteArchitectureSection({ data }) {
|
|
27
|
+
const { totalPages, totalWords, groups } = data;
|
|
28
|
+
const treeRef = react.useRef(null);
|
|
29
|
+
react.useRef(null);
|
|
30
|
+
const [expandedGroup, setExpandedGroup] = react.useState(null);
|
|
31
|
+
react.useEffect(() => {
|
|
32
|
+
gsap__default.default.registerPlugin(ScrollTrigger.ScrollTrigger);
|
|
33
|
+
const ctx = gsap__default.default.context(() => {
|
|
34
|
+
gsap__default.default.utils.toArray(".arch-node").forEach((node, i) => {
|
|
35
|
+
gsap__default.default.fromTo(
|
|
36
|
+
node,
|
|
37
|
+
{ opacity: 0, scale: 0.8, y: 20 },
|
|
38
|
+
{
|
|
39
|
+
opacity: 1,
|
|
40
|
+
scale: 1,
|
|
41
|
+
y: 0,
|
|
42
|
+
duration: 0.5,
|
|
43
|
+
delay: i * 0.08,
|
|
44
|
+
ease: "back.out(1.4)",
|
|
45
|
+
scrollTrigger: {
|
|
46
|
+
trigger: treeRef.current,
|
|
47
|
+
start: "top 70%",
|
|
48
|
+
toggleActions: "play none none none"
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
);
|
|
52
|
+
});
|
|
53
|
+
gsap__default.default.utils.toArray(".arch-line").forEach((line, i) => {
|
|
54
|
+
const length = line.getTotalLength();
|
|
55
|
+
gsap__default.default.set(line, { strokeDasharray: length, strokeDashoffset: length });
|
|
56
|
+
gsap__default.default.to(line, {
|
|
57
|
+
strokeDashoffset: 0,
|
|
58
|
+
duration: 0.6,
|
|
59
|
+
delay: i * 0.1,
|
|
60
|
+
ease: "power2.out",
|
|
61
|
+
scrollTrigger: {
|
|
62
|
+
trigger: treeRef.current,
|
|
63
|
+
start: "top 70%",
|
|
64
|
+
toggleActions: "play none none none"
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
return () => ctx.revert();
|
|
70
|
+
}, [groups.length]);
|
|
71
|
+
const hasWords = totalWords > 0;
|
|
72
|
+
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"}.`;
|
|
73
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
74
|
+
"section",
|
|
75
|
+
{
|
|
76
|
+
className: "w-full py-20 md:py-28",
|
|
77
|
+
style: { background: "var(--sk-bg, #0a0a0a)" },
|
|
78
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-6xl mx-auto px-6", children: [
|
|
79
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkIKBK7HYX_cjs.ScrollReveal, { y: 30, children: [
|
|
80
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
81
|
+
"h2",
|
|
82
|
+
{
|
|
83
|
+
className: "text-3xl md:text-4xl font-bold mb-4",
|
|
84
|
+
style: {
|
|
85
|
+
color: "var(--sk-text-primary, #ffffff)",
|
|
86
|
+
fontFamily: "var(--sk-font-heading, inherit)"
|
|
87
|
+
},
|
|
88
|
+
children: "Site Architecture"
|
|
89
|
+
}
|
|
90
|
+
),
|
|
91
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
92
|
+
"p",
|
|
93
|
+
{
|
|
94
|
+
className: "text-lg mb-16 max-w-3xl",
|
|
95
|
+
style: { color: "var(--sk-text-secondary, #a1a1aa)" },
|
|
96
|
+
children: subtitle
|
|
97
|
+
}
|
|
98
|
+
)
|
|
99
|
+
] }),
|
|
100
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { ref: treeRef, className: "relative", children: [
|
|
101
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center mb-8", children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
102
|
+
"div",
|
|
103
|
+
{
|
|
104
|
+
className: "arch-node relative px-6 py-3 rounded-xl text-center",
|
|
105
|
+
style: {
|
|
106
|
+
background: "color-mix(in srgb, var(--sk-primary, #6366f1) 15%, var(--sk-bg, #0a0a0a))",
|
|
107
|
+
border: "2px solid var(--sk-primary, #6366f1)",
|
|
108
|
+
boxShadow: "0 0 30px color-mix(in srgb, var(--sk-primary, #6366f1) 20%, transparent)"
|
|
109
|
+
},
|
|
110
|
+
children: [
|
|
111
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
112
|
+
"span",
|
|
113
|
+
{
|
|
114
|
+
className: "text-sm font-bold tracking-wide",
|
|
115
|
+
style: { color: "var(--sk-primary, #6366f1)" },
|
|
116
|
+
children: "/"
|
|
117
|
+
}
|
|
118
|
+
),
|
|
119
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
120
|
+
"span",
|
|
121
|
+
{
|
|
122
|
+
className: "block text-xs mt-0.5",
|
|
123
|
+
style: { color: "var(--sk-text-tertiary, #71717a)" },
|
|
124
|
+
children: [
|
|
125
|
+
totalPages,
|
|
126
|
+
" pages"
|
|
127
|
+
]
|
|
128
|
+
}
|
|
129
|
+
)
|
|
130
|
+
]
|
|
131
|
+
}
|
|
132
|
+
) }),
|
|
133
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4", children: groups.map((group, gi) => {
|
|
134
|
+
const color = getBranchColor(gi);
|
|
135
|
+
const isExpanded = expandedGroup === gi;
|
|
136
|
+
const hasChildren = group.pages.length > 0;
|
|
137
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
138
|
+
"div",
|
|
139
|
+
{
|
|
140
|
+
className: "arch-node flex flex-col",
|
|
141
|
+
children: [
|
|
142
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
143
|
+
"div",
|
|
144
|
+
{
|
|
145
|
+
className: "w-px h-6 mx-auto mb-2",
|
|
146
|
+
style: {
|
|
147
|
+
background: `linear-gradient(to bottom, color-mix(in srgb, ${color} 40%, transparent), ${color})`
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
),
|
|
151
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
152
|
+
"button",
|
|
153
|
+
{
|
|
154
|
+
onClick: () => hasChildren && setExpandedGroup(isExpanded ? null : gi),
|
|
155
|
+
className: "relative rounded-xl p-4 text-left transition-all duration-300 cursor-pointer group",
|
|
156
|
+
style: {
|
|
157
|
+
background: `color-mix(in srgb, ${color} 8%, var(--sk-bg, #0a0a0a))`,
|
|
158
|
+
border: `1.5px solid color-mix(in srgb, ${color} ${isExpanded ? "40" : "20"}%, transparent)`,
|
|
159
|
+
boxShadow: isExpanded ? `0 0 20px color-mix(in srgb, ${color} 15%, transparent)` : "none"
|
|
160
|
+
},
|
|
161
|
+
children: [
|
|
162
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
163
|
+
"div",
|
|
164
|
+
{
|
|
165
|
+
className: "absolute -top-2.5 -right-2 px-2 py-0.5 rounded-full text-xs font-bold",
|
|
166
|
+
style: {
|
|
167
|
+
background: color,
|
|
168
|
+
color: "#000",
|
|
169
|
+
boxShadow: `0 0 10px color-mix(in srgb, ${color} 40%, transparent)`
|
|
170
|
+
},
|
|
171
|
+
children: group.count
|
|
172
|
+
}
|
|
173
|
+
),
|
|
174
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
175
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
176
|
+
"div",
|
|
177
|
+
{
|
|
178
|
+
className: "w-2 h-2 rounded-full shrink-0",
|
|
179
|
+
style: { background: color }
|
|
180
|
+
}
|
|
181
|
+
),
|
|
182
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
183
|
+
"span",
|
|
184
|
+
{
|
|
185
|
+
className: "text-sm font-semibold truncate",
|
|
186
|
+
style: { color: "var(--sk-text-primary, #ffffff)" },
|
|
187
|
+
children: group.label
|
|
188
|
+
}
|
|
189
|
+
)
|
|
190
|
+
] }),
|
|
191
|
+
hasChildren && /* @__PURE__ */ jsxRuntime.jsx(
|
|
192
|
+
"span",
|
|
193
|
+
{
|
|
194
|
+
className: "text-[10px] mt-1 block transition-colors",
|
|
195
|
+
style: { color: "var(--sk-text-tertiary, #71717a)" },
|
|
196
|
+
children: isExpanded ? "click to collapse" : `${group.count} ${group.count === 1 ? "page" : "pages"} \u2014 click to expand`
|
|
197
|
+
}
|
|
198
|
+
)
|
|
199
|
+
]
|
|
200
|
+
}
|
|
201
|
+
),
|
|
202
|
+
isExpanded && hasChildren && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
203
|
+
"div",
|
|
204
|
+
{
|
|
205
|
+
className: "mt-2 rounded-lg overflow-hidden",
|
|
206
|
+
style: {
|
|
207
|
+
background: `color-mix(in srgb, ${color} 5%, var(--sk-bg, #0a0a0a))`,
|
|
208
|
+
border: `1px solid color-mix(in srgb, ${color} 15%, transparent)`
|
|
209
|
+
},
|
|
210
|
+
children: [
|
|
211
|
+
group.pages.map((page, pi) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
212
|
+
"div",
|
|
213
|
+
{
|
|
214
|
+
className: "flex items-center gap-2 px-3 py-1.5",
|
|
215
|
+
style: {
|
|
216
|
+
borderBottom: pi < group.pages.length - 1 ? `1px solid color-mix(in srgb, ${color} 8%, transparent)` : "none"
|
|
217
|
+
},
|
|
218
|
+
children: [
|
|
219
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
220
|
+
"div",
|
|
221
|
+
{
|
|
222
|
+
className: "w-1 h-1 rounded-full shrink-0",
|
|
223
|
+
style: { background: color, opacity: 0.5 }
|
|
224
|
+
}
|
|
225
|
+
),
|
|
226
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
227
|
+
"span",
|
|
228
|
+
{
|
|
229
|
+
className: "text-xs truncate",
|
|
230
|
+
style: { color: "var(--sk-text-tertiary, #71717a)" },
|
|
231
|
+
title: page.title || page.path,
|
|
232
|
+
children: page.title || page.path
|
|
233
|
+
}
|
|
234
|
+
)
|
|
235
|
+
]
|
|
236
|
+
},
|
|
237
|
+
pi
|
|
238
|
+
)),
|
|
239
|
+
group.count > group.pages.length && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
240
|
+
"div",
|
|
241
|
+
{
|
|
242
|
+
className: "px-3 py-1.5 text-xs italic",
|
|
243
|
+
style: { color: "var(--sk-text-tertiary, #71717a)", opacity: 0.6 },
|
|
244
|
+
children: [
|
|
245
|
+
"+",
|
|
246
|
+
group.count - group.pages.length,
|
|
247
|
+
" more pages"
|
|
248
|
+
]
|
|
249
|
+
}
|
|
250
|
+
)
|
|
251
|
+
]
|
|
252
|
+
}
|
|
253
|
+
)
|
|
254
|
+
]
|
|
255
|
+
},
|
|
256
|
+
gi
|
|
257
|
+
);
|
|
258
|
+
}) })
|
|
259
|
+
] }),
|
|
260
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkIKBK7HYX_cjs.ScrollReveal, { y: 20, delay: 0.4, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
261
|
+
"div",
|
|
262
|
+
{
|
|
263
|
+
className: "mt-12 flex items-center justify-center gap-8 md:gap-12 py-4 px-6 rounded-xl mx-auto max-w-2xl",
|
|
264
|
+
style: {
|
|
265
|
+
background: "color-mix(in srgb, var(--sk-primary, #6366f1) 5%, var(--sk-bg, #0a0a0a))",
|
|
266
|
+
border: "1px solid color-mix(in srgb, var(--sk-primary, #6366f1) 15%, transparent)"
|
|
267
|
+
},
|
|
268
|
+
children: [
|
|
269
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center", children: [
|
|
270
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
271
|
+
"span",
|
|
272
|
+
{
|
|
273
|
+
className: "text-2xl font-bold block",
|
|
274
|
+
style: { color: "var(--sk-primary, #6366f1)" },
|
|
275
|
+
children: totalPages
|
|
276
|
+
}
|
|
277
|
+
),
|
|
278
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
279
|
+
"span",
|
|
280
|
+
{
|
|
281
|
+
className: "text-[10px] uppercase tracking-wider block mt-0.5",
|
|
282
|
+
style: { color: "var(--sk-text-tertiary, #71717a)" },
|
|
283
|
+
children: "Pages"
|
|
284
|
+
}
|
|
285
|
+
)
|
|
286
|
+
] }),
|
|
287
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
288
|
+
"div",
|
|
289
|
+
{
|
|
290
|
+
className: "w-px h-8",
|
|
291
|
+
style: { background: "color-mix(in srgb, var(--sk-text-tertiary, #71717a) 20%, transparent)" }
|
|
292
|
+
}
|
|
293
|
+
),
|
|
294
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center", children: [
|
|
295
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
296
|
+
"span",
|
|
297
|
+
{
|
|
298
|
+
className: "text-2xl font-bold block",
|
|
299
|
+
style: { color: "var(--sk-primary, #6366f1)" },
|
|
300
|
+
children: groups.length
|
|
301
|
+
}
|
|
302
|
+
),
|
|
303
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
304
|
+
"span",
|
|
305
|
+
{
|
|
306
|
+
className: "text-[10px] uppercase tracking-wider block mt-0.5",
|
|
307
|
+
style: { color: "var(--sk-text-tertiary, #71717a)" },
|
|
308
|
+
children: "Categories"
|
|
309
|
+
}
|
|
310
|
+
)
|
|
311
|
+
] }),
|
|
312
|
+
hasWords && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
313
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
314
|
+
"div",
|
|
315
|
+
{
|
|
316
|
+
className: "w-px h-8",
|
|
317
|
+
style: { background: "color-mix(in srgb, var(--sk-text-tertiary, #71717a) 20%, transparent)" }
|
|
318
|
+
}
|
|
319
|
+
),
|
|
320
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center", children: [
|
|
321
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
322
|
+
"span",
|
|
323
|
+
{
|
|
324
|
+
className: "text-2xl font-bold block",
|
|
325
|
+
style: { color: "var(--sk-primary, #6366f1)" },
|
|
326
|
+
children: totalWords > 1e3 ? `${(totalWords / 1e3).toFixed(0)}k` : totalWords
|
|
327
|
+
}
|
|
328
|
+
),
|
|
329
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
330
|
+
"span",
|
|
331
|
+
{
|
|
332
|
+
className: "text-[10px] uppercase tracking-wider block mt-0.5",
|
|
333
|
+
style: { color: "var(--sk-text-tertiary, #71717a)" },
|
|
334
|
+
children: "Words"
|
|
335
|
+
}
|
|
336
|
+
)
|
|
337
|
+
] })
|
|
338
|
+
] })
|
|
339
|
+
]
|
|
340
|
+
}
|
|
341
|
+
) })
|
|
342
|
+
] })
|
|
343
|
+
}
|
|
344
|
+
);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
module.exports = SiteArchitectureSection;
|
|
348
|
+
//# sourceMappingURL=SiteArchitectureSection-EE6VQSXM.cjs.map
|
|
349
|
+
//# sourceMappingURL=SiteArchitectureSection-EE6VQSXM.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/portfolio/components/sections/SiteArchitectureSection.tsx"],"names":["useRef","useState","useEffect","gsap","ScrollTrigger","jsx","jsxs","ScrollReveal","Fragment"],"mappings":"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","file":"SiteArchitectureSection-EE6VQSXM.cjs","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"]}
|