-
+
Join us and make a difference
-
+
These numbers represent more than statistics - they represent lives
changed through education and technology. Sugar Labs continues to grow
and impact communities worldwide.
@@ -177,7 +177,7 @@ const Stats = () => {
>
{stat.value}
-
+
{stat.title.split('.')[0].substring(0, 12)}
{stat.title.split('.')[0].length > 12 ? '...' : ''}
diff --git a/src/components/Testimonials.tsx b/src/components/Testimonials.tsx
index 13e68bb6..bd779450 100644
--- a/src/components/Testimonials.tsx
+++ b/src/components/Testimonials.tsx
@@ -62,7 +62,7 @@ const ReviewCard = ({
setImgError(true)}
/>
@@ -93,7 +93,7 @@ export function Testimonials() {
const secondRow = testimonials.slice(Math.ceil(testimonials.length / 2));
return (
-
+
{/* Heading Section with Hearts */}
-
+
Words of appreciation and
admiration from others.
@@ -185,8 +185,8 @@ export function Testimonials() {
{/* Gradient Fades */}
-
-
+
+
);
diff --git a/src/components/Try.tsx b/src/components/Try.tsx
index 9bb35277..77323366 100644
--- a/src/components/Try.tsx
+++ b/src/components/Try.tsx
@@ -66,7 +66,7 @@ const Try: React.FC = () => {
animate="visible"
variants={fadeIn}
>
-
+
{
EXPERIENCE
SUGAR
@@ -94,14 +94,14 @@ const Try: React.FC = () => {
variants={subtleRise}
>
"Our educational tools can be experienced in a number of ways.
Try the ones that are best for you!"
Whether you enjoy hands-on activities, visual learning, or
@@ -163,7 +163,7 @@ const Try: React.FC = () => {
onClick={() =>
handleSwipe('prev', setCurrentCard, TryCardData.length)
}
- className="pointer-events-auto p-2 sm:p-3 bg-white/80 text-[#975555] rounded-full shadow-lg hover:bg-white transition-all"
+ className="pointer-events-auto p-2 sm:p-3 bg-white/80 dark:bg-gray-800/80 text-[#975555] dark:text-pink-400 rounded-full shadow-lg hover:bg-white dark:hover:bg-gray-700 transition-all"
aria-label="Previous"
>
SUGAR?
@@ -255,13 +255,13 @@ const Try: React.FC = () => {
variants={subtleRise}
>
"We have many activities for you!"
The Sugar Learning platform is a complete environment for
@@ -339,7 +339,7 @@ const Try: React.FC = () => {
onClick={() =>
handleSwipe('prev', setCurrentActivity, Activities.length)
}
- className="pointer-events-auto p-2 sm:p-3 bg-white/80 text-[#975555] rounded-full shadow-lg hover:bg-white transition-all"
+ className="pointer-events-auto p-2 sm:p-3 bg-white/80 dark:bg-gray-800/80 text-[#975555] dark:text-pink-400 rounded-full shadow-lg hover:bg-white dark:hover:bg-gray-700 transition-all"
aria-label="Previous"
>
{
onClick={() =>
handleSwipe('next', setCurrentActivity, Activities.length)
}
- className="pointer-events-auto p-2 sm:p-3 bg-white/80 text-[#975555] rounded-full shadow-lg hover:bg-white transition-all"
+ className="pointer-events-auto p-2 sm:p-3 bg-white/80 dark:bg-gray-800/80 text-[#975555] dark:text-pink-400 rounded-full shadow-lg hover:bg-white dark:hover:bg-gray-700 transition-all"
aria-label="Next"
>
{
onClick={() => setCurrentActivity(index)}
className={`w-2 h-2 sm:w-2.5 sm:h-2.5 rounded-full transition-all duration-300 ${
currentActivity === index
- ? 'bg-[#975555] w-4 sm:w-6'
- : 'bg-[#975555]/30'
+ ? 'bg-[#975555] dark:bg-pink-400 w-4 sm:w-6'
+ : 'bg-[#975555]/30 dark:bg-pink-400/30'
}`}
aria-label={`Go to slide ${index + 1}`}
/>
diff --git a/src/components/TryCard.tsx b/src/components/TryCard.tsx
index 57195478..5400326c 100644
--- a/src/components/TryCard.tsx
+++ b/src/components/TryCard.tsx
@@ -29,13 +29,13 @@ export const ActivityCard: React.FC = ({
href,
version,
}) => (
-
+

-
+
{title}
@@ -43,22 +43,22 @@ export const ActivityCard: React.FC = ({
{version}
)}
-
+
{description}
-
@@ -75,16 +75,16 @@ export const TryCard: React.FC = ({
imagePath,
gradientClass,
}) => (
-
+
{/* Content Section */}
{/* Header */}
-
+
{title}
-
+
{description}
@@ -105,9 +105,9 @@ export const TryCard: React.FC
= ({
= ({
{/* Image Section */}
-
+

+
{/* Left Side Content */}
@@ -60,7 +60,7 @@ export function TryMore() {
variants={staggerContainer}
>
diff --git a/src/components/TryNow/FeatureSection.tsx b/src/components/TryNow/FeatureSection.tsx
index 8a9f71f8..fd2c1017 100644
--- a/src/components/TryNow/FeatureSection.tsx
+++ b/src/components/TryNow/FeatureSection.tsx
@@ -30,9 +30,15 @@ const FeatureSection = ({ data }: { data: FeatureData }) => {
variants={featureSectionAnimations.textContainer}
>
{data.title}
- {data.subtitle}
- {data.quote}
- {data.description}
+
+ {data.subtitle}
+
+
+ {data.quote}
+
+
+ {data.description}
+
{/* Right Side: Image Carousel */}
@@ -69,12 +75,14 @@ const FeatureSection = ({ data }: { data: FeatureData }) => {
) : (
- No Image Available
+
+ No Image Available
+
)}
@@ -82,7 +90,7 @@ const FeatureSection = ({ data }: { data: FeatureData }) => {
{/* Optional Note */}
{data.note && (
{
{data.map((card, index) => (
{
{/* Title */}
- {card.title}
+
+ {card.title}
+
{/* Divider */}
-
+
{/* Description */}
-
+
{card.description.map((point, i) => (
- {point}
))}
diff --git a/src/components/TryNow/NumberedCard.tsx b/src/components/TryNow/NumberedCard.tsx
index a5517b39..21756c1a 100644
--- a/src/components/TryNow/NumberedCard.tsx
+++ b/src/components/TryNow/NumberedCard.tsx
@@ -42,10 +42,10 @@ const NumberedCard: React.FC = ({
{/* Title */}
- {title}
+ {title}
{/* Description */}
- {description}
+ {description}
{/* Conditionally Render Image */}
{image && (
diff --git a/src/components/TryNow/Paragraph.tsx b/src/components/TryNow/Paragraph.tsx
index 6c2fb53a..b269ef46 100644
--- a/src/components/TryNow/Paragraph.tsx
+++ b/src/components/TryNow/Paragraph.tsx
@@ -33,7 +33,7 @@ const Paragraph: React.FC = ({
>
{/* Styled Title */}
{title}
@@ -41,7 +41,7 @@ const Paragraph: React.FC = ({
{/* Render Content as a List if Multiple Lines Exist */}
{contentPoints.length > 1 ? (
-
+
{contentPoints.map((point, index) => (
= ({
) : (
{
return (
-
+
Steps to Boot Sugar on a Stick
@@ -28,14 +28,14 @@ const StepsToUse = () => {
{steps.map((step, index) => (
{/* TEXT CONTENT */}
-
+
Step {index + 1}
-
+
{step.title}
= ({ members }) => {
>
{/* Title */}
Music Blocks Offline Edition
and
Curriculum Development Team
@@ -41,7 +41,7 @@ const TeamSection: React.FC<{ members: TeamMember[] }> = ({ members }) => {
{/* Grid Layout for Members */}
= ({ members }) => {
{members.map((member, index) => (
{/* Member Image */}
@@ -69,7 +69,9 @@ const TeamSection: React.FC<{ members: TeamMember[] }> = ({ members }) => {
>
{member.name}
- {member.description}
+
+ {member.description}
+
))}
diff --git a/src/components/shared/DarkModeToggle.tsx b/src/components/shared/DarkModeToggle.tsx
new file mode 100644
index 00000000..5771b2c6
--- /dev/null
+++ b/src/components/shared/DarkModeToggle.tsx
@@ -0,0 +1,38 @@
+import { useState, useEffect } from 'react';
+
+const DarkModeToggle = () => {
+ const [isDarkMode, setIsDarkMode] = useState(false);
+
+ useEffect(() => {
+ const theme = localStorage.getItem('theme');
+ if (theme === 'dark') {
+ document.documentElement.classList.add('dark');
+ setIsDarkMode(true);
+ } else {
+ document.documentElement.classList.remove('dark');
+ setIsDarkMode(false);
+ }
+ }, []);
+
+ const toggleDarkMode = () => {
+ if (isDarkMode) {
+ document.documentElement.classList.remove('dark');
+ localStorage.setItem('theme', 'light');
+ } else {
+ document.documentElement.classList.add('dark');
+ localStorage.setItem('theme', 'dark');
+ }
+ setIsDarkMode(!isDarkMode);
+ };
+
+ return (
+
+ {isDarkMode ? '☀️' : '🌙'}
+
+ );
+};
+
+export default DarkModeToggle;
diff --git a/src/constants/Stats.ts b/src/constants/Stats.ts
index e4527bb2..2e8f027a 100644
--- a/src/constants/Stats.ts
+++ b/src/constants/Stats.ts
@@ -30,8 +30,8 @@ export const statisticsData = [
imageSrc: stats.kidlaptop,
imageAlt: 'Student with laptop',
gradient: 'from-green-600 to-green-700',
- bgColor: 'bg-green-50',
- borderColor: 'border-green-200',
+ bgColor: 'bg-green-50 dark:bg-green-900/50',
+ borderColor: 'border-green-200 dark:border-green-800',
},
{
title:
@@ -40,8 +40,8 @@ export const statisticsData = [
imageSrc: stats.studentsCollaborating,
imageAlt: 'Students collaborating',
gradient: 'from-red-600 to-red-700',
- bgColor: 'bg-red-50',
- borderColor: 'border-red-200',
+ bgColor: 'bg-red-50 dark:bg-red-900/50',
+ borderColor: 'border-red-200 dark:border-red-800',
},
{
title: 'Problem-solving tasks completed by students ages 13-17.',
@@ -49,8 +49,8 @@ export const statisticsData = [
imageSrc: stats.studentMobile,
imageAlt: 'Student with mobile device',
gradient: 'from-green-600 to-green-700',
- bgColor: 'bg-green-100',
- borderColor: 'border-green-300',
+ bgColor: 'bg-green-100 dark:bg-green-900/60',
+ borderColor: 'border-green-300 dark:border-green-700',
},
{
title: 'Activities Downloaded',
@@ -58,8 +58,8 @@ export const statisticsData = [
imageSrc: stats.activity,
imageAlt: 'Activity icon',
gradient: 'from-yellow-600 to-yellow-700',
- bgColor: 'bg-yellow-50',
- borderColor: 'border-yellow-200',
+ bgColor: 'bg-yellow-50 dark:bg-yellow-900/50',
+ borderColor: 'border-yellow-200 dark:border-yellow-800',
},
{
title: 'Languages our educational software has been translated into',
@@ -67,8 +67,8 @@ export const statisticsData = [
imageSrc: stats.language,
imageAlt: 'Language icon',
gradient: 'from-blue-600 to-blue-700',
- bgColor: 'bg-blue-50',
- borderColor: 'border-blue-200',
+ bgColor: 'bg-blue-50 dark:bg-blue-900/50',
+ borderColor: 'border-blue-200 dark:border-blue-800',
},
{
title:
@@ -77,7 +77,7 @@ export const statisticsData = [
imageSrc: stats.mentorsTeaching,
imageAlt: 'Mentors teaching',
gradient: 'from-red-600 to-red-700',
- bgColor: 'bg-red-100',
- borderColor: 'border-red-300',
+ bgColor: 'bg-red-100 dark:bg-red-900/60',
+ borderColor: 'border-red-300 dark:border-red-700',
},
];
diff --git a/src/constants/aboutUs/navigation.ts b/src/constants/aboutUs/navigation.ts
index 5d3c0ce9..ab60445f 100644
--- a/src/constants/aboutUs/navigation.ts
+++ b/src/constants/aboutUs/navigation.ts
@@ -21,12 +21,13 @@ export const navigationConfig = {
export const navigationStyles = {
container:
- 'sticky bg-white/90 backdrop-blur-md shadow-md rounded-lg p-4 mb-8 z-40 mt-16',
+ 'sticky bg-white/90 dark:bg-gray-800/90 backdrop-blur-md shadow-md dark:shadow-gray-700 rounded-lg p-4 mb-8 z-40 mt-16',
list: 'flex flex-wrap justify-center gap-4 md:gap-8',
button: {
base: 'px-4 py-2 rounded-md transition-all duration-300 text-sm md:text-base relative group hover:cursor-pointer',
- active: 'text-red-500 font-medium',
- inactive: 'text-gray-600 hover:text-red-500',
+ active: 'text-red-500 dark:text-red-400 font-medium',
+ inactive:
+ 'text-gray-600 dark:text-gray-300 hover:text-red-500 dark:hover:text-red-400',
},
indicator: {
base: 'absolute bottom-0 left-0 w-full h-0.5 bg-red-500 transform transition-all duration-300',
diff --git a/src/pages/About/AboutUs.tsx b/src/pages/About/AboutUs.tsx
index cafb4a03..3b2e1d10 100644
--- a/src/pages/About/AboutUs.tsx
+++ b/src/pages/About/AboutUs.tsx
@@ -19,7 +19,7 @@ const AboutUs = () => {
}, []);
return (
-
+
diff --git a/src/pages/About/ContactUs.tsx b/src/pages/About/ContactUs.tsx
index 8c9300d9..94333e4a 100644
--- a/src/pages/About/ContactUs.tsx
+++ b/src/pages/About/ContactUs.tsx
@@ -19,7 +19,7 @@ const ContactUs: React.FC = () => {
return (
<>
-
+
{/* Hero Section */}
{
{/* Contact Information Card */}
{
>
{
iconSrc="assets/Icons/mail.svg"
title="By Mail"
description={
-
+
Sugar Labs
2028 E Ben White Blvd STE 240 PMB 1271
@@ -141,7 +141,7 @@ const ContactUs: React.FC = () => {
description={
+1 (617) 702-4088
@@ -155,7 +155,7 @@ const ContactUs: React.FC = () => {
description={
info@sugarlabs.org
@@ -169,7 +169,7 @@ const ContactUs: React.FC = () => {
description={
Go to Matrix Chat
@@ -285,14 +285,14 @@ const ContactMethod: React.FC = ({
}) => (
-
+
{title}
{description}
diff --git a/src/pages/About/FAQs.tsx b/src/pages/About/FAQs.tsx
index 77ec184e..4587ba66 100644
--- a/src/pages/About/FAQs.tsx
+++ b/src/pages/About/FAQs.tsx
@@ -28,7 +28,7 @@ const FAQs = () => {
}, [selectedCategory]);
return (
-
+
{/* Top FAQs Section */}
@@ -46,13 +46,13 @@ const FAQs = () => {
variants={slideInLeft}
>
FAQs
Have questions? Here you'll find the answers most valued by our
@@ -88,7 +88,7 @@ const FAQs = () => {
variants={fadeIn}
>
Quick Answers
@@ -100,20 +100,20 @@ const FAQs = () => {
{quickAnswers.map((qa, index) => (
{qa.question}
-
+
{qa.answer}
@@ -141,7 +141,7 @@ const FAQs = () => {
className={`px-4 py-2 rounded-full transition-all ${
selectedCategory === 'all'
? 'bg-blue-600 text-white cursor-pointer'
- : 'bg-gray-200 hover:bg-gray-300 cursor-pointer'
+ : 'bg-gray-200 text-gray-800 dark:bg-gray-700 dark:text-gray-200 hover:bg-gray-300 dark:hover:bg-gray-600 cursor-pointer'
}`}
>
All
@@ -153,7 +153,7 @@ const FAQs = () => {
className={`px-4 py-2 rounded-full transition-all capitalize ${
selectedCategory === category
? 'bg-blue-600 text-white cursor-pointer'
- : 'bg-gray-200 hover:bg-gray-300 cursor-pointer'
+ : 'bg-gray-200 text-gray-800 dark:bg-gray-700 dark:text-gray-200 hover:bg-gray-300 dark:hover:bg-gray-600 cursor-pointer'
}`}
>
{category}
@@ -170,7 +170,7 @@ const FAQs = () => {
variants={faqPageAnimations.faqContainer}
>
{selectedCategory === 'all'
@@ -178,7 +178,7 @@ const FAQs = () => {
: `${selectedCategory} FAQs`}
{filteredFaqs.length > 0 ? (
@@ -191,7 +191,7 @@ const FAQs = () => {
/>
))
) : (
-
+
No FAQs found for this category.
)}
diff --git a/src/pages/About/Leadership.tsx b/src/pages/About/Leadership.tsx
index 906c1151..bbf6ab56 100644
--- a/src/pages/About/Leadership.tsx
+++ b/src/pages/About/Leadership.tsx
@@ -14,14 +14,14 @@ import {
const Leadership = () => {
return (
-
+
-
+
{/* Section header with animations */}
{
{
return (
<>
-
- {/* Hero Section */}
-
- {/* Left Column with Heading and Buttons */}
+
+
+ {/* Hero Section */}
+
+ {/* Left Column with Heading and Buttons */}
+
+
+ Make a Lasting Impact in
+ Education
+
+
+
+ A financial contribution to Sugar Labs is an investment in
+ education. Your tax-deductible donation helps us create
+ innovative tools for teaching and learning while mentoring
+ budding developers from around the world.
+
+
+
+
+
+ Donate Now
+
+
+
+
+
+
+ Your donation is tax-deductible in the United States as Sugar
+ Labs is a registered 501(c)(3) nonprofit organization.
+
+
+
+
+ {/* Right Column with Image */}
+
+
+
+
+
+ {/* Impact Statement Section */}
-
- Make a Lasting Impact in
- Education
-
-
-
- A financial contribution to Sugar Labs is an investment in
- education. Your tax-deductible donation helps us create innovative
- tools for teaching and learning while mentoring budding developers
- from around the world.
-
+
+ Your Donation Directly Assists Our Mission
+
-
-
-
- Donate Now
-
-
-
+
+
+ Despite the fact that computers, and the software on those
+ computers, run the way much of the world works, there still
+ remains very little support in education, especially at the
+ levels of primary and secondary schooling, to cultivate a
+ computationally literate society. Despite initiatives, a mere
+ "day of code," sometimes as little as "an hour of code," is
+ woefully insufficient to instill computational literacy in a
+ generation of young learners.
+
-
-
- Your donation is tax-deductible in the United States as Sugar
- Labs is a registered 501(c)(3) nonprofit organization.
+
+ Sugar Labs, as an organization, and the suite of apps,
+ curriculum, rubrics, and mentoring, is well poised to bridge the
+ gap for many learners in the US and around the world - the gap
+ between educational services provided and what youth need
+ developmentally to succeed.
- {/* Right Column with Image */}
+ {/* Why Your Support Matters */}
-
-
-
-
- {/* Impact Statement Section */}
-
-
- Your Donation Directly Assists Our Mission
-
-
-
-
- Despite the fact that computers, and the software on those
- computers, run the way much of the world works, there still
- remains very little support in education, especially at the levels
- of primary and secondary schooling, to cultivate a computationally
- literate society. Despite initiatives, a mere "day of code,"
- sometimes as little as "an hour of code," is woefully insufficient
- to instill computational literacy in a generation of young
- learners.
-
-
-
- Sugar Labs, as an organization, and the suite of apps, curriculum,
- rubrics, and mentoring, is well poised to bridge the gap for many
- learners in the US and around the world - the gap between
- educational services provided and what youth need developmentally
- to succeed.
-
-
-
-
- {/* Why Your Support Matters */}
-
-
- How Your Donation Makes a Difference
-
-
-
- {IMPACT_STATS.map((stat) => (
-
-
- {stat.value}
-
-
- {stat.title}
-
-
- {stat.description}
-
-
- ))}
-
-
-
- {/* Mission Statement */}
-
-
-
- Our Mission
+
+ How Your Donation Makes a Difference
-
- Sugar Labs® is a US-based 501(c)(3) nonprofit organization with a
- global mission to create educational opportunities in technology
- to youth around the world. Volunteer mentors and contributors work
- together to develop activity- focused software for children. All
- software is developed with learning as the primary goal,
- necessitating the need for source code to be published publicly
- for study — worked upon openly within a community where students
- are invited to make contributions under guidance of experienced
- mentors.
-
-
-
-
- {/* Financial Transparency Section */}
-
-
- Financial Transparency
-
-
-
-
- Sugar Labs is committed to full financial transparency. As a
- 501(c)(3) nonprofit organization, we make our tax filings
- available for public review.
-
+
-
- Our 990 Tax Filings
-
+ {/* Mission Statement */}
+
+
+
+ Our Mission
+
+
+ Sugar Labs® is a US-based 501(c)(3) nonprofit organization with
+ a global mission to create educational opportunities in
+ technology to youth around the world. Volunteer mentors and
+ contributors work together to develop activity- focused software
+ for children. All software is developed with learning as the
+ primary goal, necessitating the need for source code to be
+ published publicly for study — worked upon openly within a
+ community where students are invited to make contributions under
+ guidance of experienced mentors.
+
-
- {visibleFilings.map((filing) => (
+
+
- {/* Show More Button */}
- {hasMoreFilings && !showAllFilings && (
-
- setShowAllFilings(true)}
- className="bg-gray-200 hover:bg-gray-300 text-gray-800 px-4 py-2 rounded-md text-sm font-medium flex items-center"
- >
- Show More
-
-
- )}
+ {/* Financial Transparency Section */}
+
+
+ Financial Transparency
+
-
-
- Note about 2018 and earlier
-
-
- Sugar Labs Inc. received its 501(c)(3) nonprofit status in 2020.
- Before 2019, Sugar Labs was a member organization under Software
- Freedom Conservancy. To view our archived financial data from
- before 2019, please visit:{' '}
-
- https://wiki.sugarlabs.org/go/Finance
-
+
+
+ Sugar Labs is committed to full financial transparency. As a
+ 501(c)(3) nonprofit organization, we make our tax filings
+ available for public review.
+
+
+ Our 990 Tax Filings
+
+
+
+
+ {/* Show More Button */}
+ {hasMoreFilings && !showAllFilings && (
+
+ setShowAllFilings(true)}
+ className="bg-gray-200 hover:bg-gray-300 text-gray-800 dark:bg-gray-700 dark:hover:bg-gray-600 dark:text-gray-200 px-4 py-2 rounded-md text-sm font-medium flex items-center"
+ >
+ Show More
+
+
+ )}
+
+
+
+ Note about 2018 and earlier
+
+
+ Sugar Labs Inc. received its 501(c)(3) nonprofit status in
+ 2020. Before 2019, Sugar Labs was a member organization under
+ Software Freedom Conservancy. To view our archived financial
+ data from before 2019, please visit:{' '}
+
+ https://wiki.sugarlabs.org/go/Finance
+
+
+
-
-
+
- {/* Donation Section */}
-
-
- Support Our Mission Today
-
+ {/* Donation Section */}
+
+
+ Support Our Mission Today
+
-
- Financial contributions to Sugar Labs helps us continue to create
- and maintain innovative tools for learning, as well as mentor youth
- at a critical point in their development. Your support makes a
- meaningful difference in the lives of children around the world.
-
+
+ Financial contributions to Sugar Labs helps us continue to create
+ and maintain innovative tools for learning, as well as mentor
+ youth at a critical point in their development. Your support makes
+ a meaningful difference in the lives of children around the world.
+
-
-
+
+
+
>
diff --git a/src/pages/JoinDevelopment.tsx b/src/pages/JoinDevelopment.tsx
index 13240fb1..445068ce 100644
--- a/src/pages/JoinDevelopment.tsx
+++ b/src/pages/JoinDevelopment.tsx
@@ -13,7 +13,7 @@ const JoinDevelopment = () => {
}, []);
return (
-
+
@@ -25,12 +25,12 @@ const JoinDevelopment = () => {
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6, delay: 0.2 }}
>
-
+
Before Beginning to Contribute
-
+
-
+
As a developer, whether you are just starting out or you've
participated in other development before, there are a few things you
need to know about our community. This page has important
@@ -55,14 +55,14 @@ const JoinDevelopment = () => {
viewport={{ once: true, amount: 0.1 }}
>
-
+
Resources
-
+
Important Links for Developers
-
-
+
+
Essential resources for people interested in making development
contributions to Sugar Labs
diff --git a/src/pages/MainPage.tsx b/src/pages/MainPage.tsx
index 6a1a1d2a..3cacd138 100644
--- a/src/pages/MainPage.tsx
+++ b/src/pages/MainPage.tsx
@@ -11,7 +11,7 @@ import { bannerConfigs } from '@/constants/Banner';
const MainPage = () => {
return (
- <>
+
@@ -21,7 +21,7 @@ const MainPage = () => {
- >
+
);
};
diff --git a/src/pages/Matrix.tsx b/src/pages/Matrix.tsx
index 30d45078..55bf2044 100644
--- a/src/pages/Matrix.tsx
+++ b/src/pages/Matrix.tsx
@@ -50,16 +50,18 @@ const TimelineStep: React.FC = ({
{icon}
-
-
{title}
-
+
+
+ {title}
+
+
{description}
{link && (
{link.text}
@@ -72,18 +74,18 @@ const TimelineStep: React.FC = ({
{isLeft ? (
<>
-
-
+
+
{title}
-
+
{description}
{link && (
{link.text}
@@ -99,7 +101,7 @@ const TimelineStep: React.FC = ({
{icon}
-
+
{title.split(' ')[0]}
@@ -112,7 +114,7 @@ const TimelineStep: React.FC = ({
className="flex items-center justify-end"
whileHover={{ x: -5 }}
>
-
+
{title.split(' ')[0]}
@@ -124,18 +126,18 @@ const TimelineStep: React.FC = ({
{step}
-
-
+
+
{title}
-
+
{description}
{link && (
{link.text}
@@ -165,23 +167,25 @@ const RoomCard: React.FC = ({ link, getIcon }) => (
key={link.id}
variants={statCard}
whileHover="hover"
- className="bg-white rounded-xl shadow-md overflow-hidden border border-gray-100 hover:shadow-lg transition-all duration-300 h-full"
+ className="bg-white dark:bg-gray-800 rounded-xl shadow-md overflow-hidden border border-gray-100 dark:border-gray-700 hover:shadow-lg transition-all duration-300 h-full"
>
{getIcon(link.icon)}
-
{link.title}
+
+ {link.title}
+
-
+
{link.description}
Join Room
@@ -246,7 +250,7 @@ const Matrix: React.FC = () => {
];
return (
-
+
{/* Hero Section*/}
@@ -307,12 +311,12 @@ const Matrix: React.FC = () => {
whileInView="visible"
viewport={{ once: true, margin: '-100px' }}
variants={fadeIn}
- className="py-12 sm:py-16 bg-[#FFFEF9]"
+ className="py-12 sm:py-16 bg-[#FFFEF9] dark:bg-gray-900"
>
What is Matrix?
@@ -350,11 +354,11 @@ const Matrix: React.FC = () => {
whileInView="visible"
viewport={{ once: true, margin: '-100px' }}
variants={staggerContainer}
- className="py-12 sm:py-16 md:py-24 bg-[#FFFEF9]"
+ className="py-12 sm:py-16 md:py-24 bg-[#FFFEF9] dark:bg-gray-900"
>
-
+
Join Our Matrix Rooms
@@ -375,11 +379,11 @@ const Matrix: React.FC = () => {
whileInView="visible"
viewport={{ once: true, margin: '-100px' }}
variants={staggerContainer}
- className="py-12 sm:py-16 bg-[#FFFEF9]"
+ className="py-12 sm:py-16 bg-[#FFFEF9] dark:bg-gray-900"
>
-
+
How to Get Started with Matrix
diff --git a/src/pages/News/NewsDetailPage.tsx b/src/pages/News/NewsDetailPage.tsx
index 8e10ead6..da7e0f87 100644
--- a/src/pages/News/NewsDetailPage.tsx
+++ b/src/pages/News/NewsDetailPage.tsx
@@ -1,9 +1,9 @@
import React, { useState, useEffect, useCallback } from 'react';
import ShareModal from '@/components/ShareModal';
import { Share2 } from 'lucide-react';
+import { motion } from 'framer-motion';
import { useParams, useNavigate, useLocation } from 'react-router-dom';
import { getPostBySlug, Post } from '@/utils/posts-utils';
-import { motion } from 'framer-motion';
import Header from '@/sections/Header';
import Footer from '@/sections/Footer';
import MarkdownRenderer from '@/utils/MarkdownRenderer';
@@ -122,10 +122,12 @@ const NewsDetailPage: React.FC = () => {
return (
<>
-
+
-
-
Loading article...
+
+
+ Loading article...
+
@@ -139,15 +141,15 @@ const NewsDetailPage: React.FC = () => {
<>
-
+
{error || 'Post Not Found'}
-
+
The post you're looking for doesn't exist or has been removed.
Back to News
@@ -161,11 +163,11 @@ const NewsDetailPage: React.FC = () => {
return (
<>
-
+
{/* Back button */}
{
{/* Article Header */}
-
+
{post.category && (
-
+
{post.category}
)}
-
{post.title}
+
+ {post.title}
+
{
-
+
{post.date && (
<>
@@ -258,7 +262,7 @@ const NewsDetailPage: React.FC = () => {
handleTagClick(tag)}
- className="text-xs bg-gray-100 text-gray-600 px-2 py-1 rounded-md hover:bg-blue-100 hover:text-blue-700 cursor-pointer transition-colors"
+ className="text-xs bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 px-2 py-1 rounded-md hover:bg-blue-100 dark:hover:bg-gray-700 hover:text-blue-700 dark:hover:text-blue-300 cursor-pointer transition-colors"
>
#{tag}
@@ -292,7 +296,7 @@ const NewsDetailPage: React.FC = () => {
{/* Article Content */}
{
{/* Author Bio Section */}
{post.author && (
@@ -319,17 +323,19 @@ const NewsDetailPage: React.FC = () => {
className="w-16 h-16 rounded-full object-cover"
/>
) : (
-
+
{post.author.name.charAt(0).toUpperCase()}
)}
-
+
About {post.author.name}
-
{post.author.description}
-
+
+ {post.author.description}
+
+
Click to view profile →
@@ -338,14 +344,16 @@ const NewsDetailPage: React.FC = () => {
{/* Tags Section */}
{post.tags && post.tags.length > 0 && (
-
-
Tags
+
+
+ Tags
+
{post.tags.map((tag, index) => (
handleTagClick(tag)}
- className="px-3 py-1 bg-gray-100 text-gray-700 rounded-full text-sm hover:bg-blue-100 hover:text-blue-700 cursor-pointer transition-colors"
+ className="px-3 py-1 bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 rounded-full text-sm hover:bg-blue-100 dark:hover:bg-gray-700 hover:text-blue-700 dark:hover:text-blue-400 cursor-pointer transition-colors"
>
#{tag}
diff --git a/src/pages/News/NewsPage.tsx b/src/pages/News/NewsPage.tsx
index ebdec180..c9274d08 100644
--- a/src/pages/News/NewsPage.tsx
+++ b/src/pages/News/NewsPage.tsx
@@ -153,7 +153,7 @@ const NewsPage: React.FC = () => {
return (
<>
-
+
-
+
-
+
Loading Latest News
-
+
Fetching the most recent stories from Sugar Labs community...
@@ -194,7 +194,7 @@ const NewsPage: React.FC = () => {
return (
<>
-
+
{
/>
-
+
Oops! Something went wrong
{error}
@@ -239,7 +239,7 @@ const NewsPage: React.FC = () => {
return (
<>
-
+
{/* Enhanced Hero Section */}
@@ -269,7 +269,7 @@ const NewsPage: React.FC = () => {
/>
-
+
Discover the latest innovations, community updates, and
educational insights from the Sugar Labs ecosystem
@@ -281,7 +281,7 @@ const NewsPage: React.FC = () => {
{/* Enhanced Filters and Controls */}
-
+
{/* Search Bar */}
@@ -306,7 +306,7 @@ const NewsPage: React.FC = () => {
: '';
navigate(`/news/${catPath}${query}`, { replace: true });
}}
- className="w-full pl-10 pr-10 py-3 border border-gray-200 rounded-xl focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all duration-300"
+ className="w-full pl-10 pr-4 py-3 border border-gray-200 dark:bg-gray-700 dark:border-gray-600 dark:text-white rounded-xl focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all duration-300"
/>
{searchTerm && (
{
{/* View Mode Toggle */}
-
+
setViewMode('grid')}
className={`p-3 rounded-lg transition-all duration-300 ${
viewMode === 'grid'
- ? 'bg-white text-blue-600 shadow-md'
- : 'text-gray-600 hover:text-blue-600'
+ ? 'bg-white dark:bg-blue-600 dark:text-white text-blue-600 shadow-md'
+ : 'text-gray-600 dark:text-gray-400 hover:text-blue-600'
}`}
title="Grid View"
>
@@ -345,8 +345,8 @@ const NewsPage: React.FC = () => {
onClick={() => setViewMode('list')}
className={`p-3 rounded-lg transition-all duration-300 ${
viewMode === 'list'
- ? 'bg-white text-blue-600 shadow-md'
- : 'text-gray-600 hover:text-blue-600'
+ ? 'bg-white dark:bg-blue-600 dark:text-white text-blue-600 shadow-md'
+ : 'text-gray-600 dark:text-gray-400 hover:text-blue-600'
}`}
title="List View"
>
@@ -357,10 +357,13 @@ const NewsPage: React.FC = () => {
{/* Category Filters - Always Visible */}
-
+
-
-
+
+
Categories
@@ -372,7 +375,7 @@ const NewsPage: React.FC = () => {
className={`px-4 py-2 rounded-full text-sm font-medium transition-all duration-300 ${
activeCategory === cat
? 'bg-[#144EEC] text-white shadow-lg'
- : 'bg-gray-100 text-gray-700 hover:bg-gray-200 hover:shadow-md'
+ : 'bg-gray-100 dark:bg-gray-700 dark:text-gray-300 text-gray-700 hover:bg-gray-200 hover:shadow-md'
}`}
whileHover={{ scale: 1.05, cursor: 'pointer' }}
whileTap={{ scale: 0.95 }}
@@ -392,15 +395,18 @@ const NewsPage: React.FC = () => {
{/* Template Category Note */}
{activeCategory.toLowerCase() === 'template' && (
-
+
-
+
Note: These are developer templates for
post formatting.
@@ -419,7 +425,7 @@ const NewsPage: React.FC = () => {
{activeCategory} {searchTerm && `· "${searchTerm}"`}
-
+
{filteredPosts.length} articles found
{searchTerm && (
{
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
>
-
+
🔍
-
+
No articles found
-
+
{searchTerm
? `No articles match "${searchTerm}" in this category.`
: 'There are no articles in this category yet.'}
@@ -482,7 +488,7 @@ const NewsPage: React.FC = () => {
{visiblePosts.map((post, index) => (
handlePostClick(post.slug)}
@@ -504,7 +510,7 @@ const NewsPage: React.FC = () => {
className="w-full h-full object-cover group-hover:scale-110 transition-transform duration-700"
/>
) : (
-
+
)}
@@ -533,25 +539,25 @@ const NewsPage: React.FC = () => {
>
{post.title}
-
+
{post.excerpt}
{post.date && (
-
+
{post.date}
)}
-
+
Read more
{
return (
-
+
{/* Hero Section */}
@@ -99,10 +99,10 @@ const NotFoundPage: React.FC = () => {
whileInView="visible"
viewport={{ once: true, margin: '-100px' }}
variants={fadeIn}
- className="py-16 bg-[#FFFEF9]"
+ className="py-16 bg-[#FFFEF9] dark:bg-gray-900"
>
-