From ee36189ae0e57e78f80de43dcdc648180b3a6dc1 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sat, 25 Jul 2026 02:34:27 +0000 Subject: [PATCH 1/2] Improve site across 100 loops with cinematic UI complements Clean the hero to brand + headline + CTA + featured visual, then polish home sections, FAQ/footer patterns, process beams, accessibility, and route-level UX while keeping Ardeno's dark red cinematic system. Co-authored-by: Cookie_Cat21 --- App.tsx | 27 +- components/AI/ArdenoAIWidget.tsx | 50 +- components/CaseStudies/CaseStudiesIndex.tsx | 42 +- components/CaseStudies/CaseStudiesPage.css | 6 + components/CaseStudies/HumbleBeginnings.tsx | 89 ++- components/Docs/DocsPage.tsx | 80 ++- components/FAQ/FAQPage.tsx | 380 ++++++++++-- components/Home/AuditCTA.tsx | 82 ++- components/Home/BrandIdentity.tsx | 87 ++- components/Home/ContactModal.tsx | 48 +- components/Home/FeaturedWork.tsx | 215 +++---- components/Home/FinalCTA.tsx | 121 ++-- components/Home/Hero.tsx | 414 +++---------- components/Home/OurStory.tsx | 45 +- components/Home/Pageloader.tsx | 100 +++- components/Home/Process.tsx | 140 +++-- components/Home/ProjectMarquee.tsx | 9 +- components/Home/Services.tsx | 221 +++---- components/Home/Testimonials.tsx | 36 +- components/Layout/Footer.tsx | 183 ++++-- components/Layout/Navbar.tsx | 157 +++-- components/Services/ServicePage.tsx | 348 +++++++++-- components/UI/AnimatedBeam.tsx | 139 +++++ components/UI/Button.tsx | 22 +- components/UI/Cursor.tsx | 18 +- components/UI/cobe-globe-pulse.tsx | 2 +- constants.tsx | 14 +- data/projects.ts | 27 +- index.css | 48 +- reports/improvement-loops-100.json | 624 ++++++++++++++++++++ seo.ts | 25 +- tailwind.config.js | 9 + vercel.json | 36 ++ 33 files changed, 2722 insertions(+), 1122 deletions(-) create mode 100644 components/UI/AnimatedBeam.tsx create mode 100644 reports/improvement-loops-100.json diff --git a/App.tsx b/App.tsx index 82c557c..1f4eb56 100644 --- a/App.tsx +++ b/App.tsx @@ -216,26 +216,41 @@ const App: React.FC = () => { ); + const routeSkeleton = ( +
+
+
+
+
+
+
+
+ ); + return (
setLoaded(true)} minDuration={900} /> <> {route === 'docs' && ( - + setContactOpen(true)} /> )} {route === 'faq' && pageShell( - + setContactOpen(true)} /> , { hideNav: true } )} {route === 'case-studies' && pageShell( - + , { hideNav: true } @@ -253,14 +268,14 @@ const App: React.FC = () => { )} {route === 'cs-humble-beginnings' && pageShell( - + , { hideNav: true } )} {servicePageKey && pageShell( - + setContactOpen(true)} /> , { hideNav: true } @@ -287,7 +302,7 @@ const App: React.FC = () => { <> setContactOpen(true)} /> - + setContactOpen(true)} /> diff --git a/components/AI/ArdenoAIWidget.tsx b/components/AI/ArdenoAIWidget.tsx index a0a6414..fe2f355 100644 --- a/components/AI/ArdenoAIWidget.tsx +++ b/components/AI/ArdenoAIWidget.tsx @@ -75,6 +75,8 @@ const STARTER_PROMPTS: QuickAction[] = [ const STORAGE_KEY = "ardeno_ai_messages_v7"; const OPEN_KEY = "ardeno_ai_open_v7"; +const AI_PANEL_ID = "ardeno-ai-panel"; +const CHAR_LIMIT = 500; const genId = () => Math.random().toString(36).slice(2, 9); @@ -753,6 +755,27 @@ const STYLES = ` font-weight: 800; } + .aw-disclaimer { + margin: 0 0 8px; + padding-inline: 4px; + font-family: var(--aw-body); + font-size: 11px; + line-height: 1.45; + color: rgba(255, 255, 255, 0.38); + } + + .aw-char-count { + font-variant-numeric: tabular-nums; + } + + .aw-char-count.near-limit { + color: rgba(255, 180, 80, 0.9); + } + + .aw-char-count.at-limit { + color: rgba(255, 77, 87, 0.95); + } + .aw-reduced .aw-fab, .aw-reduced .aw-quick, .aw-reduced .aw-icon-button, @@ -819,7 +842,8 @@ const STYLES = ` } .aw-compose-meta { - display: none; + flex-wrap: wrap; + gap: 4px 10px; } } `; @@ -892,6 +916,9 @@ const ArdenoAIWidget: React.FC = () => { const abortRef = useRef(null); const isInputEmpty = useMemo(() => input.trim().length === 0, [input]); + const charCount = input.length; + const nearLimit = charCount >= CHAR_LIMIT - 50; + const atLimit = charCount >= CHAR_LIMIT; const close = useCallback(() => { abortRef.current?.abort(); @@ -1001,7 +1028,7 @@ const ArdenoAIWidget: React.FC = () => { }, [close, open]); const sendPrompt = async (value: string) => { - const trimmed = value.trim(); + const trimmed = value.trim().slice(0, CHAR_LIMIT); if (!trimmed || loading) return; const userMsg: Message = { @@ -1105,6 +1132,8 @@ const ArdenoAIWidget: React.FC = () => { type="button" onClick={toggle} aria-label={open ? "Close AI assistant" : "Open AI assistant"} + aria-expanded={open} + aria-controls={AI_PANEL_ID} className="aw-fab aw-fab-wrapper" whileTap={reduced ? undefined : { scale: 0.98 }} style={{ @@ -1185,6 +1214,7 @@ const ArdenoAIWidget: React.FC = () => { {open && ( {
-
+
{messages.length === 0 && ( <> {