From 7b95300c829a025dc0edc0c837ce51b105c75165 Mon Sep 17 00:00:00 2001 From: Mohit Gaur Date: Wed, 29 Jul 2026 03:17:37 +0530 Subject: [PATCH 01/16] chore: restructure app directory with Next.js route groups --- client/src/app/{ => (app)}/builder/[appId]/[[...slug]]/layout.tsx | 0 client/src/app/{ => (app)}/builder/[appId]/[[...slug]]/page.tsx | 0 client/src/app/{ => (app)}/builder/[appId]/auth/page.tsx | 0 client/src/app/{ => (app)}/builder/[appId]/layout.tsx | 0 client/src/app/{ => (app)}/dashboard/page.tsx | 0 client/src/app/{ => (auth)}/auth/callback/callback-content.tsx | 0 client/src/app/{ => (auth)}/auth/callback/page.tsx | 0 client/src/app/{ => (auth)}/login/page.tsx | 0 client/src/app/{ => (auth)}/register/page.tsx | 0 client/src/app/{ => (marketing)}/page.tsx | 0 10 files changed, 0 insertions(+), 0 deletions(-) rename client/src/app/{ => (app)}/builder/[appId]/[[...slug]]/layout.tsx (100%) rename client/src/app/{ => (app)}/builder/[appId]/[[...slug]]/page.tsx (100%) rename client/src/app/{ => (app)}/builder/[appId]/auth/page.tsx (100%) rename client/src/app/{ => (app)}/builder/[appId]/layout.tsx (100%) rename client/src/app/{ => (app)}/dashboard/page.tsx (100%) rename client/src/app/{ => (auth)}/auth/callback/callback-content.tsx (100%) rename client/src/app/{ => (auth)}/auth/callback/page.tsx (100%) rename client/src/app/{ => (auth)}/login/page.tsx (100%) rename client/src/app/{ => (auth)}/register/page.tsx (100%) rename client/src/app/{ => (marketing)}/page.tsx (100%) diff --git a/client/src/app/builder/[appId]/[[...slug]]/layout.tsx b/client/src/app/(app)/builder/[appId]/[[...slug]]/layout.tsx similarity index 100% rename from client/src/app/builder/[appId]/[[...slug]]/layout.tsx rename to client/src/app/(app)/builder/[appId]/[[...slug]]/layout.tsx diff --git a/client/src/app/builder/[appId]/[[...slug]]/page.tsx b/client/src/app/(app)/builder/[appId]/[[...slug]]/page.tsx similarity index 100% rename from client/src/app/builder/[appId]/[[...slug]]/page.tsx rename to client/src/app/(app)/builder/[appId]/[[...slug]]/page.tsx diff --git a/client/src/app/builder/[appId]/auth/page.tsx b/client/src/app/(app)/builder/[appId]/auth/page.tsx similarity index 100% rename from client/src/app/builder/[appId]/auth/page.tsx rename to client/src/app/(app)/builder/[appId]/auth/page.tsx diff --git a/client/src/app/builder/[appId]/layout.tsx b/client/src/app/(app)/builder/[appId]/layout.tsx similarity index 100% rename from client/src/app/builder/[appId]/layout.tsx rename to client/src/app/(app)/builder/[appId]/layout.tsx diff --git a/client/src/app/dashboard/page.tsx b/client/src/app/(app)/dashboard/page.tsx similarity index 100% rename from client/src/app/dashboard/page.tsx rename to client/src/app/(app)/dashboard/page.tsx diff --git a/client/src/app/auth/callback/callback-content.tsx b/client/src/app/(auth)/auth/callback/callback-content.tsx similarity index 100% rename from client/src/app/auth/callback/callback-content.tsx rename to client/src/app/(auth)/auth/callback/callback-content.tsx diff --git a/client/src/app/auth/callback/page.tsx b/client/src/app/(auth)/auth/callback/page.tsx similarity index 100% rename from client/src/app/auth/callback/page.tsx rename to client/src/app/(auth)/auth/callback/page.tsx diff --git a/client/src/app/login/page.tsx b/client/src/app/(auth)/login/page.tsx similarity index 100% rename from client/src/app/login/page.tsx rename to client/src/app/(auth)/login/page.tsx diff --git a/client/src/app/register/page.tsx b/client/src/app/(auth)/register/page.tsx similarity index 100% rename from client/src/app/register/page.tsx rename to client/src/app/(auth)/register/page.tsx diff --git a/client/src/app/page.tsx b/client/src/app/(marketing)/page.tsx similarity index 100% rename from client/src/app/page.tsx rename to client/src/app/(marketing)/page.tsx From b670e31255d66bb753e89b9a505b77a4ccb91044 Mon Sep 17 00:00:00 2001 From: Mohit Gaur Date: Mon, 10 Aug 2026 10:59:07 +0530 Subject: [PATCH 02/16] style: implement configflow design tokens in tailwind --- client/tailwind.config.js | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/client/tailwind.config.js b/client/tailwind.config.js index bcc5a41..3094770 100644 --- a/client/tailwind.config.js +++ b/client/tailwind.config.js @@ -9,7 +9,28 @@ module.exports = { fontFamily: { sans: ["var(--font-inter)", "system-ui", "sans-serif"], }, + colors: { + // Core Brand Colors + 'cf-dark': '#0a0a0a', // The absolute background (deepest dark) + 'cf-surface': '#111111', // Slightly lighter for cards/panels + 'cf-surface-hover': '#1a1a1a', + 'cf-orange': '#ff6b00', // The primary glowing accent + 'cf-orange-dim': 'rgba(255, 107, 0, 0.2)', // For subtle glows + // Utilities + 'cf-border': 'rgba(255, 255, 255, 0.1)', + 'cf-text-muted': '#888888', + }, + animation: { + 'pulse-slow': 'pulse 4s cubic-bezier(0.4, 0, 0.6, 1) infinite', + 'float': 'float 6s ease-in-out infinite', + }, + keyframes: { + float: { + '0%, 100%': { transform: 'translateY(0)' }, + '50%': { transform: 'translateY(-10px)' }, + } + } }, }, plugins: [], -}; +}; \ No newline at end of file From 2a9eb218ec921f56fb268c494be43eaff8758ce6 Mon Sep 17 00:00:00 2001 From: Mohit Gaur Date: Mon, 10 Aug 2026 23:51:25 +0530 Subject: [PATCH 03/16] feat: implement marketing landing page with footer, navigation, and site assets --- client/public/apple-touch-icon.svg | 15 ---- client/public/configflow-logo-1024px.png | Bin 0 -> 14754 bytes client/public/configflow-logo.svg | 59 +++++++++++++ client/public/favicon.svg | 66 +++++++++++--- client/public/icon-192.png | Bin 524 -> 4403 bytes client/public/icon-192.svg | 15 ---- client/public/icon-512.png | Bin 0 -> 7173 bytes client/public/icon-512.svg | 15 ---- client/public/icon-maskable-192.png | Bin 0 -> 4403 bytes client/public/icon-maskable-192.svg | 15 ---- client/public/icon-maskable-512.png | Bin 0 -> 7173 bytes client/public/icon-maskable-512.svg | 15 ---- client/src/app/(marketing)/layout.tsx | 18 ++++ client/src/app/(marketing)/page.tsx | 36 -------- client/src/app/apple-icon.png | Bin 0 -> 2231 bytes client/src/app/favicon.ico | Bin 25931 -> 15086 bytes client/src/app/icon.png | Bin 0 -> 1080 bytes client/src/app/icon.svg | 1 + client/src/app/manifest.ts | 18 ++-- client/src/components/layout/Footer.tsx | 106 +++++++++++++++++++++++ client/src/components/layout/Navbar.tsx | 89 +++++++++++++++++++ client/tailwind.config.js | 93 ++++++++++++++++---- 22 files changed, 411 insertions(+), 150 deletions(-) delete mode 100644 client/public/apple-touch-icon.svg create mode 100644 client/public/configflow-logo-1024px.png create mode 100644 client/public/configflow-logo.svg delete mode 100644 client/public/icon-192.svg create mode 100644 client/public/icon-512.png delete mode 100644 client/public/icon-512.svg create mode 100644 client/public/icon-maskable-192.png delete mode 100644 client/public/icon-maskable-192.svg create mode 100644 client/public/icon-maskable-512.png delete mode 100644 client/public/icon-maskable-512.svg create mode 100644 client/src/app/(marketing)/layout.tsx create mode 100644 client/src/app/apple-icon.png create mode 100644 client/src/app/icon.png create mode 100644 client/src/app/icon.svg create mode 100644 client/src/components/layout/Footer.tsx create mode 100644 client/src/components/layout/Navbar.tsx diff --git a/client/public/apple-touch-icon.svg b/client/public/apple-touch-icon.svg deleted file mode 100644 index 4693628..0000000 --- a/client/public/apple-touch-icon.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/client/public/configflow-logo-1024px.png b/client/public/configflow-logo-1024px.png new file mode 100644 index 0000000000000000000000000000000000000000..412de9b5b18e47d465a27eec3c6d06e86309ed3c GIT binary patch literal 14754 zcmeHtc~n!^xBmrHR1{QHtjM5Nv6VRjg#dA2kSb`MKoKE8Kp+D{2w(`ITBQzvL#rY} ztZ1#3K?D*NNT>s$%3vITBtR5YP`Drx17v*XCSdXVet-Pd@AuYQ-?tvDMee!h?z8tf zpR=d4?>)NJ&wKXF#WNuYn(edEV;clb0nI7UbZv0?K(BfZF6FoYp9mkHZ=vbnW*Rh4 zO9#>dE#!Z()>QR%7ib%gwfBMcsxcabi=p;E^idg8)btUcANdOb{|KM)>of>DsjHrX zt-YPC)+tR}3vhrgjrH5v+G<_Wa8#)vNc)n8BQi*5LK`rJ6otpHfXj^7jk^;dNdE!y zul4I{ePalkx-M!*06D;Svr8C>V2uqYh2pG}39-m1$Q6?uiw%pxk;f1NaAd4`G67Faa7lKv zQ1f*GZKT`A0uaTAN4RYB@ERilcWxH@$>dlU8=Iu0BmL+`RKJOR1Y2-%K{Q{QOr@KI_>vDo+o+>Vr3 zoSVfqTmmUEJ`AVkfD9UAvLPOaCF8=~?QQKHt!%%uva@xy`IkqCjDH4rV98i_>dLr8 z5*Zy%3ez-PG#8I`8@D-zlGjsgNtzBz%_T7b7ykv}&UKz7AHO{WyA3g45QfHMiQ!*R zu16?6$e};%Nz(MwKF?1*lP@RdnN0QxcgL<-V;^B>YiH%`jIy&@V~2IJ!eSjFtgzvZ z_7RQ_IA?6Q-DfVEAz!lb3I$vo>>cbK9h~jf*f}{neD@D5>W5#_?;s_H?MHBSxBtxd zpFTCMs|~XC_$bYesc*)%?DGiCergCO=*<7U9)*W})}h$Mc)VIa!^3QFcpL#oBqJJR zH>N@1VJ_q-G9LGj{;b23ztkUK7%q4$G1AQ<*(w|tflb7dE!=k!)x*Ng!*K~wkwkMV za{%OjTG$vbSDOi9{y&x#JHhf0+fX|I#45l8uqM>ln!ugQxDZiSS*!{}mIqrl>*gQitZy{=b%;t+Or4B0>`{Fb6$b0>K$_>$ZekZoptr8K%H ziVSwL`nNcMfN+9wOgR*LezyJ$e$v+?fo%RV@N;Pn5@HS`(QB0l z_?aY~L|_tuNdzVl_%B8vx)P2?<+eeK&On!#O;y7Bl}@uE+m%{t2{DRaa(s#B=vGqJ zwDkNLP_!QXiCx*R77$eXHS~v-d>yxbS3aZ}_(9hM6_}z8g>2SN7u+)=*W=&JfYR;$ zM-LixE$AD(AjwI}l=(m6N2C2uvdIZ-u~~ zz`^~M!)GbauEG~k0-Qy~@$8sxdTG$su%Q$$z6u`XC?E0ZS1JSHtQg__ zVNZtT8Q>dNZiaSL$X`*qSVB)ObGwA#O}}Y!YnSXna7DGKm7*$OJ{w?}1Pdt1K1Un6 zzru9|XQ@8fG`hdQ-yy-yYZX-DF?ZZbAGPoJqx;Bl z0biF@;7HJ|qDcxlf1}=hN)$vBs~LnqObPr+N_j#RI4NA|Zj-Rc-^0v}r*?7a9YItII<1l^G-Ixad4MtBbC@uAktq&> ztL_UGNglzNI1OEzTXGV5s0=PpB}!T&Xn2_h#l@pvnh^f(>N3-6VA8R&_r-8Aj>nj} z@EmZ-wpvf}^sB^AjazoH9~N^I0}n9oa}RZ$rO<2x0^w|i68+E}~RKI5!t)gqBtK_-eQ zY^tW;h@EhYGa42}soMkph%UgOPHa|hSlvMFrqq@aoItuI$^tf3lw!j*1L6%j++^2p zyvim=9Ab`MfS(#(#<-r)?DEF`U$U8r`EyjRk&fg_<+{o@$9kF!3cyhb#0>jNNgwl5 zLKow8{Voziv`V`C!F~-a<)*YNw9b-F#;f{W)LhqsppKV>RMFQYfiA#A8@5%o=;b6)jN}MmW}<4Vt5P z7y3%G&g+E%JV(Wg5nYEeJBmQbGqWA1f7I^8#azwFEZ@+QrA#l4)y#HBv8#jfn+E(9 z+UvxL#5s&i`u8Z~s6bZ>sZQ-Z&BknV#$Fq_wx;Y9v%jgFyUT-K8(^+k+PA^2-yv+O z+>*D5BTq~PXI$VZuEf{v8O+`v(FGS9U&e%4f!68R;*|LOl`p zcK>0S*+M03!_s57vJ=BUWQmCT&e;xQ3{;$0rBS5KTi|zct)qt97b;9!Bt7@x#$Ms4 zZq`6*K@fQ_TBSGG&HKyR^={CC(8{;gI5VH{>46r zRAf1|MRB%}$CQ8C9cpr`+462N+D57`{q(ZEjH5$&Y6?H2JLw60^XIDi{aX)gAqv@- zV3`p-WDHzWo}v^AGK8+HcjBeR-H*XSfA=;?%66f+rBhULEBAPDwt_`@+7ANCWrNE$ z3E4^`vzDv?4m@~)`KpP_;o+S8wKs|Qe&`U%u&C!3Xrm_-AToq7wYT(yEfT!h=ow~5 zQ!Qt^BkPXEa}Y=TIoqr`FKSI4#sP8l=v(lE-riUIgg(*=csRi=+0Zd*cIV(B`* z8EIGE7&NfMNGcXHGi|BT?UtE9H|;9$6vD&YdS&#&8{PSV5vtM@Yhp{e0W+NSWKjfU9B?e5-pY;6}}d+?l(uV_L|bxT;Ch_y>P&4a3HVf z5r_%0+74KWzMOsJ@KR{oT&Q_?N{xZE-#I_?G$GG|xkc$)`Ra1dGoQ|_x3?^mRZBFR~Hg5*rhC~GgxO9*FoidF_zH#pSHKvyit z_F~K(S~ezUtqh}@Fa1lkM76Iql^LGNHz)~G#)|EHpBDKyDo3Ax7_NI;){sV!gdO@D zn7qacov-x?o9W-nso0^m+AX9=vn906&rn95x*R8Ed+8`iCW`W>p``f%v~j)NOFJNx z-WeqQWL4)bzD!Y!@+=(ex|cj{RwWIRGOg+)X&Wksn|scLI%pPC-Kq8ANi}wH%M&1vh*&Gg)Aeo}eGq>$+4KbaQIkG)#-N^HS-}m0fkSyF_yX zTM59PT27tR=;Mtg(6ER{kt#-5H49Uz>|(c%A>tI@np=7iBIm_QO6$RaKYR;F$6t(X z+PAtjeBFl}CGfzm?4Xao_6%J}zu%Hcx51wvup=trKYNBkZ8h5A?+BSv3*k}jUdSiGrI~U(U9C{tZ}| zo@0l*xRNlsf#+Ros{yVA4=t%qksl`&^v6)W%y$2gU1hDby7@y=L(UgOeIHJb7>T^v z_t6*A!sGg@IyefE3PdVt<03B&R4-E`e~Z6=jhQiU+}&Z?9F41R(0TbsLuYVG;7@tw zRPptxe8r1F8@AOw;_X$^=Zn^Uma6EOr+Oq@)^};x1IWvyJA(;$wx)P{Fc#}fS1WGy z1+AN1kJYSTMQzXa;~zfIka)=%VNRF5C-Pcqp)oWfAiSi0#J^)97R_EGeZH)Xl88*R z%qG=bDwrU1He)d&6MsW=!o6bpW9y&kZwPT9v-yHm;qYrUt6U5kuu2`ih}=c$D#OGT zcIo3jta&hcT1`bHm-CVNT`tvQslm8EDD0YnL@wZ#$0EjL$0Q#AGt_}FG6dfyJc2I` zKS0zP3H@UMB!otSxjXlcJSHATA$mO)$Ri?r)L}`JBGlAdzMHc4Ta8I>fzIcw$U_J< zp#egbU75%*;w*UrDE0NH{SZP;R7}s={S@)`fESYX*`hYN{96kR;8I0r1g0h5fD`aS z;9ok`@o;P{iB-P&JZsf~J9!^V)sAGsvJ1Ni%0A%NVqyMZNtIRO1oQ&9hDd_&51f-7 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 literal 0 HcmV?d00001 diff --git a/client/public/configflow-logo.svg b/client/public/configflow-logo.svg new file mode 100644 index 0000000..9efd449 --- /dev/null +++ b/client/public/configflow-logo.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/client/public/favicon.svg b/client/public/favicon.svg index 8bd2cc9..9efd449 100644 --- a/client/public/favicon.svg +++ b/client/public/favicon.svg @@ -1,15 +1,59 @@ - + - - - - + - - - - - - + + + + + + + + + + + \ No newline at end of file diff --git a/client/public/icon-192.png b/client/public/icon-192.png index 46f9ff19cb96f2a63cd409598a2f47d164a2cfb0..3d66282124f1022b9393d9e433bace1027f5a9a4 100644 GIT binary patch literal 4403 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 - - - - - - - - - - - - - - diff --git a/client/public/icon-512.png b/client/public/icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..18bc97498a10d7cc0c5face8c1c8db751330bb00 GIT binary patch literal 7173 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 k_xG^BKL`HtYp7UN`J9Gh$d#)b;D2 - - - - - - - - - - - - - - diff --git a/client/public/icon-maskable-192.png b/client/public/icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..3d66282124f1022b9393d9e433bace1027f5a9a4 GIT binary patch literal 4403 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 - - - - - - - - - - - - - - diff --git a/client/public/icon-maskable-512.png b/client/public/icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..18bc97498a10d7cc0c5face8c1c8db751330bb00 GIT binary patch literal 7173 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 k_xG^BKL`HtYp7UN`J9Gh$d#)b;D2 - - - - - - - - - - - - - - diff --git a/client/src/app/(marketing)/layout.tsx b/client/src/app/(marketing)/layout.tsx new file mode 100644 index 0000000..e8d4583 --- /dev/null +++ b/client/src/app/(marketing)/layout.tsx @@ -0,0 +1,18 @@ +import Navbar from "@/components/layout/Navbar"; +import Footer from "@/components/layout/Footer"; + +export default function MarketingLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( +
+ +
+ {children} +
+
+
+ ); +} \ No newline at end of file diff --git a/client/src/app/(marketing)/page.tsx b/client/src/app/(marketing)/page.tsx index 6e1c488..6466c09 100644 --- a/client/src/app/(marketing)/page.tsx +++ b/client/src/app/(marketing)/page.tsx @@ -148,42 +148,6 @@ export default function HomePage() { return (
- {/* Navigation */} - - {/* Hero Section */}
diff --git a/client/src/app/apple-icon.png b/client/src/app/apple-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4ffb8c826e6a082aa796771c78af00b49cc307f8 GIT binary patch literal 2231 zcmdUxYcv~Z8pmTT+O*?Rj44GswXJ*VR;x*9vuGV9B`#GOmx#-R#7GDt(vD_&Q@2o~ z2+?(E5fyc*NOjdPZf#~MjcKS$Mi8T8Bq0&mbarPy?T7ie^WlA-_dNge{+{=|=YP)g z-oE62{u7`v5C8yt;&Z_>P?ev4T>CUt5jw8vs7hxEUY7|7TpWQIor(qoqN9_%qtg>n zIP7^e7M&VRz@;9wOdt?a@Ml1vRFxX{Z#Dim)gFr`Se2KD%mV=X9DO{`1!YvO^L=mG zhMErj+-Ll=o|mrI2fOWCHJ$<4@B6RqQ{xY0xWwEj{C3H|YBeHvq2Ko4fYBWjmjy>~ zfSyKxu9vP}o?b+^!}Ww(Zw;S?1BdkS%2a>90vFWyMdEnhtJW{J?cFcJL+6-tP;tfT z>iMeEMA!Gtg<62mht&Z^OKR6HYy!?&WCD&BLjbxyW`J83Isnh&|2O%Cr473`L6jz! zO((ZEQ~32=hkKNZ_r<2AO>LoUp8gVwow5lCA2osUa_J(5Q(ar6+>KP6oo(cA78T0? zWjT7FeyZad%!~@^clWky3FUHSf!xxWnvPqS(?#UxEa{P^jwX2T_=(fcs{ODNZ%Lds z93lb82N7n$b3cM5OQ{N(Pp~q6u6|S-^w_>YRP+1g%Mt){+r3&*-nG4gR zX?+&8v@do@e_f>fq7LYeil)+|Mj@POjDwx`&Bo8t#Y%5AUNDum9#M@r6rPIBPg) z3R|3}Kx1~KQ%rG%D6ts7W4UFq%6!rmpTRQEWDUioj7((dC~I0p>N$6>2Bz75lv`{! zN@YSkIX2s@S%*Uy3&wVWI>e5B84wt00 z!(1hM2*WJ0x71IP6v<M1%&TQD@ZyuKQ@1I_#}VNgDwI+XLa2$ z>}i8%uqb|~%Kcx-bl{zc_DO>?kGcF~1HKTRsea!B+J;> z9r>c5=o$>v$VCDb-*TW6lWur5rO1Xf(wJPVq_ERx!{x-fFUfCd92yMth`VFA6-#OQ zMqJyKo)a|H+m$q8@P$iz&ci{57B%0RfN5>n9SlHDuM3Kze`wx$Q!@Ay6VgfCz9|X> zaw=hc0hffWRkhr{CRK4NW8w}>WkWxPl{0m!tn|P8dagm%36+2AxwSBon-zoP6dz78 z%66}UA%srU--5ogV6mK-$(l=AVRBv?sxa|E!q~ZAOxewq0ezTOYgw6mS}f4lFqR)z zq43tut*Mv((@oXkfr{f+^J`83LPHl1a4@*bK@6IrGmFvMz#X+BU|zQp28n&#Y7=sC zk|KGNW{mh0A#8*Z;{%o53rJbC2d?#ShhNYBIQK|93|;=Pt>EIU3()kk5X-#VMPl82 zY+yk#99lW?;MqG9IfCji9!3eS&r~_f`sv2T4)#N=RAibHaqx|y8+>LnxG(B8_)Yo> z3mI0gi#N9xPcfM%Qz{r%Dviw7uN{a5j26lVzflkSu7qYN?H+%)bzb zH`ab|oyuYnNvy7XxFeWd2V^!%$e9j}~7mmuP$DNj&TduCRaK?!uw|ESe zy=D|5gy7?rMD(Ki*^u)sU8FQx#XBHSH2?eX$Wnaan@(3+Iou|R1f z{t4HHM1z$5or^^NQ#J;3-_42^Ww>EA~_Um5=5Z>03QikUF;V&RX6**&8TQ_oj8EXY@RC-E^6+z+9z}45b zr!qZ$G|1}zM;%u@R0)IswcDU)?;C`0zg8J++8hsr&c6>7%257{lSd+eS1G?6a>e0S z>bj9EUHODF87hI{L|%gBD@vk(mA%uA#=owlbf&kTB;~>2;X+%=m#@fl5%S{db#?F| zAT*2-U{2Mx-&(w>4c3N-8a@-nd|(OUv6h79!RH!nChLZqW|ifzWxN{0WrA1tM;Unk ddloA-gipVwX?^(KQ}q)8_;~qyGGS3){R??c6runC literal 0 HcmV?d00001 diff --git a/client/src/app/favicon.ico b/client/src/app/favicon.ico index 718d6fea4835ec2d246af9800eddb7ffb276240c..f9c81caeb64a1954bed2dc8fec9b8c8ff60d457e 100644 GIT binary patch literal 15086 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 LrJugUA?W`A8`#=m diff --git a/client/src/app/icon.png b/client/src/app/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a43904573526f468df90daabe9bf1963ac8214f9 GIT binary patch literal 1080 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGo4kfM;CBgY=CFO}lsSH7>i8*eG zWtqwOdG4ussYQt;`9%sE86_nJ#a8%kYo2n75ZEMeO{ml5R8#f;_cC`T_3yqgRY^Wl<5ZLA&4lAl zi%z&r>OCKjbL5b@;Jd?TEc0TX-6?)P@8i6k?|1(&y=-ax-sbsV)A;{0nI{!|3E)qV z{mO7HkebxVdgUhmo)3yM|MgcMv|M-Gjt@IiGr4erH{?;DOKdua`Rux&)Wq5)?=*UA9;MfgSU) z(7T(J*DQKa+ji^x%^u0xc!!!#{RO+lw_aa%?Ou}_mtXoC>3EkdszSfFGzhr`e9$O< z+wgYf*2kaSYW|&wtB$`U4fY<;uf3WI{xJ@|N4|5E2UkpZDRhPP%L>nS34^EeO_If! z*X?4kX9tIcRM>$Dr%oDW=X$Q)D|%Q`mANJ|`~9om&VoL2h1&u?>})r+o@Bdx_d$z; zyL!T%&Py0vR#lbpB5F75X6^3+ z{hAV&fByW#v$a}xL5)Pj&DFD~mFzP}h|8}F&|^81;=y8*G&jEX{I;Y&Zkrxxu*Sc> z@yDMhBRs!Mk;UMqZ+j85T3|ts;JPJ2dGBsN`TO_FQ@;(O!jswcZk^TZX^7I~KJovk z4lI0NY2lwx!DMN}d21!YJRa>X*4)xZR0Wc*6#MLv=}3-6;&mSxt;yF|JuGcfg9Ols$uLN_W5|K^;Y4QNZBo>gTe~ HDWM4fpkUwn literal 0 HcmV?d00001 diff --git a/client/src/app/icon.svg b/client/src/app/icon.svg new file mode 100644 index 0000000..d610dbd --- /dev/null +++ b/client/src/app/icon.svg @@ -0,0 +1 @@ +RealFaviconGeneratorhttps://realfavicongenerator.net \ No newline at end of file diff --git a/client/src/app/manifest.ts b/client/src/app/manifest.ts index 20982ac..15e5ae0 100644 --- a/client/src/app/manifest.ts +++ b/client/src/app/manifest.ts @@ -10,31 +10,31 @@ export default function manifest(): MetadataRoute.Manifest { display: "standalone", orientation: "portrait-primary", background_color: "#0a0a0a", - theme_color: "#6366f1", + theme_color: "#ff6b00", categories: ["productivity", "utilities"], icons: [ { - src: "/icon-192.svg", + src: "/icon-192.png", sizes: "192x192", - type: "image/svg+xml", + type: "image/png", purpose: "any", }, { - src: "/icon-512.svg", + src: "/icon-512.png", sizes: "512x512", - type: "image/svg+xml", + type: "image/png", purpose: "any", }, { - src: "/icon-maskable-192.svg", + src: "/icon-maskable-192.png", sizes: "192x192", - type: "image/svg+xml", + type: "image/png", purpose: "maskable", }, { - src: "/icon-maskable-512.svg", + src: "/icon-maskable-512.png", sizes: "512x512", - type: "image/svg+xml", + type: "image/png", purpose: "maskable", }, ], diff --git a/client/src/components/layout/Footer.tsx b/client/src/components/layout/Footer.tsx new file mode 100644 index 0000000..fa9966f --- /dev/null +++ b/client/src/components/layout/Footer.tsx @@ -0,0 +1,106 @@ +import Link from "next/link"; + +export default function Footer() { + return ( +
+
+
+
+ + + + + + + {/* Connection Circuit Lines */} + + + + + {/* Architectural Nodes */} + + + + + + ConfigFlow + +
+

The operating system for software generation.

+
+
+

PRODUCT

+
    +
  • Templates
  • +
  • Pricing
  • +
+
+
+

COMPANY

+
    +
  • Mission
  • +
  • Showcase
  • +
+
+
+

SUPPORT

+
    +
  • Contact Support
  • +
+
+
+
+
© 2024 ConfigFlow Engineering. All rights reserved.
+
+ Privacy + Terms +
+ System Operational +
+
+
+
+ ); +} \ No newline at end of file diff --git a/client/src/components/layout/Navbar.tsx b/client/src/components/layout/Navbar.tsx new file mode 100644 index 0000000..50878db --- /dev/null +++ b/client/src/components/layout/Navbar.tsx @@ -0,0 +1,89 @@ +import Link from "next/link"; + +export default function Navbar() { + return ( + + ); +} \ No newline at end of file diff --git a/client/tailwind.config.js b/client/tailwind.config.js index 3094770..b9bf331 100644 --- a/client/tailwind.config.js +++ b/client/tailwind.config.js @@ -6,29 +6,84 @@ module.exports = { darkMode: "class", theme: { extend: { + colors: { + // Semantic Surface Colors + 'surface': '#131313', + 'surface-dim': '#131313', + 'surface-bright': '#3a3939', + 'surface-container-lowest': '#0e0e0e', + 'surface-container-low': '#1c1b1b', + 'surface-container': '#201f1f', + 'surface-container-high': '#2a2a2a', + 'surface-container-highest': '#353534', + + // Semantic Text/Icon Colors + 'on-surface': '#e5e2e1', + 'on-surface-variant': '#e2bfb0', + 'inverse-surface': '#e5e2e1', + 'inverse-on-surface': '#313030', + + // Borders and Outlines + 'outline': '#a98a7d', + 'outline-variant': '#5a4136', + 'outline-hairline': 'rgba(255, 255, 255, 0.1)', + + // Primary (Warm Orange) + 'primary': '#ffb693', + 'on-primary': '#561f00', + 'primary-container': '#ff6b00', + 'on-primary-container': '#572000', + 'primary-fixed': '#ffdbcc', + 'primary-fixed-dim': '#ffb693', + + // Secondary & Tertiary + 'secondary': '#c0c1ff', + 'secondary-container': '#3131c0', + 'tertiary': '#4edea3', + 'tertiary-container': '#00ae78', + + // Backgrounds & Utilities + 'background': '#131313', + 'terminal-bg': '#09090B', + 'surface-elevated': '#111111', + 'code-indigo': '#C7D2FE', + 'error-red': '#EF4444', + 'warning-amber': '#F59E0B', + }, fontFamily: { - sans: ["var(--font-inter)", "system-ui", "sans-serif"], + 'display-hero': ['Inter', 'sans-serif'], + 'headline-lg': ['Inter', 'sans-serif'], + 'headline-md': ['Inter', 'sans-serif'], + 'body-lg': ['Inter', 'sans-serif'], + 'body-md': ['Inter', 'sans-serif'], + 'code-base': ['Geist Mono', 'monospace'], + 'label-caps': ['Geist Mono', 'monospace'], + 'label-tech': ['Geist Mono', 'monospace'], }, - colors: { - // Core Brand Colors - 'cf-dark': '#0a0a0a', // The absolute background (deepest dark) - 'cf-surface': '#111111', // Slightly lighter for cards/panels - 'cf-surface-hover': '#1a1a1a', - 'cf-orange': '#ff6b00', // The primary glowing accent - 'cf-orange-dim': 'rgba(255, 107, 0, 0.2)', // For subtle glows - // Utilities - 'cf-border': 'rgba(255, 255, 255, 0.1)', - 'cf-text-muted': '#888888', + fontSize: { + 'display-hero': ['72px', { lineHeight: '1.1', letterSpacing: '-0.04em', fontWeight: '900' }], + 'headline-lg': ['32px', { lineHeight: '1.2', letterSpacing: '-0.02em', fontWeight: '700' }], + 'headline-md': ['24px', { lineHeight: '1.3', fontWeight: '700' }], + 'body-lg': ['18px', { lineHeight: '1.6', fontWeight: '400' }], + 'body-md': ['15px', { lineHeight: '1.5', fontWeight: '400' }], + 'code-base': ['14px', { lineHeight: '1.6', fontWeight: '400' }], + 'label-caps': ['11px', { lineHeight: '1.0', letterSpacing: '0.15em', fontWeight: '700' }], + 'label-tech': ['12px', { lineHeight: '1.2', fontWeight: '500' }], }, - animation: { - 'pulse-slow': 'pulse 4s cubic-bezier(0.4, 0, 0.6, 1) infinite', - 'float': 'float 6s ease-in-out infinite', + spacing: { + 'base': '4px', + 'gutter': '16px', + 'margin-safe': '32px', + 'panel-gap': '1px', + 'container-max': '1440px', }, - keyframes: { - float: { - '0%, 100%': { transform: 'translateY(0)' }, - '50%': { transform: 'translateY(-10px)' }, - } + borderRadius: { + 'sm': '0.125rem', + DEFAULT: '0.25rem', + 'md': '0.375rem', + 'lg': '0.5rem', + 'xl': '0.75rem', + 'full': '9999px', } }, }, From 4b3000ee3b92c406fe1f0a5578feb59b267d3928 Mon Sep 17 00:00:00 2001 From: Mohit Gaur Date: Tue, 11 Aug 2026 01:24:40 +0530 Subject: [PATCH 04/16] feat: initialize marketing landing page and global styles with Next.js layout --- client/src/app/(marketing)/page.tsx | 430 ++++++++++++++-------------- client/src/app/globals.css | 67 +++++ client/src/app/layout.tsx | 1 + 3 files changed, 283 insertions(+), 215 deletions(-) diff --git a/client/src/app/(marketing)/page.tsx b/client/src/app/(marketing)/page.tsx index 6466c09..555bc40 100644 --- a/client/src/app/(marketing)/page.tsx +++ b/client/src/app/(marketing)/page.tsx @@ -1,238 +1,238 @@ "use client"; +import Link from "next/link"; +import { useEffect, useRef } from "react"; -import { useState, useEffect, useCallback } from "react"; -import { useRouter } from "next/navigation"; -import Image from "next/image"; -import { useAuth } from "@/lib/auth-context"; -import { ArrowRight, Code2, Database, LayoutTemplate, Zap } from "lucide-react"; -import api from "@/lib/api"; - -import { useTranslation } from "@/i18n/useTranslation"; -import LanguageSwitcher from "@/components/LanguageSwitcher"; -import PwaRegister from "@/components/PwaRegister"; -import { toast } from "react-hot-toast"; -const SAMPLE_CONFIG = { - "app": { - "name": "Task Manager", - "description": "Personal task tracking app", - "theme": { "primaryColor": "#6366f1", "mode": "light" }, - "auth": { "enabled": true } - }, - "entities": { - "task": { - "userScoped": true, - "displayField": "title", - "fields": { - "title": { "type": "string", "required": true, "label": "Task Title" }, - "description": { "type": "text", "label": "Description" }, - "status": { "type": "enum", "options": ["todo", "in_progress", "done"], "default": "todo", "label": "Status" }, - "priority": { "type": "number", "min": 1, "max": 5, "default": 3, "label": "Priority" }, - "dueDate": { "type": "date", "label": "Due Date" }, - "isUrgent": { "type": "boolean", "default": false, "label": "Urgent?" } - } - } - }, - "pages": [ - { - "type": "table", "name": "All Tasks", "path": "/tasks", - "entity": "task", - "columns": ["title", "status", "priority", "dueDate", "isUrgent"], - "actions": ["create", "edit", "delete"], - "filters": ["status", "priority"], - "searchable": true, - "pageSize": 10 - }, - { - "type": "form", "name": "New Task", "path": "/tasks/new", - "entity": "task", - "fields": ["title", "description", "status", "priority", "dueDate", "isUrgent"] - }, - { - "type": "dashboard", "name": "Dashboard", "path": "/dashboard", - "widgets": [ - { "type": "stat", "label": "Total Tasks", "entity": "task", "operation": "count" }, - { "type": "stat", "label": "Avg Priority", "entity": "task", "operation": "avg", "field": "priority" }, - { "type": "chart", "label": "Tasks by Status", "entity": "task", "groupBy": "status", "chartType": "pie" }, - { "type": "list", "label": "Recent Tasks", "entity": "task" } - ] - } - ] -}; - -export default function HomePage() { - const { isAuthenticated, loading } = useAuth(); - const router = useRouter(); - const [jsonInput, setJsonInput] = useState(JSON.stringify(SAMPLE_CONFIG, null, 2)); - const [isGenerating, setIsGenerating] = useState(false); - const [error, setError] = useState(""); - - const { t, direction } = useTranslation(); - const handleGenerate = useCallback(async (configString: string) => { - try { - setIsGenerating(true); - setError(""); - const configJson = JSON.parse(configString); - - const response = await api.post("/apps", configJson); - if (response.data.success) { - toast.success("Application created"); - router.push(`/builder/${response.data.data.id}`); - } - } catch (err: unknown) { - let message = "Invalid JSON or server error"; - if (typeof err === "object" && err !== null) { - const e = err as { response?: { data?: { error?: unknown } }; message?: unknown }; - if (typeof e.response?.data?.error === "string") { - message = e.response!.data!.error as string; - } else if (typeof e.message === "string") { - message = e.message; - } - } else if (typeof err === "string") { - message = err; - } - setError(message); - } finally { - setIsGenerating(false); - } - }, [router]); +export default function Home() { + const heroRef = useRef(null); + const glowRef = useRef(null); useEffect(() => { - // If returning from login with a pending config, generate it - const pendingConfig = localStorage.getItem("pending_app_config"); - if (isAuthenticated && pendingConfig) { - localStorage.removeItem("pending_app_config"); - // defer to avoid calling setState synchronously during rendering - setTimeout(() => handleGenerate(pendingConfig), 0); - } - }, [isAuthenticated, handleGenerate]); - - useEffect(() => { - if (typeof window !== "undefined") { - const searchParams = new URLSearchParams(window.location.search); - const sharedText = searchParams.get("text") || searchParams.get("title"); - const sharedUrl = searchParams.get("url"); - - let contentToParse = sharedText || ""; - if (sharedUrl && !contentToParse.includes(sharedUrl)) { - contentToParse = contentToParse ? `${contentToParse}\n${sharedUrl}` : sharedUrl; - } - - if (contentToParse) { - try { - const trimmed = contentToParse.trim(); - if (trimmed.startsWith("{") && trimmed.endsWith("}")) { - const parsed = JSON.parse(trimmed); - setJsonInput(JSON.stringify(parsed, null, 2)); - toast.success("Imported shared configuration!"); - - // Clean up query string from URL - const cleanUrl = window.location.pathname; - window.history.replaceState({}, document.title, cleanUrl); - } - } catch (e) { - // not valid JSON - } - } + const heroSection = heroRef.current; + const mouseGlow = glowRef.current; + + if (heroSection && mouseGlow) { + const handleMouseMove = (e: MouseEvent) => { + const rect = heroSection.getBoundingClientRect(); + const x = e.clientX - rect.left; + const y = e.clientY - rect.top; + mouseGlow.style.left = `${x}px`; + mouseGlow.style.top = `${y}px`; + }; + + heroSection.addEventListener('mousemove', handleMouseMove); + heroSection.addEventListener('mouseleave', () => { + mouseGlow.style.left = '50%'; + mouseGlow.style.top = '50%'; + }); + + return () => { + heroSection.removeEventListener('mousemove', handleMouseMove); + }; } }, []); - const handleGenerateClick = () => { - if (!isAuthenticated) { - localStorage.setItem("pending_app_config", jsonInput); - router.push("/login?redirect=generate"); - return; - } - handleGenerate(jsonInput); - }; - return ( -
- +
{/* Hero Section */} -
-
+
+
+
+
+ + Configuration is the new compiler +
+

+
Define it.
+
Generate it.
+
Ship it.
+

+

+ Describe your software architecture in JSON. ConfigFlow's generation engine orchestrates the architecture and generates a production-ready Next.js system in minutes. +

+
+ + Start Building Free + arrow_forward + + + play_circle + See How It Works + +
+
+
+ memory + Config-Driven Architecture +
+
+ verified + Production Ready +
+
+
+ + {/* Abstract Isometric Diagram */} +
+
+
+
+
+
+
- {/* Left: Copy */} -
-
- - {t('header.tagline')} +
+
+
+
+
+
+
-

- {t('home.title')} - - {t('home.subtitle')} - -

-

- {t('header.description')} -

-
- } title={t('home.featureDatabase')} desc={t('home.featureDatabaseDesc')} /> - } title={t('home.featureNext')} desc={t('home.featureNextDesc')} /> - } title={t('home.featureExport')} desc={t('home.featureExportDesc')} /> +
+
+ chat_bubble_outline +
+ DEFINE +
+ +
+
+ code +
+
+
+
+ CONFIG +
+ +
+
+ layers +
+ PRODUCTION
- - {/* Right: The Prompt Box (JSON Editor) */} -
-
-
- - {/* Editor Header */} -
-
-
-
-
+
+
+ + {/* Tech Stack Band */} +
+
+
+ language + NEXT.JS +
+
+ code + REACT +
+
+ api + EXPRESS +
+
+ database + POSTGRESQL +
+
+ schema + PRISMA +
+
+ palette + TAILWIND CSS +
+
+
+ + {/* Generate Section (Showpiece) */} +
+
+

THE ENGINE

+

A complete, production-ready architecture.

+

Every layer. Every file. Every configuration. Generated, connected, and ready to scale.

+
+
+
+ + {/* JSON Input Left */} +
+
+
+
+
+ config.json +
+
+{`{
+  "`}project{`": "`}SaaS CRM{`",
+  "`}models{`": [
+    {
+      "`}name{`": "`}Customer{`",
+      "`}fields{`": {
+        "`}email{`": "`}String @unique{`",
+        "`}status{`": "`}Enum{`"
+      }
+    }
+  ],
+  "`}features{`": [
+    "`}auth{`",
+    "`}api_routes{`",
+    "`}dashboard_ui{`"
+  ]
+}`}
+              
+
+ + {/* Engine Core Middle */} +
+
+
+ settings_b_roll +
+
+ GENERATION ENGINE
+ RESOLVING DEPENDENCIES +
+
+ + {/* Outputs Right */} +
+
+ database +
+
DATABASE
+
schema.prisma generated
-
app-config.json
-
- - {/* Editor Body */} -
-