From acb33f86b2209f96884cfd33385800f17c7de3d4 Mon Sep 17 00:00:00 2001
From: Kaung Myat Shwe <225817956+kaungmyatshwe1397@users.noreply.github.com>
Date: Wed, 25 Mar 2026 16:22:15 +0700
Subject: [PATCH 1/2] :sparkles: feat(books-classes): refactor pages and adjust
for headerstyle consistency
---
content/books/sample-book.mdx | 8 +-
messages/en.json | 10 ++
messages/mm.json | 10 ++
src/app/books/BooksPageClient.tsx | 143 +++++++++++++++++
src/app/books/page.tsx | 95 +-----------
src/app/classes/ClassesPageClient.tsx | 138 +++++++++++++++++
src/app/classes/page.tsx | 89 +----------
.../Common/SectionHero/SectionHero.tsx | 144 ++++++++++++++++++
8 files changed, 453 insertions(+), 184 deletions(-)
create mode 100644 src/app/books/BooksPageClient.tsx
create mode 100644 src/app/classes/ClassesPageClient.tsx
create mode 100644 src/components/Common/SectionHero/SectionHero.tsx
diff --git a/content/books/sample-book.mdx b/content/books/sample-book.mdx
index b0a0fd6..4436cfc 100644
--- a/content/books/sample-book.mdx
+++ b/content/books/sample-book.mdx
@@ -1,10 +1,10 @@
---
title: "Clean Code"
authorName: "Robert C. Martin"
-link: "https://www.oreilly.com/library/view/clean-code-a/9780136083238/"
-image: "https://m.media-amazon.com/images/I/41xShlnTZTL._SX374_BO1,204,203,200_.jpg"
-authorEmail: "unclebob@example.com"
-authorLink: "https://blog.cleancoder.com/"
+link: https://www.oreilly.com/library/view/clean-code-a/9780136083238/
+image: https://m.media-amazon.com/images/I/41xShlnTZTL._SX374_BO1,204,203,200_.jpg
+authorEmail: unclebob@example.com
+authorLink: https://blog.cleancoder.com/
---
Recommended software craftsmanship reading.
diff --git a/messages/en.json b/messages/en.json
index 2e4b633..0820f0a 100644
--- a/messages/en.json
+++ b/messages/en.json
@@ -358,6 +358,16 @@
"title": "Profiles",
"subtitle": "Discover {count}+ software engineers from Myanmar. Browse by technology, search by name, and connect with the community."
},
+ "booksHero": {
+ "label": "Tech Books & Resources",
+ "title": "Books",
+ "subtitle": "Recommended tech books and learning resources shared by Myanmar software engineers."
+ },
+ "classesHero": {
+ "label": "Tech Classes & Workshops",
+ "title": "Classes",
+ "subtitle": "A trust-first, community-curated directory of tech classes in Myanmar. Listings are reviewed before publication."
+ },
"footer": {
"tagline": {
"prefix": "Empowering Myanmar's Software Engineers to ",
diff --git a/messages/mm.json b/messages/mm.json
index 96b2a2a..c1073b6 100644
--- a/messages/mm.json
+++ b/messages/mm.json
@@ -358,6 +358,16 @@
"title": "ပရိုဖိုင်များ",
"subtitle": "မြန်မာမှ ဆော့ဖ်ဝဲ အင်ဂျင်နီယာ {count}+ ဦးကို ရှာဖွေပါ။ နည်းပညာအလိုက် ရှာဖွေပါ၊ အမည်ဖြင့် ရှာပါ၊ အသိုင်းအဝိုင်းနှင့် ချိတ်ဆက်ပါ။"
},
+ "booksHero": {
+ "label": "နည်းပညာ စာအုပ်များနှင့် အရင်းအမြစ်များ",
+ "title": "စာအုပ်များ",
+ "subtitle": "မြန်မာ software engineer များ မျှဝေထားသော နည်းပညာစာအုပ်များနှင့် လေ့လာရေးအရင်းအမြစ်များကို ရှာဖွေပါ။"
+ },
+ "classesHero": {
+ "label": "နည်းပညာ သင်တန်းများနှင့် အလုပ်ရုံဆွေးနွေးပွဲများ",
+ "title": "သင်တန်းများ",
+ "subtitle": "ယုံကြည်စိတ်ချရမှုကို အခြေခံထားသော မြန်မာနည်းပညာသင်တန်းများ စာရင်းဖြစ်ပြီး၊ စာရင်းတင်သွင်းမှုများကို မထုတ်ပြန်မီ စစ်ဆေးအတည်ပြုပါသည်။"
+ },
"footer": {
"tagline": {
"prefix": "မြန်မာ့ ဆော့ဖ်ဝဲ အင်ဂျင်နီယာများကို ",
diff --git a/src/app/books/BooksPageClient.tsx b/src/app/books/BooksPageClient.tsx
new file mode 100644
index 0000000..7312dd2
--- /dev/null
+++ b/src/app/books/BooksPageClient.tsx
@@ -0,0 +1,143 @@
+"use client";
+
+import Container from "@/components/Common/Container/Container";
+import SectionHero from "@/components/Common/SectionHero/SectionHero";
+import SpacingDivider from "@/components/Common/SpacingDivider/SpacingDivider";
+import { BookOpen, Bookmark, LibraryBig, NotebookPen } from "lucide-react";
+import { useTranslations } from "next-intl";
+
+type BookItem = {
+ _id: string;
+ title: string;
+ authorName: string;
+ authorEmail?: string;
+ authorLink?: string;
+ image?: string;
+ link: string;
+};
+
+type BooksPageClientProps = {
+ books: BookItem[];
+};
+
+const BooksPageClient = ({ books }: BooksPageClientProps) => {
+ const t = useTranslations("booksHero");
+
+ return (
+
+
+
+
+ {books.length === 0 ? (
+
+
+ No books yet
+
+
+ Community recommendations will appear here once contributors add
+ book entries to the repository.
+
+
+ ) : (
+
+ {books.map((book) => (
+
+
+
+ {book.image && (
+

+ )}
+
+
+
+ {book.title}
+
+
+ by {book.authorName}
+
+ {(book.authorEmail || book.authorLink) && (
+
+ )}
+
+
+
+
+ Open Resource
+
+
+
+ ))}
+
+ )}
+
+
+
+
+ );
+};
+
+export default BooksPageClient;
diff --git a/src/app/books/page.tsx b/src/app/books/page.tsx
index 1773caf..907e8af 100644
--- a/src/app/books/page.tsx
+++ b/src/app/books/page.tsx
@@ -1,9 +1,8 @@
import PageTransitionWrapper from "@/components/Animate/PageTransitionWrapper/PageTransitionWrapper";
-import Container from "@/components/Common/Container/Container";
-import SpacingDivider from "@/components/Common/SpacingDivider/SpacingDivider";
import APP_CONFIG from "@/config/config";
import { allBooks } from "contentlayer/generated";
import { Metadata } from "next";
+import BooksPageClient from "./BooksPageClient";
export const metadata: Metadata = {
title: `Books | ${APP_CONFIG.title}`,
@@ -22,97 +21,7 @@ const BooksPage = async () => {
return (
-
-
-
-
- Community Library
-
-
- Books
-
-
- Recommended tech books and learning resources shared by Myanmar
- software engineers.
-
-
-
- {books.length === 0 ? (
-
-
- No books yet
-
-
- Community recommendations will appear here once contributors add
- book entries to the repository.
-
-
- ) : (
-
- {books.map((book) => (
-
-
-
- {book.image && (
-

- )}
-
-
-
- {book.title}
-
-
- by {book.authorName}
-
- {(book.authorEmail || book.authorLink) && (
-
- )}
-
-
-
-
- Open Resource
-
-
-
- ))}
-
- )}
-
-
-
-
+
);
};
diff --git a/src/app/classes/ClassesPageClient.tsx b/src/app/classes/ClassesPageClient.tsx
new file mode 100644
index 0000000..4957ee3
--- /dev/null
+++ b/src/app/classes/ClassesPageClient.tsx
@@ -0,0 +1,138 @@
+"use client";
+
+import Container from "@/components/Common/Container/Container";
+import SectionHero from "@/components/Common/SectionHero/SectionHero";
+import SpacingDivider from "@/components/Common/SpacingDivider/SpacingDivider";
+import { BookOpenCheck, GraduationCap, Presentation, School } from "lucide-react";
+import { useTranslations } from "next-intl";
+
+type ClassItem = {
+ _id: string;
+ title: string;
+ status: string;
+ classType: string;
+ description: string;
+ instructorName: string;
+ tags: string[];
+ classLink: string;
+};
+
+type ClassesPageClientProps = {
+ classes: ClassItem[];
+};
+
+const ClassesPageClient = ({ classes }: ClassesPageClientProps) => {
+ const t = useTranslations("classesHero");
+
+ return (
+
+
+
+
+ {classes.length === 0 ? (
+
+
+ No classes yet
+
+
+ Verified class listings will appear here after maintainers review
+ and approve class submissions.
+
+
+ ) : (
+
+ {classes.map((classItem) => (
+
+
+
+
+
+ {classItem.title}
+
+
+ {classItem.status}
+
+
+ {classItem.classType}
+
+
+
+
+ {classItem.description}
+
+
+
+ Instructor: {classItem.instructorName}
+
+
+
+ {classItem.tags.map((tag) => (
+
+ {tag}
+
+ ))}
+
+
+
+
+
+
+ ))}
+
+ )}
+
+
+
+
+ );
+};
+
+export default ClassesPageClient;
diff --git a/src/app/classes/page.tsx b/src/app/classes/page.tsx
index 3fbe2f3..9f5642f 100644
--- a/src/app/classes/page.tsx
+++ b/src/app/classes/page.tsx
@@ -1,9 +1,8 @@
import PageTransitionWrapper from "@/components/Animate/PageTransitionWrapper/PageTransitionWrapper";
-import Container from "@/components/Common/Container/Container";
-import SpacingDivider from "@/components/Common/SpacingDivider/SpacingDivider";
import APP_CONFIG from "@/config/config";
import { allClasses } from "contentlayer/generated";
import { Metadata } from "next";
+import ClassesPageClient from "./ClassesPageClient";
export const metadata: Metadata = {
title: `Classes | ${APP_CONFIG.title}`,
@@ -22,91 +21,7 @@ const ClassesPage = async () => {
return (
-
-
-
-
- Verified Registry
-
-
- Classes
-
-
- A trust-first, community-curated directory of tech classes in
- Myanmar. Listings are reviewed before publication.
-
-
-
- {classes.length === 0 ? (
-
-
- No classes yet
-
-
- Verified class listings will appear here after maintainers review
- and approve class submissions.
-
-
- ) : (
-
- {classes.map((classItem) => (
-
-
-
-
-
- {classItem.title}
-
-
- {classItem.status}
-
-
- {classItem.classType}
-
-
-
-
- {classItem.description}
-
-
-
- Instructor: {classItem.instructorName}
-
-
-
- {classItem.tags.map((tag) => (
-
- {tag}
-
- ))}
-
-
-
-
-
-
- ))}
-
- )}
-
-
-
-
+
);
};
diff --git a/src/components/Common/SectionHero/SectionHero.tsx b/src/components/Common/SectionHero/SectionHero.tsx
new file mode 100644
index 0000000..efe64d0
--- /dev/null
+++ b/src/components/Common/SectionHero/SectionHero.tsx
@@ -0,0 +1,144 @@
+"use client";
+
+import { khitHaungg } from "@/fonts/fonts";
+import { useLanguage } from "@/hooks/useLanguage";
+import { LucideIcon } from "lucide-react";
+import { motion, useInView } from "motion/react";
+import { CSSProperties, useRef } from "react";
+
+type FloatingIconConfig = {
+ Icon: LucideIcon;
+ className: string;
+ style: CSSProperties;
+ delay: number;
+ sizeClass: string;
+};
+
+type SectionHeroProps = {
+ label: string;
+ title: string;
+ subtitle: string;
+ labelIcon: LucideIcon;
+ labelIconClassName: string;
+ labelChipBackground: string;
+ labelChipBorder: string;
+ shimmerBackground: string;
+ myanmarTitleColorClass: string;
+ floatingIcons: FloatingIconConfig[];
+};
+
+const SectionHero = ({
+ label,
+ title,
+ subtitle,
+ labelIcon: LabelIcon,
+ labelIconClassName,
+ labelChipBackground,
+ labelChipBorder,
+ shimmerBackground,
+ myanmarTitleColorClass,
+ floatingIcons,
+}: SectionHeroProps) => {
+ const heroRef = useRef(null);
+ const heroInView = useInView(heroRef, { amount: 0.3, once: true });
+ const { isMyanmar } = useLanguage();
+ const mmFont = isMyanmar ? khitHaungg.className : "";
+
+ return (
+
+ {floatingIcons.map(({ Icon, className, style, delay, sizeClass }, index) => (
+
+
+
+ ))}
+
+
+
+
+
+
+ {label}
+
+
+
+
+
+
+ {title}
+
+
+
+
+ {subtitle}
+
+
+
+
+ );
+};
+
+export default SectionHero;
From 9a9329b2a1068997365048efe4c97e8f70ded636 Mon Sep 17 00:00:00 2001
From: Kaung Myat Shwe <225817956+kaungmyatshwe1397@users.noreply.github.com>
Date: Wed, 25 Mar 2026 16:40:33 +0700
Subject: [PATCH 2/2] :memo: docs: update documentation
---
README.md | 129 ++++++++++++++++++++++++++++++++++++++++++++----------
1 file changed, 105 insertions(+), 24 deletions(-)
diff --git a/README.md b/README.md
index 20c6a62..ee191f6 100644
--- a/README.md
+++ b/README.md
@@ -32,17 +32,17 @@ MMSWE is an open-source platform where Myanmar software engineers can showcase t
## Tech Stack
-| Layer | Technology |
-|-------|-----------|
-| **Framework** | Next.js 16 (App Router, Static Export) |
-| **Language** | TypeScript, React 19 |
-| **Styling** | Tailwind CSS 3 + DaisyUI + Sass |
-| **Content** | Contentlayer2 with MDX |
-| **Animation** | Framer Motion, Three.js, React Three Fiber |
-| **i18n** | next-intl (Myanmar & English) |
-| **Fonts** | Bricolage Grotesque, Plus Jakarta Sans, JetBrains Mono, KhitHaungg (Myanmar) |
-| **Package Manager** | Bun |
-| **Deployment** | GitHub Pages via GitHub Actions |
+| Layer | Technology |
+| ------------------- | ---------------------------------------------------------------------------- |
+| **Framework** | Next.js 16 (App Router, Static Export) |
+| **Language** | TypeScript, React 19 |
+| **Styling** | Tailwind CSS 3 + DaisyUI + Sass |
+| **Content** | Contentlayer2 with MDX |
+| **Animation** | Framer Motion, Three.js, React Three Fiber |
+| **i18n** | next-intl (Myanmar & English) |
+| **Fonts** | Bricolage Grotesque, Plus Jakarta Sans, JetBrains Mono, KhitHaungg (Myanmar) |
+| **Package Manager** | Bun |
+| **Deployment** | GitHub Pages via GitHub Actions |
## Quick Start
@@ -119,12 +119,93 @@ Hello! I'm a software engineer from Myanmar...
### Frontmatter Fields
-| Field | Required | Description |
-|-------|----------|-------------|
-| `name` | Yes | Your display name |
-| `description` | No | Short bio (shown on profile card) |
-| `image` | No | Avatar URL (GitHub avatar recommended) |
-| `tags` | No | Technology/skill tags |
+| Field | Required | Description |
+| ------------- | -------- | -------------------------------------- |
+| `name` | Yes | Your display name |
+| `description` | No | Short bio (shown on profile card) |
+| `image` | No | Avatar URL (GitHub avatar recommended) |
+| `tags` | No | Technology/skill tags |
+
+## Add Your Book
+
+1. **Fork** this repository
+2. Create a new file in `content/books/`:
+
+```
+content/books/your-book-title.mdx
+```
+
+3. Add frontmatter and content:
+
+```mdx
+---
+title: book title
+authorName: the name of book author
+link: https://example.com/book-link
+image: https://example.com/book-cover.jpg
+authorEmail: author@example.com
+authorLink: https://example.com
+---
+
+Short note about why this book is recommended.
+```
+
+4. **Submit a Pull Request** to the `main` branch
+
+### Frontmatter Fields
+
+| Field | Required | Description |
+| ------------- | -------- | ------------------------------ |
+| `title` | Yes | Book title |
+| `authorName` | Yes | Author name |
+| `link` | Yes | Official/primary resource link |
+| `image` | No | Book cover image URL |
+| `authorEmail` | No | Author contact email |
+| `authorLink` | No | Author website/profile URL |
+
+## Add Your Class
+
+1. **Fork** this repository
+2. Create a new file in `content/classes/`:
+
+```
+content/classes/your-class-title.mdx
+```
+
+3. Add frontmatter and content:
+
+```mdx
+---
+title: your class title
+description: short description of your class
+instructorName: class mentor name
+classLink: https://example.com/classes/react-bootcamp
+tags: tags for tech-stack that involve in this class
+classType: online or in-person
+status: upcoming/completed/incoming
+proofOfAssociation: Proof that submitter is affiliated with the class.
+image: https://example.com/class-cover.jpg
+---
+
+Add trust context, schedule notes, and useful details for learners.
+This is important because PR without trust context for class will be denied.
+```
+
+4. **Submit a Pull Request** to the `main` branch
+
+### Frontmatter Fields
+
+| Field | Required | Description |
+| -------------------- | -------- | ----------------------------------------- |
+| `title` | Yes | Class title |
+| `description` | Yes | Summary of class content |
+| `instructorName` | Yes | Instructor or organization |
+| `classLink` | Yes | Official class link |
+| `tags` | Yes | Topic tags (e.g. React, Python) |
+| `classType` | Yes | One of: `online`, `In-Person` |
+| `status` | Yes | One of: `active`, `completed`, `incoming` |
+| `proofOfAssociation` | Yes | Credibility/proof note for maintainers |
+| `image` | No | Class cover image URL |
## Project Structure
@@ -161,14 +242,14 @@ messages/
MMSWE uses the **Obsidian Prism** theme — a dark interface with prismatic accent colors:
-| Token | Color | Usage |
-|-------|-------|-------|
-| `obsidian` | `#09090b` | Base background |
-| `surface` | `#1a1a22` | Card backgrounds |
-| `prism-cyan` | `#22d3ee` | Primary accent |
+| Token | Color | Usage |
+| -------------- | --------- | ---------------- |
+| `obsidian` | `#09090b` | Base background |
+| `surface` | `#1a1a22` | Card backgrounds |
+| `prism-cyan` | `#22d3ee` | Primary accent |
| `prism-violet` | `#a78bfa` | Secondary accent |
-| `prism-rose` | `#fb7185` | Tertiary accent |
-| `accent-gold` | `#fbbf24` | Highlight accent |
+| `prism-rose` | `#fb7185` | Tertiary accent |
+| `accent-gold` | `#fbbf24` | Highlight accent |
Typography uses **Bricolage Grotesque** for display, **Plus Jakarta Sans** for body, **JetBrains Mono** for code, and **KhitHaungg** for Myanmar script.