diff --git a/theme/components/HomeSections.tsx b/theme/components/HomeSections.tsx
new file mode 100644
index 0000000..0f49ae5
--- /dev/null
+++ b/theme/components/HomeSections.tsx
@@ -0,0 +1,63 @@
+import { useFrontmatter } from "@rspress/core/runtime"
+import { SectionBand } from "./sections/SectionBand"
+import { FeatureGrid } from "./sections/FeatureGrid"
+import { TechStack } from "./sections/TechStack"
+import { Cases } from "./sections/Cases"
+import { CallToAction } from "./sections/CallToAction"
+import { hasContent, type Section } from "./sections/types"
+
+/** Type guard for a single entry of `frontmatter.sections`. */
+function isSection(value: unknown): value is Section {
+ if (typeof value !== "object" || value === null) return false
+ const type = (value as { type?: unknown }).type
+ return (
+ type === "advantages" ||
+ type === "contentGrid" ||
+ type === "techStack" ||
+ type === "cases" ||
+ type === "cta"
+ )
+}
+
+function renderBody(section: Section) {
+ switch (section.type) {
+ case "advantages":
+ case "contentGrid":
+ return
+ {quote} ++ )} + {/* Without an approved testimonial, describe the engagement instead. */} + {!quote && details && ( +
{details}
+ )} +{subtitle}
+ )} +