From 7adee96905d0e1e9689566152cb1c7358956ba85 Mon Sep 17 00:00:00 2001 From: Clemence Kyara Date: Fri, 30 Aug 2024 14:49:51 +0300 Subject: [PATCH 1/8] Update metadata --- apps/engineeringblog/app/apple-touch.png | Bin 0 -> 4679 bytes apps/engineeringblog/app/favicon.ico | Bin 25931 -> 15086 bytes apps/engineeringblog/app/icon.png | Bin 0 -> 11295 bytes apps/engineeringblog/app/openGraphImage.jpg | Bin 0 -> 35285 bytes apps/engineeringblog/app/robots.txt | 6 ++++++ 5 files changed, 6 insertions(+) create mode 100644 apps/engineeringblog/app/apple-touch.png create mode 100644 apps/engineeringblog/app/icon.png create mode 100644 apps/engineeringblog/app/openGraphImage.jpg create mode 100644 apps/engineeringblog/app/robots.txt diff --git a/apps/engineeringblog/app/apple-touch.png b/apps/engineeringblog/app/apple-touch.png new file mode 100644 index 0000000000000000000000000000000000000000..451a89ef7bea382f6b5c160f13794e6cc56b7fed GIT binary patch literal 4679 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 GMEwuo$*Wrc literal 0 HcmV?d00001 diff --git a/apps/engineeringblog/app/favicon.ico b/apps/engineeringblog/app/favicon.ico index 718d6fea4835ec2d246af9800eddb7ffb276240c..a1d054c5dc768dae91fcf7a97376698e8091f153 100644 GIT binary patch literal 15086 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 literal 25931 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 LrJugUA?W`A8`#=m diff --git a/apps/engineeringblog/app/icon.png b/apps/engineeringblog/app/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f47760d726e8f6bad551213bb4e2efa2485f6397 GIT binary patch literal 11295 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 Date: Fri, 30 Aug 2024 14:50:27 +0300 Subject: [PATCH 2/8] Switch to using system fonts Use what GitHub uses --- apps/engineeringblog/theme/index.ts | 76 +++++++++++++---------------- 1 file changed, 35 insertions(+), 41 deletions(-) diff --git a/apps/engineeringblog/theme/index.ts b/apps/engineeringblog/theme/index.ts index fda604905..008438231 100644 --- a/apps/engineeringblog/theme/index.ts +++ b/apps/engineeringblog/theme/index.ts @@ -1,20 +1,10 @@ -"use client"; - -import { createTheme, ThemeOptions } from "@mui/material"; +import { ThemeOptions, createTheme } from "@mui/material/styles"; import { deepmerge } from "@mui/utils"; -import { Merriweather, Open_Sans } from "next/font/google"; - -const openSans = Open_Sans({ - weight: ["300", "400", "600", "700", "800"], - subsets: ["latin"], -}); -const merriWeather = Merriweather({ - weight: ["300", "400", "700"], - subsets: ["latin"], -}); -const FONT_FAMILY_PRIMARY = openSans.style.fontFamily; -const FONT_FAMILY_SECONDARY = merriWeather.style.fontFamily; +const FONT_FAMILY_SANS = + '-apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"'; +const FONT_FAMILY_MONO = + 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace !important'; const palette = { mode: "light", @@ -39,6 +29,17 @@ const breakpoints = { }, }; +declare module "@mui/material/styles" { + interface TypographyOptions { + fontFamilyMono: string; + } + interface Theme { + typography: { + fontFamilyMono: string; + }; + } +} + const theme = createTheme({ palette, breakpoints, @@ -52,99 +53,100 @@ const theme = createTheme({ unit: "px", }, typography: { - fontFamily: FONT_FAMILY_PRIMARY, + fontFamily: FONT_FAMILY_SANS, + fontFamilyMono: FONT_FAMILY_MONO, display1: { - fontFamily: FONT_FAMILY_PRIMARY, + fontFamily: FONT_FAMILY_SANS, fontStyle: "normal", fontWeight: 300, lineHeight: 72 / 72, }, display2: { - fontFamily: FONT_FAMILY_PRIMARY, + fontFamily: FONT_FAMILY_SANS, fontStyle: "normal", fontWeight: 700, lineHeight: 72 / 60, letterSpacing: "-0.04em", }, h1: { - fontFamily: FONT_FAMILY_PRIMARY, + fontFamily: FONT_FAMILY_SANS, fontStyle: "normal", fontWeight: 700, letterSpacing: "-0.04em", }, h2: { - fontFamily: FONT_FAMILY_PRIMARY, + fontFamily: FONT_FAMILY_SANS, fontStyle: "normal", fontWeight: 700, letterSpacing: "-0.04em", }, h3: { - fontFamily: FONT_FAMILY_PRIMARY, + fontFamily: FONT_FAMILY_SANS, fontStyle: "normal", fontWeight: 700, letterSpacing: "-0.02em", }, h4: { - fontFamily: FONT_FAMILY_PRIMARY, + fontFamily: FONT_FAMILY_SANS, fontStyle: "normal", fontWeight: 700, letterSpacing: "-0.02em", }, h5: { - fontFamily: FONT_FAMILY_PRIMARY, + fontFamily: FONT_FAMILY_SANS, fontStyle: "normal", fontWeight: 700, letterSpacing: "-0.02em", }, h6: { - fontFamily: FONT_FAMILY_PRIMARY, + fontFamily: FONT_FAMILY_SANS, fontStyle: "normal", fontWeight: 700, letterSpacing: "-0.02em", }, subheading: { - fontFamily: FONT_FAMILY_SECONDARY, + fontFamily: FONT_FAMILY_SANS, fontStyle: "normal", fontWeight: 300, }, subtitle1: { - fontFamily: FONT_FAMILY_PRIMARY, + fontFamily: FONT_FAMILY_SANS, fontStyle: "normal", fontWeight: 400, }, subtitle2: { - fontFamily: FONT_FAMILY_PRIMARY, + fontFamily: FONT_FAMILY_SANS, fontStyle: "normal", fontWeight: 400, }, body1: { - fontFamily: FONT_FAMILY_PRIMARY, + fontFamily: FONT_FAMILY_SANS, fontStyle: "normal", fontWeight: 400, }, body2: { - fontFamily: FONT_FAMILY_PRIMARY, + fontFamily: FONT_FAMILY_SANS, fontStyle: "normal", fontWeight: 400, }, body3: { - fontFamily: FONT_FAMILY_PRIMARY, + fontFamily: FONT_FAMILY_SANS, fontStyle: "normal", fontWeight: 400, }, button: { - fontFamily: FONT_FAMILY_PRIMARY, + fontFamily: FONT_FAMILY_SANS, fontStyle: "normal", fontWeight: 600, }, caption: { - fontFamily: FONT_FAMILY_PRIMARY, + fontFamily: FONT_FAMILY_SANS, fontStyle: "normal", fontWeight: 400, lineHeight: 14 / 12, }, footer: { - fontFamily: FONT_FAMILY_PRIMARY, + fontFamily: FONT_FAMILY_SANS, fontStyle: "normal", fontWeight: 400, lineHeight: 14 / 12, @@ -373,10 +375,6 @@ deepmerge( body1: { fontSize: pxToRem(14), lineHeight: 23 / 14, - marginTop: pxToRem(28), - "&:first-of-type": { - marginTop: 0, - }, }, body1SemiBold: { ...theme.typography.body1, @@ -398,10 +396,6 @@ deepmerge( body2: { fontSize: pxToRem(16), lineHeight: 26 / 16, - marginTop: pxToRem(28), - "&:first-of-type": { - marginTop: 0, - }, }, body2SemiBold: { ...theme.typography.body2, From c72446fde24b4063f5bc6a6ce44bbad3897ed877 Mon Sep 17 00:00:00 2001 From: Clemence Kyara Date: Fri, 30 Aug 2024 14:51:03 +0300 Subject: [PATCH 3/8] Update main page/layout --- apps/engineeringblog/app/layout.tsx | 10 ++++------ apps/engineeringblog/app/page.tsx | 8 +++++++- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/apps/engineeringblog/app/layout.tsx b/apps/engineeringblog/app/layout.tsx index c5049d60b..636aa7f3b 100644 --- a/apps/engineeringblog/app/layout.tsx +++ b/apps/engineeringblog/app/layout.tsx @@ -1,14 +1,12 @@ import type { Metadata } from "next"; -import { Inter } from "next/font/google"; import Navbar from "@/engineeringblog/components/Navbar"; import { AppRouterCacheProvider } from "@mui/material-nextjs/v13-appRouter"; import StyledRoot from "./StyledRoot"; -const inter = Inter({ subsets: ["latin"] }); - export const metadata: Metadata = { - title: "Code For Africa Engineering", - description: "The homepage of CFA engineering blog", + title: "Technology | Code for Africa", + description: + "Tech adventures in Africa's civic labs: Coding, innovating, and disrupting for good across the continent.", }; export default function RootLayout({ @@ -18,7 +16,7 @@ export default function RootLayout({ }>) { return ( - + diff --git a/apps/engineeringblog/app/page.tsx b/apps/engineeringblog/app/page.tsx index 208faa4be..424794867 100644 --- a/apps/engineeringblog/app/page.tsx +++ b/apps/engineeringblog/app/page.tsx @@ -1,3 +1,9 @@ +import { Box, Container } from "@mui/material"; + export default function index() { - return
Homepage
; + return ( + + Homepage + + ); } From 0cb81bc6551aba5d2425f412deb9d7223403f3d2 Mon Sep 17 00:00:00 2001 From: Clemence Kyara Date: Fri, 30 Aug 2024 14:51:37 +0300 Subject: [PATCH 4/8] Initial implementation of Navbar (xs and md) --- ...vron-left, Size=24, Color=CurrentColor.svg | 3 + ...Type=menu, Size=24, Color=CurrentColor.svg | 5 + .../Type=x, Size=24, Color=CurrentColor.svg | 4 + .../assets/images/logo-dark-mode.png | Bin 27873 -> 0 bytes .../assets/images/logo-dark.png | Bin 0 -> 982 bytes .../assets/images/logo-light-mode.png | Bin 17639 -> 0 bytes .../assets/images/logo-light.png | Bin 0 -> 982 bytes .../components/DesktopNavBar/DesktopNavBar.js | 35 ++++++ .../components/DesktopNavBar/index.js | 3 + apps/engineeringblog/components/Logo/Logo.js | 40 +++++++ apps/engineeringblog/components/Logo/index.js | 3 + .../components/MobileNavBar/MobileNavBar.js | 110 ++++++++++++++++++ .../components/MobileNavBar/index.js | 3 + .../components/NavBar/NavBar.js | 78 +++++++++++++ .../components/NavBar/index.js | 3 + apps/engineeringblog/components/Navbar.tsx | 40 ------- 16 files changed, 287 insertions(+), 40 deletions(-) create mode 100644 apps/engineeringblog/assets/icons/Type=chevron-left, Size=24, Color=CurrentColor.svg create mode 100644 apps/engineeringblog/assets/icons/Type=menu, Size=24, Color=CurrentColor.svg create mode 100644 apps/engineeringblog/assets/icons/Type=x, Size=24, Color=CurrentColor.svg delete mode 100644 apps/engineeringblog/assets/images/logo-dark-mode.png create mode 100644 apps/engineeringblog/assets/images/logo-dark.png delete mode 100644 apps/engineeringblog/assets/images/logo-light-mode.png create mode 100644 apps/engineeringblog/assets/images/logo-light.png create mode 100644 apps/engineeringblog/components/DesktopNavBar/DesktopNavBar.js create mode 100644 apps/engineeringblog/components/DesktopNavBar/index.js create mode 100644 apps/engineeringblog/components/Logo/Logo.js create mode 100644 apps/engineeringblog/components/Logo/index.js create mode 100644 apps/engineeringblog/components/MobileNavBar/MobileNavBar.js create mode 100644 apps/engineeringblog/components/MobileNavBar/index.js create mode 100644 apps/engineeringblog/components/NavBar/NavBar.js create mode 100644 apps/engineeringblog/components/NavBar/index.js delete mode 100644 apps/engineeringblog/components/Navbar.tsx diff --git a/apps/engineeringblog/assets/icons/Type=chevron-left, Size=24, Color=CurrentColor.svg b/apps/engineeringblog/assets/icons/Type=chevron-left, Size=24, Color=CurrentColor.svg new file mode 100644 index 000000000..0b40930e2 --- /dev/null +++ b/apps/engineeringblog/assets/icons/Type=chevron-left, Size=24, Color=CurrentColor.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/engineeringblog/assets/icons/Type=menu, Size=24, Color=CurrentColor.svg b/apps/engineeringblog/assets/icons/Type=menu, Size=24, Color=CurrentColor.svg new file mode 100644 index 000000000..2c00a8dcc --- /dev/null +++ b/apps/engineeringblog/assets/icons/Type=menu, Size=24, Color=CurrentColor.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/engineeringblog/assets/icons/Type=x, Size=24, Color=CurrentColor.svg b/apps/engineeringblog/assets/icons/Type=x, Size=24, Color=CurrentColor.svg new file mode 100644 index 000000000..93fbad2f7 --- /dev/null +++ b/apps/engineeringblog/assets/icons/Type=x, Size=24, Color=CurrentColor.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/engineeringblog/assets/images/logo-dark-mode.png b/apps/engineeringblog/assets/images/logo-dark-mode.png deleted file mode 100644 index 78594c18dd1cb569888a4c4051f660df0a4fe01f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27873 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 B`D*|G diff --git a/apps/engineeringblog/assets/images/logo-dark.png b/apps/engineeringblog/assets/images/logo-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..570eda132a4b73a148e92233369f6d0e34a3d84d GIT binary patch literal 982 zcmeAS@N?(olHy`uVBq!ia0y~yV7v{)|5=!UB5yOZ)PadlKZr2TTH%qPP}Kyw6n3e{fpyH2@&lhY-R%K$L7h_@8|BZ^Zlxyb|~SpTB!QM zKLv$o!2PgoZv2Ji7YoxDenXMmy?6J2J)>go?51uA__BS|IPQFN$vpkIREh zgaTub!N2c!uq)`Hg1i;BF>r9_V8QK_xyyfR{<~`0sb6am6J_-l2T;;-(%L5I}ozu}&?tW1^d&_LQ z?cbK|*zuSj7O3A7C$75fnD_TEL}0tiyU^b&Hhb-4UcUD@#86wFcgI~<+4VP8i+zHJ z-t2{zdU>}B_8*(yy6*Ij((kFo)vfD7Hy_Ny zdOkA}=(J*}s=F=SztcWuZ@#s2H^ZZCmQiA-b2qhj&(?=Z`~JDOt153jC(!fn;t%y& z?$VzoZG;pjze_#_zGm7Hdi}B9yql%}R%?~r^GA)M!ta+Ksp|f|b1NDtj^$XsKinX8 zam%W`i0B2gs&D-Z7N1&xnrz#F$>Dxf_!-^oQ)p53=uzD9<M{HiYKa9FbBxo`eJlueqf$bjsSuz~wEk8I27rt7Vtrq740E*0j0lm-G1mK%?ljH#h zXvfkJ!DU7R)C49W;(!@HP&}d*CIM)$0fb*ZbiD^=nE^H#^)J#uc^%L;jEhkTpke}S zN+CgS07MVKppTZ;6$nfM2qn+dp{H+4akm*kO(j)A8(zJa@Y6iHi4$c!cer9FRi9mXyl9_Eg$#nxxuYejyB7#VFm{T(T? z69#}aNAIyGCe|u4Uw&j?>!+;OM~G&67@1Dj;a@6oglmAz-FfwMyMMZo`1PY1pSKrsR7k}+z~U?kj7!ncnUPyT-X?l&Y<^yi!I*W=Hh*H@VC5d>GbfN~2#IFD%N zd|hLNs}J)eZV{ahu|hD_E^74C4ouI8nK3a z9t$=(Aw}WnvSMTD=@hNtWkQQF z9;|>AV;1$0m8%saz(OyLM=D$p@%<#)(6|v@M5zraMWi)8YRJz@=TpCY#fdkM#)F0s zsMJ9ZiOK&^P1lHb+eK>hj{Td4G!yMKeiQ*Ku1APi7tbsFP_cLP4L{&zDsoiD@y8{{ zZ9dWNG8Lq7N|VvX^v{2`tVDSq%S8RQFK9DuvvZSUlYEorOdCDTNZ3B-MtPm#(}0ES zi@&&kIsYP?B)$_-%})Nbl>bWwk1I+`wB%Rqr!u8)`2?I!$?t~(h-E(fF3F0UATuK| zyEZS|acsm}ildZI7*!u1+?Co%*g?2(!NdwC3g`_nWq6T7ib87o!iBUf@ni0biSQS_ zDr`LL`-$60I7zmu8jQ7!o&0gDO!4ddgmF$ zqOrs(3U>12>Y}R{n)7sKge5*wz`_Lz3x2&9_+3_0jS<|DS&ofbg26Xk=4r|)6H=xmrVS1O=ON*tAN&Vd5(HUN z$a|Lhnm1(~FYR^L+{Z7|QmRrq4)Yhvj<}D^kG?Ht{Nc=aldj3(FxuHCwyN}ZOb8<* zj?HqV*jqtN!Oyg2o0ip>HCnx7ro8UAOX0QQF^S-n;Ma@|!3`+S^1EeC{XaZyb$xY% z3Z1s;`avsVKD5uDpWUCwfIQ#VaHa^Mejr>$dbc#tHr_UYQW{TlAL2+AWaV8LhNix>VFBF`IpB7)19PyGG$8G*~| zNOZRjiVjl<>lpV~$gG$SBc=SAG^3pR&x7bDF1J_R9KV_VHU!ca{Al`!^>HbMFP%8q zncDiD0ADkEz|ZI(_M(L}axt~0d!}1ooCk|df-0Z7ZNlqVDdSN3EvtSMBWW_D*NW!u zsAw_FFrrkNny7zi9SR+IA77OIcIfa=)xg3Jp48)v=R^Ds{I#F8zk@%hGgD}6H5XgF zuY}sWEue1@A-xS&LoSBaht)D#Pbm}~swb3sH`BSxS^DX<5BRs&z*+8NsG|Q3^4edV zIn-6qVAWiyF}w>-BNrqJ4J##FAW0zdnPpgX{Y(DMcAzzBF}Av(sH@@g$d~aiyIaf5 z>Dt)wg$Y{;*fv;m^VL`@YSo9AR}u@X2}2AEuz*^zhU`{oeUnLE|L_pMkV=lqh02`@ z_tE%Ljp59V&DasSN7EJO!PJ6w)AgfZf6Ia@oT}W^mnoBbnft11q0-R8-JAG(Yuyrg zYx~1qgmHvN6k6=snTE+Jig5vzPf^ov_oc9Vsal@Wj$N3sxUp0tQhU~E?Zn+ScdyY_ zt|_tj=AFNL6tAI7P&reWQm|TxCZ8osrYI-hYa3}dD*O=~o8DV?e~?FA+s>38K|*Sk==KWukdbfGxTUcph=^rZG- zcs9GOxKtj^yN`Jh6Z4FSka+%J%)z_>@=a=E=}&S1;Qkr_d;Nr?P^=I5(oLQy z%cC)&X_{L(%=9`%R+c_G)rpQQ#_`KEVoEYLH#bJ2qHqOqvRS6v!7jyt;Dwk+fQM?X ziEPWOW18cP5ft13wSK}|SORq0W29jldV6zf3@8dIq(hYg_dH1Oyi791xAE+AF)wqU z<%m495kVRJssFpdml`BL|GPohNkA1I$Zu8>Z&C_YOMC-IjS3Io;kAl)iN63C1|}83 z=ZfI|cSB}#IwKq~x$J^BrjDHdjb0($>U?I1)~ImL)1K1%;YNuFaC{}bk>-nhF#8IE z9p`ud5eo?ba1r7Dy8%%IT=##5x$`TlhloyYK(mInMtpmN#lt^?>1P zk;3Q)x}k~Nd4kZ>6S#+F`roYnKllDG5&rY3=2`^}@TI#Qr1E(dCjux<#X)Qn#s$6ge>fPl zgP;N=|I>!DJ`uy*1FO%&qhn_;=rkw$ZbWz!x{qH$`!Y**krnQz!?UknGsdJ{S9$a1 zwn;1HKbHJ|a<7Ja;);aqf3GuwPDEVuf(rrd$FgEth zh)U8!-0{YuLXOW?)j3_61c%EEUqQa$ohm(Ib zZ;uHou92Qf$h-K8VDU6$_3){k8j}8Zt*kCc|9yCf4CTij$r3?~HJ4taa*G}9F({-* z?maTNnn%Lzg0=^VG?65-C0<%|ku)W3^hOAf9h@8lPAz{=kH`sfx%L!sc zidUAUrGANWJJSuWix)DSB8VSD6}|xloGAjd_DFb#UHt5cZ!gSfmB3iCS}WFDH2b)- zVtnMk$A&{&mNIQ#+FqdnMW*#De`rhm)@kpV9ADG|mhh^bEzBa|SB-n{?8gI#zY3O= zM)n%TQU$mLS>9Ll6iIj7fX#AKX14%)uqb$ z+3;K6)|LMB#ZwL4%W${P*#Qau2IFL{rDtv|sPJ6a{)!UcPH&SDVvAMD2Ud=#9Br;~ zmba*imynyQCqiz1m^t;u_O55q^kxyvJq8?~#nH+rZ-D=}b$(uDq8dX14CG20r0g(g z6{>DHOV%HMK0jM~&U43 z5avzU7j}IO;=>GZgTadA0 z4>u$x#I<5ySZ|fG-Ob9G!#OYT+-bt$@$(GE0AZ7q9Wj^255wcFJH>Orb}l^urCehywaF^)@!s6cM`4GVne-XPP!<8%XE_JetKKIQ`xaLY{85Q?+@PUG+wVN_5qbL0q^t? zbT3V!qlyJsL;5yF?=kHHoe{-9od-}f2i93qhQqKQ*I2|1yfMGrN>AWedQ)FQwEOZ1 z7N;B=T^t1FVGV+Fu!biZq1M4!R_PKrV4fI}2h%Sm z!=7kgw;#F!{@!o~?!@opD=D5-bOad&!{6Y;!5~Fmt?V8PEMT;Unsh%(Fm01oVItWv z5r>vsKvRPL_@zr7Av~+mWkKu&^m~Tt1L^l^%uRUNQ-=oz!3h5{0@NuoAQMZ(ZfGn| zlM>2eIjh<7-Kucis+;YG+i9D31+wni?ZX`wR`T^O?r!8FVUEbF4DZIhjSSGy zs8sD`ZTyVwi1ApBYLto$Tgp+pEuf$>y(=WsXd!pEJDf~=o7O!GAvdIWR1jE+!Rfy7 zXODE}SPVd&wqIT>F#{Sj&v?WOKC~GH>*mrcQ-$hw(>f%omU9CC{-a3 zLz_vlX?Ue~4`blvv0cThLK0vEvcCOLWkEUDT}^*GbA5WdbI$fWmp%?=5^8S|ok30M z^DkL4sgnNDSB_?LO}8uZogm`>CQh7hx!Mxq4w8MJ|fGJ+8Sobr!(F?ZusJ+5n6%!3ALs+2R%vSyaza@5ojhSf*Z zMQTiEC$^Z>{Xs_vIb4<(U$oq1Q{OW*w9FRid~12-KH7{93FJh(0aDpwtNtb)6>_vN zs;@s!u1oRFhEs^)69U__f^$P`m@%*9@T}9kKWF>899Jk2!ZbK^&ji2#DN+tmL!+F~ z@PY+3I!A81Ntwp`?7v%yv5jYo#mT;j9krjT`^NAFv-Im&yY$pm$7;}SeF^(_t5@Y! zxbWdEtO-c%4L{*WUn%V06FO~@Phl5?_+k<4rxBQBq zgJtNM%(|R)dAAYUb@_DHOrt(U2CLRPK$kxC{^boT!=En{rkrDN6bh4j1FK&WBCRVH zG;xXdW^rX{X#r>`)GWLq1gQT*d)Ku4eCAeHiviH%y(W6Ye)(KhUDX! z>MmY9bT-zej^y*uH0;4$`l4t1t)no1#hqSavHrfXs%6ev^Ys{1O@D|7vhMb@qWQTf z#6k*$(6^a8W~)%0?j^~*BIVWXFL?HI*0ZI3#dOf zW(^|>1BmSwZki|CTVvyR`RKuCnhPW%{bDEkKS%82XWVnAOD4iY>aJUOrjY?*F@FPZ zq4~_!sMcCsaTC$ohEEckY2%RX&(F@!nMFDlax`gulJNW(D=88m)aa3Y)ezf>L_sOg zN@W=`=J07^^b<+rJWJ2*O7x4I-ZE)-JTMfSp#Tx+{v#Mqi+yGW;GCAfwTdWnnQUxw zrXzU1v#QSv;0*2{2ygfsjGdhJ7?#L0s23`n-OuDAc~>VyHCAet^ja)wEZul^-t?_# zo5~^pSm^%$$b-KSpY?*C6aS}8*V&g|4Lq->6MG-?rz4!6TiQ^sk-+rUe-)jghKgc* z^H&o|_Z7Ay6D4XNlFw1nrvk1IY0TyX!^V##kbm$}z7n^1O6$dt!7!DemPA>oMLy%M zcLG(}zuN&hV)OA(2fQILI!mpQlg-V;T>b8sXFLk!G)}*l31hbhsP3ZID^;=#K=GQn zT)Jsp+X$-P6xv?`6Zc6432)GPGv6vE;5RC~RoOpQtKW80FLbBbw(8#=>D$I4e8)7K z;9q(77u7#S``5(9@>=mn+y|K?N-o{C05#mjHZUq|f-}h0Q1&EfQ>qNPsn}i)E&mi2 ziV7hxeNTAy?vFQcbek(uCh_gP7sGMb6Knj+hB+u;H8medP8nZVIo~|r>jHH@nGs%mti=r6K{}je0*UkKUulhM(w1MKkbf9O~OrE4e9M&sO3vi!C;J3*? z$fK=dkW_f)9C!}(?u&Q9ZX8?Jpg5V?@XuFy9#I@jr(DZCE!U~;c&9XwWhk!TNE#!k zP8B(IG;|lm)-Q!0tEHd)%AE-J<@^pLxEp6%N#JL^^qZO1xYE1N;uJ|pJYQ_BT}nLZ z9Q)+TcU-*ys$ZcJTU3MmnGf6abz~5=M!L{jkvHzLiWq}en5kXv%GAdllSZ%;2sf;L zeCb4IujlL@qR)i5RP|treLl0Se|B!0$_P}yMjdv#+H+zGJQKZ>E$2$B9Jc=XKAe>m zGGyFbf*0(TuLC`js<>mAull)Cr~YBMdoXC*iD=HEK%czkWtm2}-vowlBXYZDd&WLr zs;CKjYzf9@9D~iWX2<$We ze0}Ex(I%u@KeuLzPbxim5B+}N-Ib(_>8pj@-kf47QqI?F#E2T7W#+XdTQlWeMXrv6 zm|lf1y2?4NZCy<=czv^9GB%A#T;??&f!DsiX z{755~wM7Jjb)QJPEhe%&aG=At$j9032*0e7TYZGYYx@QdqJ^FB+MZK3%T6t6PL7(O z`mV(`o(&CN^gb;vLRG_$KNRDY#2>OSV`sO;ahaT-hYz1be2%xY5E7^FZ|>F+mcRty z2z|nRf%sz>qKQcPO9>0>3nw1Rc@Dd{u{L=o{Xi4^IZ>wlbdIIhY0m65XynCt2#5t^UN@R^TGa_jI!pCps%?TW|kIWJnupDGVqoeh?fS13jA{x}^C~=pJNl7FtmlYvHeRnC)Zv|OG#@_` z&c*)ed~myrhn5wAktS{M;hJLW`AF``2_H`ZLY_tl52qo+EQtuFuz6riIKR0gENc&@ z09w46=#Zki2Q{9 z&hr_;hADYjih{GlQ99;s|B2w`m96n87pe4{E;D|#R&T^f<=D1t8bQHKDykUgzz8~F&z?DVJ3bS`#Ov$(}{wbGbBYA82bKMq%sAB2xjsEES2I_k@s zZ^?usDdsnOv!pe4d5M!iaSRDla?P~N-d|D@7GIN3%_kc&QFZfcomU)@+u~Lue@I_& zjPP~8YjbnKCw>htjJqg3Ccp5ORw+`Vn~(y_vqa@L10Si9)sPIbdPa11Xo8580%jwWQWfTWX+(U>#V$;AZ(oLQaL-r-jkPrxe3EUxSF%cp z3>}*(d1E}%*6Y8@G)-l%%^g-ZjJhlqKJ)VZ131TD20nZzE2Oc_FqSO4`Dx?ms9-(9 zhtruO^|#%s{TZ*Va;b1wJ1U27pO$_eN6dKI1l*j7PPr9(XB^o>p@&l*WWE;2|EeG2 zajo(7I=>8?zlKcwTbIOX5Fv|}R_?^jU3xfP3ag_CannfF?9M)ukk6bPTZWZg3oC!i z@r-Bc{fIST(F)0I=wA-S9>YMY%m{4S^?r2y?Sk~a-Y6=n$HJu$13{xt7kWSRmf2sW zWzpNVTK7USvRrjedLxi+^p5oiGw^LV?f5Ctw@i+I^JvpHHAjrFj(<05HcwTr@SHDt z^9xX!=i%~NPEhhxIpIA1QCFh8IM)MVzRe$)thlLsa+9hGaU;cI%3fCA(|z+F6x>CQ z;%B~T?rjRUvQOwXXq30x?>!Shm`S@r2dfzB9lcOBa!Id+4v)!F$a-hI-gSRiZ`OkU zU2C|JvM4P?{yVbG!Ma}W6Z`gFbInNR{g>B)C;IW8WmW6vd(1k7t`%Djd#^krfFFw! zje@6Osyhf8P686YPg+Pl$d7rg#86H^TFxk_`}@fb=3`gs;^38ZqVW-|Pq1Xqa`wqn zB9nVCo!yaOy(YLWwAMKe*JvT_e^(WIjO5Mr-7!4xBls{9{gvP>f{Z9c`Lk^f?Q^%6 zz0SGKqG>wf$zvy-SPP+g)h;FebRO9_Q{y1)7ThSFn0nxymhKv|;m}<3cawk~52juW zYnDPIou+j|z3YB=LZ2y*Xy>b!J2k95@Gs@d&V|2OzAQR^QU8Y%$2L5Ji?#J^w)ut= zpLay4jJtt)H2m*`9=)L->3oU$+Q{#g&I#V*I0KHA$=m+pB^?Fhnm1W4a5)oMxUQzS zXnA2*UuzH|0!=Vmb5jPsMaeM-owiRe~75}H2oyVj$xM6wjz%y&^F%b!o$ni3pY&T+rAElffuKU z;N(cGYF3M&f*c5lfAo{+xm^oy@6)gnAfFFvSaWRYS=lP3sQlVo3Zt=`YWtJtetmZC zRlhDIP$~TJYnq0jD1QWJc;0si`4WFW!t5(Sxj9cFJfFyemaJo1aw4Yv8wJ|+Z#Q45 z7$zd&a1ra6GxV;Fx_zcYtvD?-W@fy=)GS0nIXx`7OsPmUt;-_2dWnxR92)BxGIhic zR%3rDR;o3RO!KbLR=%kxAo_R&i7#7DdPhBU{=?1ncwd6@DHqLqn{#Xf-j}-m3u$Wc z*xHVGZSu|npPa%Usb4JXgILkw!9O(DjoC-|jVHJwyHzP7yG0px(f#@@1)7$GZr+F4 z61SRtjvFl@?K)GMm%GM91c6r+?la;3Qn65oRpCx1a@x8#rEsMBL!JxG=f>a0>`_yB z2a?N44~kO}+aLqF11*Yb8uhhyi4Q`Dz9|i$S3+8U{1GgH$<2HyBfwEW6HulElean| z#$R|xNeI5O9`ju!HJ~Rs!hCQm?)>rbZo?eF zCB=mBu3R=t+X-VqG{*A$(pM zqP^r0Gi?7_v=7WW4nX&2n`Vgg9M=pfnCeB!DrXBe_Yd)>$ z6+7GRGfEO=VBhJg<_WMS5;g6NNBq6tmFtLA1onzn;z{muc3IiLx!wB6{50}>+}izo8TD-Yu=0E{qu=^$`+Rh~v0&R0`n=Kl zteygWa1-o)vWzcT<%_a{1-k*NXQf+d3lVokw@CFa@&P?>=JiSn*&lPGsDuRXmfhwr zI6i|F&Df|t-R>{h{CFAMA6mcyLE?7W-pm1xb{?qh4KcfYwE`U7@(xr zu1RcN7f?t#*F4qdd~3$|`shJpds-F~lyPXi_Ins)z+XO{ZrCR&oO^120`%OO;$KEh zZn-`73ToAEK`Sw+B5s|bC*ZC%)tx?S}f z8H))TfdZN9E#`w5OaH2p*`L3;8O#U6>?$L0U0>h{O`2>RcwTIMdvN1ve^u6sTThW4 za`P_-DrOGvV8ZZwUh}!3s-uASsCa1ER|;4j1lwZVoVfC5z*owl#177W{w{i_ecTm{ z?U>|gAL6;{u1?)zi}`iHbu!oe8TNdqFNoo{;(adnaPRYIyS`vsdxy6i`d3@xW2YJ( zIM+0TZ|Yw^JCzN>$!onF{#8+%qhO4mqyVqr>Ds4}TkGQ0G3+edo zFZFG1A&8>Qsp6Ncj(MC|RV1~$CRQz~r2ebZ2z}5>ygDU+ug7ULN|*ahIc;|+9UglF z7>@fpS8JoXm)P??0HHErgeFqbWU?!|HbX_*4M<$4HzB*yO>^JRrz-&vn(=&-yD_kQZt^CV+$@_G3sT24ggU~(AA zmeHnm)1$dd#7+}6H4tk9E|VRxeF(na>Q@Z6T67v^c)zGAQ8F=N-s!DGL_)O9N=x|7 z*Up>4z9V*cfNY)oHIUylbN#d&e$X=a&Iz&rF=9s?rcFU-Lbg+>=Uj4i0Sm8JHfGP0oc{;Uyg*N6if({9WJp2q8y;qF*EY=T`Zle^KyZ zxlQjgty?D-{Azczj|T}*R{?ngZaaLre@tJlRpeQ#3xs^?{(a^By*thW%=_tCi0R<~ ziW9$r;R}qis9_=HXJ~#_=22Kb7vNIZILBJe!)UilfA%7qTjz+;XyHQoH<_a0d0%bm zi?>K1Jp{W+82@_Nho^#&;lhi+MOv`aJo-)&JRo8Lf`4Wi`ed7n?7!BtV!Deg5c~f- z&f(i*7ey`Hd;!U-+8i1DNV{Ok23crD{nzTucU|3==sG5TT70u+Pw&S2@aFm4NCOO= zB0%lS2N1QO&$f&%Q34?$6AvR3P{I~{)G)ADSntpo;;MOO3^v{Jk$USxKghL)hA4%m z9fwmi1)GaM+%B&i^R2`re@m*|cl$Y$SFm<$LOIaL?@iep!aMvd7#Tu!{)`?p{}znV zY47DGW%x$OXX*BNPPm#`Pb>KN3zec*-uI7;=w}Hk-+Y>^nkYZ7gW(c45_v@iJnUQ0 z5Jqw)fj1{-V;2Qq;XB9cy+_J-4WZhi7<9oq#Q}>WpsS>xO`f^xNpy{%b&3`$y2fSr zm~y!!Zr(JjYoXw^37D$)m$TP(` zFH=gate;KCBxqf!Q3o!M>YR!$0t*Epydf9a6s48pf!I4s(sKIm8Bax?xhsp@<%B3Z zADUpOv=af$50Tr;djIMvHncfd9fb7B1j5Tf(O?-n+-m+P)1>U4S5QvXrpS8HL6EQ> z&P)vVpy#SI7bg{+vu|nr9pCqbi9v)_^YH!UP^-@;y4AMq*~`TG=c5Z)zPTvv>R6Au zLM*yMDYE>``Qvp3au|;ILss_=8oqdgp=M z=GJS;!5yx=ps%tXK=1d z7ym%H(xYPw4~NyPTm9g9dloyu$%1VLWrCNa8(h(Hh3-p- z)XvChC5dESX`CiSQx5Nrg&Lr0R+gFoaMGcw85V{I$K`S`G9aP{44IXE#6dE!R@LIF zCYaLrvwr0EJ&lrck_|H4SvjchptFX{8x^wKk>S&L{hY!4(4c?HrqO#S$4B&@r}3YW z;v%9brM>NBuqEvybN70v}kG|I{FC0hr!sE|Rhtq1WYp9?-naHCEwJ9VvkSV@=Q zzPozm^G8X=_;|9>YpbPj)}vv=8l$bS@Ev4!h+kjzT_3-mrw#sGUsq{{Sd7Jm6^*Y| zk=P8H@&IMwAWI!jqIg%z>~PQi#=|~?5Q$!ojbvl48*kdo=F45x@@6uNG9cd)w|HGP zt&FqyLvxgsiXSJ}o+P*G(Je9G-x0)i*3_f?7@^REmZAPgy=z^DgDoynbUz$-&9UvA zW_W|ws!3#g#Rk?#e4FKRReh2Hdg9#7cF89$?^|1odrz?=ufw63a*SV}C?vYBqrFus zBWcPD4^>$Ud1TRqyHyRv?Qo}>Th~lfe8?a}Ttl4(h0K`lw;r~oldbY-OSyx6l5j;D z&oJQ|x=INLceLTd#^AQXTJ^FlJ&YqjWvcZ4X@VQv^y2`|5GxZ23KQpDvtI8 zcT*@grjM4>W#TWsKx)@N4qpg1r-V1L028NaVb?Fgxsc3?8VcDap~Ynh~*63?OSBFaHF0-dB3nsvI_M{T4Cu+?cn_Jnc(# z1h!t6`}L>DtYuoYPBLh3!u(r{s|M7A(NdCdH`M^Le+I77`D%bl#(nxM`KoTRol1fm zpVwA+NPZf%+6l+cg{BC5y9%`U0hD$=E{(EOMwKoNG})SnqGdT$kwHD>vHOSQlRFeH zi?ZP5X+T8)HMg;mZ>oIU;5aUmb4l7~WQI2x=G)6zX-${QjM_e8IjPrtF^!x#AW}|X zeuR@M$!%T0GD4!prS3nTLy46td9H4sD#iV-o@q3dbMw*#GSuCsa;U2Afg~Ikuu46C z(0xHSz9>bs#`u;~rf~T2(RVUA{~?sg-&rTAoUX3;E zbv!CuXlQkKak!XbPdRsmFNf||Fkf^^JYV#y?meK2;a|XKV0+{w-Gk=+ZAxse##B~u zZrDqld+1mvl$>_T^l9H?`(xPEz#%4}!h(uT;M77Fh1gl?Nc+eba6-DRU&G($w9J;y ziiKaJKEYhA-Yo6XjsT|OCAhOPC-s9zXfMA>7@O&#GQo_mTYfuzG{iql#h+JMuqoR@ z^G?uY0#xWwbG7=d9@?&zbxbG%@2h7clwZ$k@Qg?NOvImODqy*bP`SMpsE2pqloj?68?GuH4f?3>inr()+NwD2C_#5Yg- zLAQV`yI1n@i`#bb0rI0Nr=>}gswWAoRl%CrJoiyei5|j&-{O{kjK;;^>! z)0OkZd-3KRi!wTXv$8v8n=-()t2Q_Iiooeh_#y%?I?tN2*JEGq%M6JwSjf#cu#pHu z^V!Y`a+1eG3~KxG;s8V#de8*1-vZaxmg05`JWH(i4I7A9;9;c@l;LZLGA=AMV0ot6 zx_i_+tJiBI)^_pUMg4FJJRZ`CShoA;7m~rkKZ`7tl+U_RN#H^AH=wV4+iRSMM}*-j z@kh(`=n8+zelOPcJ8a~#GD6*~Opo4-12$jOQ_g44?@1zgW-g8U@|F9dYH5eUd08dD zKM2^9D&$fXd}x#o>nawphDgh{p#5ym7u|s;3j~#ewqQ#_I~e{}o!m!wAMII}z(y|; zb9bS4K>kx74wJ)N$4shG_vp3!Z%LUcy%MsvPdfQ8f(7j0W{q$UB$9VEvbmmyc*iVX z@pX}!A#0w-5 z=Mzo6-&cFTJ2Bg8{a4wPdM#_WTIJZ6a>-#U1{7g@IN5$CNpD1q9U(&pk^RWq{ZVM? z3asOQ#zC6<06}!dhaS;^9DJNXs7F<8&*0@@6OSV9rX_Odd=U?Mi@tKI@s|qV2NX3I zRqA~9L9bOMyvH$BUIkkHvgYRU8sCd@3=>qv7F=(ByF#MOKIds43h;Cb^uDUsK zma5D`A$rx&dPjWdmV$hVr1YGgwMFbsGn?ZqoHP-lGS@qk?^{FoK_U~@`4*^9%<$y4 zS|M1`qFzH9obP85HVImew-p>IMvZc;2X8`fQJpxXPZB5aS6to@N9)HcWlf5SC_7&WIft@XiP!DRsKo{8(c zM(zB9`(u1ix=H{;v4VOwoHK>HRp#bS3eP?|Q;esNe_M_-G~}Ad726tztBiJtkQ1?; zdq?7uB(%XcHNTmRyB>_RA4J%u!jiJPxJadLl>_y->J7c9a;cB_5UCi&Oga!RReG;1 z(({|$-=M-*D<_3_W8w!@Yp#>!G@`X0UqJl4HC7E{aG5d3WiBYmB<}F;W~Az2~2T)V24rU5EBGKA)B=Zg-*(PK!xc)ayR|v z%c&noF02x{T$0NWkRcTe9%xddZ?qbTt#SUujIVqR7Og?dls6Y@cObW|z<%ScF10c5 z9wS{>K2&g4dN6`USyfhCGahlrY~j4Zpya{j=nhnWcoE*6V*%x>Sdx(WqV&XBrXKBG zL0)(WRnpkmI*#Iat@kD|fg;o6)^tk8&5~w{uj@Lz>C-J2kLxvZ$>jbS+Q%Ic+HwEpeng$XM4gF(ICN^ehmSRu9EUdgZR8+*Tx4 z|7KXl6cADD&D)d@iR9akwlO4GkRjxdbHwCZTi1v)FAF0N-rWLA{A)vRVM1=c@ofLW6hcPv%luEM_i zi(TTPOu^wZ2O0?jUZ+SR^o?w3p2tH*2)4G?LU@QP!CZ5qYG$+6N|AIO3S+Ewtj|@s zyGICh{ntdpNBRCx9?EFumkx2O_V>4L+-mDmkBMxkSLfwE)0N43f4L|myRM0DQ#oGy zR9(s9=CF8!wVm|IT{NGEn+md#&V~t#B6+OC-~!W>oj`Nh&yvyBZ=(G@kXmh0%b)P( z`m9m}-kJAvm7yN{&S8x7qzau25zUx4W*e`%?WJXV9l&vJxfglnfV0->h`V#Mg- zW?a`ibw9S9Drbi;0B9twWDIjX?uP7W?>3}egfhIqxe3klSe?(GkT15m!EnH3s@lM%Wx@a4flepm%bzR9j3AwP~+(y#PwNhBe{)#iH=g}lfL@ib3 zUof=g2F1$=Xga2!K>5{{rG{u9^9{Q4qT9WP_MM3L!xXPwU-swA-DMCN!)q{+3cmao5!7f0F({fvo%a13@YO05HlV!5w@2dawMC z5x@G{;JCs`VnClHtpV{|J{XVakD9(5*IAQ;JaA!U{1`m$I&y2@@ZG|yrRAXN86qNg zG<=#Z?lh(M`+d~6`M17TNbM@weyk89t!ypb*E>0_mB&{p12nUmSPP`+ikuY_}b z>ZakX=bV*z#plvI0>(phUkiS z32pXTln1T2k)#V+u>;FE0llvU)C%3FYMNzF-y1apzQjoFgj9Fu6wcKHW;%oMj8@7D z=YbR>-lTpk>kQ69#)hPG7cD-0&mJ%TM)X|JYByYTitZd7p48~Y5(?L-XONqNr0S3H zHOK^=uzQq-g7CszDgGW0PWO|~L{CI7n&d28t#OW98?5B8c@r+IAU;-%d~5Hxri&hu zzcE=m#(7+TjhvX?n!4Bh>MhP|9@iVQU8dAga$rAM;U(oBDWb9*oSW{3`w(Pk zz#mNX7BL|7(O(!%g`V+|TgP3u!Gs?vL)%BDzU;i=DJ$@teTwkDu}*yg5$^W)RT%nS z@cpWxNt7HG1)Wvm9@CWEjbNJwXP6^~O1*k{qP>PWmlG=V`&Sm(9J8`qEVHsth;v{z zo;fFChf5slR_ws5a8hs6vE8DQ^2f#aKHPuu{g0IC7#75Myz1cjBB_NU!fJH@3){aS zckVmcxSz~e{a#|#!Q;CR7qfW-+OsB!=<2!VU_I||M6E#C*!Ba=T#4mh@d4$OHFX4#K9L(IGnoL$8L)Z zFet>i=D{jlcy;im?`pV4CJO|_5A9{^Op6@#p@V(I!EZPWum}WZX0QrjV3O4#!q&a` ztjTE`*Fi`TBvOx-!TOslbT3e;T{Ys2jaNOaW6N#m)1qY(=Lm!4?R~cp zMZ&v^r`u)lkV|@c-WBA&a_;B=-w2niUF{ctL&*si*&s_h$yXLNSB%{ah0XA0(qJT# zFjBiT_U}EAyd|HW_#UZKh`nc@__HYzJbtcA9DQ5K!kYDP54WM`!8NH@@@guJT_6uC z{P-_%`-pd6(SG@1%G{1Xa4-k+r6kgf3$eLW%iiaoGe)U5*O*`;l7dW?Vn2&O;)?<@ zR|%sYtTMx}nFPjIW!oxgk1_@I&>8L_gi*KZ^W}E8&$PbZqHT@`B?^c`lQ4-U0KAh z+Aj?QiW}6tA5UgCW`_xXF-o(a&0#2CY8<^Y>|JQ~|C_XFSZ+=m=mK|QCY5m-AYNv^ z{PX->cTmnhdrcRyBQ@W;ZZ%h;PqbGAt3k z@nhkY#dzg8n}i3~2{B530=+CyuH4*2@W|vWM8*#iKsUuiKF&6}e=h_`z)X|=H7Rit z9;3i67N5v$1Nbgcx$=a^ucC}^ohuT~E2@R^ldmerer24k2-!3ItNR-8(0vfqq!+YK z8Vw&gj=9(MbX!@3;<$$UWUwHPG`vI5X1l!m)%f%b2hiLq#3B&n{CkrWkdcrVFBLWL G|9=2XieldY diff --git a/apps/engineeringblog/assets/images/logo-light.png b/apps/engineeringblog/assets/images/logo-light.png new file mode 100644 index 0000000000000000000000000000000000000000..ad5134108e22632dbdabbedf930c178f770d5b97 GIT binary patch literal 982 zcmeAS@N?(olHy`uVBq!ia0y~yV7v{)|5=!UB5yOZ)PadlKZr2TTH%qPP}Kyw6n3e{fpyH2@&lhY-R%K$L7h_@8|BZ^Zlxyb|~SpTB!QM zKLv$o!2PgoZv2Ji7YoxDenXMmy?6J2J)>go?51uA__BS|IPQFN$vpkIREh zgaTub!N2c!uq)`Hg1i;BF>r9_V8QK_xyyfR{<~`0sb6am6J_-l2T;;-(%L5I}ozu}&?tW1^d&_LQ z?cbK|*zuSj7O3A7C$75fnD_TEL}0tiyU^b&Hhb-4UcUD@#86wFcgI~<+4VP8i+zHJ z-t2{zdU>}B_8*(yy6*Ij((kFo)vfD7Hy_Ny zdOkA}=(J*}s=F=SztcWuZ@#s2H^ZZCmQiA-b2qhj&(?=Z`~JDOt153jC(!fn;t%y& z?$VzoZG;pjze_#_zGm7Hdi}B9yql%}R%?~r^GA)M!ta+Ksp|f|b1NDtj^$XsKinX8 zam%W`i0B2gs&D-Z7N1&xnrz#F$>Dxf_!-^oQ)p53=uzD9< + + + + + ); +}); + +DesktopNavBar.propTypes = { + direction: PropTypes.string, + menu: PropTypes.arrayOf( + PropTypes.shape({ + label: PropTypes.string, + href: PropTypes.string, + }), + ), +}; + +export default DesktopNavBar; diff --git a/apps/engineeringblog/components/DesktopNavBar/index.js b/apps/engineeringblog/components/DesktopNavBar/index.js new file mode 100644 index 000000000..3919164ee --- /dev/null +++ b/apps/engineeringblog/components/DesktopNavBar/index.js @@ -0,0 +1,3 @@ +import DesktopNavBar from "./DesktopNavBar"; + +export default DesktopNavBar; diff --git a/apps/engineeringblog/components/Logo/Logo.js b/apps/engineeringblog/components/Logo/Logo.js new file mode 100644 index 000000000..1df7cbec9 --- /dev/null +++ b/apps/engineeringblog/components/Logo/Logo.js @@ -0,0 +1,40 @@ +import { ImageButton } from "@commons-ui/core"; +import { Divider, Link, Stack } from "@mui/material"; +import PropTypes from "prop-types"; +import React from "react"; + +const Logo = React.forwardRef(function Logo(props, ref) { + const { + alt = "Technology | Code for Africa", + href = "https://codeforafrica.org", + src, + ...other + } = props; + return ( + + + ({ fontFamily: typography.fontFamilyMono })} + > + Technology + + + ); +}); + +Logo.propTypes = { + src: PropTypes.string, +}; + +export default Logo; diff --git a/apps/engineeringblog/components/Logo/index.js b/apps/engineeringblog/components/Logo/index.js new file mode 100644 index 000000000..b7d6439c1 --- /dev/null +++ b/apps/engineeringblog/components/Logo/index.js @@ -0,0 +1,3 @@ +import Logo from "./Logo"; + +export default Logo; diff --git a/apps/engineeringblog/components/MobileNavBar/MobileNavBar.js b/apps/engineeringblog/components/MobileNavBar/MobileNavBar.js new file mode 100644 index 000000000..9df1a5b24 --- /dev/null +++ b/apps/engineeringblog/components/MobileNavBar/MobileNavBar.js @@ -0,0 +1,110 @@ +import { + Dialog, + DialogContent, + Grid, + IconButton, + Slide, + SvgIcon, +} from "@mui/material"; +import { styled } from "@mui/material/styles"; +import PropTypes from "prop-types"; +import React from "react"; + +import Logo from "@/engineeringblog/components/Logo"; +import CloseIcon from "@/engineeringblog/assets/icons/Type=x, Size=24, Color=CurrentColor.svg"; +import MenuIcon from "@/engineeringblog/assets/icons/Type=menu, Size=24, Color=CurrentColor.svg"; + +const DialogContainer = styled(Dialog)(({ theme: { palette, spacing } }) => ({ + marginTop: "49px", // NavBar has 1px bottom border + "& .MuiDialog-container": { + height: "100%", + }, + "& .MuiBackdrop-root": { + background: "transparent", + }, + "& .MuiDialogContent-root": { + padding: spacing(5), + color: palette.text.primary, + background: palette.background.default, + }, +})); + +const Transition = React.forwardRef(function Transition(props, ref) { + return ; +}); + +const MobileNavBar = React.forwardRef(function MobileNavBar(props, ref) { + const { logo, sx } = props; + const [open, setOpen] = React.useState(false); + + const handleClickOpen = () => { + setOpen(true); + }; + const handleClose = () => { + setOpen(false); + }; + const MenuActionIcon = open ? CloseIcon : MenuIcon; + + return ( + + + + + + + + + + + + + + + + ); +}); + +MobileNavBar.propTypes = { + direction: PropTypes.string, + logo: PropTypes.shape({}), + menus: PropTypes.arrayOf( + PropTypes.shape({ + label: PropTypes.string, + href: PropTypes.string, + }), + ), +}; + +export default MobileNavBar; diff --git a/apps/engineeringblog/components/MobileNavBar/index.js b/apps/engineeringblog/components/MobileNavBar/index.js new file mode 100644 index 000000000..b19184643 --- /dev/null +++ b/apps/engineeringblog/components/MobileNavBar/index.js @@ -0,0 +1,3 @@ +import MobileNavBar from "./MobileNavBar"; + +export default MobileNavBar; diff --git a/apps/engineeringblog/components/NavBar/NavBar.js b/apps/engineeringblog/components/NavBar/NavBar.js new file mode 100644 index 000000000..d647da4f0 --- /dev/null +++ b/apps/engineeringblog/components/NavBar/NavBar.js @@ -0,0 +1,78 @@ +"use client"; + +import { NavBar as NavigationBar, Section } from "@commons-ui/core"; +import { alpha, useScrollTrigger, useTheme } from "@mui/material"; +import PropTypes from "prop-types"; +import React from "react"; + +import DesktopNavBar from "@/engineeringblog/components/DesktopNavBar"; +import MobileNavBar from "@/engineeringblog/components/MobileNavBar"; +import logoLight from "@/engineeringblog/assets/images/logo-light.png"; + +function ScrollStyle({ children, sx, ...other }) { + const theme = useTheme(); + const trigger = useScrollTrigger({ + disableHysteresis: true, + threshold: 0, + }); + + return React.cloneElement(children, { + ...other, + sx: trigger + ? { + ...sx, + backgroundColor: alpha(theme.palette.background.default, 0.9), + borderBottom: `1px solid ${theme.palette.divider}`, + } + : sx, + }); +} + +function NavBar({ logo: logoProp, menus, socialLinks }) { + const logo = logoProp || { height: 32, src: logoLight.src, width: 29.5 }; + + return ( + + +
+ + +
+
+
+ ); +} + +NavBar.propTypes = { + menus: PropTypes.arrayOf( + PropTypes.shape({ + label: PropTypes.string, + href: PropTypes.string, + }), + ), +}; + +export default NavBar; diff --git a/apps/engineeringblog/components/NavBar/index.js b/apps/engineeringblog/components/NavBar/index.js new file mode 100644 index 000000000..085b6b525 --- /dev/null +++ b/apps/engineeringblog/components/NavBar/index.js @@ -0,0 +1,3 @@ +import NavBar from "./NavBar"; + +export default NavBar; diff --git a/apps/engineeringblog/components/Navbar.tsx b/apps/engineeringblog/components/Navbar.tsx deleted file mode 100644 index 078e917de..000000000 --- a/apps/engineeringblog/components/Navbar.tsx +++ /dev/null @@ -1,40 +0,0 @@ -"use client"; - -import AppBar from "@mui/material/AppBar"; -import Box from "@mui/material/Box"; -import { useTheme } from "@mui/material/styles"; -import Toolbar from "@mui/material/Toolbar"; -import Typography from "@mui/material/Typography"; -import Image from "next/image"; -import { useMemo } from "react"; - -import cfaLogoDark from "@/engineeringblog/assets/images/logo-dark-mode.png"; -import cfaLogoLight from "@/engineeringblog/assets/images/logo-light-mode.png"; - -export default function Navbar() { - const theme = useTheme(); - const logo = useMemo(() => { - // Cannot dymaically import the image according to the docs that's why we must import both - // regardless of the theme palette mode. Leaving this here as a potential optimization in the future. - // - // https://nextjs.org/docs/app/building-your-application/optimizing/images#local-images - // > Warning: Dynamic await import() or require() are not supported. The import must be static so it can be analyzed at build time. - - return theme.palette.mode === "light" ? cfaLogoLight : cfaLogoDark; - }, [theme.palette.mode]); - - return ( - - - - - CFA Logo - - - ENGINEERING - - - - - ); -} From 67ebbcf6d2c840358e669fe50c288c3302f17474 Mon Sep 17 00:00:00 2001 From: Clemence Kyara Date: Fri, 30 Aug 2024 14:52:12 +0300 Subject: [PATCH 5/8] Add svg icon support + update app config --- apps/engineeringblog/next.config.mjs | 19 +++++++++++++++++++ apps/engineeringblog/package.json | 7 ++++++- apps/engineeringblog/tsconfig.json | 14 ++++++++------ pnpm-lock.yaml | 22 ++++++++++++++-------- 4 files changed, 47 insertions(+), 15 deletions(-) diff --git a/apps/engineeringblog/next.config.mjs b/apps/engineeringblog/next.config.mjs index 371c445b1..e2aecd6c1 100644 --- a/apps/engineeringblog/next.config.mjs +++ b/apps/engineeringblog/next.config.mjs @@ -3,6 +3,25 @@ import createMDX from "@next/mdx"; /** @type {import('next').NextConfig} */ const nextConfig = { pageExtensions: ["mdx", "tsx"], + reactStrictMode: true, + transpilePackages: ["@commons-ui/core", "@commons-ui/next"], + webpack: (config) => { + config.module.rules.push( + { + test: /\.svg$/i, + type: "asset", + resourceQuery: /url/, // *.svg?url + }, + { + test: /\.svg$/i, + issuer: /\.[jt]sx?$/, + resourceQuery: { not: [/url/] }, // exclude react component if *.svg?url + use: ["@svgr/webpack"], + }, + ); + config.experiments = { ...config.experiments, topLevelAwait: true }; // eslint-disable-line no-param-reassign + return config; + }, }; const withMDX = createMDX({ diff --git a/apps/engineeringblog/package.json b/apps/engineeringblog/package.json index 6a43007da..2ee520fb0 100644 --- a/apps/engineeringblog/package.json +++ b/apps/engineeringblog/package.json @@ -11,12 +11,13 @@ "clean": "rm -rf .next .turbo node_modules" }, "dependencies": { + "@commons-ui/core": "workspace:*", + "@commons-ui/next": "workspace:*", "@emotion/cache": "^11.11.0", "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.5", "@mdx-js/loader": "^3.0.1", "@mdx-js/react": "^3.0.1", - "@mui/icons-material": "^5.16.1", "@mui/material": "^5.16.1", "@mui/material-nextjs": "^5.16.1", "@mui/utils": "^5.16.6", @@ -27,6 +28,7 @@ "react-dom": "^18" }, "devDependencies": { + "@svgr/webpack": "^8.1.0", "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", @@ -37,5 +39,8 @@ "eslint-plugin-import": "^2.29.1", "prettier": "^3.3.3", "typescript": "^5" + }, + "engines": { + "node": "20.x" } } diff --git a/apps/engineeringblog/tsconfig.json b/apps/engineeringblog/tsconfig.json index bb4124b36..651d6694f 100644 --- a/apps/engineeringblog/tsconfig.json +++ b/apps/engineeringblog/tsconfig.json @@ -3,24 +3,26 @@ "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, - "strict": true, + "strict": false, "noEmit": true, - "esModuleInterop": true, + "incremental": true, "module": "esnext", - "moduleResolution": "bundler", + "esModuleInterop": true, + "moduleResolution": "node", "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", - "incremental": true, "plugins": [ { "name": "next" } ], "paths": { - "@/engineeringblog/*": ["./*"] + "@/engineeringblog/*": ["./*"], + "@/commons-ui/core/*": ["../../packages/commons-ui-core/src/*"], + "@/commons-ui/next/*": ["../../packages/commons-ui-next/src/*"] } }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "include": ["next-env.d.ts", ".next/types/**/*.ts", "**/*.ts", "**/*.tsx"], "exclude": ["node_modules"] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ab6659c27..527511efd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -97,7 +97,7 @@ importers: version: 1.0.7(@swc/core@1.7.6(@swc/helpers@0.5.5))(ajv@8.17.1)(payload@2.25.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.4)(webpack@5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))(sass@1.69.4) '@payloadcms/db-mongodb': specifier: ^1.7.1 - version: 1.7.1(@aws-sdk/client-sso-oidc@3.623.0(@aws-sdk/client-sts@3.621.0))(payload@2.25.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.4)(webpack@5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.5))(webpack-cli@4.10.0))) + version: 1.7.1(@aws-sdk/client-sso-oidc@3.623.0(@aws-sdk/client-sts@3.623.0))(payload@2.25.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.4)(webpack@5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.5))(webpack-cli@4.10.0))) '@payloadcms/plugin-cloud-storage': specifier: ^1.1.3 version: 1.1.3(@aws-sdk/client-s3@3.623.0)(@aws-sdk/lib-storage@3.623.0(@aws-sdk/client-s3@3.623.0))(payload@2.25.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.4)(webpack@5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.5))(webpack-cli@4.10.0))) @@ -133,7 +133,7 @@ importers: version: 1.9.4 migrate-mongo: specifier: ^11.0.0 - version: 11.0.0(mongodb@4.17.1(@aws-sdk/client-sso-oidc@3.623.0(@aws-sdk/client-sts@3.621.0))) + version: 11.0.0(mongodb@4.17.1(@aws-sdk/client-sso-oidc@3.623.0(@aws-sdk/client-sts@3.623.0))) monaco-editor: specifier: ^0.50.0 version: 0.50.0 @@ -903,6 +903,12 @@ importers: apps/engineeringblog: dependencies: + '@commons-ui/core': + specifier: workspace:* + version: link:../../packages/commons-ui-core + '@commons-ui/next': + specifier: workspace:* + version: link:../../packages/commons-ui-next '@emotion/cache': specifier: ^11.11.0 version: 11.13.1 @@ -918,9 +924,6 @@ importers: '@mdx-js/react': specifier: ^3.0.1 version: 3.0.1(@types/react@18.3.3)(react@18.3.1) - '@mui/icons-material': - specifier: ^5.16.1 - version: 5.16.6(@mui/material@5.16.6(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@mui/material': specifier: ^5.16.1 version: 5.16.6(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -946,6 +949,9 @@ importers: specifier: ^18 version: 18.3.1(react@18.3.1) devDependencies: + '@svgr/webpack': + specifier: ^8.1.0 + version: 8.1.0(typescript@5.5.4) '@types/node': specifier: ^20 version: 20.14.14 @@ -15328,7 +15334,7 @@ snapshots: '@aws-sdk/token-providers@3.614.0(@aws-sdk/client-sso-oidc@3.623.0(@aws-sdk/client-sts@3.623.0))': dependencies: - '@aws-sdk/client-sso-oidc': 3.623.0(@aws-sdk/client-sts@3.621.0) + '@aws-sdk/client-sso-oidc': 3.623.0(@aws-sdk/client-sts@3.623.0) '@aws-sdk/types': 3.609.0 '@smithy/property-provider': 3.1.3 '@smithy/shared-ini-file-loader': 3.1.4 @@ -18215,7 +18221,7 @@ snapshots: - utf-8-validate - webpack-dev-server - '@payloadcms/db-mongodb@1.7.1(@aws-sdk/client-sso-oidc@3.623.0(@aws-sdk/client-sts@3.621.0))(payload@2.25.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.4)(webpack@5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))': + '@payloadcms/db-mongodb@1.7.1(@aws-sdk/client-sso-oidc@3.623.0(@aws-sdk/client-sts@3.623.0))(payload@2.25.0(@swc/helpers@0.5.5)(@types/react@18.3.3)(encoding@0.1.13)(typescript@5.5.4)(webpack@5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.5))(webpack-cli@4.10.0)))': dependencies: bson-objectid: 2.0.4 deepmerge: 4.3.1 @@ -26985,7 +26991,7 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - migrate-mongo@11.0.0(mongodb@4.17.1(@aws-sdk/client-sso-oidc@3.623.0(@aws-sdk/client-sts@3.621.0))): + migrate-mongo@11.0.0(mongodb@4.17.1(@aws-sdk/client-sso-oidc@3.623.0(@aws-sdk/client-sts@3.623.0))): dependencies: cli-table3: 0.6.5 commander: 9.5.0 From cc3bd6ac09fc62b6a7fb061011021964da89b0b6 Mon Sep 17 00:00:00 2001 From: kilemensi Date: Sat, 31 Aug 2024 09:38:51 +0300 Subject: [PATCH 6/8] Fix tsconfig.json --- apps/engineeringblog/tsconfig.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/engineeringblog/tsconfig.json b/apps/engineeringblog/tsconfig.json index 651d6694f..d1475f39d 100644 --- a/apps/engineeringblog/tsconfig.json +++ b/apps/engineeringblog/tsconfig.json @@ -3,15 +3,15 @@ "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, - "strict": false, + "strict": true, "noEmit": true, - "incremental": true, - "module": "esnext", "esModuleInterop": true, - "moduleResolution": "node", + "module": "esnext", + "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", + "incremental": true, "plugins": [ { "name": "next" @@ -23,6 +23,6 @@ "@/commons-ui/next/*": ["../../packages/commons-ui-next/src/*"] } }, - "include": ["next-env.d.ts", ".next/types/**/*.ts", "**/*.ts", "**/*.tsx"], + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], "exclude": ["node_modules"] } From 78fe1bbceea5edf4bf4a92d88da8136245c2b51f Mon Sep 17 00:00:00 2001 From: kilemensi Date: Sat, 31 Aug 2024 09:48:17 +0300 Subject: [PATCH 7/8] Use ts(x) instead of js --- apps/engineeringblog/app/StyledRoot.tsx | 17 --- apps/engineeringblog/app/layout.tsx | 24 +++- apps/engineeringblog/components/Logo/Logo.js | 40 ------- apps/engineeringblog/components/Logo/Logo.tsx | 105 ++++++++++++++++++ apps/engineeringblog/components/Logo/index.js | 3 - apps/engineeringblog/components/Logo/index.ts | 5 + .../DesktopNavBar/DesktopNavBar.tsx} | 17 +-- .../DesktopNavBar/index.ts} | 0 .../MobileNavBar/MobileNavBar.tsx} | 27 ++--- .../index.js => NavBar/MobileNavBar/index.ts} | 0 .../components/NavBar/NavBar.js | 78 ------------- .../components/NavBar/NavBar.tsx | 75 +++++++++++++ .../components/NavBar/NavBarProps.tsx | 9 ++ .../components/NavBar/index.js | 3 - .../components/NavBar/index.ts | 5 + apps/engineeringblog/theme/index.ts | 2 + apps/engineeringblog/types.d.ts | 2 + 17 files changed, 238 insertions(+), 174 deletions(-) delete mode 100644 apps/engineeringblog/app/StyledRoot.tsx delete mode 100644 apps/engineeringblog/components/Logo/Logo.js create mode 100644 apps/engineeringblog/components/Logo/Logo.tsx delete mode 100644 apps/engineeringblog/components/Logo/index.js create mode 100644 apps/engineeringblog/components/Logo/index.ts rename apps/engineeringblog/components/{DesktopNavBar/DesktopNavBar.js => NavBar/DesktopNavBar/DesktopNavBar.tsx} (57%) rename apps/engineeringblog/components/{DesktopNavBar/index.js => NavBar/DesktopNavBar/index.ts} (100%) rename apps/engineeringblog/components/{MobileNavBar/MobileNavBar.js => NavBar/MobileNavBar/MobileNavBar.tsx} (84%) rename apps/engineeringblog/components/{MobileNavBar/index.js => NavBar/MobileNavBar/index.ts} (100%) delete mode 100644 apps/engineeringblog/components/NavBar/NavBar.js create mode 100644 apps/engineeringblog/components/NavBar/NavBar.tsx create mode 100644 apps/engineeringblog/components/NavBar/NavBarProps.tsx delete mode 100644 apps/engineeringblog/components/NavBar/index.js create mode 100644 apps/engineeringblog/components/NavBar/index.ts create mode 100644 apps/engineeringblog/types.d.ts diff --git a/apps/engineeringblog/app/StyledRoot.tsx b/apps/engineeringblog/app/StyledRoot.tsx deleted file mode 100644 index c86e74e25..000000000 --- a/apps/engineeringblog/app/StyledRoot.tsx +++ /dev/null @@ -1,17 +0,0 @@ -"use client"; -import { ThemeProvider } from "@mui/material/styles"; -import theme from "@/engineeringblog/theme"; -import { CssBaseline } from "@mui/material"; - -export default function StyledRoot({ - children, -}: Readonly<{ - children: React.ReactNode; -}>) { - return ( - - - {children} - - ); -} diff --git a/apps/engineeringblog/app/layout.tsx b/apps/engineeringblog/app/layout.tsx index 636aa7f3b..32ce49b59 100644 --- a/apps/engineeringblog/app/layout.tsx +++ b/apps/engineeringblog/app/layout.tsx @@ -1,7 +1,12 @@ -import type { Metadata } from "next"; -import Navbar from "@/engineeringblog/components/Navbar"; +import { CssBaseline, ThemeProvider } from "@mui/material"; import { AppRouterCacheProvider } from "@mui/material-nextjs/v13-appRouter"; -import StyledRoot from "./StyledRoot"; +import type { Metadata } from "next"; + +import NavBar from "@/engineeringblog/components/NavBar"; +import theme from "@/engineeringblog/theme"; + +// TODO: blurWidth/blueHeight https://github.com/vercel/next.js/issues/56511 +import logoLight from "@/engineeringblog/assets/images/logo-light.png"; export const metadata: Metadata = { title: "Technology | Code for Africa", @@ -14,14 +19,21 @@ export default function RootLayout({ }: Readonly<{ children: React.ReactNode; }>) { + const logo = { + ...logoLight, + alt: "Technology | Code for Africa", + title: "Technology", + }; + return ( - - + + + {children} - + diff --git a/apps/engineeringblog/components/Logo/Logo.js b/apps/engineeringblog/components/Logo/Logo.js deleted file mode 100644 index 1df7cbec9..000000000 --- a/apps/engineeringblog/components/Logo/Logo.js +++ /dev/null @@ -1,40 +0,0 @@ -import { ImageButton } from "@commons-ui/core"; -import { Divider, Link, Stack } from "@mui/material"; -import PropTypes from "prop-types"; -import React from "react"; - -const Logo = React.forwardRef(function Logo(props, ref) { - const { - alt = "Technology | Code for Africa", - href = "https://codeforafrica.org", - src, - ...other - } = props; - return ( - - - ({ fontFamily: typography.fontFamilyMono })} - > - Technology - - - ); -}); - -Logo.propTypes = { - src: PropTypes.string, -}; - -export default Logo; diff --git a/apps/engineeringblog/components/Logo/Logo.tsx b/apps/engineeringblog/components/Logo/Logo.tsx new file mode 100644 index 000000000..2f44cdc06 --- /dev/null +++ b/apps/engineeringblog/components/Logo/Logo.tsx @@ -0,0 +1,105 @@ +import { Link, Stack, SvgIcon } from "@mui/material"; +import { SxProps, Theme } from "@mui/material/styles"; +import Image, { ImageProps } from "next/image"; +import React from "react"; + +import PreviousIcon from "@/engineeringblog/assets/icons/Type=chevron-left, Size=24, Color=CurrentColor.svg"; + +export interface LogoProps extends ImageProps { + href?: string; + sx?: SxProps; + title?: string; +} + +const Logo = React.forwardRef(function Logo( + props: LogoProps, + ref: React.ForwardedRef, +) { + const { + alt, + href: hrefProp, + src, + sx, + title, + ...other // All next/image supported props + } = props; + const logoHref = title?.length ? "https://codeforafrica.org" : "/"; + + return ( + + ({ + "&>svg,&>img": { + transition: theme.transitions.create(["opacity", "transform"]), + }, + "&:hover": { + "&>svg,&>img": { + opacity: 0.65, + }, + "&>svg": { + transform: "translateX(-5px)", + }, + }, + })} + > + {title?.length ? ( + ({ + fill: { xs: "none" }, + fontSize: 32, + left: -24, + opacity: 0, + position: "absolute", + right: 0, + })} + > + + + ) : null} + {alt} + + {title?.length ? ( + ({ + display: "flex", + fontFamily: typography.fontFamilyMono, + transition: transitions.create(["opacity", "transform"]), + "&:hover": { + opacity: 0.65, + }, + })} + > + Technology + + ) : null} + + ); +}); + +export default Logo; diff --git a/apps/engineeringblog/components/Logo/index.js b/apps/engineeringblog/components/Logo/index.js deleted file mode 100644 index b7d6439c1..000000000 --- a/apps/engineeringblog/components/Logo/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import Logo from "./Logo"; - -export default Logo; diff --git a/apps/engineeringblog/components/Logo/index.ts b/apps/engineeringblog/components/Logo/index.ts new file mode 100644 index 000000000..ef29c030a --- /dev/null +++ b/apps/engineeringblog/components/Logo/index.ts @@ -0,0 +1,5 @@ +import type { LogoProps } from "./Logo"; +import Logo from "./Logo"; + +export type { LogoProps }; +export default Logo; diff --git a/apps/engineeringblog/components/DesktopNavBar/DesktopNavBar.js b/apps/engineeringblog/components/NavBar/DesktopNavBar/DesktopNavBar.tsx similarity index 57% rename from apps/engineeringblog/components/DesktopNavBar/DesktopNavBar.js rename to apps/engineeringblog/components/NavBar/DesktopNavBar/DesktopNavBar.tsx index d6f0443c3..1d7d74916 100644 --- a/apps/engineeringblog/components/DesktopNavBar/DesktopNavBar.js +++ b/apps/engineeringblog/components/NavBar/DesktopNavBar/DesktopNavBar.tsx @@ -1,10 +1,13 @@ import { Grid } from "@mui/material"; -import PropTypes from "prop-types"; import React from "react"; import Logo from "@/engineeringblog/components/Logo"; +import type NavBarProps from "@/engineeringblog/components/NavBar/NavBarProps"; -const DesktopNavBar = React.forwardRef(function DesktopNavBar(props, ref) { +const DesktopNavBar = React.forwardRef(function DesktopNavBar( + props: NavBarProps, + ref: React.ForwardedRef, +) { const { logo, sx } = props; return ( @@ -22,14 +25,4 @@ const DesktopNavBar = React.forwardRef(function DesktopNavBar(props, ref) { ); }); -DesktopNavBar.propTypes = { - direction: PropTypes.string, - menu: PropTypes.arrayOf( - PropTypes.shape({ - label: PropTypes.string, - href: PropTypes.string, - }), - ), -}; - export default DesktopNavBar; diff --git a/apps/engineeringblog/components/DesktopNavBar/index.js b/apps/engineeringblog/components/NavBar/DesktopNavBar/index.ts similarity index 100% rename from apps/engineeringblog/components/DesktopNavBar/index.js rename to apps/engineeringblog/components/NavBar/DesktopNavBar/index.ts diff --git a/apps/engineeringblog/components/MobileNavBar/MobileNavBar.js b/apps/engineeringblog/components/NavBar/MobileNavBar/MobileNavBar.tsx similarity index 84% rename from apps/engineeringblog/components/MobileNavBar/MobileNavBar.js rename to apps/engineeringblog/components/NavBar/MobileNavBar/MobileNavBar.tsx index 9df1a5b24..52d0e2764 100644 --- a/apps/engineeringblog/components/MobileNavBar/MobileNavBar.js +++ b/apps/engineeringblog/components/NavBar/MobileNavBar/MobileNavBar.tsx @@ -4,12 +4,13 @@ import { Grid, IconButton, Slide, + SlideProps, SvgIcon, } from "@mui/material"; import { styled } from "@mui/material/styles"; -import PropTypes from "prop-types"; import React from "react"; +import type NavBarProps from "@/engineeringblog/components/NavBar/NavBarProps"; import Logo from "@/engineeringblog/components/Logo"; import CloseIcon from "@/engineeringblog/assets/icons/Type=x, Size=24, Color=CurrentColor.svg"; import MenuIcon from "@/engineeringblog/assets/icons/Type=menu, Size=24, Color=CurrentColor.svg"; @@ -29,11 +30,19 @@ const DialogContainer = styled(Dialog)(({ theme: { palette, spacing } }) => ({ }, })); -const Transition = React.forwardRef(function Transition(props, ref) { +interface TransitionProps extends SlideProps {} + +const Transition = React.forwardRef(function Transition( + props: TransitionProps, + ref, +) { return ; }); -const MobileNavBar = React.forwardRef(function MobileNavBar(props, ref) { +const MobileNavBar = React.forwardRef(function MobileNavBar( + props: NavBarProps, + ref: React.ForwardedRef, +) { const { logo, sx } = props; const [open, setOpen] = React.useState(false); @@ -88,7 +97,6 @@ const MobileNavBar = React.forwardRef(function MobileNavBar(props, ref) { justifyContent: "space-between", alignItems: "flex-start", }} - onClose={handleClose} > @@ -96,15 +104,4 @@ const MobileNavBar = React.forwardRef(function MobileNavBar(props, ref) { ); }); -MobileNavBar.propTypes = { - direction: PropTypes.string, - logo: PropTypes.shape({}), - menus: PropTypes.arrayOf( - PropTypes.shape({ - label: PropTypes.string, - href: PropTypes.string, - }), - ), -}; - export default MobileNavBar; diff --git a/apps/engineeringblog/components/MobileNavBar/index.js b/apps/engineeringblog/components/NavBar/MobileNavBar/index.ts similarity index 100% rename from apps/engineeringblog/components/MobileNavBar/index.js rename to apps/engineeringblog/components/NavBar/MobileNavBar/index.ts diff --git a/apps/engineeringblog/components/NavBar/NavBar.js b/apps/engineeringblog/components/NavBar/NavBar.js deleted file mode 100644 index d647da4f0..000000000 --- a/apps/engineeringblog/components/NavBar/NavBar.js +++ /dev/null @@ -1,78 +0,0 @@ -"use client"; - -import { NavBar as NavigationBar, Section } from "@commons-ui/core"; -import { alpha, useScrollTrigger, useTheme } from "@mui/material"; -import PropTypes from "prop-types"; -import React from "react"; - -import DesktopNavBar from "@/engineeringblog/components/DesktopNavBar"; -import MobileNavBar from "@/engineeringblog/components/MobileNavBar"; -import logoLight from "@/engineeringblog/assets/images/logo-light.png"; - -function ScrollStyle({ children, sx, ...other }) { - const theme = useTheme(); - const trigger = useScrollTrigger({ - disableHysteresis: true, - threshold: 0, - }); - - return React.cloneElement(children, { - ...other, - sx: trigger - ? { - ...sx, - backgroundColor: alpha(theme.palette.background.default, 0.9), - borderBottom: `1px solid ${theme.palette.divider}`, - } - : sx, - }); -} - -function NavBar({ logo: logoProp, menus, socialLinks }) { - const logo = logoProp || { height: 32, src: logoLight.src, width: 29.5 }; - - return ( - - -
- - -
-
-
- ); -} - -NavBar.propTypes = { - menus: PropTypes.arrayOf( - PropTypes.shape({ - label: PropTypes.string, - href: PropTypes.string, - }), - ), -}; - -export default NavBar; diff --git a/apps/engineeringblog/components/NavBar/NavBar.tsx b/apps/engineeringblog/components/NavBar/NavBar.tsx new file mode 100644 index 000000000..56a5d281a --- /dev/null +++ b/apps/engineeringblog/components/NavBar/NavBar.tsx @@ -0,0 +1,75 @@ +"use client"; + +import { NavBar as NavigationBar, Section } from "@commons-ui/core"; +import { + AppBarProps, + ToolbarProps, + alpha, + useScrollTrigger, + useTheme, +} from "@mui/material"; +import React from "react"; + +import type NavBarProps from "@/engineeringblog/components/NavBar/NavBarProps"; +import DesktopNavBar from "./DesktopNavBar"; +import MobileNavBar from "./MobileNavBar"; + +interface ScrollStyleProps extends AppBarProps { + ToolbarProps: ToolbarProps; + children: React.ReactElement; +} + +function ScrollStyle({ children, sx, ...other }: ScrollStyleProps) { + const theme = useTheme(); + const trigger = useScrollTrigger({ + disableHysteresis: true, + threshold: 0, + }); + + return children + ? React.cloneElement(children, { + ...other, + sx: trigger + ? { + ...sx, + backgroundColor: alpha(theme.palette.background.default, 0.9), + borderBottom: `1px solid ${theme.palette.divider}`, + } + : sx, + }) + : null; +} + +function NavBar({ logo }: NavBarProps) { + return ( + + +
+ + +
+
+
+ ); +} + +export default NavBar; diff --git a/apps/engineeringblog/components/NavBar/NavBarProps.tsx b/apps/engineeringblog/components/NavBar/NavBarProps.tsx new file mode 100644 index 000000000..9f626be59 --- /dev/null +++ b/apps/engineeringblog/components/NavBar/NavBarProps.tsx @@ -0,0 +1,9 @@ +import { Theme, SxProps } from "@mui/material/styles"; +import { LogoProps } from "@/engineeringblog/components/Logo"; + +interface NavBarProps { + logo: LogoProps; + sx?: SxProps; +} + +export default NavBarProps; diff --git a/apps/engineeringblog/components/NavBar/index.js b/apps/engineeringblog/components/NavBar/index.js deleted file mode 100644 index 085b6b525..000000000 --- a/apps/engineeringblog/components/NavBar/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import NavBar from "./NavBar"; - -export default NavBar; diff --git a/apps/engineeringblog/components/NavBar/index.ts b/apps/engineeringblog/components/NavBar/index.ts new file mode 100644 index 000000000..757a2207f --- /dev/null +++ b/apps/engineeringblog/components/NavBar/index.ts @@ -0,0 +1,5 @@ +import NavBar from "./NavBar"; +import type NavBarProps from "./NavBarProps"; + +export type { NavBarProps }; +export default NavBar; diff --git a/apps/engineeringblog/theme/index.ts b/apps/engineeringblog/theme/index.ts index 008438231..126bef355 100644 --- a/apps/engineeringblog/theme/index.ts +++ b/apps/engineeringblog/theme/index.ts @@ -1,3 +1,5 @@ +"use client"; + import { ThemeOptions, createTheme } from "@mui/material/styles"; import { deepmerge } from "@mui/utils"; diff --git a/apps/engineeringblog/types.d.ts b/apps/engineeringblog/types.d.ts new file mode 100644 index 000000000..33ce257b0 --- /dev/null +++ b/apps/engineeringblog/types.d.ts @@ -0,0 +1,2 @@ +declare module "@commons-ui/core"; +declare module "@commons-ui/next"; From 36c35ab89e44c4787884e2ac22b04c16400c0dd3 Mon Sep 17 00:00:00 2001 From: kilemensi Date: Mon, 2 Sep 2024 08:27:01 +0300 Subject: [PATCH 8/8] @types should be dev dependencies --- apps/engineeringblog/package.json | 2 +- pnpm-lock.yaml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/engineeringblog/package.json b/apps/engineeringblog/package.json index 2ee520fb0..00218ad5a 100644 --- a/apps/engineeringblog/package.json +++ b/apps/engineeringblog/package.json @@ -22,13 +22,13 @@ "@mui/material-nextjs": "^5.16.1", "@mui/utils": "^5.16.6", "@next/mdx": "^14.2.5", - "@types/mdx": "^2.0.13", "next": "^14.2.5", "react": "^18", "react-dom": "^18" }, "devDependencies": { "@svgr/webpack": "^8.1.0", + "@types/mdx": "^2.0.13", "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 527511efd..9303013f3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -936,9 +936,6 @@ importers: '@next/mdx': specifier: ^14.2.5 version: 14.2.6(@mdx-js/loader@3.0.1(webpack@5.93.0))(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1)) - '@types/mdx': - specifier: ^2.0.13 - version: 2.0.13 next: specifier: ^14.2.5 version: 14.2.5(@babel/core@7.25.2)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.3)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.69.4) @@ -952,6 +949,9 @@ importers: '@svgr/webpack': specifier: ^8.1.0 version: 8.1.0(typescript@5.5.4) + '@types/mdx': + specifier: ^2.0.13 + version: 2.0.13 '@types/node': specifier: ^20 version: 20.14.14 @@ -15334,7 +15334,7 @@ snapshots: '@aws-sdk/token-providers@3.614.0(@aws-sdk/client-sso-oidc@3.623.0(@aws-sdk/client-sts@3.623.0))': dependencies: - '@aws-sdk/client-sso-oidc': 3.623.0(@aws-sdk/client-sts@3.623.0) + '@aws-sdk/client-sso-oidc': 3.623.0(@aws-sdk/client-sts@3.621.0) '@aws-sdk/types': 3.609.0 '@smithy/property-provider': 3.1.3 '@smithy/shared-ini-file-loader': 3.1.4