portable-agent-layer 0.30.1 → 0.32.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 (58) hide show
  1. package/assets/skills/consulting-report/SKILL.md +74 -74
  2. package/assets/skills/consulting-report/demo/app/globals.css +459 -0
  3. package/assets/skills/consulting-report/demo/app/layout.tsx +32 -0
  4. package/assets/skills/consulting-report/demo/app/page.tsx +302 -0
  5. package/assets/skills/consulting-report/demo/bun.lock +240 -0
  6. package/assets/skills/consulting-report/demo/components/callout.tsx +13 -0
  7. package/assets/skills/consulting-report/demo/components/comparison-table.tsx +40 -0
  8. package/assets/skills/consulting-report/demo/components/cover-page.tsx +34 -0
  9. package/assets/skills/consulting-report/demo/components/exhibit.tsx +21 -0
  10. package/assets/skills/consulting-report/demo/components/finding-card.tsx +28 -0
  11. package/assets/skills/consulting-report/demo/components/quote-block.tsx +17 -0
  12. package/assets/skills/consulting-report/demo/components/recommendation-card.tsx +52 -0
  13. package/assets/skills/consulting-report/demo/components/section.tsx +17 -0
  14. package/assets/skills/consulting-report/demo/components/severity-badge.tsx +19 -0
  15. package/assets/skills/consulting-report/demo/components/stat-grid.tsx +26 -0
  16. package/assets/skills/consulting-report/demo/components/table-of-contents.tsx +27 -0
  17. package/assets/skills/consulting-report/demo/components/timeline.tsx +20 -0
  18. package/assets/skills/consulting-report/demo/lib/report-data.ts +247 -0
  19. package/assets/skills/consulting-report/demo/lib/utils.ts +6 -0
  20. package/assets/skills/consulting-report/demo/next.config.js +9 -0
  21. package/assets/skills/consulting-report/demo/package.json +27 -0
  22. package/assets/skills/consulting-report/demo/postcss.config.mjs +5 -0
  23. package/assets/skills/consulting-report/demo/tsconfig.json +41 -0
  24. package/assets/skills/consulting-report/template/app/globals.css +459 -0
  25. package/assets/skills/consulting-report/template/app/layout.tsx +32 -0
  26. package/assets/skills/consulting-report/template/app/page.tsx +282 -0
  27. package/assets/skills/consulting-report/template/bun.lock +240 -0
  28. package/assets/skills/consulting-report/template/components/callout.tsx +13 -0
  29. package/assets/skills/consulting-report/template/components/comparison-table.tsx +40 -0
  30. package/assets/skills/consulting-report/template/components/cover-page.tsx +34 -0
  31. package/assets/skills/consulting-report/template/components/exhibit.tsx +21 -0
  32. package/assets/skills/consulting-report/template/components/finding-card.tsx +28 -0
  33. package/assets/skills/consulting-report/template/components/quote-block.tsx +17 -0
  34. package/assets/skills/consulting-report/template/components/recommendation-card.tsx +52 -0
  35. package/assets/skills/consulting-report/template/components/section.tsx +17 -0
  36. package/assets/skills/consulting-report/template/components/severity-badge.tsx +19 -0
  37. package/assets/skills/consulting-report/template/components/stat-grid.tsx +26 -0
  38. package/assets/skills/consulting-report/template/components/table-of-contents.tsx +27 -0
  39. package/assets/skills/consulting-report/template/components/timeline.tsx +20 -0
  40. package/assets/skills/consulting-report/template/lib/report-data.ts +176 -0
  41. package/assets/skills/consulting-report/template/lib/utils.ts +6 -0
  42. package/assets/skills/consulting-report/template/next.config.js +9 -0
  43. package/assets/skills/consulting-report/template/package.json +27 -0
  44. package/assets/skills/consulting-report/template/postcss.config.mjs +5 -0
  45. package/assets/skills/consulting-report/template/tsconfig.json +27 -0
  46. package/assets/skills/consulting-report/tools/dev.ts +47 -0
  47. package/assets/skills/consulting-report/tools/generate-pdf.ts +140 -408
  48. package/assets/skills/consulting-report/tools/scaffold.ts +83 -48
  49. package/assets/skills/presentation/SKILL.md +1 -1
  50. package/package.json +9 -9
  51. package/assets/skills/consulting-report/demo/content/current-state.md +0 -33
  52. package/assets/skills/consulting-report/demo/content/executive-summary.md +0 -19
  53. package/assets/skills/consulting-report/demo/content/report-data.ts +0 -101
  54. package/assets/skills/consulting-report/demo/diagrams/.gitkeep +0 -0
  55. package/assets/skills/consulting-report/template/README.md +0 -28
  56. package/assets/skills/consulting-report/template/content/executive-summary.md +0 -19
  57. package/assets/skills/consulting-report/template/content/report-data.ts +0 -59
  58. package/assets/skills/consulting-report/template/diagrams/.gitkeep +0 -0
