@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.
Files changed (89) hide show
  1. package/dist/{BeforeAfterSection-6QUJOBO2.js → BeforeAfterSection-6BHFLY4Y.js} +6 -6
  2. package/dist/BeforeAfterSection-6BHFLY4Y.js.map +1 -0
  3. package/dist/{BeforeAfterSection-DVAWWE4K.cjs → BeforeAfterSection-JTORBR3A.cjs} +6 -6
  4. package/dist/BeforeAfterSection-JTORBR3A.cjs.map +1 -0
  5. package/dist/DesignSystemSection-2R5BRBGO.js +172 -0
  6. package/dist/DesignSystemSection-2R5BRBGO.js.map +1 -0
  7. package/dist/DesignSystemSection-KXIQXITF.cjs +174 -0
  8. package/dist/DesignSystemSection-KXIQXITF.cjs.map +1 -0
  9. package/dist/{DetailsSection-FB763FS7.js → DetailsSection-A6PZQUQL.js} +14 -5
  10. package/dist/DetailsSection-A6PZQUQL.js.map +1 -0
  11. package/dist/{DetailsSection-OACJFGH7.cjs → DetailsSection-TTUZAPZZ.cjs} +14 -5
  12. package/dist/DetailsSection-TTUZAPZZ.cjs.map +1 -0
  13. package/dist/PerformanceSection-24TVVFZA.cjs +356 -0
  14. package/dist/PerformanceSection-24TVVFZA.cjs.map +1 -0
  15. package/dist/PerformanceSection-MGCEIXDX.js +351 -0
  16. package/dist/PerformanceSection-MGCEIXDX.js.map +1 -0
  17. package/dist/SiteArchitectureSection-EE6VQSXM.cjs +349 -0
  18. package/dist/SiteArchitectureSection-EE6VQSXM.cjs.map +1 -0
  19. package/dist/SiteArchitectureSection-PBBRTARV.js +344 -0
  20. package/dist/SiteArchitectureSection-PBBRTARV.js.map +1 -0
  21. package/dist/SpeedComparisonSection-EZKFQVGW.cjs +174 -0
  22. package/dist/SpeedComparisonSection-EZKFQVGW.cjs.map +1 -0
  23. package/dist/SpeedComparisonSection-Y3K7OFZQ.js +172 -0
  24. package/dist/SpeedComparisonSection-Y3K7OFZQ.js.map +1 -0
  25. package/dist/{StrategySection-3ED3QW4R.cjs → StrategySection-CJ7Y6OFQ.cjs} +18 -24
  26. package/dist/StrategySection-CJ7Y6OFQ.cjs.map +1 -0
  27. package/dist/{StrategySection-VUWMIYYP.js → StrategySection-DI5RSCJU.js} +18 -24
  28. package/dist/StrategySection-DI5RSCJU.js.map +1 -0
  29. package/dist/TechStackSection-2AQ7RGY3.js +93 -0
  30. package/dist/TechStackSection-2AQ7RGY3.js.map +1 -0
  31. package/dist/TechStackSection-VTNNZR5V.cjs +95 -0
  32. package/dist/TechStackSection-VTNNZR5V.cjs.map +1 -0
  33. package/dist/{chunk-XMC4DN6G.js → chunk-APG2QSMB.js} +8 -8
  34. package/dist/chunk-APG2QSMB.js.map +1 -0
  35. package/dist/chunk-JTI3F3QY.cjs +619 -0
  36. package/dist/chunk-JTI3F3QY.cjs.map +1 -0
  37. package/dist/{chunk-NAS4K5UR.cjs → chunk-OA5ZM4OA.cjs} +8 -8
  38. package/dist/chunk-OA5ZM4OA.cjs.map +1 -0
  39. package/dist/{chunk-QIC6JFFD.js → chunk-OMOF4VR5.js} +14 -14
  40. package/dist/chunk-OMOF4VR5.js.map +1 -0
  41. package/dist/chunk-RLVW7WEK.js +612 -0
  42. package/dist/chunk-RLVW7WEK.js.map +1 -0
  43. package/dist/{chunk-5FKOLIV6.cjs → chunk-XM2QD3AK.cjs} +14 -14
  44. package/dist/chunk-XM2QD3AK.cjs.map +1 -0
  45. package/dist/index.cjs +13 -13
  46. package/dist/index.d.cts +2 -2
  47. package/dist/index.d.ts +2 -2
  48. package/dist/index.js +3 -3
  49. package/dist/layout/index.cjs +2 -2
  50. package/dist/layout/index.d.cts +1 -1
  51. package/dist/layout/index.d.ts +1 -1
  52. package/dist/layout/index.js +1 -1
  53. package/dist/portfolio/client.cjs +3 -3
  54. package/dist/portfolio/client.d.cts +7 -3
  55. package/dist/portfolio/client.d.ts +7 -3
  56. package/dist/portfolio/client.js +1 -1
  57. package/dist/portfolio/index.cjs +6 -6
  58. package/dist/portfolio/index.d.cts +2 -2
  59. package/dist/portfolio/index.d.ts +2 -2
  60. package/dist/portfolio/index.js +2 -2
  61. package/dist/portfolio/sections.d.cts +1 -1
  62. package/dist/portfolio/sections.d.ts +1 -1
  63. package/dist/portfolio/server.cjs +1 -0
  64. package/dist/portfolio/server.cjs.map +1 -1
  65. package/dist/portfolio/server.d.cts +1 -1
  66. package/dist/portfolio/server.d.ts +1 -1
  67. package/dist/portfolio/server.js +1 -0
  68. package/dist/portfolio/server.js.map +1 -1
  69. package/dist/{types-BMUhBhWx.d.cts → types-DL4t_Cfa.d.cts} +3 -1
  70. package/dist/{types-BMUhBhWx.d.ts → types-DL4t_Cfa.d.ts} +3 -1
  71. package/package.json +1 -1
  72. package/dist/BeforeAfterSection-6QUJOBO2.js.map +0 -1
  73. package/dist/BeforeAfterSection-DVAWWE4K.cjs.map +0 -1
  74. package/dist/DetailsSection-FB763FS7.js.map +0 -1
  75. package/dist/DetailsSection-OACJFGH7.cjs.map +0 -1
  76. package/dist/StrategySection-3ED3QW4R.cjs.map +0 -1
  77. package/dist/StrategySection-VUWMIYYP.js.map +0 -1
  78. package/dist/TechStackSection-OCUYG4XT.js +0 -90
  79. package/dist/TechStackSection-OCUYG4XT.js.map +0 -1
  80. package/dist/TechStackSection-VKJK4KQB.cjs +0 -91
  81. package/dist/TechStackSection-VKJK4KQB.cjs.map +0 -1
  82. package/dist/chunk-2VNNFAG6.js +0 -415
  83. package/dist/chunk-2VNNFAG6.js.map +0 -1
  84. package/dist/chunk-5FKOLIV6.cjs.map +0 -1
  85. package/dist/chunk-NAS4K5UR.cjs.map +0 -1
  86. package/dist/chunk-QIC6JFFD.js.map +0 -1
  87. package/dist/chunk-TAPNXT7X.cjs +0 -422
  88. package/dist/chunk-TAPNXT7X.cjs.map +0 -1
  89. 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"]}