From 58ce72e5b430ea156c5b529f057faf14408f40fc Mon Sep 17 00:00:00 2001 From: Arjun Mahar Date: Tue, 14 Apr 2026 14:39:42 +0500 Subject: [PATCH 1/2] Redesign Why FlutterInit bento grid interactions --- app/components/landing/WhyFlutterInit.tsx | 232 ++++++++++++++-------- 1 file changed, 151 insertions(+), 81 deletions(-) diff --git a/app/components/landing/WhyFlutterInit.tsx b/app/components/landing/WhyFlutterInit.tsx index af5698d..3ee3841 100644 --- a/app/components/landing/WhyFlutterInit.tsx +++ b/app/components/landing/WhyFlutterInit.tsx @@ -9,122 +9,192 @@ import { } from '@hugeicons/core-free-icons'; import { HugeiconsIcon } from '@hugeicons/react'; +type Feature = { + title: string; + description: string; + className: string; + icon: JSX.Element; + accent: string; + gradient: string; + pattern: 'dots' | 'grid' | 'waves'; + metric: string; + chips: string[]; +}; + export function WhyFlutterInit() { - const features = [ + const features: Feature[] = [ { - title: "Architecture Agnostic", - description: "Clean Architecture, MVVM, or MVC. FlutterInit adapts to your team's workflow, providing the perfect structure every time.", - icon: , - className: "md:col-span-2 md:row-span-1", - gradient: "from-primary/10 via-primary/5 to-transparent", - pattern: true, - hoverBg: "group-hover:bg-primary/10", - hoverBorder: "group-hover:border-primary/25" + title: 'Architecture Agnostic', + description: + "Clean Architecture, MVVM, or MVC. FlutterInit mirrors your team\'s mental model without forcing a single doctrine.", + className: 'md:col-span-2 md:row-span-1', + icon: , + accent: 'primary', + gradient: 'from-primary/15 via-primary/5 to-transparent', + pattern: 'grid', + metric: '3 major patterns supported', + chips: ['Clean', 'MVVM', 'Feature-first'] }, { - title: "Zero Boilerplate", - description: "Skip the 4-hour setup. Focus on features.", - icon: , - className: "md:col-span-1 md:row-span-1", - gradient: "from-amber-500/10 to-transparent", - hoverBg: "group-hover:bg-amber-500/10", - hoverBorder: "group-hover:border-amber-500/25" + title: 'Zero Boilerplate', + description: 'Generate battle-tested structure, wiring, and defaults in seconds.', + className: 'md:col-span-1 md:row-span-1', + icon: , + accent: 'amber', + gradient: 'from-amber-500/20 via-amber-500/5 to-transparent', + pattern: 'dots', + metric: '< 60 sec setup', + chips: ['Fast', 'Typed', 'Ready'] }, { - title: "Production Ready", - description: "Enterprise-grade logging, error handling, and monitoring built into the core. Scale with confidence.", - icon: , - className: "md:col-span-1 md:row-span-2", - gradient: "from-emerald-500/10 to-transparent", - vertical: true, - hoverBg: "group-hover:bg-emerald-500/10", - hoverBorder: "group-hover:border-emerald-500/25" + title: 'Production Ready', + description: + 'Error handling, logging, and environment management are built in from day one.', + className: 'md:col-span-1 md:row-span-2', + icon: , + accent: 'emerald', + gradient: 'from-emerald-500/20 via-emerald-500/5 to-transparent', + pattern: 'waves', + metric: 'Enterprise defaults included', + chips: ['Logging', 'Env', 'Reliability'] }, { - title: "Optimized Performance", - description: "Lightweight Scaffold following best practices for 60fps animations.", - icon: , - className: "md:col-span-1 md:row-span-1", - gradient: "from-indigo-500/10 to-transparent", - hoverBg: "group-hover:bg-indigo-500/10", - hoverBorder: "group-hover:border-indigo-500/25" + title: 'Optimized Performance', + description: 'Lean templates and pragmatic defaults for smooth 60fps experiences.', + className: 'md:col-span-1 md:row-span-1', + icon: , + accent: 'indigo', + gradient: 'from-indigo-500/20 via-indigo-500/5 to-transparent', + pattern: 'grid', + metric: 'Performance-first scaffolds', + chips: ['Lightweight', 'Scalable', 'Maintainable'] }, { - title: "Modern Tech Stack", - description: "Riverpod, Bloc, GoRouter, and Material 3 design tokens pre-integrated.", - icon: , - className: "md:col-span-1 md:row-span-1", - gradient: "from-blue-500/10 to-transparent", - hoverBg: "group-hover:bg-blue-500/10", - hoverBorder: "group-hover:border-blue-500/25" + title: 'Modern Tech Stack', + description: 'Riverpod, Bloc, GoRouter, and Material 3 tokens pre-integrated.', + className: 'md:col-span-1 md:row-span-1', + icon: , + accent: 'blue', + gradient: 'from-blue-500/20 via-blue-500/5 to-transparent', + pattern: 'dots', + metric: 'Tools teams already love', + chips: ['Riverpod', 'Bloc', 'GoRouter'] }, { - title: "Rapid Prototyping", - description: "From idea to running app in under 60 seconds. The faster way to ship Flutter applications to production.", - icon: , - className: "md:col-span-2 md:row-span-1", - gradient: "from-rose-500/10 to-transparent", - pattern: true, - hoverBg: "group-hover:bg-rose-500/10", - hoverBorder: "group-hover:border-rose-500/25" + title: 'Rapid Prototyping', + description: 'Move from idea to installable build quickly and iterate without friction.', + className: 'md:col-span-2 md:row-span-1', + icon: , + accent: 'rose', + gradient: 'from-rose-500/20 via-rose-500/5 to-transparent', + pattern: 'waves', + metric: 'More time for product thinking', + chips: ['Prototype', 'Validate', 'Ship'] } ]; + const patternClassByType: Record = { + dots: + 'bg-[radial-gradient(circle_at_center,rgba(24,24,27,0.12)_1px,transparent_1px)] [background-size:16px_16px]', + grid: + 'bg-[linear-gradient(rgba(24,24,27,0.08)_1px,transparent_1px),linear-gradient(90deg,rgba(24,24,27,0.08)_1px,transparent_1px)] [background-size:18px_18px]', + waves: + 'bg-[radial-gradient(ellipse_at_top,rgba(24,24,27,0.1),transparent_65%),radial-gradient(ellipse_at_bottom,rgba(24,24,27,0.08),transparent_60%)]' + }; + + const chipClassByAccent: Record = { + primary: 'bg-primary/10 text-primary', + amber: 'bg-amber-500/10 text-amber-700', + emerald: 'bg-emerald-500/10 text-emerald-700', + indigo: 'bg-indigo-500/10 text-indigo-700', + blue: 'bg-blue-500/10 text-blue-700', + rose: 'bg-rose-500/10 text-rose-700' + }; + return ( -
- {/* Background decorations */} -
- -
-
-
- +
+
+ +
+
+
+ Core Philosophy
-

- Why FlutterInit exists? + +

+ Why FlutterInit exists?

-

+ +

We believe Flutter development should be about innovation, not repetitive configuration. - Stop wasting days on project setup and start building. + Stop wasting days on setup and start shipping meaningful product value.

-
- {features.map((feature, index) => ( -
- {/* Pattern Overlay */} - {feature.pattern && ( -
+
+ {features.map((feature) => ( +
+
+
+
- {/* Radial Highlight */} -
+
+ +
+ + Live +
-
-
- {feature.icon} +
+
+
+ {feature.icon} +
+ +

+ {feature.metric} +

-

+

{feature.title}

-

+

{feature.description}

+ +
+
+ {feature.chips.map((chip) => ( + + {chip} + + ))} +
+
- {/* Decorative Corner Element */} -
-
+
+
))}
From 8b7d1a4a7d861a44c3ce751c9ff6fe262811a56f Mon Sep 17 00:00:00 2001 From: Arjun Mahar Date: Tue, 14 Apr 2026 14:45:47 +0500 Subject: [PATCH 2/2] Fix WhyFlutterInit icon typing for Next build --- app/components/landing/WhyFlutterInit.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/components/landing/WhyFlutterInit.tsx b/app/components/landing/WhyFlutterInit.tsx index 3ee3841..83f7204 100644 --- a/app/components/landing/WhyFlutterInit.tsx +++ b/app/components/landing/WhyFlutterInit.tsx @@ -7,13 +7,14 @@ import { Layers01Icon, Shield01Icon } from '@hugeicons/core-free-icons'; +import type { ReactNode } from 'react'; import { HugeiconsIcon } from '@hugeicons/react'; type Feature = { title: string; description: string; className: string; - icon: JSX.Element; + icon: ReactNode; accent: string; gradient: string; pattern: 'dots' | 'grid' | 'waves';