@@ -0,0 +1,282 @@
1
+ import { AlertTriangle, CheckCircle2, Lightbulb, Target } from "lucide-react";
2
+ import { Callout } from "@/components/callout";
3
+ import { ComparisonTable } from "@/components/comparison-table";
4
+ import { CoverPage } from "@/components/cover-page";
5
+ import { Exhibit } from "@/components/exhibit";
6
+ import { FindingCard } from "@/components/finding-card";
7
+ import { RecommendationCard } from "@/components/recommendation-card";
8
+ import { Section } from "@/components/section";
9
+ import { StatGrid } from "@/components/stat-grid";
10
+ import { TableOfContents } from "@/components/table-of-contents";
11
+ import { Timeline } from "@/components/timeline";
12
+ import { reportData } from "@/lib/report-data";
13
+
14
+ const sections = [
15
+ { id: "executive-summary", title: "Executive Summary" },
16
+ { id: "situation-assessment", title: "Situation Assessment" },
17
+ { id: "key-findings", title: "Key Findings" },
18
+ { id: "risk-analysis", title: "Risk Analysis" },
19
+ { id: "strategic-opportunity", title: "Strategic Opportunity" },
20
+ { id: "recommendations", title: "Strategic Recommendations" },
21
+ { id: "target-state", title: "Target State Vision" },
22
+ { id: "roadmap", title: "Implementation Roadmap" },
23
+ { id: "call-to-action", title: "Call to Action" },
24
+ ];
25
+
26
+ export default function ReportPage() {
27
+ const data = reportData;
28
+
29
+ return (
30
+ <div>
31
+ <CoverPage
32
+ clientName={data.clientName}
33
+ reportTitle={data.reportTitle}
34
+ reportDate={data.reportDate}
35
+ classification={data.classification}
36
+ consultancyName={data.consultancyName}
37
+ preTitle={data.preTitle}
38
+ />
39
+
40
+ <div className="report-container">
41
+ <TableOfContents items={sections} />
42
+
43
+ <Section id="executive-summary" title="Executive Summary">
44
+ <p className="text-lg mb-6">{data.executiveSummary.context}</p>
45
+
46
+ <StatGrid
47
+ stats={[
48
+ {
49
+ value: String(data.executiveSummary.methodology.interviewCount),
50
+ label: "Interviews",
51
+ },
52
+ { value: "—", label: "Headline metric", caption: "replace with your own" },
53
+ { value: "—", label: "Headline metric", caption: "replace with your own" },
54
+ ]}
55
+ />
56
+
57
+ <Exhibit number={1} title="Roles Interviewed">
58
+ <div className="grid grid-cols-2 gap-1">
59
+ {data.executiveSummary.methodology.roles.map((role) => (
60
+ <p key={role} className="text-sm text-muted">
61
+ {role}
62
+ </p>
63
+ ))}
64
+ </div>
65
+ </Exhibit>
66
+
67
+ <Exhibit number={2} title="Key Findings Summary">
68
+ <ul className="space-y-2">
69
+ {data.executiveSummary.keyFindings.map((finding, i) => (
70
+ <li key={finding} className="flex items-start gap-3">
71
+ <span className="text-primary font-bold font-sans">{i + 1}.</span>
72
+ <span>{finding}</span>
73
+ </li>
74
+ ))}
75
+ </ul>
76
+ </Exhibit>
77
+
78
+ <Callout label="Primary Recommendation">
79
+ {data.executiveSummary.primaryRecommendation}
80
+ </Callout>
81
+
82
+ <h3 className="text-lg font-semibold mt-6 mb-3">Expected Outcomes</h3>
83
+ <ul className="space-y-2">
84
+ {data.executiveSummary.expectedOutcomes.map((outcome) => (
85
+ <li key={outcome} className="flex items-center gap-3">
86
+ <CheckCircle2 className="h-5 w-5 text-success shrink-0" />
87
+ <span>{outcome}</span>
88
+ </li>
89
+ ))}
90
+ </ul>
91
+ </Section>
92
+
93
+ <Section id="situation-assessment" title="Situation Assessment">
94
+ <div className="grid gap-6">
95
+ <div>
96
+ <h3 className="text-lg font-semibold mb-2 flex items-center gap-2">
97
+ <Target className="h-5 w-5 text-primary" />
98
+ What You Asked For
99
+ </h3>
100
+ <p>{data.situationAssessment.clientAsk}</p>
101
+ </div>
102
+ <div>
103
+ <h3 className="text-lg font-semibold mb-2">Current State</h3>
104
+ <p>{data.situationAssessment.currentState}</p>
105
+ </div>
106
+ <div>
107
+ <h3 className="text-lg font-semibold mb-2">Why This Matters Now</h3>
108
+ <p>{data.situationAssessment.whyNow}</p>
109
+ </div>
110
+ </div>
111
+ </Section>
112
+
113
+ <Section id="key-findings" title="Key Findings">
114
+ <p className="text-muted mb-6">
115
+ Our analysis identified {data.findings.length} significant findings that
116
+ require attention. Each finding is supported by evidence gathered during our
117
+ assessment.
118
+ </p>
119
+ <div className="space-y-4">
120
+ {data.findings.map((finding, index) => (
121
+ <FindingCard key={finding.id} finding={finding} index={index} />
122
+ ))}
123
+ </div>
124
+ </Section>
125
+
126
+ <Section id="risk-analysis" title="Risk Analysis">
127
+ <div className="grid gap-6">
128
+ <Exhibit number={3} title="Existential Risks">
129
+ <div className="space-y-3">
130
+ {data.riskAnalysis.existentialRisks.map((risk) => (
131
+ <div
132
+ key={risk}
133
+ className="flex items-start gap-3 p-3 bg-destructive/5 rounded-lg border border-destructive/20"
134
+ >
135
+ <AlertTriangle className="h-5 w-5 text-destructive shrink-0 mt-0.5" />
136
+ <span>{risk}</span>
137
+ </div>
138
+ ))}
139
+ </div>
140
+ </Exhibit>
141
+
142
+ <Exhibit number={4} title="Competitive Threats">
143
+ <ul className="space-y-2">
144
+ {data.riskAnalysis.competitiveThreats.map((threat, i) => (
145
+ <li key={threat} className="flex items-start gap-3">
146
+ <span className="text-warning font-bold font-sans">{i + 1}.</span>
147
+ <span>{threat}</span>
148
+ </li>
149
+ ))}
150
+ </ul>
151
+ </Exhibit>
152
+
153
+ <div>
154
+ <h3 className="text-lg font-semibold mb-2">Timeline Pressures</h3>
155
+ <p>{data.riskAnalysis.timelinePressures}</p>
156
+ </div>
157
+ </div>
158
+ </Section>
159
+
160
+ <Section id="strategic-opportunity" title="Strategic Opportunity">
161
+ <Callout label="The Path Forward">{data.strategicOpportunity.goodNews}</Callout>
162
+
163
+ <h3 className="text-lg font-semibold mt-6 mb-3 flex items-center gap-2">
164
+ <Lightbulb className="h-5 w-5 text-accent" />
165
+ What This Requires
166
+ </h3>
167
+ <ul className="space-y-3">
168
+ {data.strategicOpportunity.requirements.map((req, i) => (
169
+ <li
170
+ key={req}
171
+ className="flex items-start gap-3 p-3 bg-accent/5 rounded-lg border border-accent/20"
172
+ >
173
+ <span className="text-accent font-bold font-sans">{i + 1}.</span>
174
+ <span>{req}</span>
175
+ </li>
176
+ ))}
177
+ </ul>
178
+ </Section>
179
+
180
+ <Section id="recommendations" title="Strategic Recommendations">
181
+ <p className="text-muted mb-6">
182
+ Recommendations are prioritized by urgency and impact.
183
+ </p>
184
+ <div className="space-y-4">
185
+ {data.recommendations.map((rec, index) => (
186
+ <RecommendationCard key={rec.id} recommendation={rec} index={index} />
187
+ ))}
188
+ </div>
189
+ </Section>
190
+
191
+ <Section id="target-state" title="Target State Vision">
192
+ <p className="text-lg mb-6">{data.targetState.description}</p>
193
+
194
+ <ComparisonTable
195
+ leftLabel="Today"
196
+ rightLabel="Target"
197
+ rows={[
198
+ {
199
+ metric: "Replace with metric",
200
+ left: "Current state value",
201
+ right: "Target state value",
202
+ },
203
+ ]}
204
+ />
205
+
206
+ <Exhibit number={5} title="Key Capabilities Enabled">
207
+ <div className="grid md:grid-cols-3 gap-4">
208
+ {data.targetState.keyCapabilities.map((capability) => (
209
+ <div
210
+ key={capability}
211
+ className="p-4 bg-success/5 rounded-lg border border-success/20 text-center"
212
+ >
213
+ <CheckCircle2 className="h-8 w-8 text-success mx-auto mb-2" />
214
+ <span className="font-medium">{capability}</span>
215
+ </div>
216
+ ))}
217
+ </div>
218
+ </Exhibit>
219
+
220
+ <h3 className="text-lg font-semibold mt-6 mb-3">Success Metrics</h3>
221
+ <ul className="space-y-2">
222
+ {data.targetState.successMetrics.map((metric) => (
223
+ <li key={metric} className="flex items-center gap-3">
224
+ <span className="w-2 h-2 bg-primary rounded-full" />
225
+ <span>{metric}</span>
226
+ </li>
227
+ ))}
228
+ </ul>
229
+ </Section>
230
+
231
+ <Section id="roadmap" title="Implementation Roadmap">
232
+ <p className="text-muted mb-6">
233
+ The transformation should be executed in phases, with clear milestones and
234
+ decision points.
235
+ </p>
236
+ <Exhibit number={6} title="Phased Implementation Plan">
237
+ <Timeline phases={data.roadmap} />
238
+ </Exhibit>
239
+ </Section>
240
+
241
+ <Section id="call-to-action" title="Call to Action">
242
+ <div className="bg-primary/5 rounded-2xl p-8 border border-primary/20">
243
+ <h3 className="text-xl font-semibold mb-4">Immediate Next Steps</h3>
244
+ <ol className="space-y-3 mb-6">
245
+ {data.callToAction.immediateSteps.map((step, i) => (
246
+ <li key={step} className="flex items-start gap-3">
247
+ <span className="shrink-0 w-7 h-7 rounded-full bg-primary text-white flex items-center justify-center font-bold text-sm">
248
+ {i + 1}
249
+ </span>
250
+ <span className="pt-0.5">{step}</span>
251
+ </li>
252
+ ))}
253
+ </ol>
254
+
255
+ <h3 className="text-xl font-semibold mb-4">Decision Points Required</h3>
256
+ <ul className="space-y-2 mb-6">
257
+ {data.callToAction.decisionPoints.map((point) => (
258
+ <li key={point} className="flex items-center gap-3">
259
+ <span className="w-2 h-2 bg-accent rounded-full" />
260
+ <span>{point}</span>
261
+ </li>
262
+ ))}
263
+ </ul>
264
+
265
+ <Callout label="Commitment Required">
266
+ {data.callToAction.commitmentRequired}
267
+ </Callout>
268
+ </div>
269
+ </Section>
270
+
271
+ <div className="mt-12 pt-8 border-t border-border text-center text-sm text-muted">
272
+ <p className="font-semibold text-foreground mb-1">{data.classification}</p>
273
+ <p>
274
+ This report was prepared for {data.clientName} and contains confidential
275
+ information.
276
+ </p>
277
+ <p className="mt-2">{data.reportDate}</p>
278
+ </div>
279
+ </div>
280
+ </div>
281
+ );
282
+ }
@@ -0,0 +1,240 @@
1
+ {
2
+ "lockfileVersion": 1,
3
+ "workspaces": {
4
+ "": {
5
+ "name": "consulting-report",
6
+ "dependencies": {
7
+ "clsx": "2.1.1",
8
+ "lucide-react": "1.14.0",
9
+ "next": "16.2.4",
10
+ "react": "19.2.5",
11
+ "react-dom": "19.2.5",
12
+ "tailwind-merge": "3.5.0",
13
+ },
14
+ "devDependencies": {
15
+ "@tailwindcss/postcss": "4.2.4",
16
+ "@types/node": "25.6.0",
17
+ "@types/react": "19.2.14",
18
+ "@types/react-dom": "19.2.3",
19
+ "postcss": "8.5.13",
20
+ "tailwindcss": "4.2.4",
21
+ "typescript": "6.0.3",
22
+ },
23
+ },
24
+ },
25
+ "packages": {
26
+ "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="],
27
+
28
+ "@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="],
29
+
30
+ "@img/colour": ["@img/colour@1.1.0", "", {}, "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ=="],
31
+
32
+ "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="],
33
+
34
+ "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="],
35
+
36
+ "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="],
37
+
38
+ "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="],
39
+
40
+ "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="],
41
+
42
+ "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="],
43
+
44
+ "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.2.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA=="],
45
+
46
+ "@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.2.4", "", { "os": "linux", "cpu": "none" }, "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA=="],
47
+
48
+ "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="],
49
+
50
+ "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="],
51
+
52
+ "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="],
53
+
54
+ "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="],
55
+
56
+ "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="],
57
+
58
+ "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="],
59
+
60
+ "@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.2.4" }, "os": "linux", "cpu": "ppc64" }, "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA=="],
61
+
62
+ "@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.2.4" }, "os": "linux", "cpu": "none" }, "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw=="],
63
+
64
+ "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="],
65
+
66
+ "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="],
67
+
68
+ "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="],
69
+
70
+ "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="],
71
+
72
+ "@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="],
73
+
74
+ "@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.34.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g=="],
75
+
76
+ "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="],
77
+
78
+ "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="],
79
+
80
+ "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
81
+
82
+ "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="],
83
+
84
+ "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
85
+
86
+ "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
87
+
88
+ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
89
+
90
+ "@next/env": ["@next/env@16.2.4", "", {}, "sha512-dKkkOzOSwFYe5RX6y26fZgkSpVAlIOJKQHIiydQcrWH6y/97+RceSOAdjZ14Qa3zLduVUy0TXcn+EiM6t4rPgw=="],
91
+
92
+ "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@16.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-OXTFFox5EKN1Ym08vfrz+OXxmCcEjT4SFMbNRsWZE99dMqt2Kcusl5MqPXcW232RYkMLQTy0hqgAMEsfEd/l2A=="],
93
+
94
+ "@next/swc-darwin-x64": ["@next/swc-darwin-x64@16.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-XhpVnUfmYWvD3YrXu55XdcAkQtOnvaI6wtQa8fuF5fGoKoxIUZ0kWPtcOfqJEWngFF/lOS9l3+O9CcownhiQxQ=="],
95
+
96
+ "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@16.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-Mx/tjlNA3G8kg14QvuGAJ4xBwPk1tUHq56JxZ8CXnZwz1Etz714soCEzGQQzVMz4bEnGPowzkV6Xrp6wAkEWOQ=="],
97
+
98
+ "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@16.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-iVMMp14514u7Nup2umQS03nT/bN9HurK8ufylC3FZNykrwjtx7V1A7+4kvhbDSCeonTVqV3Txnv0Lu+m2oDXNg=="],
99
+
100
+ "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@16.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-EZOvm1aQWgnI/N/xcWOlnS3RQBk0VtVav5Zo7n4p0A7UKyTDx047k8opDbXgBpHl4CulRqRfbw3QrX2w5UOXMQ=="],
101
+
102
+ "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@16.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-h9FxsngCm9cTBf71AR4fGznDEDx1hS7+kSEiIRjq5kO1oXWm07DxVGZjCvk0SGx7TSjlUqhI8oOyz7NfwAdPoA=="],
103
+
104
+ "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@16.2.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-3NdJV5OXMSOeJYijX+bjaLge3mJBlh4ybydbT4GFoB/2hAojWHtMhl3CYlYoMrjPuodp0nzFVi4Tj2+WaMg+Ow=="],
105
+
106
+ "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@16.2.4", "", { "os": "win32", "cpu": "x64" }, "sha512-kMVGgsqhO5YTYODD9IPGGhA6iprWidQckK3LmPeW08PIFENRmgfb4MjXHO+p//d+ts2rpjvK5gXWzXSMrPl9cw=="],
107
+
108
+ "@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="],
109
+
110
+ "@tailwindcss/node": ["@tailwindcss/node@4.2.4", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.19.0", "jiti": "^2.6.1", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.2.4" } }, "sha512-Ai7+yQPxz3ddrDQzFfBKdHEVBg0w3Zl83jnjuwxnZOsnH9pGn93QHQtpU0p/8rYWxvbFZHneni6p1BSLK4DkGA=="],
111
+
112
+ "@tailwindcss/oxide": ["@tailwindcss/oxide@4.2.4", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.2.4", "@tailwindcss/oxide-darwin-arm64": "4.2.4", "@tailwindcss/oxide-darwin-x64": "4.2.4", "@tailwindcss/oxide-freebsd-x64": "4.2.4", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.4", "@tailwindcss/oxide-linux-arm64-gnu": "4.2.4", "@tailwindcss/oxide-linux-arm64-musl": "4.2.4", "@tailwindcss/oxide-linux-x64-gnu": "4.2.4", "@tailwindcss/oxide-linux-x64-musl": "4.2.4", "@tailwindcss/oxide-wasm32-wasi": "4.2.4", "@tailwindcss/oxide-win32-arm64-msvc": "4.2.4", "@tailwindcss/oxide-win32-x64-msvc": "4.2.4" } }, "sha512-9El/iI069DKDSXwTvB9J4BwdO5JhRrOweGaK25taBAvBXyXqJAX+Jqdvs8r8gKpsI/1m0LeJLyQYTf/WLrBT1Q=="],
113
+
114
+ "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.2.4", "", { "os": "android", "cpu": "arm64" }, "sha512-e7MOr1SAn9U8KlZzPi1ZXGZHeC5anY36qjNwmZv9pOJ8E4Q6jmD1vyEHkQFmNOIN7twGPEMXRHmitN4zCMN03g=="],
115
+
116
+ "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-tSC/Kbqpz/5/o/C2sG7QvOxAKqyd10bq+ypZNf+9Fi2TvbVbv1zNpcEptcsU7DPROaSbVgUXmrzKhurFvo5eDg=="],
117
+
118
+ "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-yPyUXn3yO/ufR6+Kzv0t4fCg2qNr90jxXc5QqBpjlPNd0NqyDXcmQb/6weunH/MEDXW5dhyEi+agTDiqa3WsGg=="],
119
+
120
+ "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.2.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-BoMIB4vMQtZsXdGLVc2z+P9DbETkiopogfWZKbWwM8b/1Vinbs4YcUwo+kM/KeLkX3Ygrf4/PsRndKaYhS8Eiw=="],
121
+
122
+ "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-7pIHBLTHYRAlS7V22JNuTh33yLH4VElwKtB3bwchK/UaKUPpQ0lPQiOWcbm4V3WP2I6fNIJ23vABIvoy2izdwA=="],
123
+
124
+ "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-+E4wxJ0ZGOzSH325reXTWB48l42i93kQqMvDyz5gqfRzRZ7faNhnmvlV4EPGJU3QJM/3Ab5jhJ5pCRUsKn6OQw=="],
125
+
126
+ "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-bBADEGAbo4ASnppIziaQJelekCxdMaxisrk+fB7Thit72IBnALp9K6ffA2G4ruj90G9XRS2VQ6q2bCKbfFV82g=="],
127
+
128
+ "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-7Mx25E4WTfnht0TVRTyC00j3i0M+EeFe7wguMDTlX4mRxafznw0CA8WJkFjWYH5BlgELd1kSjuU2JiPnNZbJDA=="],
129
+
130
+ "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-2wwJRF7nyhOR0hhHoChc04xngV3iS+akccHTGtz965FwF0up4b2lOdo6kI1EbDaEXKgvcrFBYcYQQ/rrnWFVfA=="],
131
+
132
+ "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.2.4", "", { "dependencies": { "@emnapi/core": "^1.8.1", "@emnapi/runtime": "^1.8.1", "@emnapi/wasi-threads": "^1.1.0", "@napi-rs/wasm-runtime": "^1.1.1", "@tybys/wasm-util": "^0.10.1", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-FQsqApeor8Fo6gUEklzmaa9994orJZZDBAlQpK2Mq+DslRKFJeD6AjHpBQ0kZFQohVr8o85PPh8eOy86VlSCmw=="],
133
+
134
+ "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.2.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-L9BXqxC4ToVgwMFqj3pmZRqyHEztulpUJzCxUtLjobMCzTPsGt1Fa9enKbOpY2iIyVtaHNeNvAK8ERP/64sqGQ=="],
135
+
136
+ "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.2.4", "", { "os": "win32", "cpu": "x64" }, "sha512-ESlKG0EpVJQwRjXDDa9rLvhEAh0mhP1sF7sap9dNZT0yyl9SAG6T7gdP09EH0vIv0UNTlo6jPWyujD6559fZvw=="],
137
+
138
+ "@tailwindcss/postcss": ["@tailwindcss/postcss@4.2.4", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.2.4", "@tailwindcss/oxide": "4.2.4", "postcss": "^8.5.6", "tailwindcss": "4.2.4" } }, "sha512-wgAVj6nUWAolAu8YFvzT2cTBIElWHkjZwFYovF+xsqKsW2ADxM/X2opxj5NsF/qVccAOjRNe8X2IdPzMsWyHTg=="],
139
+
140
+ "@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="],
141
+
142
+ "@types/react": ["@types/react@19.2.14", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w=="],
143
+
144
+ "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="],
145
+
146
+ "baseline-browser-mapping": ["baseline-browser-mapping@2.10.24", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-I2NkZOOrj2XuguvWCK6OVh9GavsNjZjK908Rq3mIBK25+GD8vPX5w2WdxVqnQ7xx3SrZJiCiZFu+/Oz50oSYSA=="],
147
+
148
+ "caniuse-lite": ["caniuse-lite@1.0.30001791", "", {}, "sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ=="],
149
+
150
+ "client-only": ["client-only@0.0.1", "", {}, "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="],
151
+
152
+ "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
153
+
154
+ "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
155
+
156
+ "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
157
+
158
+ "enhanced-resolve": ["enhanced-resolve@5.21.0", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA=="],
159
+
160
+ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
161
+
162
+ "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="],
163
+
164
+ "lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="],
165
+
166
+ "lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="],
167
+
168
+ "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="],
169
+
170
+ "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="],
171
+
172
+ "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="],
173
+
174
+ "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="],
175
+
176
+ "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="],
177
+
178
+ "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="],
179
+
180
+ "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="],
181
+
182
+ "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="],
183
+
184
+ "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="],
185
+
186
+ "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="],
187
+
188
+ "lucide-react": ["lucide-react@1.14.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-+1mdWcfSJVUsaTIjN9zoezmUhfXo5l0vP7ekBMPo3jcS/aIkxHnXqAPsByszMZx/Y8oQBRJxJx5xg+RH3urzxA=="],
189
+
190
+ "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
191
+
192
+ "nanoid": ["nanoid@3.3.12", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ=="],
193
+
194
+ "next": ["next@16.2.4", "", { "dependencies": { "@next/env": "16.2.4", "@swc/helpers": "0.5.15", "baseline-browser-mapping": "^2.9.19", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "16.2.4", "@next/swc-darwin-x64": "16.2.4", "@next/swc-linux-arm64-gnu": "16.2.4", "@next/swc-linux-arm64-musl": "16.2.4", "@next/swc-linux-x64-gnu": "16.2.4", "@next/swc-linux-x64-musl": "16.2.4", "@next/swc-win32-arm64-msvc": "16.2.4", "@next/swc-win32-x64-msvc": "16.2.4", "sharp": "^0.34.5" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-kPvz56wF5frc+FxlHI5qnklCzbq53HTwORaWBGdT0vNoKh1Aya9XC8aPauH4NJxqtzbWsS5mAbctm4cr+EkQ2Q=="],
195
+
196
+ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
197
+
198
+ "postcss": ["postcss@8.5.13", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-qif0+jGGZoLWdHey3UFHHWP0H7Gbmsk8T5VEqyYFbWqPr1XqvLGBbk/sl8V5exGmcYJklJOhOQq1pV9IcsiFag=="],
199
+
200
+ "react": ["react@19.2.5", "", {}, "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA=="],
201
+
202
+ "react-dom": ["react-dom@19.2.5", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.5" } }, "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag=="],
203
+
204
+ "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="],
205
+
206
+ "semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
207
+
208
+ "sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="],
209
+
210
+ "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
211
+
212
+ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="],
213
+
214
+ "tailwind-merge": ["tailwind-merge@3.5.0", "", {}, "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A=="],
215
+
216
+ "tailwindcss": ["tailwindcss@4.2.4", "", {}, "sha512-HhKppgO81FQof5m6TEnuBWCZGgfRAWbaeOaGT00KOy/Pf/j6oUihdvBpA7ltCeAvZpFhW3j0PTclkxsd4IXYDA=="],
217
+
218
+ "tapable": ["tapable@2.3.3", "", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="],
219
+
220
+ "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
221
+
222
+ "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="],
223
+
224
+ "undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="],
225
+
226
+ "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.10.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" }, "bundled": true }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="],
227
+
228
+ "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="],
229
+
230
+ "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="],
231
+
232
+ "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.4", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" }, "bundled": true }, "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow=="],
233
+
234
+ "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],
235
+
236
+ "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
237
+
238
+ "next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="],
239
+ }
240
+ }
@@ -0,0 +1,13 @@
1
+ interface CalloutProps {
2
+ label?: string;
3
+ children: React.ReactNode;
4
+ }
5
+
6
+ export function Callout({ label = "Key Takeaway", children }: CalloutProps) {
7
+ return (
8
+ <div className="callout">
9
+ <div className="callout-label">{label}</div>
10
+ <div className="callout-content">{children}</div>
11
+ </div>
12
+ );
13
+ }
@@ -0,0 +1,40 @@
1
+ interface ComparisonRow {
2
+ metric: string;
3
+ left: string;
4
+ right: string;
5
+ }
6
+
7
+ interface ComparisonTableProps {
8
+ leftLabel: string;
9
+ rightLabel: string;
10
+ rows: ComparisonRow[];
11
+ metricLabel?: string;
12
+ }
13
+
14
+ export function ComparisonTable({
15
+ leftLabel,
16
+ rightLabel,
17
+ rows,
18
+ metricLabel = "Metric",
19
+ }: ComparisonTableProps) {
20
+ return (
21
+ <table className="comparison-table">
22
+ <thead>
23
+ <tr>
24
+ <th>{metricLabel}</th>
25
+ <th>{leftLabel}</th>
26
+ <th>{rightLabel}</th>
27
+ </tr>
28
+ </thead>
29
+ <tbody>
30
+ {rows.map((row) => (
31
+ <tr key={row.metric}>
32
+ <td className="metric">{row.metric}</td>
33
+ <td>{row.left}</td>
34
+ <td>{row.right}</td>
35
+ </tr>
36
+ ))}
37
+ </tbody>
38
+ </table>
39
+ );
40
+ }
@@ -0,0 +1,34 @@
1
+ interface CoverPageProps {
2
+ clientName: string;
3
+ reportTitle: string;
4
+ reportDate: string;
5
+ classification: string;
6
+ consultancyName: string;
7
+ preTitle?: string;
8
+ }
9
+
10
+ export function CoverPage({
11
+ clientName,
12
+ reportTitle,
13
+ reportDate,
14
+ classification,
15
+ consultancyName,
16
+ preTitle = "Strategic Assessment",
17
+ }: CoverPageProps) {
18
+ return (
19
+ <div className="cover-page">
20
+ <div className="cover-classification">{classification}</div>
21
+
22
+ <div className="text-sm tracking-[0.25em] text-primary uppercase mb-4 font-semibold font-sans">
23
+ {preTitle}
24
+ </div>
25
+ <h1 className="cover-title">{reportTitle}</h1>
26
+ <p className="cover-subtitle">Prepared for {clientName}</p>
27
+
28
+ <div className="cover-meta">
29
+ <p className="cover-date">{reportDate}</p>
30
+ <p className="text-muted-dark text-sm mt-2 font-sans">{consultancyName}</p>
31
+ </div>
32
+ </div>
33
+ );
34
+ }