diff --git a/frontend/src/App.js b/frontend/src/App.js
index 344f9cb..e7686a9 100644
--- a/frontend/src/App.js
+++ b/frontend/src/App.js
@@ -165,53 +165,56 @@ function AppLayout({ theme, onThemeToggle }) {
- } />
- } />
- } />
- } />
- } />
-
-
-
- }
- />
- } />
-
-
-
- }
- />
- }
- />
- }
- />
-
-
-
- }
- />
-
-
-
- }
- />
- } />
+ } />
+ } />
+ } />
+ } />
+ }
+ />
+
+
+
+ }
+ />
+ } />
+
+
+
+ }
+ />
+ }
+ />
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+ } />
diff --git a/frontend/src/components/three/HeroExperience.js b/frontend/src/components/three/HeroExperience.js
index 5f8a5e3..2c8a294 100644
--- a/frontend/src/components/three/HeroExperience.js
+++ b/frontend/src/components/three/HeroExperience.js
@@ -143,7 +143,14 @@ function Core({ reduceMotion, radius = 1.05 }) {
// A frosted-glass document panel. On capable GPUs MeshPhysicalMaterial
// transmission gives a single-pass glass look; on weak hardware we fall back to
// a cheap translucent standard material that reads the same but costs nothing.
-function Panel({ position, rotation, scale, reduceMotion, floatSeed, lowPower }) {
+function Panel({
+ position,
+ rotation,
+ scale,
+ reduceMotion,
+ floatSeed,
+ lowPower,
+}) {
return (
{
const all = [
- { position: [-2.55, 0.55, -0.6], rotation: [0.18, 0.55, 0.12], scale: 1.05, floatSeed: 0.2 },
- { position: [2.7, -0.1, -0.5], rotation: [-0.2, -0.6, -0.15], scale: 0.95, floatSeed: 0.6 },
- { position: [0.5, 2.0, -1.4], rotation: [0.4, 0.1, 0.3], scale: 0.8, floatSeed: 0.9 },
- { position: [-2.3, -2.7, -0.6], rotation: [0.1, 0.5, -0.18], scale: 0.92, floatSeed: 0.35 },
- { position: [2.5, -4.3, -0.9], rotation: [-0.25, -0.4, 0.2], scale: 1.0, floatSeed: 0.75 },
- { position: [-1.9, -6.1, -0.4], rotation: [0.3, 0.3, 0.1], scale: 0.85, floatSeed: 0.5 },
- { position: [2.0, -7.7, -0.7], rotation: [-0.15, -0.55, -0.12], scale: 0.95, floatSeed: 0.65 },
- { position: [-0.6, -9.3, -1.2], rotation: [0.35, 0.2, 0.28], scale: 0.8, floatSeed: 0.85 },
+ {
+ position: [-2.55, 0.55, -0.6],
+ rotation: [0.18, 0.55, 0.12],
+ scale: 1.05,
+ floatSeed: 0.2,
+ },
+ {
+ position: [2.7, -0.1, -0.5],
+ rotation: [-0.2, -0.6, -0.15],
+ scale: 0.95,
+ floatSeed: 0.6,
+ },
+ {
+ position: [0.5, 2.0, -1.4],
+ rotation: [0.4, 0.1, 0.3],
+ scale: 0.8,
+ floatSeed: 0.9,
+ },
+ {
+ position: [-2.3, -2.7, -0.6],
+ rotation: [0.1, 0.5, -0.18],
+ scale: 0.92,
+ floatSeed: 0.35,
+ },
+ {
+ position: [2.5, -4.3, -0.9],
+ rotation: [-0.25, -0.4, 0.2],
+ scale: 1.0,
+ floatSeed: 0.75,
+ },
+ {
+ position: [-1.9, -6.1, -0.4],
+ rotation: [0.3, 0.3, 0.1],
+ scale: 0.85,
+ floatSeed: 0.5,
+ },
+ {
+ position: [2.0, -7.7, -0.7],
+ rotation: [-0.15, -0.55, -0.12],
+ scale: 0.95,
+ floatSeed: 0.65,
+ },
+ {
+ position: [-0.6, -9.3, -1.2],
+ rotation: [0.35, 0.2, 0.28],
+ scale: 0.8,
+ floatSeed: 0.85,
+ },
];
// Weak hardware: keep every other panel (8 → 4).
return lowPower ? all.filter((_, i) => i % 2 === 0) : all;
@@ -280,10 +327,30 @@ function Scene({ reduceMotion, lowPower, scrollRef }) {
const accents = useMemo(() => {
const all = [
- { geometry: , position: [-1.7, -1.4, 0.6], color: PALETTE.core, floatSeed: 0.3 },
- { geometry: , position: [1.7, -3.4, 0.8], color: PALETTE.core, floatSeed: 0.5 },
- { geometry: , position: [-1.5, -5.2, 0.5], color: "#3a2a1c", floatSeed: 0.7 },
- { geometry: , position: [1.4, -8.6, 0.7], color: PALETTE.core, floatSeed: 0.45 },
+ {
+ geometry: ,
+ position: [-1.7, -1.4, 0.6],
+ color: PALETTE.core,
+ floatSeed: 0.3,
+ },
+ {
+ geometry: ,
+ position: [1.7, -3.4, 0.8],
+ color: PALETTE.core,
+ floatSeed: 0.5,
+ },
+ {
+ geometry: ,
+ position: [-1.5, -5.2, 0.5],
+ color: "#3a2a1c",
+ floatSeed: 0.7,
+ },
+ {
+ geometry: ,
+ position: [1.4, -8.6, 0.7],
+ color: PALETTE.core,
+ floatSeed: 0.45,
+ },
];
return lowPower ? all.filter((_, i) => i % 2 === 0) : all;
}, [lowPower]);
@@ -303,9 +370,24 @@ function Scene({ reduceMotion, lowPower, scrollRef }) {
castShadow={!lowPower}
/>
{/* Warm core lights at both ends of the journey (hero + CTA). */}
-
-
-
+
+
+
@@ -316,7 +398,12 @@ function Scene({ reduceMotion, lowPower, scrollRef }) {
{panels.map((p, i) => (
-
+
))}
{accents.map((a, i) => (
@@ -402,7 +489,11 @@ export default function HeroExperience({ reduceMotion = false, scrollRef }) {
);
}}
>
-
+
);
diff --git a/frontend/src/pages/LandingPage.js b/frontend/src/pages/LandingPage.js
index ece031c..e5ab9cd 100644
--- a/frontend/src/pages/LandingPage.js
+++ b/frontend/src/pages/LandingPage.js
@@ -324,7 +324,8 @@ const LandingPage = () => {
},
{
title: "Refine or rewrite",
- description: "Refine the summary or rewrite selected text in a new style.",
+ description:
+ "Refine the summary or rewrite selected text in a new style.",
icon: ,
},
{
@@ -374,7 +375,8 @@ const LandingPage = () => {
},
{
title: "Refine",
- description: "Refine the summary or rewrite selected text in a new style.",
+ description:
+ "Refine the summary or rewrite selected text in a new style.",
icon: ,
},
];
@@ -421,7 +423,8 @@ const LandingPage = () => {
},
{
title: "Refine and rewrite",
- description: "Refine the summary or rewrite selected text to a new style.",
+ description:
+ "Refine the summary or rewrite selected text to a new style.",
icon: ,
},
];
@@ -660,746 +663,759 @@ const LandingPage = () => {
}}
>
{/* Center scrim so the headline reads over the glowing core */}
-
+
+
+ {/* Slim brand bar (the global navbar is hidden on the landing route) */}
+
+
+
+
+
+
+
+ DocuThinker
+
+
+
+
+
+
+
+
- {/* Slim brand bar (the global navbar is hidden on the landing route) */}
-
+ {/* Hero content */}
-
-
+ }
sx={{
- width: 32,
- height: 32,
- borderRadius: "9px",
- background: `linear-gradient(135deg, ${palette.accent}, #ffb066)`,
- boxShadow: "0 6px 18px rgba(245,124,0,0.5)",
- display: "grid",
- placeItems: "center",
- color: "#fff",
- "& .MuiSvgIcon-root": { fontSize: "1.15rem" },
+ mb: 3,
+ fontWeight: 600,
+ font: "inherit",
+ color: "#ffd9a8",
+ backgroundColor: palette.heroGlass,
+ border: `1px solid ${palette.heroGlassBorder}`,
+ backdropFilter: "blur(8px)",
+ "& .MuiChip-icon": { color: "#ffb066" },
}}
- aria-hidden="true"
- >
-
-
+ />
- DocuThinker
+ Every document,
+
+ instantly{" "}
+
+ understood
+
+ .
-
-
-
-
-
-
-
-
- {/* Hero content */}
-
-
- }
- sx={{
- mb: 3,
- fontWeight: 600,
- font: "inherit",
- color: "#ffd9a8",
- backgroundColor: palette.heroGlass,
- border: `1px solid ${palette.heroGlassBorder}`,
- backdropFilter: "blur(8px)",
- "& .MuiChip-icon": { color: "#ffb066" },
- }}
- />
-
- Every document,
-
- instantly{" "}
-
- understood
-
- .
-
-
- Upload PDFs, Word, Markdown, CSV, JSON, code, and more — then
- summarize, analyze, chat, rewrite, translate, and reply by voice,
- all in one intelligent workspace.
-
-
- }
- sx={{
- backgroundColor: palette.accent,
- font: "inherit",
- fontWeight: 600,
- textTransform: "none",
- fontSize: "1.05rem",
- px: 4,
- py: 1.3,
- borderRadius: "999px",
- boxShadow: "0 12px 34px rgba(245,124,0,0.45)",
- transition: "transform 0.25s ease, box-shadow 0.25s ease",
- "&:hover": {
- backgroundColor: palette.accentDark,
- transform: "translateY(-2px)",
- boxShadow: "0 18px 44px rgba(245,124,0,0.55)",
- },
- }}
- >
- Start for free
-
- }
- sx={{
- borderColor: palette.heroGlassBorder,
- color: palette.heroText,
- font: "inherit",
- fontWeight: 600,
- textTransform: "none",
- fontSize: "1.05rem",
- px: 4,
- py: 1.3,
- borderRadius: "999px",
- backgroundColor: "rgba(255,255,255,0.03)",
- backdropFilter: "blur(6px)",
- "&:hover": {
- borderColor: "#ffb066",
- backgroundColor: "rgba(255,138,26,0.1)",
- },
+ maxWidth: 640,
+ fontSize: { xs: "1.05rem", md: "1.2rem" },
+ lineHeight: 1.6,
+ mb: 4,
}}
>
- Take the tour
-
- {/* Text button that scrolls to the content below — replaces the
- old floating arrow that collided with the stats card. */}
- }
- aria-label="Scroll to learn more"
+ Upload PDFs, Word, Markdown, CSV, JSON, code, and more — then
+ summarize, analyze, chat, rewrite, translate, and reply by
+ voice, all in one intelligent workspace.
+
+
- Scroll to explore
-
-
-
-
- {heroHighlights.map((label) => (
- }
sx={{
+ backgroundColor: palette.accent,
font: "inherit",
- color: palette.heroMuted,
- backgroundColor: "rgba(255,255,255,0.04)",
- border: "1px solid rgba(255,255,255,0.09)",
+ fontWeight: 600,
+ textTransform: "none",
+ fontSize: "1.05rem",
+ px: 4,
+ py: 1.3,
+ borderRadius: "999px",
+ boxShadow: "0 12px 34px rgba(245,124,0,0.45)",
+ transition: "transform 0.25s ease, box-shadow 0.25s ease",
+ "&:hover": {
+ backgroundColor: palette.accentDark,
+ transform: "translateY(-2px)",
+ boxShadow: "0 18px 44px rgba(245,124,0,0.55)",
+ },
+ }}
+ >
+ Start for free
+
+ }
+ sx={{
+ borderColor: palette.heroGlassBorder,
+ color: palette.heroText,
+ font: "inherit",
+ fontWeight: 600,
+ textTransform: "none",
+ fontSize: "1.05rem",
+ px: 4,
+ py: 1.3,
+ borderRadius: "999px",
+ backgroundColor: "rgba(255,255,255,0.03)",
backdropFilter: "blur(6px)",
"&:hover": {
- color: palette.heroText,
- borderColor: palette.heroGlassBorder,
+ borderColor: "#ffb066",
+ backgroundColor: "rgba(255,138,26,0.1)",
},
}}
- />
- ))}
-
-
-
-
-
-
-
- {/* Floating stats band. On desktop it overlaps up into the hero for a
- "floating" feel; on mobile that overlap collided with the hero's
- scroll-cue arrow, so it sits clear below the hero instead. */}
-
-
- {stats.map((stat, i) => (
-
-
+ Take the tour
+
+ {/* Text button that scrolls to the content below — replaces the
+ old floating arrow that collided with the stats card. */}
+ }
+ aria-label="Scroll to learn more"
sx={{
- textAlign: "center",
- py: { xs: 1, md: 0.5 },
- borderLeft: {
- md:
- i === 0
- ? "none"
- : `1px solid ${palette.border}`,
+ color: palette.heroMuted,
+ font: "inherit",
+ fontWeight: 600,
+ textTransform: "none",
+ fontSize: "1.05rem",
+ px: 2.5,
+ py: 1.3,
+ borderRadius: "999px",
+ "& .MuiButton-startIcon": {
+ animation: reduceMotion
+ ? "none"
+ : `${bounceHint} 2.2s ease-in-out infinite`,
+ },
+ "&:hover": {
+ color: palette.heroText,
+ backgroundColor: "rgba(255,255,255,0.05)",
},
}}
>
-
- {stat.value}
-
-
+
+
+
+ {heroHighlights.map((label) => (
+
- {stat.label}
-
-
-
- ))}
-
+ />
+ ))}
+
+
+
- {/* Pillars */}
-
-
-
- Professional clarity, at any scale
-
-
+ {/* Floating stats band. On desktop it overlaps up into the hero for a
+ "floating" feel; on mobile that overlap collided with the hero's
+ scroll-cue arrow, so it sits clear below the hero instead. */}
+
- Grounded in the features available today — summaries, bullet points,
- analytics, and chat, all in one place.
-
-
- {pillars.map((pillar, i) => (
-
-
-
+
+ {stats.map((stat, i) => (
+
+
- 0{i + 1}
+ {stat.value}
- {pillar.icon}
- {pillar.title}
-
-
- {pillar.description}
+ {stat.label}
-
-
-
- ))}
-
-
+
+
+ ))}
+
+
- {/* Spotlight (dark mid-page moment) */}
-
-
+
+
+ Professional clarity, at any scale
+
+
+ Grounded in the features available today — summaries, bullet
+ points, analytics, and chat, all in one place.
+
+
+ {pillars.map((pillar, i) => (
+
+
+
+
+ 0{i + 1}
+
+ {pillar.icon}
+
+ {pillar.title}
+
+
+ {pillar.description}
+
+
+
+
+ ))}
+
+
+
+ {/* Spotlight (dark mid-page moment) */}
+
-
-
-
-
- Clarity for complex documents
-
-
- Step through what DocuThinker does the moment a file lands.
-
-
-
+
+
+
+
-
- {spotlights[spotlightIndex].icon}
-
-
- {spotlights[spotlightIndex].title}
-
-
+ Clarity for complex documents
+
- {spotlights[spotlightIndex].description}
+ Step through what DocuThinker does the moment a file lands.
-
- {spotlights[spotlightIndex].points.map((point) => (
-
+
+
+ {spotlights[spotlightIndex].icon}
+
+
-
-
+
+
+ {spotlights[spotlightIndex].description}
+
+
+ {spotlights[spotlightIndex].points.map((point) => (
+
- {point}
-
-
+
+
+ {point}
+
+
+ ))}
+
+
+
+ {spotlights.map((_, i) => (
+ setSpotlightIndex(i)}
+ role="button"
+ aria-label={`Show spotlight ${i + 1}`}
+ sx={{
+ cursor: "pointer",
+ height: 6,
+ borderRadius: 3,
+ width: i === spotlightIndex ? 30 : 14,
+ backgroundColor:
+ i === spotlightIndex
+ ? palette.accent
+ : "rgba(255,255,255,0.25)",
+ transition: "all 0.4s ease",
+ }}
+ />
))}
-
-
- {spotlights.map((_, i) => (
- setSpotlightIndex(i)}
- role="button"
- aria-label={`Show spotlight ${i + 1}`}
- sx={{
- cursor: "pointer",
- height: 6,
- borderRadius: 3,
- width: i === spotlightIndex ? 30 : 14,
- backgroundColor:
- i === spotlightIndex
- ? palette.accent
- : "rgba(255,255,255,0.25)",
- transition: "all 0.4s ease",
- }}
- />
- ))}
-
+
+
+
+ {features.slice(0, 3).map((feature) => (
+
+
+ {feature.icon}
+
+
+ {feature.title}
+
+
+ {feature.description}
+
+
+
+
+ ))}
+
+
-
-
- {features.slice(0, 3).map((feature) => (
-
+
+ {/* Features — bento grid */}
+
+
+
+ Everything you need to move faster
+
+
+ Built for clarity, accessibility, and shared understanding across
+ teams.
+
+
+ {features.map((feature, i) => {
+ const featured = i === 0;
+ return (
+
-
- {feature.icon}
-
-
- {feature.title}
-
-
+ {featured ? (
+
- {feature.description}
-
-
-
-
- ))}
-
-
-
-
-
- {/* Features — bento grid */}
-
-
-
- Everything you need to move faster
-
-
- Built for clarity, accessibility, and shared understanding across
- teams.
-
-
- {features.map((feature, i) => {
- const featured = i === 0;
- return (
-
-
- {featured ? (
-
+ ) : (
+ {feature.icon}
+ )}
+
- {feature.icon}
-
- ) : (
- {feature.icon}
- )}
-
- {feature.title}
-
-
- {feature.description}
-
- {featured && (
-
+
- {["PDF", "Word", "CSV", "JSON", "Markdown", "Code"].map(
- (t) => (
+ {feature.description}
+
+ {featured && (
+
+ {[
+ "PDF",
+ "Word",
+ "CSV",
+ "JSON",
+ "Markdown",
+ "Code",
+ ].map((t) => (
{
border: "1px solid rgba(255,255,255,0.25)",
}}
/>
- ),
- )}
-
- )}
-
-
- );
- })}
+ ))}
+
+ )}
+
+
+ );
+ })}
+
-
- {/* Workflow — connected stepper */}
-
-
-
- A workflow that mirrors the app
-
-
- Upload, summarize, analyze, and refine — all in the same workspace.
-
-
- {/* connecting line on desktop */}
-
+
+
+ A workflow that mirrors the app
+
+
-
- {workflow.map((step, index) => (
-
-
+ className="reveal"
+ >
+ Upload, summarize, analyze, and refine — all in the same
+ workspace.
+
+
+ {/* connecting line on desktop */}
+
+
+ {workflow.map((step, index) => (
+
- {step.icon}
- {index + 1}
+ {step.icon}
+
+ {index + 1}
+
+
+ {step.title}
+
+
+ {step.description}
+
-
+ ))}
+
+
+
+
+ {/* Outcomes */}
+
+
+
+ What you get back
+
+
+ {outcomes.map((item) => (
+
+
+
+ {item.icon}
+
+ {item.title}
+
+
+ {item.description}
+
+
+
+
+ ))}
+
+
+
+ {/* Comparison */}
+
+
+
+ Manual vs DocuThinker
+
+
+ {["Manual workflow", "DocuThinker workflow"].map(
+ (title, index) => (
+
+
- {step.title}
-
-
+
+ {title}
+
+
+ {(index === 0
+ ? [
+ "Manual reading and highlighting",
+ "Copying notes across tools",
+ "No built-in sentiment or analytics",
+ "Hard to refine or rewrite quickly",
+ ]
+ : [
+ "Upload documents, tables, text, or code files",
+ "Generate summary + bullet summary",
+ "Run sentiment analysis and document analytics",
+ "Chat, refine, rewrite, or use voice responses",
+ ]
+ ).map((item) => (
+
+ {index === 0 ? (
+
+ ) : (
+
+ )}
+
+ {item}
+
+
+ ))}
+
+
+
+
+ ),
+ )}
+
+
+
+ {/* Supported inputs — marquee */}
+
+
+
+ Bring almost anything
+
+
+ Documents, structured data, text, logs, and code. Google Drive
+ supports PDF, Word, JSON, and text-based files; voice chat
+ supports audio upload or recording.
+
+
+ {[0, 1].map((row) => (
+
+ {(reduceMotion
+ ? integrations
+ : [...integrations, ...integrations]
+ ).map((label, idx) => (
+
- {step.description}
-
-
+ />
+ ))}
+
+ ))}
+
+
+
+ {/* Use cases */}
+
+
+
+ What you can do right now
+
+
+ {useCases.map((useCase) => (
+
+
+
+ {useCase.icon}
+
+ {useCase.title}
+
+
+ {useCase.description}
+
+
+
))}
-
- {/* Outcomes */}
-
-
-
- What you get back
-
-
- {outcomes.map((item) => (
-
-
-
- {item.icon}
-
- {item.title}
-
-
- {item.description}
-
-
-
+ {/* Inside the workspace + privacy */}
+
+
+
+
+
+ Made for real work
+
+
+ Everything below reflects features available in the app today.
+
+
+
+ {testimonials[testimonialIndex].title}
+
+
+ {testimonials[testimonialIndex].description}
+
+
+
+
+ setTestimonialIndex(
+ (prev) =>
+ (prev - 1 + testimonials.length) %
+ testimonials.length,
+ )
+ }
+ sx={{
+ border: `1px solid ${palette.border}`,
+ color: palette.textPrimary,
+ }}
+ >
+
+
+
+ setTestimonialIndex(
+ (prev) => (prev + 1) % testimonials.length,
+ )
+ }
+ sx={{
+ border: `1px solid ${palette.border}`,
+ color: palette.textPrimary,
+ }}
+ >
+
+
+
- ))}
-
-
-
- {/* Comparison */}
-
-
-
- Manual vs DocuThinker
-
-
- {["Manual workflow", "DocuThinker workflow"].map((title, index) => (
-
+
- {title}
+ Data handling (from Privacy Policy)
-
- {(index === 0
- ? [
- "Manual reading and highlighting",
- "Copying notes across tools",
- "No built-in sentiment or analytics",
- "Hard to refine or rewrite quickly",
- ]
- : [
- "Upload documents, tables, text, or code files",
- "Generate summary + bullet summary",
- "Run sentiment analysis and document analytics",
- "Chat, refine, rewrite, or use voice responses",
- ]
- ).map((item) => (
+
+ {[
+ "Signed-in documents may be stored for later access.",
+ "Guest uploads are processed but not stored.",
+ "Google Drive access is read-only for file selection.",
+ ].map((item) => (
- {index === 0 ? (
-
- ) : (
-
- )}
+
+
+
{item}
@@ -1662,477 +1950,234 @@ const LandingPage = () => {
- ))}
-
-
+
+
- {/* Supported inputs — marquee */}
-
-
-
- Bring almost anything
-
-
- Documents, structured data, text, logs, and code. Google Drive
- supports PDF, Word, JSON, and text-based files; voice chat supports
- audio upload or recording.
-
-
- {[0, 1].map((row) => (
-
- {(reduceMotion
- ? integrations
- : [...integrations, ...integrations]
- ).map((label, idx) => (
-
+
+
+ Answers at a glance
+
+
+ {faqs.map((faq, i) => (
+
+ }
sx={{
- font: "inherit",
- fontSize: "0.95rem",
- py: 2.25,
- px: 0.5,
- borderRadius: "999px",
- backgroundColor: palette.surface,
- border: `1px solid ${palette.border}`,
- color: palette.textSecondary,
- "& .MuiChip-label": { px: 2 },
+ px: { xs: 2.5, md: 3 },
+ py: 1,
+ backgroundColor: "transparent",
+ transition: "background-color 0.25s ease",
+ "& .MuiAccordionSummary-content": { my: 1.5 },
+ // Tighten the header→body gap when expanded (MUI defaults the
+ // expanded content margin to 20px). Collapsed stays at 1.5.
+ "& .MuiAccordionSummary-content.Mui-expanded": {
+ mt: 1.5,
+ mb: 0.25,
+ },
+ // No hover effect — neutralize the app-wide `button:hover`
+ // red by keeping the background unchanged on hover.
+ "&:hover": { backgroundColor: "transparent" },
}}
- />
- ))}
-
- ))}
-
-
-
- {/* Use cases */}
-
-
-
- What you can do right now
-
-
- {useCases.map((useCase) => (
-
-
-
- {useCase.icon}
+ >
- {useCase.title}
+ {faq.title}
+
+
- {useCase.description}
+ {faq.description}
-
-
-
- ))}
-
-
-
- {/* Inside the workspace + privacy */}
-
-
-
-
-
- Made for real work
-
-
- Everything below reflects features available in the app today.
-
-
-
- {testimonials[testimonialIndex].title}
-
-
- {testimonials[testimonialIndex].description}
-
-
-
-
- setTestimonialIndex(
- (prev) =>
- (prev - 1 + testimonials.length) % testimonials.length,
- )
- }
- sx={{
- border: `1px solid ${palette.border}`,
- color: palette.textPrimary,
- }}
- >
-
-
-
- setTestimonialIndex(
- (prev) => (prev + 1) % testimonials.length,
- )
- }
- sx={{
- border: `1px solid ${palette.border}`,
- color: palette.textPrimary,
- }}
- >
-
-
-
-
-
-
-
-
- Data handling (from Privacy Policy)
-
-
- {[
- "Signed-in documents may be stored for later access.",
- "Guest uploads are processed but not stored.",
- "Google Drive access is read-only for file selection.",
- ].map((item) => (
-
-
-
-
-
- {item}
-
-
- ))}
-
-
-
-
-
-
-
- {/* FAQ — accordion */}
-
-
-
- Answers at a glance
-
-
- {faqs.map((faq, i) => (
-
- }
- sx={{
- px: { xs: 2.5, md: 3 },
- py: 1,
- backgroundColor: "transparent",
- transition: "background-color 0.25s ease",
- "& .MuiAccordionSummary-content": { my: 1.5 },
- // Tighten the header→body gap when expanded (MUI defaults the
- // expanded content margin to 20px). Collapsed stays at 1.5.
- "& .MuiAccordionSummary-content.Mui-expanded": {
- mt: 1.5,
- mb: 0.25,
- },
- // No hover effect — neutralize the app-wide `button:hover`
- // red by keeping the background unchanged on hover.
- "&:hover": { backgroundColor: "transparent" },
- }}
- >
-
- {faq.title}
-
-
-
-
- {faq.description}
-
-
-
- ))}
+
+
+ ))}
+
-
-
+
- {/* ===================== 3D CTA bookend ===================== */}
-
- {/* Scrim so the closing headline reads over the glowing core below it */}
+ {/* ===================== 3D CTA bookend ===================== */}
-
+ {/* Scrim so the closing headline reads over the glowing core below it */}
+
-
-
- Ready to make documents{" "}
-
+
- instantly useful
-
- ?
-
-
- Start now and see how DocuThinker turns information into action —
- no setup, no friction.
-
-
- }
+ Ready to make documents{" "}
+
+ instantly useful
+
+ ?
+
+
- Get Started
-
-
-
-
-
-
+ }
+ sx={{
+ backgroundColor: palette.accent,
+ font: "inherit",
+ fontWeight: 600,
+ textTransform: "none",
+ fontSize: "1.05rem",
+ px: 4,
+ py: 1.3,
+ borderRadius: "999px",
+ boxShadow: "0 12px 34px rgba(245,124,0,0.45)",
+ transition: "transform 0.25s ease, box-shadow 0.25s ease",
+ "&:hover": {
+ backgroundColor: palette.accentDark,
+ transform: "translateY(-2px)",
+ boxShadow: "0 18px 44px rgba(245,124,0,0.55)",
+ },
+ }}
+ >
+ Get Started
+
+
+
+
+
+
);