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/apple-touch.png b/apps/engineeringblog/app/apple-touch.png
new file mode 100644
index 000000000..451a89ef7
Binary files /dev/null and b/apps/engineeringblog/app/apple-touch.png differ
diff --git a/apps/engineeringblog/app/favicon.ico b/apps/engineeringblog/app/favicon.ico
index 718d6fea4..a1d054c5d 100644
Binary files a/apps/engineeringblog/app/favicon.ico and b/apps/engineeringblog/app/favicon.ico differ
diff --git a/apps/engineeringblog/app/icon.png b/apps/engineeringblog/app/icon.png
new file mode 100644
index 000000000..f47760d72
Binary files /dev/null and b/apps/engineeringblog/app/icon.png differ
diff --git a/apps/engineeringblog/app/layout.tsx b/apps/engineeringblog/app/layout.tsx
index c5049d60b..32ce49b59 100644
--- a/apps/engineeringblog/app/layout.tsx
+++ b/apps/engineeringblog/app/layout.tsx
@@ -1,14 +1,17 @@
-import type { Metadata } from "next";
-import { Inter } from "next/font/google";
-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";
-const inter = Inter({ subsets: ["latin"] });
+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: "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({
@@ -16,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/app/openGraphImage.jpg b/apps/engineeringblog/app/openGraphImage.jpg
new file mode 100644
index 000000000..327e45f84
Binary files /dev/null and b/apps/engineeringblog/app/openGraphImage.jpg differ
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
+
+ );
}
diff --git a/apps/engineeringblog/app/robots.txt b/apps/engineeringblog/app/robots.txt
new file mode 100644
index 000000000..2df101e7f
--- /dev/null
+++ b/apps/engineeringblog/app/robots.txt
@@ -0,0 +1,6 @@
+# Disallow specifies the paths that are not allowed to be crawled by the robot.
+User-agent: *
+Disallow: /
+
+
+# Generatedy by RoboShield (https://roboshield.trustlab.africa)
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 78594c18d..000000000
Binary files a/apps/engineeringblog/assets/images/logo-dark-mode.png and /dev/null differ
diff --git a/apps/engineeringblog/assets/images/logo-dark.png b/apps/engineeringblog/assets/images/logo-dark.png
new file mode 100644
index 000000000..570eda132
Binary files /dev/null and b/apps/engineeringblog/assets/images/logo-dark.png differ
diff --git a/apps/engineeringblog/assets/images/logo-light-mode.png b/apps/engineeringblog/assets/images/logo-light-mode.png
deleted file mode 100644
index 933495f49..000000000
Binary files a/apps/engineeringblog/assets/images/logo-light-mode.png and /dev/null differ
diff --git a/apps/engineeringblog/assets/images/logo-light.png b/apps/engineeringblog/assets/images/logo-light.png
new file mode 100644
index 000000000..ad5134108
Binary files /dev/null and b/apps/engineeringblog/assets/images/logo-light.png differ
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}
+
+
+ {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.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/NavBar/DesktopNavBar/DesktopNavBar.tsx b/apps/engineeringblog/components/NavBar/DesktopNavBar/DesktopNavBar.tsx
new file mode 100644
index 000000000..1d7d74916
--- /dev/null
+++ b/apps/engineeringblog/components/NavBar/DesktopNavBar/DesktopNavBar.tsx
@@ -0,0 +1,28 @@
+import { Grid } from "@mui/material";
+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: NavBarProps,
+ ref: React.ForwardedRef,
+) {
+ const { logo, sx } = props;
+
+ return (
+
+
+
+
+
+ );
+});
+
+export default DesktopNavBar;
diff --git a/apps/engineeringblog/components/NavBar/DesktopNavBar/index.ts b/apps/engineeringblog/components/NavBar/DesktopNavBar/index.ts
new file mode 100644
index 000000000..3919164ee
--- /dev/null
+++ b/apps/engineeringblog/components/NavBar/DesktopNavBar/index.ts
@@ -0,0 +1,3 @@
+import DesktopNavBar from "./DesktopNavBar";
+
+export default DesktopNavBar;
diff --git a/apps/engineeringblog/components/NavBar/MobileNavBar/MobileNavBar.tsx b/apps/engineeringblog/components/NavBar/MobileNavBar/MobileNavBar.tsx
new file mode 100644
index 000000000..52d0e2764
--- /dev/null
+++ b/apps/engineeringblog/components/NavBar/MobileNavBar/MobileNavBar.tsx
@@ -0,0 +1,107 @@
+import {
+ Dialog,
+ DialogContent,
+ Grid,
+ IconButton,
+ Slide,
+ SlideProps,
+ SvgIcon,
+} from "@mui/material";
+import { styled } from "@mui/material/styles";
+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";
+
+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,
+ },
+}));
+
+interface TransitionProps extends SlideProps {}
+
+const Transition = React.forwardRef(function Transition(
+ props: TransitionProps,
+ ref,
+) {
+ return ;
+});
+
+const MobileNavBar = React.forwardRef(function MobileNavBar(
+ props: NavBarProps,
+ ref: React.ForwardedRef,
+) {
+ const { logo, sx } = props;
+ const [open, setOpen] = React.useState(false);
+
+ const handleClickOpen = () => {
+ setOpen(true);
+ };
+ const handleClose = () => {
+ setOpen(false);
+ };
+ const MenuActionIcon = open ? CloseIcon : MenuIcon;
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+});
+
+export default MobileNavBar;
diff --git a/apps/engineeringblog/components/NavBar/MobileNavBar/index.ts b/apps/engineeringblog/components/NavBar/MobileNavBar/index.ts
new file mode 100644
index 000000000..b19184643
--- /dev/null
+++ b/apps/engineeringblog/components/NavBar/MobileNavBar/index.ts
@@ -0,0 +1,3 @@
+import MobileNavBar from "./MobileNavBar";
+
+export default MobileNavBar;
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.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/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 (
-
-
-
-
-
-
-
- ENGINEERING
-
-
-
-
- );
-}
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..00218ad5a 100644
--- a/apps/engineeringblog/package.json
+++ b/apps/engineeringblog/package.json
@@ -11,22 +11,24 @@
"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",
"@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",
@@ -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/theme/index.ts b/apps/engineeringblog/theme/index.ts
index fda604905..126bef355 100644
--- a/apps/engineeringblog/theme/index.ts
+++ b/apps/engineeringblog/theme/index.ts
@@ -1,20 +1,12 @@
"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 +31,17 @@ const breakpoints = {
},
};
+declare module "@mui/material/styles" {
+ interface TypographyOptions {
+ fontFamilyMono: string;
+ }
+ interface Theme {
+ typography: {
+ fontFamilyMono: string;
+ };
+ }
+}
+
const theme = createTheme({
palette,
breakpoints,
@@ -52,99 +55,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 +377,6 @@ deepmerge(
body1: {
fontSize: pxToRem(14),
lineHeight: 23 / 14,
- marginTop: pxToRem(28),
- "&:first-of-type": {
- marginTop: 0,
- },
},
body1SemiBold: {
...theme.typography.body1,
@@ -398,10 +398,6 @@ deepmerge(
body2: {
fontSize: pxToRem(16),
lineHeight: 26 / 16,
- marginTop: pxToRem(28),
- "&:first-of-type": {
- marginTop: 0,
- },
},
body2SemiBold: {
...theme.typography.body2,
diff --git a/apps/engineeringblog/tsconfig.json b/apps/engineeringblog/tsconfig.json
index bb4124b36..d1475f39d 100644
--- a/apps/engineeringblog/tsconfig.json
+++ b/apps/engineeringblog/tsconfig.json
@@ -18,7 +18,9 @@
}
],
"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"],
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";
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index ab6659c27..9303013f3 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)
@@ -933,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)
@@ -946,6 +946,12 @@ 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/mdx':
+ specifier: ^2.0.13
+ version: 2.0.13
'@types/node':
specifier: ^20
version: 20.14.14
@@ -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