diff --git a/apps/nextjs/src/app/(dashboard)/project/[id]/(root)/_components/ChartData.tsx b/apps/nextjs/src/app/(dashboard)/project/[id]/(root)/_components/ChartData.tsx new file mode 100644 index 0000000..d9198a5 --- /dev/null +++ b/apps/nextjs/src/app/(dashboard)/project/[id]/(root)/_components/ChartData.tsx @@ -0,0 +1,172 @@ +"use client"; + +import { TrendingUp } from "lucide-react"; +import { + Area, + AreaChart, + Bar, + BarChart, + CartesianGrid, + Cell, + Pie, + PieChart, + XAxis, + YAxis, +} from "recharts"; + +import type { ChartConfig } from "@amaxa/ui/chart"; +import { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from "@amaxa/ui/card"; +import { + ChartContainer, + ChartTooltip, + ChartTooltipContent, +} from "@amaxa/ui/chart"; + +import { api } from "~/trpc/react"; + +const chartConfig = { + tasksFinished: { + label: "Tasks Finished", + color: "hsl(var(--primary))", + }, +} satisfies ChartConfig; + +const COLORS = ["#3498db", "#e74c3c", "#2ecc71", "#f39c12"]; + +export function ProjectDashboard({ id }: { id: string }) { + const [taskData] = api.tasks.getTasksOverTime.useSuspenseQuery({ + projectId: id, + }); + const [priorityData] = api.tasks.getTaskPriorities.useSuspenseQuery({ + projectId: id, + }); + const [statusData] = api.tasks.getTaskStatuses.useSuspenseQuery({ + projectId: id, + }); + + return ( +
+
+ + + Tasks Finished Over Time + + Number of tasks completed each month + + + + + + + + + } /> + + + + + +
+
+
+ Trending up by 10% this month{" "} + +
+
+ {taskData[0]?.month} - {taskData[taskData.length - 1]?.month} +
+
+
+
+
+ + + + Task Priority Distribution + Breakdown of tasks by priority + + + + + + {priorityData.map((entry, index) => ( + + ))} + + } /> + + + + Low, Medium, and High priority tasks + + + + + Task Status Overview + Current status of all tasks + + + + + + + + } /> + + {statusData.map((_, index) => ( + + ))} + + + + + + Todo, In Progress, Done, and Unable to Complete statuses + + +
+
+ ); +} diff --git a/apps/nextjs/src/app/(dashboard)/project/[id]/(root)/page.tsx b/apps/nextjs/src/app/(dashboard)/project/[id]/(root)/page.tsx index 04357fc..7a80838 100644 --- a/apps/nextjs/src/app/(dashboard)/project/[id]/(root)/page.tsx +++ b/apps/nextjs/src/app/(dashboard)/project/[id]/(root)/page.tsx @@ -1,33 +1,4 @@ -"use client"; - -import { TrendingUp } from "lucide-react"; -import { - Area, - AreaChart, - Bar, - BarChart, - CartesianGrid, - Cell, - Pie, - PieChart, - XAxis, - YAxis, -} from "recharts"; - -import type { ChartConfig } from "@amaxa/ui/chart"; -import { - Card, - CardContent, - CardDescription, - CardFooter, - CardHeader, - CardTitle, -} from "@amaxa/ui/card"; -import { - ChartContainer, - ChartTooltip, - ChartTooltipContent, -} from "@amaxa/ui/chart"; +import { ProjectDashboard } from "./_components/ChartData"; interface ProjectPageProps { params: { @@ -35,156 +6,7 @@ interface ProjectPageProps { }; } -const chartConfig = { - tasksFinished: { - label: "Tasks Finished", - color: "hsl(var(--primary))", - }, -} satisfies ChartConfig; - -const COLORS = ["#0088FE", "#00C49F", "#FFBB28", "#FF8042"]; -const getTaskData = () => { - return [ - { month: "January", tasksFinished: 18 }, - { month: "February", tasksFinished: 30 }, - { month: "March", tasksFinished: 23 }, - { month: "April", tasksFinished: 7 }, - { month: "May", tasksFinished: 20 }, - { month: "June", tasksFinished: 21 }, - ]; -}; - -const getPriorityData = () => { - return [ - { priority: "Low", count: 15 }, - { priority: "Medium", count: 30 }, - { priority: "High", count: 20 }, - ]; -}; - -const getStatusData = () => { - return [ - { status: "todo", count: 10 }, - { status: "in-progress", count: 15 }, - { status: "done", count: 40 }, - { status: "unable-to-complete", count: 5 }, - ]; -}; - -export default function HomePage({ params }: ProjectPageProps) { - const { id } = params; - const taskData = getTaskData(); - const priorityData = getPriorityData(); - const statusData = getStatusData(); - return ( -
-
- - - Tasks Finished Over Time project {id} - - Number of tasks completed each month - - - - - - - - - } /> - - - - - -
-
-
- Trending up by 10% this month{" "} - -
-
- January - June 2024 -
-
-
-
-
- - - - Task Priority Distribution - Breakdown of tasks by priority - - - - - - {priorityData.map((entry, index) => ( - - ))} - - } /> - - - - Low, Medium, and High priority tasks - - - - - Task Status Overview - Current status of all tasks - - - - - - - - } /> - - - - - - Todo, In Progress, Done, and Unable to Complete statuses - - -
-
- ); +export default async function HomePage({ params }: ProjectPageProps) { + const id = params.id; + return ; } diff --git a/apps/nextjs/src/app/(home)/guides/_components/popover.tsx b/apps/nextjs/src/app/(home)/guides/_components/popover.tsx new file mode 100644 index 0000000..3958dc4 --- /dev/null +++ b/apps/nextjs/src/app/(home)/guides/_components/popover.tsx @@ -0,0 +1,58 @@ +"use client"; + +import type { Dispatch, ReactNode, SetStateAction } from "react"; +import * as PopoverPrimitive from "@radix-ui/react-popover"; +import { Drawer } from "vaul"; + +export default function Popover({ + children, + content, + align = "center", + openPopover, + setOpenPopover, + mobileOnly, +}: { + children: ReactNode; + content: ReactNode | string; + align?: "center" | "start" | "end"; + openPopover: boolean; + setOpenPopover: Dispatch>; + mobileOnly?: boolean; +}) { + if (mobileOnly) { + return ( + +
{children}
+ + + +
+
+
+
+ {content} +
+ + + + + ); + } + + return ( + + + {children} + + + + {content} + + + + ); +} diff --git a/apps/nextjs/src/app/(home)/guides/_components/tabs.tsx b/apps/nextjs/src/app/(home)/guides/_components/tabs.tsx index bd30973..bf359e3 100644 --- a/apps/nextjs/src/app/(home)/guides/_components/tabs.tsx +++ b/apps/nextjs/src/app/(home)/guides/_components/tabs.tsx @@ -1,14 +1,79 @@ +"use client"; + import React from "react"; +import Link from "next/link"; +import { usePathname } from "next/navigation"; +import { motion } from "framer-motion"; +import { Check } from "lucide-react"; -import { Tabs, TabsTrigger } from "~/components/route-tabs"; +import { cn } from "@amaxa/ui"; +//TODO: memoize export function GuidesTabs() { + const pathname = usePathname(); return ( -
- - Action Guides - Fundraising Guides - -
+ ); } + +const CategoryLink = ({ + title, + href, + active, + mobile, + setOpenPopover, +}: { + title: string; + href: string; + active?: boolean; + mobile?: boolean; + setOpenPopover?: (open: boolean) => void; +}) => { + if (mobile) { + return ( + setOpenPopover(false), + })} + className="flex w-full items-center justify-between rounded-md p-2 transition-colors hover:bg-muted active:bg-muted/80" + > +

{title}

+ {active && } + + ); + } + return ( + +
+ {title} +
+ {active && ( + + )} + + ); +}; diff --git a/apps/nextjs/src/app/(home)/guides/action-guides/_components/GuideCard.tsx b/apps/nextjs/src/app/(home)/guides/action-guides/_components/GuideCard.tsx index 3c1b535..99426c9 100644 --- a/apps/nextjs/src/app/(home)/guides/action-guides/_components/GuideCard.tsx +++ b/apps/nextjs/src/app/(home)/guides/action-guides/_components/GuideCard.tsx @@ -25,17 +25,17 @@ export default function Guides() { const actionGuides = [ { id: 1, - title: "Test Action Guide 1", + title: "How to Start a Fundraiser", description: - "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat.", + "Fundraising is a great way to raise money for your cause. Here are some tips to get you started.", tags: ["Fundraising"], embedId: "Opening-Guide-Copy-7acb2eb37957405694b19afa43ae7b9c", }, { id: 2, - title: "Test Action Guide 2", + title: "How to Plan an Event", description: - "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat.", + "Planning an event can be a lot of work, but it can also be a lot of fun. Here are some tips to help you get started.", tags: ["Impact Outreach"], embedId: "Opening-Guide-Copy-7acb2eb37957405694b19afa43ae7b9c", }, @@ -93,7 +93,7 @@ export default function Guides() {
{filteredGuides.map((guide) => ( - + {guide.title} diff --git a/apps/nextjs/src/app/(home)/guides/layout.tsx b/apps/nextjs/src/app/(home)/guides/layout.tsx index 047a623..440cb81 100644 --- a/apps/nextjs/src/app/(home)/guides/layout.tsx +++ b/apps/nextjs/src/app/(home)/guides/layout.tsx @@ -5,7 +5,9 @@ import { GuidesTabs } from "./_components/tabs"; export default function Layout({ children }: { children: React.ReactNode }) { return (
- +
+ +
{children}
); diff --git a/apps/nextjs/src/app/_components/theme-switch.tsx b/apps/nextjs/src/app/_components/theme-switch.tsx new file mode 100644 index 0000000..13f6dbd --- /dev/null +++ b/apps/nextjs/src/app/_components/theme-switch.tsx @@ -0,0 +1,60 @@ +"use client"; + +import { Monitor, Moon, Sun } from "lucide-react"; +import { useTheme } from "next-themes"; + +import { + Select, + SelectContent, + SelectGroup, + SelectItem, + SelectTrigger, + SelectValue, +} from "@amaxa/ui/select"; + +type Theme = "dark" | "system" | "light"; + +interface Props { + currentTheme?: Theme; +} + +const ThemeIcon = ({ currentTheme }: Props) => { + switch (currentTheme) { + case "dark": + return ; + case "system": + return ; + default: + return ; + } +}; + +export const ThemeSwitch = () => { + const { theme, setTheme, themes } = useTheme(); + + return ( +
+ + +
+ +
+
+ ); +}; diff --git a/apps/nextjs/src/app/layout.tsx b/apps/nextjs/src/app/layout.tsx index d41b02e..a1b2820 100644 --- a/apps/nextjs/src/app/layout.tsx +++ b/apps/nextjs/src/app/layout.tsx @@ -3,7 +3,7 @@ import { GeistMono } from "geist/font/mono"; import { GeistSans } from "geist/font/sans"; import { cn } from "@amaxa/ui"; -import { ThemeProvider } from "@amaxa/ui/theme"; +import { ThemeProvider, ThemeToggle } from "@amaxa/ui/theme"; import { Toaster } from "@amaxa/ui/toast"; import { TRPCReactProvider } from "~/trpc/react"; @@ -46,11 +46,15 @@ export default function RootLayout(props: { children: React.ReactNode }) { GeistMono.variable, )} > - + {props.children} + +
+ +
diff --git a/apps/website/.content-collections/cache/blogpost/empowerment_through_education/28657230b8cf547f1acb7a9b04dd921fda65a3eac2d852bfaf8b254c695519fd.cache b/apps/website/.content-collections/cache/blogpost/empowerment_through_education/28657230b8cf547f1acb7a9b04dd921fda65a3eac2d852bfaf8b254c695519fd.cache new file mode 100644 index 0000000..c9321b5 --- /dev/null +++ b/apps/website/.content-collections/cache/blogpost/empowerment_through_education/28657230b8cf547f1acb7a9b04dd921fda65a3eac2d852bfaf8b254c695519fd.cache @@ -0,0 +1 @@ +"var Component=(()=>{var p=Object.create;var r=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var g=Object.getPrototypeOf,f=Object.prototype.hasOwnProperty;var y=(i,e)=>()=>(e||i((e={exports:{}}).exports,e),e.exports),v=(i,e)=>{for(var t in e)r(i,t,{get:e[t],enumerable:!0})},o=(i,e,t,s)=>{if(e&&typeof e==\"object\"||typeof e==\"function\")for(let a of m(e))!f.call(i,a)&&a!==t&&r(i,a,{get:()=>e[a],enumerable:!(s=u(e,a))||s.enumerable});return i};var b=(i,e,t)=>(t=i!=null?p(g(i)):{},o(e||!i||!i.__esModule?r(t,\"default\",{value:i,enumerable:!0}):t,i)),x=i=>o(r({},\"__esModule\",{value:!0}),i);var h=y((P,l)=>{l.exports=_jsx_runtime});var w={};v(w,{default:()=>c});var n=b(h());function d(i){let e={a:\"a\",h1:\"h1\",h2:\"h2\",h3:\"h3\",li:\"li\",p:\"p\",span:\"span\",strong:\"strong\",ul:\"ul\",...i.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.h1,{id:\"\"}),`\n`,(0,n.jsxs)(e.h1,{id:\"empowerment-through-education-an-impactful-project-to-help-palestine\",children:[(0,n.jsx)(e.a,{\"aria-hidden\":\"true\",tabIndex:\"-1\",href:\"#empowerment-through-education-an-impactful-project-to-help-palestine\",children:(0,n.jsx)(e.span,{className:\"icon icon-link\"})}),\"Empowerment Through Education: An Impactful Project to Help Palestine\"]}),`\n`,(0,n.jsx)(e.p,{children:\"The Palestinian-Israeli conflict is more than a conflict of nations- it is a story of innocent people grappling with the harsh realities of war and displacement. Civilians in Palestine are being killed, displaced, and deprived of their basic rights.\"}),`\n`,(0,n.jsx)(e.p,{children:\"One of those rights that was seized from them is the right to education. Students and teachers risk tear gas, raids, armed clashes, arrest, and intimidation just by going to school.\"}),`\n`,(0,n.jsx)(e.p,{children:\"But amidst this turmoil there is a glimmer of hope. The ISNAD Community Education Center gives students the opportunity to learn by doing through field trips, summer camps, and extracurricular activities. This gives students a place where they can find respite and learn.\"}),`\n`,(0,n.jsxs)(e.h2,{id:\"the-wars-impact-on-education\",children:[(0,n.jsx)(e.a,{\"aria-hidden\":\"true\",tabIndex:\"-1\",href:\"#the-wars-impact-on-education\",children:(0,n.jsx)(e.span,{className:\"icon icon-link\"})}),(0,n.jsx)(e.strong,{children:\"The War\\u2019s Impact On Education\"})]}),`\n`,(0,n.jsx)(e.p,{children:\"Beyond the staggering statistics of attacks on Palestinian people lies an often-overlooked casualty\\u2014education. When Palestinians struggle everyday to survive, education is easily overlooked. The occupation\\u2019s ripple effects extend into the very fabric of how students and teachers engage with education.\"}),`\n`,(0,n.jsx)(e.p,{children:\"Many times students and teachers have to choose between safety and education. Between 2015 and 2019, over 4,000 Palestinian students and educators were reportedly harmed by attacks \\u2013 the highest number of worldwide attacks during the period (GCPEA). These attacks, all occurring near schools, include armed clashes, the use of tear gas, raids, checkpoints near schools, settler violence, and arrest and intimidation of children and teachers.\"}),`\n`,(0,n.jsxs)(e.h3,{id:\"the-occupations-impact-on-students\",children:[(0,n.jsx)(e.a,{\"aria-hidden\":\"true\",tabIndex:\"-1\",href:\"#the-occupations-impact-on-students\",children:(0,n.jsx)(e.span,{className:\"icon icon-link\"})}),\"The Occupation\\u2019s Impact on Students\"]}),`\n`,(0,n.jsx)(e.p,{children:\"Arrests, demolitions, and violence are all horrifically traumatizing experiences that Palestinians are forced to endure. When students regularly regulate trauma their minds are somewhere else instead of the classroom. Persistent memories of incidents can impede the students\\u2019 ability to focus on the content and engage in the classroom.\"}),`\n`,(0,n.jsx)(e.p,{children:\"For students who arrive at school in spite of Israeli-imposed obstacles, they encounter an ever-increasing ratio of students to teachers due to students only being able to attend their local schools. Trauma, coupled with a large student to teacher ratio, makes school an overwhelming, not fun, experience for students.\"}),`\n`,(0,n.jsxs)(e.h3,{id:\"the-occupations-impact-on-teachers\",children:[(0,n.jsx)(e.a,{\"aria-hidden\":\"true\",tabIndex:\"-1\",href:\"#the-occupations-impact-on-teachers\",children:(0,n.jsx)(e.span,{className:\"icon icon-link\"})}),\"The Occupations Impact on Teachers\"]}),`\n`,(0,n.jsx)(e.p,{children:\"This barrage of challenges makes teaching distracted students a challenge. Teachers have to focus on teaching the bare minimum content of the textbook to simply get through a course. They have limited opportunities to use a variety of methods, such as discussion, collaborative work, and project-based activities.\"}),`\n`,(0,n.jsx)(e.p,{children:\"These are the activities that make school fun and the material memorable. By only teaching by the textbook teachers can feel demotivated to teach, which can lead to poorer teaching experiences.\"}),`\n`,(0,n.jsxs)(e.h2,{id:\"the-need-for-experiential-learning-for-palestinian-students\",children:[(0,n.jsx)(e.a,{\"aria-hidden\":\"true\",tabIndex:\"-1\",href:\"#the-need-for-experiential-learning-for-palestinian-students\",children:(0,n.jsx)(e.span,{className:\"icon icon-link\"})}),\"The Need For Experiential Learning For Palestinian Students\"]}),`\n`,(0,n.jsx)(e.p,{children:\"Students remember best when they learn by doing, also known as experiential learning. Field trips, discussions, projects, lab experiments, volunteering, and internships all create experiences students will forever remember, hence the name experiential learning.\"}),`\n`,(0,n.jsx)(e.p,{children:\"Students develop leadership, confidence, cultural awareness, decision-making, organization, civic engagement, and more essential life skills when they engage in experiential learning. Experiential learning not only helps the students remember school material, but teaches them essential life skills.\"}),`\n`,(0,n.jsxs)(e.h3,{id:\"isnad-provides-experimental-learning-opportunities\",children:[(0,n.jsx)(e.a,{\"aria-hidden\":\"true\",tabIndex:\"-1\",href:\"#isnad-provides-experimental-learning-opportunities\",children:(0,n.jsx)(e.span,{className:\"icon icon-link\"})}),\"ISNAD provides experimental learning opportunities\"]}),`\n`,(0,n.jsx)(e.p,{children:\"Amidst all of the struggles of education in Palestine there\\u2019s an organization providing much needed experiential learning opportunities for students. ISNAD Community Education Center in Dahria enhances youth engagement by organizing voluntary initiatives, field trips, summer camps, and courses in languages, arts, and more not available in local schools. This\"}),`\n`,(0,n.jsxs)(e.h3,{id:\"in-person-experiential-learning-palestine-project\",children:[(0,n.jsx)(e.a,{\"aria-hidden\":\"true\",tabIndex:\"-1\",href:\"#in-person-experiential-learning-palestine-project\",children:(0,n.jsx)(e.span,{className:\"icon icon-link\"})}),\"In-Person Experiential Learning Palestine Project\"]}),`\n`,(0,n.jsx)(e.p,{children:\"At ISNAD, qualified teachers provide a variety of learning opportunities for students. Students expand their educational abilities through classes in areas like languages, social media, planning, and arts. Students also participate in various volunteer projects and interventions in their local community.\"}),`\n`,(0,n.jsx)(e.p,{children:\"ISNAD has organized more than 15 field trips since its founding just over three years ago. On these trips students can feel they are explorers, free to journey to an unknown site and take in all it has to teach them. For many, due to Israeli restrictions on movement, this is a feeling they have never experienced before.\"}),`\n`,(0,n.jsxs)(e.h3,{id:\"online-experiential-learning-project-in-palestine\",children:[(0,n.jsx)(e.a,{\"aria-hidden\":\"true\",tabIndex:\"-1\",href:\"#online-experiential-learning-project-in-palestine\",children:(0,n.jsx)(e.span,{className:\"icon icon-link\"})}),\"Online Experiential Learning Project in Palestine\"]}),`\n`,(0,n.jsx)(e.p,{children:\"Checkpoints and unreasonable permit regulations restrict students from meeting with others from outside their cities. At the same time, the occupation makes it very difficult for international visitors to enter Palestine. As a result Palestinians have very few opportunities to meet, conversate with, and learn from people from outside Palestine.\"}),`\n`,(0,n.jsx)(e.p,{children:\"Through INSAD, Palestinians practice their English with volunteers from all over the world. They engage in conversations about food, music, film, pop culture, dress, traditions, and holidays. Through these activities English shifts from a bore to a lively exchange of ideas and experiences\"}),`\n`,(0,n.jsxs)(e.h2,{id:\"how-do-i-help-palestine\",children:[(0,n.jsx)(e.a,{\"aria-hidden\":\"true\",tabIndex:\"-1\",href:\"#how-do-i-help-palestine\",children:(0,n.jsx)(e.span,{className:\"icon icon-link\"})}),\"How Do I Help Palestine?\"]}),`\n`,(0,n.jsx)(e.p,{children:\"Palestine is hurting. Innocent people cannot live the lives they want to live. Though you cannot end the situation you can still aid those in need through various organizations.\"}),`\n`,(0,n.jsxs)(e.h3,{id:\"volunteer-with-amaxa\",children:[(0,n.jsx)(e.a,{\"aria-hidden\":\"true\",tabIndex:\"-1\",href:\"#volunteer-with-amaxa\",children:(0,n.jsx)(e.span,{className:\"icon icon-link\"})}),\"Volunteer With Amaxa\"]}),`\n`,(0,n.jsx)(e.p,{children:\"You can aid INSAD directly through Amaxa. When you join Amaxa you and a team of other volunteers (led by a trained coach) will have the opportunity to organize online experiential learning events for students.\"}),`\n`,(0,n.jsx)(e.p,{children:\"Here\\u2019s some of the ways Amaxa volunteers have helped INSAD:\"}),`\n`,(0,n.jsxs)(e.ul,{children:[`\n`,(0,n.jsx)(e.li,{children:\"Created a free, interactive educational website for Palestinian students.\"}),`\n`,(0,n.jsx)(e.li,{children:\"Mobilized volunteers and academics to contribute to the project by pre-recording (Insert number here) lessons.\"}),`\n`,(0,n.jsx)(e.li,{children:\"Provided students with the opportunity to interact with different subjects and materials.\"}),`\n`]}),`\n`,(0,n.jsx)(e.p,{children:\"Interested? Learn more here!\"}),`\n`,(0,n.jsxs)(e.h3,{id:\"anera\",children:[(0,n.jsx)(e.a,{\"aria-hidden\":\"true\",tabIndex:\"-1\",href:\"#anera\",children:(0,n.jsx)(e.span,{className:\"icon icon-link\"})}),\"ANERA\"]}),`\n`,(0,n.jsx)(e.p,{children:\"ANERA is another great way to help Palestine. They uplift the lives of refugees in the middle east through humanitarian and emergency relief. In times of peace they provide education and economic development programs.\"}),`\n`,(0,n.jsx)(e.p,{children:\"In Palestine specifically they have built nearly 450 infrastructure projects, gave 187,770 people access to water, and have completed 53 overall projects that have improved the lives of 421,921 Palestinians.\"}),`\n`,(0,n.jsx)(e.p,{children:\"You can directly benefit Palestinians by donating to ANERA.\"}),`\n`,(0,n.jsxs)(e.h3,{id:\"palestinian-childrens-relief-fund\",children:[(0,n.jsx)(e.a,{\"aria-hidden\":\"true\",tabIndex:\"-1\",href:\"#palestinian-childrens-relief-fund\",children:(0,n.jsx)(e.span,{className:\"icon icon-link\"})}),\"Palestinian Children\\u2019s Relief Fund\"]}),`\n`,(0,n.jsx)(e.p,{children:\"Another great way to help Palestine is donating to the Palestinian Children\\u2019s Relief Fund. They impact the lives of injured and ill children in Palestine by providing much-needed medical care.\"}),`\n`,(0,n.jsx)(e.p,{children:\"They\\u2019ve sent 2,000 affected children abroad for free medical care, sent thousands of international doctors and nurses to provide tens of thousands of children free medical care in Palestine, and provided tens of thousands of children humanitarian aid and support they can\\u2019t normally get.\"}),`\n`,(0,n.jsxs)(e.h3,{id:\"gaza-sky-geeks\",children:[(0,n.jsx)(e.a,{\"aria-hidden\":\"true\",tabIndex:\"-1\",href:\"#gaza-sky-geeks\",children:(0,n.jsx)(e.span,{className:\"icon icon-link\"})}),\"Gaza Sky Geeks\"]}),`\n`,(0,n.jsx)(e.p,{children:\"Gaza Sky Geeks provides 4 ways to help Palestine: hiring Palestinians, volunteering skills, sponsoring, and donating. They focus on giving Palestinians world-class resources to work in tech.\"}),`\n`,(0,n.jsxs)(e.h3,{id:\"weather-its-your-money-or-time-you-want-to-donate-there-are-plentiful-opportunities-to-help-those-in-need-in-palestine\",children:[(0,n.jsx)(e.a,{\"aria-hidden\":\"true\",tabIndex:\"-1\",href:\"#weather-its-your-money-or-time-you-want-to-donate-there-are-plentiful-opportunities-to-help-those-in-need-in-palestine\",children:(0,n.jsx)(e.span,{className:\"icon icon-link\"})}),\"Weather it\\u2019s your money or time you want to donate, there are plentiful opportunities to help those in need in Palestine\"]})]})}function c(i={}){let{wrapper:e}=i.components||{};return e?(0,n.jsx)(e,{...i,children:(0,n.jsx)(d,{...i})}):d(i)}return x(w);})();\n;return Component;" \ No newline at end of file diff --git a/apps/website/.content-collections/cache/content-collection-config.mjs b/apps/website/.content-collections/cache/content-collection-config.mjs new file mode 100644 index 0000000..e2780c6 --- /dev/null +++ b/apps/website/.content-collections/cache/content-collection-config.mjs @@ -0,0 +1,276 @@ +// content-collections.ts +import { defineCollection, defineConfig } from "@content-collections/core"; +import { compileMDX } from "@content-collections/mdx"; +import { remarkGfm } from "fumadocs-core/mdx-plugins"; +import GithubSlugger from "github-slugger"; +import rehypeAutolinkHeadings from "rehype-autolink-headings"; +import rehypeSlug from "rehype-slug"; + +var computedFields = (type) => ({ + slug: (document) => { + const slugger = new GithubSlugger(); + return document.slug || slugger.slug(document.title); + }, + tableOfContents: (document) => { + const content = + document.content || document.body?.raw || document.mdx?.code || ""; + const headings = content.match(/^##\s(.+)$/gm); + const slugger = new GithubSlugger(); + return ( + headings?.map((heading) => { + const title = heading.replace(/^##\s/, ""); + return { + title, + slug: slugger.slug(title), + }; + }) || [] + ); + }, + images: (document) => { + if (!document.body?.raw) return []; + return ( + document.body.raw.match(/(?<=]*\bsrc=")[^"]+(?="[^>]*\/>)/g) || + [] + ); + }, + tweetIds: (document) => { + if (!document.body?.raw) return []; + const tweetMatches = document.body.raw.match(//g); + return tweetMatches?.map((tweet) => tweet.match(/[0-9]+/g)[0]) || []; + }, + githubRepos: (document) => { + if (!document.body?.raw) return []; + return ( + document.body.raw.match( + /(?<=]*\burl=")[^"]+(?="[^>]*\/>)/g, + ) || [] + ); + }, +}); +var BlogPost = defineCollection({ + name: "BlogPost", + directory: "src/content/blog", + include: "*.mdx", + schema: (z) => ({ + title: z.string(), + categories: z.array(z.enum(["company", "eng"])).default(["company"]), + publishedAt: z.string().regex(/^\d{4}-\d{2}-\d{2}$/), + featured: z.boolean().default(false), + image: z.string(), + images: z.array(z.string()).optional(), + seoTitle: z.string().optional(), + seoDescription: z.string().optional(), + author: z.string(), + summary: z.string(), + related: z.array(z.string()).optional(), + githubRepos: z.array(z.string()).optional(), + tweetIds: z.array(z.string()).optional(), + slug: z.string().optional(), + }), + transform: async (document, context) => { + try { + const mdx = await compileMDX(context, document, { + rehypePlugins: [rehypeSlug, rehypeAutolinkHeadings], + remarkPlugins: [remarkGfm], + }); + console.log("MDX compilation successful for:", document.title); + const computed = computedFields("blog"); + return { + ...document, + slug: computed.slug(document), + mdx, + related: document.related || [], + tableOfContents: computed.tableOfContents({ + ...document, + body: { raw: mdx.raw }, + }), + images: computed.images({ ...document, body: { raw: mdx.raw } }), + tweetIds: computed.tweetIds({ ...document, body: { raw: mdx.raw } }), + githubRepos: computed.githubRepos({ + ...document, + body: { raw: mdx.raw }, + }), + }; + } catch (error) { + console.error("Error compiling MDX for:", document.title, error); + console.error("Error details:", error.stack); + throw error; + } + }, +}); +var ChangelogPost = defineCollection({ + name: "ChangelogPost", + directory: "src/content/changelog", + include: "*.mdx", + schema: (z) => ({ + title: z.string(), + publishedAt: z.string().regex(/^\d{4}-\d{2}-\d{2}$/), + summary: z.string(), + image: z.string(), + author: z.string(), + slug: z.string().optional(), + }), + transform: async (document, context) => { + try { + const mdx = await compileMDX(context, document, { + rehypePlugins: [rehypeSlug, rehypeAutolinkHeadings], + remarkPlugins: [remarkGfm], + }); + console.log("MDX compilation successful for:", document.title); + const computed = computedFields("changelog"); + return { + ...document, + slug: computed.slug(document), + mdx, + tableOfContents: computed.tableOfContents({ + ...document, + body: { raw: mdx.raw }, + }), + images: computed.images({ ...document, body: { raw: mdx.raw } }), + tweetIds: computed.tweetIds({ ...document, body: { raw: mdx.raw } }), + githubRepos: computed.githubRepos({ + ...document, + body: { raw: mdx.raw }, + }), + }; + } catch (error) { + console.error("Error compiling MDX for:", document.title, error); + console.error("Error details:", error.stack); + throw error; + } + }, +}); +var HelpPost = defineCollection({ + name: "HelpPost", + directory: "src/content/help", + include: "*.mdx", + schema: (z) => ({ + title: z.string(), + updatedAt: z.string(), + summary: z.string(), + author: z.string(), + categories: z.array(z.enum(["", "", "", "", ""])).default([""]), + related: z.array(z.string()).optional(), + excludeHeadingsFromSearch: z.boolean().optional(), + slug: z.string().optional(), + }), + transform: async (document, context) => { + try { + const mdx = await compileMDX(context, document, { + rehypePlugins: [rehypeSlug, rehypeAutolinkHeadings], + remarkPlugins: [remarkGfm], + }); + const computed = computedFields("help"); + const result = { + ...document, + slug: computed.slug(document), + mdx, + tableOfContents: computed.tableOfContents(document), + images: computed.images(document), + tweetIds: computed.tweetIds(document), + githubRepos: computed.githubRepos(document), + }; + return result; + } catch (error) { + console.error("Error compiling MDX for:", document.title, error); + console.error("Error details:", error.stack); + throw error; + } + }, +}); +var LegalPost = defineCollection({ + name: "LegalPost", + directory: "src/content/legal", + include: "*.mdx", + schema: (z) => ({ + title: z.string(), + updatedAt: z.string(), + slug: z.string().optional(), + }), + transform: async (document, context) => { + try { + const mdx = await compileMDX(context, document, { + rehypePlugins: [rehypeSlug, rehypeAutolinkHeadings], + remarkPlugins: [remarkGfm], + }); + console.log("MDX compilation successful for:", document.title); + const computed = computedFields("legal"); + return { + ...document, + slug: computed.slug(document), + mdx, + tableOfContents: computed.tableOfContents({ + ...document, + body: { raw: mdx.raw }, + }), + images: computed.images({ ...document, body: { raw: mdx.raw } }), + tweetIds: computed.tweetIds({ ...document, body: { raw: mdx.raw } }), + githubRepos: computed.githubRepos({ + ...document, + body: { raw: mdx.raw }, + }), + }; + } catch (error) { + console.error("Error compiling MDX for:", document.title, error); + console.error("Error details:", error.stack); + throw error; + } + }, +}); +var IntegrationsPost = defineCollection({ + name: "IntegrationsPost", + directory: "src/content/integrations", + include: "*.mdx", + schema: (z) => ({ + title: z.string(), + publishedAt: z.string(), + summary: z.string(), + image: z.string(), + company: z.string(), + companyLogo: z.string(), + companyUrl: z.string(), + companyDescription: z.string(), + integrationType: z.string(), + integrationDescription: z.string(), + compatibility: z.string(), + slug: z.string().optional(), + }), + transform: async (document, context) => { + try { + const mdx = await compileMDX(context, document, { + rehypePlugins: [rehypeSlug, rehypeAutolinkHeadings], + remarkPlugins: [remarkGfm], + }); + console.log("MDX compilation successful for:", document.title); + const computed = computedFields("integrations"); + return { + ...document, + slug: computed.slug(document), + mdx, + tableOfContents: computed.tableOfContents({ + ...document, + body: { raw: mdx.raw }, + }), + images: computed.images({ ...document, body: { raw: mdx.raw } }), + tweetIds: computed.tweetIds({ ...document, body: { raw: mdx.raw } }), + githubRepos: computed.githubRepos({ + ...document, + body: { raw: mdx.raw }, + }), + }; + } catch (error) { + console.error("Error compiling MDX for:", document.title, error); + console.error("Error details:", error.stack); + throw error; + } + }, +}); +var content_collections_default = defineConfig({ + collections: [BlogPost, ChangelogPost, HelpPost, LegalPost, IntegrationsPost], +}); +export { + HelpPost, + IntegrationsPost, + LegalPost, + content_collections_default as default, +}; diff --git a/apps/website/.content-collections/cache/mapping.json b/apps/website/.content-collections/cache/mapping.json new file mode 100644 index 0000000..9744494 --- /dev/null +++ b/apps/website/.content-collections/cache/mapping.json @@ -0,0 +1,7 @@ +{ + "BlogPost": { + "empowerment-through-education": [ + "28657230b8cf547f1acb7a9b04dd921fda65a3eac2d852bfaf8b254c695519fd" + ] + } +} diff --git a/apps/website/.content-collections/generated/allBlogPosts.js b/apps/website/.content-collections/generated/allBlogPosts.js new file mode 100644 index 0000000..d9375a1 --- /dev/null +++ b/apps/website/.content-collections/generated/allBlogPosts.js @@ -0,0 +1,42 @@ +export default [ + { + content: + "#\n\n# Empowerment Through Education: An Impactful Project to Help Palestine\n\nThe Palestinian-Israeli conflict is more than a conflict of nations- it is a story of innocent people grappling with the harsh realities of war and displacement. Civilians in Palestine are being killed, displaced, and deprived of their basic rights.\n\nOne of those rights that was seized from them is the right to education. Students and teachers risk tear gas, raids, armed clashes, arrest, and intimidation just by going to school.\n\nBut amidst this turmoil there is a glimmer of hope. The ISNAD Community Education Center gives students the opportunity to learn by doing through field trips, summer camps, and extracurricular activities. This gives students a place where they can find respite and learn.\n\n## **The War’s Impact On Education**\n\nBeyond the staggering statistics of attacks on Palestinian people lies an often-overlooked casualty—education. When Palestinians struggle everyday to survive, education is easily overlooked. The occupation’s ripple effects extend into the very fabric of how students and teachers engage with education.\n\nMany times students and teachers have to choose between safety and education. Between 2015 and 2019, over 4,000 Palestinian students and educators were reportedly harmed by attacks – the highest number of worldwide attacks during the period (GCPEA). These attacks, all occurring near schools, include armed clashes, the use of tear gas, raids, checkpoints near schools, settler violence, and arrest and intimidation of children and teachers.\n\n### The Occupation’s Impact on Students\n\nArrests, demolitions, and violence are all horrifically traumatizing experiences that Palestinians are forced to endure. When students regularly regulate trauma their minds are somewhere else instead of the classroom. Persistent memories of incidents can impede the students’ ability to focus on the content and engage in the classroom.\n\nFor students who arrive at school in spite of Israeli-imposed obstacles, they encounter an ever-increasing ratio of students to teachers due to students only being able to attend their local schools. Trauma, coupled with a large student to teacher ratio, makes school an overwhelming, not fun, experience for students.\n\n### The Occupations Impact on Teachers\n\nThis barrage of challenges makes teaching distracted students a challenge. Teachers have to focus on teaching the bare minimum content of the textbook to simply get through a course. They have limited opportunities to use a variety of methods, such as discussion, collaborative work, and project-based activities.\n\nThese are the activities that make school fun and the material memorable. By only teaching by the textbook teachers can feel demotivated to teach, which can lead to poorer teaching experiences.\n\n## The Need For Experiential Learning For Palestinian Students\n\nStudents remember best when they learn by doing, also known as experiential learning. Field trips, discussions, projects, lab experiments, volunteering, and internships all create experiences students will forever remember, hence the name experiential learning.\n\nStudents develop leadership, confidence, cultural awareness, decision-making, organization, civic engagement, and more essential life skills when they engage in experiential learning. Experiential learning not only helps the students remember school material, but teaches them essential life skills.\n\n### ISNAD provides experimental learning opportunities\n\nAmidst all of the struggles of education in Palestine there’s an organization providing much needed experiential learning opportunities for students. ISNAD Community Education Center in Dahria enhances youth engagement by organizing voluntary initiatives, field trips, summer camps, and courses in languages, arts, and more not available in local schools. This\n\n### In-Person Experiential Learning Palestine Project\n\nAt ISNAD, qualified teachers provide a variety of learning opportunities for students. Students expand their educational abilities through classes in areas like languages, social media, planning, and arts. Students also participate in various volunteer projects and interventions in their local community.\n\nISNAD has organized more than 15 field trips since its founding just over three years ago. On these trips students can feel they are explorers, free to journey to an unknown site and take in all it has to teach them. For many, due to Israeli restrictions on movement, this is a feeling they have never experienced before.\n\n### Online Experiential Learning Project in Palestine\n\nCheckpoints and unreasonable permit regulations restrict students from meeting with others from outside their cities. At the same time, the occupation makes it very difficult for international visitors to enter Palestine. As a result Palestinians have very few opportunities to meet, conversate with, and learn from people from outside Palestine.\n\nThrough INSAD, Palestinians practice their English with volunteers from all over the world. They engage in conversations about food, music, film, pop culture, dress, traditions, and holidays. Through these activities English shifts from a bore to a lively exchange of ideas and experiences\n\n## How Do I Help Palestine?\n\nPalestine is hurting. Innocent people cannot live the lives they want to live. Though you cannot end the situation you can still aid those in need through various organizations.\n\n### Volunteer With Amaxa\n\nYou can aid INSAD directly through Amaxa. When you join Amaxa you and a team of other volunteers (led by a trained coach) will have the opportunity to organize online experiential learning events for students.\n\nHere’s some of the ways Amaxa volunteers have helped INSAD:\n\n- Created a free, interactive educational website for Palestinian students.\n- Mobilized volunteers and academics to contribute to the project by pre-recording (Insert number here) lessons.\n- Provided students with the opportunity to interact with different subjects and materials.\n\nInterested? Learn more here!\n\n### ANERA\n\nANERA is another great way to help Palestine. They uplift the lives of refugees in the middle east through humanitarian and emergency relief. In times of peace they provide education and economic development programs.\n\nIn Palestine specifically they have built nearly 450 infrastructure projects, gave 187,770 people access to water, and have completed 53 overall projects that have improved the lives of 421,921 Palestinians.\n\nYou can directly benefit Palestinians by donating to ANERA.\n\n### Palestinian Children’s Relief Fund\n\nAnother great way to help Palestine is donating to the Palestinian Children’s Relief Fund. They impact the lives of injured and ill children in Palestine by providing much-needed medical care.\n\nThey’ve sent 2,000 affected children abroad for free medical care, sent thousands of international doctors and nurses to provide tens of thousands of children free medical care in Palestine, and provided tens of thousands of children humanitarian aid and support they can’t normally get.\n\n### Gaza Sky Geeks\n\nGaza Sky Geeks provides 4 ways to help Palestine: hiring Palestinians, volunteering skills, sponsoring, and donating. They focus on giving Palestinians world-class resources to work in tech.\n\n### Weather it’s your money or time you want to donate, there are plentiful opportunities to help those in need in Palestine", + title: + "Empowerment Through Education: An Impactful Project to Help Palestine", + categories: ["company"], + publishedAt: "2024-08-24", + featured: false, + image: "/gazachamps.png", + author: "Heather", + summary: + "Explore the challenges facing Palestinian education and learn how organizations like ISNAD are empowering students through experiential learning. Discover ways to help.", + related: ["related"], + slug: "empowerment-through-education", + _meta: { + filePath: "empowerment-through-education.mdx", + fileName: "empowerment-through-education.mdx", + directory: ".", + extension: "mdx", + path: "empowerment-through-education", + }, + mdx: 'var Component=(()=>{var p=Object.create;var r=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var g=Object.getPrototypeOf,f=Object.prototype.hasOwnProperty;var y=(i,e)=>()=>(e||i((e={exports:{}}).exports,e),e.exports),v=(i,e)=>{for(var t in e)r(i,t,{get:e[t],enumerable:!0})},o=(i,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of m(e))!f.call(i,a)&&a!==t&&r(i,a,{get:()=>e[a],enumerable:!(s=u(e,a))||s.enumerable});return i};var b=(i,e,t)=>(t=i!=null?p(g(i)):{},o(e||!i||!i.__esModule?r(t,"default",{value:i,enumerable:!0}):t,i)),x=i=>o(r({},"__esModule",{value:!0}),i);var h=y((P,l)=>{l.exports=_jsx_runtime});var w={};v(w,{default:()=>c});var n=b(h());function d(i){let e={a:"a",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",span:"span",strong:"strong",ul:"ul",...i.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.h1,{id:""}),`\n`,(0,n.jsxs)(e.h1,{id:"empowerment-through-education-an-impactful-project-to-help-palestine",children:[(0,n.jsx)(e.a,{"aria-hidden":"true",tabIndex:"-1",href:"#empowerment-through-education-an-impactful-project-to-help-palestine",children:(0,n.jsx)(e.span,{className:"icon icon-link"})}),"Empowerment Through Education: An Impactful Project to Help Palestine"]}),`\n`,(0,n.jsx)(e.p,{children:"The Palestinian-Israeli conflict is more than a conflict of nations- it is a story of innocent people grappling with the harsh realities of war and displacement. Civilians in Palestine are being killed, displaced, and deprived of their basic rights."}),`\n`,(0,n.jsx)(e.p,{children:"One of those rights that was seized from them is the right to education. Students and teachers risk tear gas, raids, armed clashes, arrest, and intimidation just by going to school."}),`\n`,(0,n.jsx)(e.p,{children:"But amidst this turmoil there is a glimmer of hope. The ISNAD Community Education Center gives students the opportunity to learn by doing through field trips, summer camps, and extracurricular activities. This gives students a place where they can find respite and learn."}),`\n`,(0,n.jsxs)(e.h2,{id:"the-wars-impact-on-education",children:[(0,n.jsx)(e.a,{"aria-hidden":"true",tabIndex:"-1",href:"#the-wars-impact-on-education",children:(0,n.jsx)(e.span,{className:"icon icon-link"})}),(0,n.jsx)(e.strong,{children:"The War\\u2019s Impact On Education"})]}),`\n`,(0,n.jsx)(e.p,{children:"Beyond the staggering statistics of attacks on Palestinian people lies an often-overlooked casualty\\u2014education. When Palestinians struggle everyday to survive, education is easily overlooked. The occupation\\u2019s ripple effects extend into the very fabric of how students and teachers engage with education."}),`\n`,(0,n.jsx)(e.p,{children:"Many times students and teachers have to choose between safety and education. Between 2015 and 2019, over 4,000 Palestinian students and educators were reportedly harmed by attacks \\u2013 the highest number of worldwide attacks during the period (GCPEA). These attacks, all occurring near schools, include armed clashes, the use of tear gas, raids, checkpoints near schools, settler violence, and arrest and intimidation of children and teachers."}),`\n`,(0,n.jsxs)(e.h3,{id:"the-occupations-impact-on-students",children:[(0,n.jsx)(e.a,{"aria-hidden":"true",tabIndex:"-1",href:"#the-occupations-impact-on-students",children:(0,n.jsx)(e.span,{className:"icon icon-link"})}),"The Occupation\\u2019s Impact on Students"]}),`\n`,(0,n.jsx)(e.p,{children:"Arrests, demolitions, and violence are all horrifically traumatizing experiences that Palestinians are forced to endure. When students regularly regulate trauma their minds are somewhere else instead of the classroom. Persistent memories of incidents can impede the students\\u2019 ability to focus on the content and engage in the classroom."}),`\n`,(0,n.jsx)(e.p,{children:"For students who arrive at school in spite of Israeli-imposed obstacles, they encounter an ever-increasing ratio of students to teachers due to students only being able to attend their local schools. Trauma, coupled with a large student to teacher ratio, makes school an overwhelming, not fun, experience for students."}),`\n`,(0,n.jsxs)(e.h3,{id:"the-occupations-impact-on-teachers",children:[(0,n.jsx)(e.a,{"aria-hidden":"true",tabIndex:"-1",href:"#the-occupations-impact-on-teachers",children:(0,n.jsx)(e.span,{className:"icon icon-link"})}),"The Occupations Impact on Teachers"]}),`\n`,(0,n.jsx)(e.p,{children:"This barrage of challenges makes teaching distracted students a challenge. Teachers have to focus on teaching the bare minimum content of the textbook to simply get through a course. They have limited opportunities to use a variety of methods, such as discussion, collaborative work, and project-based activities."}),`\n`,(0,n.jsx)(e.p,{children:"These are the activities that make school fun and the material memorable. By only teaching by the textbook teachers can feel demotivated to teach, which can lead to poorer teaching experiences."}),`\n`,(0,n.jsxs)(e.h2,{id:"the-need-for-experiential-learning-for-palestinian-students",children:[(0,n.jsx)(e.a,{"aria-hidden":"true",tabIndex:"-1",href:"#the-need-for-experiential-learning-for-palestinian-students",children:(0,n.jsx)(e.span,{className:"icon icon-link"})}),"The Need For Experiential Learning For Palestinian Students"]}),`\n`,(0,n.jsx)(e.p,{children:"Students remember best when they learn by doing, also known as experiential learning. Field trips, discussions, projects, lab experiments, volunteering, and internships all create experiences students will forever remember, hence the name experiential learning."}),`\n`,(0,n.jsx)(e.p,{children:"Students develop leadership, confidence, cultural awareness, decision-making, organization, civic engagement, and more essential life skills when they engage in experiential learning. Experiential learning not only helps the students remember school material, but teaches them essential life skills."}),`\n`,(0,n.jsxs)(e.h3,{id:"isnad-provides-experimental-learning-opportunities",children:[(0,n.jsx)(e.a,{"aria-hidden":"true",tabIndex:"-1",href:"#isnad-provides-experimental-learning-opportunities",children:(0,n.jsx)(e.span,{className:"icon icon-link"})}),"ISNAD provides experimental learning opportunities"]}),`\n`,(0,n.jsx)(e.p,{children:"Amidst all of the struggles of education in Palestine there\\u2019s an organization providing much needed experiential learning opportunities for students. ISNAD Community Education Center in Dahria enhances youth engagement by organizing voluntary initiatives, field trips, summer camps, and courses in languages, arts, and more not available in local schools. This"}),`\n`,(0,n.jsxs)(e.h3,{id:"in-person-experiential-learning-palestine-project",children:[(0,n.jsx)(e.a,{"aria-hidden":"true",tabIndex:"-1",href:"#in-person-experiential-learning-palestine-project",children:(0,n.jsx)(e.span,{className:"icon icon-link"})}),"In-Person Experiential Learning Palestine Project"]}),`\n`,(0,n.jsx)(e.p,{children:"At ISNAD, qualified teachers provide a variety of learning opportunities for students. Students expand their educational abilities through classes in areas like languages, social media, planning, and arts. Students also participate in various volunteer projects and interventions in their local community."}),`\n`,(0,n.jsx)(e.p,{children:"ISNAD has organized more than 15 field trips since its founding just over three years ago. On these trips students can feel they are explorers, free to journey to an unknown site and take in all it has to teach them. For many, due to Israeli restrictions on movement, this is a feeling they have never experienced before."}),`\n`,(0,n.jsxs)(e.h3,{id:"online-experiential-learning-project-in-palestine",children:[(0,n.jsx)(e.a,{"aria-hidden":"true",tabIndex:"-1",href:"#online-experiential-learning-project-in-palestine",children:(0,n.jsx)(e.span,{className:"icon icon-link"})}),"Online Experiential Learning Project in Palestine"]}),`\n`,(0,n.jsx)(e.p,{children:"Checkpoints and unreasonable permit regulations restrict students from meeting with others from outside their cities. At the same time, the occupation makes it very difficult for international visitors to enter Palestine. As a result Palestinians have very few opportunities to meet, conversate with, and learn from people from outside Palestine."}),`\n`,(0,n.jsx)(e.p,{children:"Through INSAD, Palestinians practice their English with volunteers from all over the world. They engage in conversations about food, music, film, pop culture, dress, traditions, and holidays. Through these activities English shifts from a bore to a lively exchange of ideas and experiences"}),`\n`,(0,n.jsxs)(e.h2,{id:"how-do-i-help-palestine",children:[(0,n.jsx)(e.a,{"aria-hidden":"true",tabIndex:"-1",href:"#how-do-i-help-palestine",children:(0,n.jsx)(e.span,{className:"icon icon-link"})}),"How Do I Help Palestine?"]}),`\n`,(0,n.jsx)(e.p,{children:"Palestine is hurting. Innocent people cannot live the lives they want to live. Though you cannot end the situation you can still aid those in need through various organizations."}),`\n`,(0,n.jsxs)(e.h3,{id:"volunteer-with-amaxa",children:[(0,n.jsx)(e.a,{"aria-hidden":"true",tabIndex:"-1",href:"#volunteer-with-amaxa",children:(0,n.jsx)(e.span,{className:"icon icon-link"})}),"Volunteer With Amaxa"]}),`\n`,(0,n.jsx)(e.p,{children:"You can aid INSAD directly through Amaxa. When you join Amaxa you and a team of other volunteers (led by a trained coach) will have the opportunity to organize online experiential learning events for students."}),`\n`,(0,n.jsx)(e.p,{children:"Here\\u2019s some of the ways Amaxa volunteers have helped INSAD:"}),`\n`,(0,n.jsxs)(e.ul,{children:[`\n`,(0,n.jsx)(e.li,{children:"Created a free, interactive educational website for Palestinian students."}),`\n`,(0,n.jsx)(e.li,{children:"Mobilized volunteers and academics to contribute to the project by pre-recording (Insert number here) lessons."}),`\n`,(0,n.jsx)(e.li,{children:"Provided students with the opportunity to interact with different subjects and materials."}),`\n`]}),`\n`,(0,n.jsx)(e.p,{children:"Interested? Learn more here!"}),`\n`,(0,n.jsxs)(e.h3,{id:"anera",children:[(0,n.jsx)(e.a,{"aria-hidden":"true",tabIndex:"-1",href:"#anera",children:(0,n.jsx)(e.span,{className:"icon icon-link"})}),"ANERA"]}),`\n`,(0,n.jsx)(e.p,{children:"ANERA is another great way to help Palestine. They uplift the lives of refugees in the middle east through humanitarian and emergency relief. In times of peace they provide education and economic development programs."}),`\n`,(0,n.jsx)(e.p,{children:"In Palestine specifically they have built nearly 450 infrastructure projects, gave 187,770 people access to water, and have completed 53 overall projects that have improved the lives of 421,921 Palestinians."}),`\n`,(0,n.jsx)(e.p,{children:"You can directly benefit Palestinians by donating to ANERA."}),`\n`,(0,n.jsxs)(e.h3,{id:"palestinian-childrens-relief-fund",children:[(0,n.jsx)(e.a,{"aria-hidden":"true",tabIndex:"-1",href:"#palestinian-childrens-relief-fund",children:(0,n.jsx)(e.span,{className:"icon icon-link"})}),"Palestinian Children\\u2019s Relief Fund"]}),`\n`,(0,n.jsx)(e.p,{children:"Another great way to help Palestine is donating to the Palestinian Children\\u2019s Relief Fund. They impact the lives of injured and ill children in Palestine by providing much-needed medical care."}),`\n`,(0,n.jsx)(e.p,{children:"They\\u2019ve sent 2,000 affected children abroad for free medical care, sent thousands of international doctors and nurses to provide tens of thousands of children free medical care in Palestine, and provided tens of thousands of children humanitarian aid and support they can\\u2019t normally get."}),`\n`,(0,n.jsxs)(e.h3,{id:"gaza-sky-geeks",children:[(0,n.jsx)(e.a,{"aria-hidden":"true",tabIndex:"-1",href:"#gaza-sky-geeks",children:(0,n.jsx)(e.span,{className:"icon icon-link"})}),"Gaza Sky Geeks"]}),`\n`,(0,n.jsx)(e.p,{children:"Gaza Sky Geeks provides 4 ways to help Palestine: hiring Palestinians, volunteering skills, sponsoring, and donating. They focus on giving Palestinians world-class resources to work in tech."}),`\n`,(0,n.jsxs)(e.h3,{id:"weather-its-your-money-or-time-you-want-to-donate-there-are-plentiful-opportunities-to-help-those-in-need-in-palestine",children:[(0,n.jsx)(e.a,{"aria-hidden":"true",tabIndex:"-1",href:"#weather-its-your-money-or-time-you-want-to-donate-there-are-plentiful-opportunities-to-help-those-in-need-in-palestine",children:(0,n.jsx)(e.span,{className:"icon icon-link"})}),"Weather it\\u2019s your money or time you want to donate, there are plentiful opportunities to help those in need in Palestine"]})]})}function c(i={}){let{wrapper:e}=i.components||{};return e?(0,n.jsx)(e,{...i,children:(0,n.jsx)(d,{...i})}):d(i)}return x(w);})();\n;return Component;', + tableOfContents: [ + { + title: "**The War’s Impact On Education**", + slug: "the-wars-impact-on-education", + }, + { + title: "The Need For Experiential Learning For Palestinian Students", + slug: "the-need-for-experiential-learning-for-palestinian-students", + }, + { + title: "How Do I Help Palestine?", + slug: "how-do-i-help-palestine", + }, + ], + images: [], + tweetIds: [], + githubRepos: [], + }, +]; diff --git a/apps/website/.content-collections/generated/allChangelogPosts.js b/apps/website/.content-collections/generated/allChangelogPosts.js new file mode 100644 index 0000000..d6d1738 --- /dev/null +++ b/apps/website/.content-collections/generated/allChangelogPosts.js @@ -0,0 +1 @@ +export default []; diff --git a/apps/website/.content-collections/generated/allHelpPosts.js b/apps/website/.content-collections/generated/allHelpPosts.js new file mode 100644 index 0000000..d6d1738 --- /dev/null +++ b/apps/website/.content-collections/generated/allHelpPosts.js @@ -0,0 +1 @@ +export default []; diff --git a/apps/website/.content-collections/generated/allIntegrationsPosts.js b/apps/website/.content-collections/generated/allIntegrationsPosts.js new file mode 100644 index 0000000..d6d1738 --- /dev/null +++ b/apps/website/.content-collections/generated/allIntegrationsPosts.js @@ -0,0 +1 @@ +export default []; diff --git a/apps/website/.content-collections/generated/allLegalPosts.js b/apps/website/.content-collections/generated/allLegalPosts.js new file mode 100644 index 0000000..d6d1738 --- /dev/null +++ b/apps/website/.content-collections/generated/allLegalPosts.js @@ -0,0 +1 @@ +export default []; diff --git a/apps/website/.content-collections/generated/index.d.ts b/apps/website/.content-collections/generated/index.d.ts new file mode 100644 index 0000000..983fd02 --- /dev/null +++ b/apps/website/.content-collections/generated/index.d.ts @@ -0,0 +1,26 @@ +import { GetTypeByName } from "@content-collections/core"; + +import configuration from "../../content-collections.ts"; + +export type BlogPost = GetTypeByName; +export declare const allBlogPosts: Array; + +export type ChangelogPost = GetTypeByName< + typeof configuration, + "ChangelogPost" +>; +export declare const allChangelogPosts: Array; + +export type HelpPost = GetTypeByName; +export declare const allHelpPosts: Array; + +export type LegalPost = GetTypeByName; +export declare const allLegalPosts: Array; + +export type IntegrationsPost = GetTypeByName< + typeof configuration, + "IntegrationsPost" +>; +export declare const allIntegrationsPosts: Array; + +export {}; diff --git a/apps/website/.content-collections/generated/index.js b/apps/website/.content-collections/generated/index.js new file mode 100644 index 0000000..11f5cd0 --- /dev/null +++ b/apps/website/.content-collections/generated/index.js @@ -0,0 +1,15 @@ +// generated by content-collections at Sun Aug 25 2024 17:13:24 GMT-0600 (Mountain Daylight Time) + +import allBlogPosts from "./allBlogPosts.js"; +import allChangelogPosts from "./allChangelogPosts.js"; +import allHelpPosts from "./allHelpPosts.js"; +import allIntegrationsPosts from "./allIntegrationsPosts.js"; +import allLegalPosts from "./allLegalPosts.js"; + +export { + allBlogPosts, + allChangelogPosts, + allHelpPosts, + allLegalPosts, + allIntegrationsPosts, +}; diff --git a/apps/website/content-collections.ts b/apps/website/content-collections.ts new file mode 100644 index 0000000..d4d5c6a --- /dev/null +++ b/apps/website/content-collections.ts @@ -0,0 +1,281 @@ +/* eslint-disable */ +//@ts-nocheck +import { defineCollection, defineConfig } from "@content-collections/core"; +import { compileMDX } from "@content-collections/mdx"; +import { remarkGfm } from "fumadocs-core/mdx-plugins"; +import GithubSlugger from "github-slugger"; +import rehypeAutolinkHeadings from "rehype-autolink-headings"; +import rehypeSlug from "rehype-slug"; + +const computedFields = ( + type: "blog" | "changelog" | "customers" | "help" | "legal" | "integrations", +) => ({ + slug: (document: any) => { + const slugger = new GithubSlugger(); + return document.slug || slugger.slug(document.title); + }, + tableOfContents: (document: any) => { + const content = + document.content || document.body?.raw || document.mdx?.code || ""; + const headings = content.match(/^##\s(.+)$/gm); + const slugger = new GithubSlugger(); + return ( + headings?.map((heading: any) => { + const title = heading.replace(/^##\s/, ""); + return { + title, + slug: slugger.slug(title), + }; + }) || [] + ); + }, + images: (document) => { + if (!document.body?.raw) return []; + return ( + document.body.raw.match(/(?<=]*\bsrc=")[^"]+(?="[^>]*\/>)/g) || + [] + ); + }, + tweetIds: (document) => { + if (!document.body?.raw) return []; + const tweetMatches = document.body.raw.match(//g); + return tweetMatches?.map((tweet) => tweet.match(/[0-9]+/g)[0]) || []; + }, + githubRepos: (document) => { + if (!document.body?.raw) return []; + return ( + document.body.raw.match( + /(?<=]*\burl=")[^"]+(?="[^>]*\/>)/g, + ) || [] + ); + }, +}); + +const BlogPost = defineCollection({ + name: "BlogPost", + directory: "src/content/blog", + include: "*.mdx", + schema: (z) => ({ + title: z.string(), + categories: z.array(z.enum(["company", "eng"])).default(["company"]), + publishedAt: z.string().regex(/^\d{4}-\d{2}-\d{2}$/), + featured: z.boolean().default(false), + image: z.string(), + images: z.array(z.string()).optional(), + seoTitle: z.string().optional(), + seoDescription: z.string().optional(), + author: z.string(), + summary: z.string(), + related: z.array(z.string()).optional(), + githubRepos: z.array(z.string()).optional(), + tweetIds: z.array(z.string()).optional(), + slug: z.string().optional(), + }), + transform: async (document, context) => { + try { + const mdx = await compileMDX(context, document, { + rehypePlugins: [rehypeSlug, rehypeAutolinkHeadings], + remarkPlugins: [remarkGfm], + }); + console.log("MDX compilation successful for:", document.title); + const computed = computedFields("blog"); + return { + ...document, + slug: computed.slug(document), + mdx, + related: document.related || [], + tableOfContents: computed.tableOfContents({ + ...document, + body: { raw: mdx.raw }, + }), + images: computed.images({ ...document, body: { raw: mdx.raw } }), + tweetIds: computed.tweetIds({ ...document, body: { raw: mdx.raw } }), + githubRepos: computed.githubRepos({ + ...document, + body: { raw: mdx.raw }, + }), + }; + } catch (error) { + console.error("Error compiling MDX for:", document.title, error); + console.error("Error details:", error.stack); + throw error; + } + }, +}); + +const ChangelogPost = defineCollection({ + name: "ChangelogPost", + directory: "src/content/changelog", + include: "*.mdx", + schema: (z) => ({ + title: z.string(), + publishedAt: z.string().regex(/^\d{4}-\d{2}-\d{2}$/), + summary: z.string(), + image: z.string(), + author: z.string(), + slug: z.string().optional(), + }), + transform: async (document, context) => { + try { + const mdx = await compileMDX(context, document, { + rehypePlugins: [rehypeSlug, rehypeAutolinkHeadings], + remarkPlugins: [remarkGfm], + }); + console.log("MDX compilation successful for:", document.title); + const computed = computedFields("changelog"); + return { + ...document, + slug: computed.slug(document), + mdx, + tableOfContents: computed.tableOfContents({ + ...document, + body: { raw: mdx.raw }, + }), + images: computed.images({ ...document, body: { raw: mdx.raw } }), + tweetIds: computed.tweetIds({ ...document, body: { raw: mdx.raw } }), + githubRepos: computed.githubRepos({ + ...document, + body: { raw: mdx.raw }, + }), + }; + } catch (error) { + console.error("Error compiling MDX for:", document.title, error); + console.error("Error details:", error.stack); + throw error; + } + }, +}); +export const HelpPost = defineCollection({ + name: "HelpPost", + directory: "src/content/help", + include: "*.mdx", + schema: (z) => ({ + title: z.string(), + updatedAt: z.string(), + summary: z.string(), + author: z.string(), + categories: z.array(z.enum(["", "", "", "", ""])).default([""]), + related: z.array(z.string()).optional(), + excludeHeadingsFromSearch: z.boolean().optional(), + slug: z.string().optional(), + }), + transform: async (document, context) => { + try { + const mdx = await compileMDX(context, document, { + rehypePlugins: [rehypeSlug, rehypeAutolinkHeadings], + remarkPlugins: [remarkGfm], + }); + + const computed = computedFields("help"); + + const result = { + ...document, + slug: computed.slug(document), + mdx, + tableOfContents: computed.tableOfContents(document), + images: computed.images(document), + tweetIds: computed.tweetIds(document), + githubRepos: computed.githubRepos(document), + }; + + return result; + } catch (error) { + console.error("Error compiling MDX for:", document.title, error); + console.error("Error details:", error.stack); + throw error; + } + }, +}); + +export const LegalPost = defineCollection({ + name: "LegalPost", + directory: "src/content/legal", + include: "*.mdx", + schema: (z) => ({ + title: z.string(), + updatedAt: z.string(), + slug: z.string().optional(), + }), + transform: async (document, context) => { + try { + const mdx = await compileMDX(context, document, { + rehypePlugins: [rehypeSlug, rehypeAutolinkHeadings], + remarkPlugins: [remarkGfm], + }); + console.log("MDX compilation successful for:", document.title); + const computed = computedFields("legal"); + return { + ...document, + slug: computed.slug(document), + mdx, + tableOfContents: computed.tableOfContents({ + ...document, + body: { raw: mdx.raw }, + }), + images: computed.images({ ...document, body: { raw: mdx.raw } }), + tweetIds: computed.tweetIds({ ...document, body: { raw: mdx.raw } }), + githubRepos: computed.githubRepos({ + ...document, + body: { raw: mdx.raw }, + }), + }; + } catch (error) { + console.error("Error compiling MDX for:", document.title, error); + console.error("Error details:", error.stack); + throw error; + } + }, +}); + +export const IntegrationsPost = defineCollection({ + name: "IntegrationsPost", + directory: "src/content/integrations", + include: "*.mdx", + schema: (z) => ({ + title: z.string(), + publishedAt: z.string(), + summary: z.string(), + image: z.string(), + company: z.string(), + companyLogo: z.string(), + companyUrl: z.string(), + companyDescription: z.string(), + integrationType: z.string(), + integrationDescription: z.string(), + compatibility: z.string(), + slug: z.string().optional(), + }), + transform: async (document, context) => { + try { + const mdx = await compileMDX(context, document, { + rehypePlugins: [rehypeSlug, rehypeAutolinkHeadings], + remarkPlugins: [remarkGfm], + }); + console.log("MDX compilation successful for:", document.title); + const computed = computedFields("integrations"); + return { + ...document, + slug: computed.slug(document), + mdx, + tableOfContents: computed.tableOfContents({ + ...document, + body: { raw: mdx.raw }, + }), + images: computed.images({ ...document, body: { raw: mdx.raw } }), + tweetIds: computed.tweetIds({ ...document, body: { raw: mdx.raw } }), + githubRepos: computed.githubRepos({ + ...document, + body: { raw: mdx.raw }, + }), + }; + } catch (error) { + console.error("Error compiling MDX for:", document.title, error); + console.error("Error details:", error.stack); + throw error; + } + }, +}); + +export default defineConfig({ + collections: [BlogPost, ChangelogPost, HelpPost, LegalPost, IntegrationsPost], +}); diff --git a/apps/website/eslint.config.js b/apps/website/eslint.config.js index 57ff886..eda53d5 100644 --- a/apps/website/eslint.config.js +++ b/apps/website/eslint.config.js @@ -5,10 +5,32 @@ import reactConfig from "@amaxa/eslint-config/react"; /** @type {import('typescript-eslint').Config} */ export default [ { - ignores: [".next/**"], + ignores: [".next/**", "..content-collections/**"], }, ...baseConfig, ...reactConfig, ...nextjsConfig, ...restrictEnvAccess, + { + // TODO: Resolve errors when setting these rules to 'error' + rules: { + "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/no-unsafe-member-access": "off", + "@typescript-eslint/no-non-null-assertion": "warn", + "@typescript-eslint/consistent-type-definitions": "warn", + "@typescript-eslint/no-unnecessary-condition": "off", + "@typescript-eslint/prefer-nullish-coalescing": "off", + "@typescript-eslint/no-unsafe-argument": "off", + "@typescript-eslint/no-unsafe-return": "off", + "@typescript-eslint/no-unused-vars": "off", + "@typescript-eslint/require-await": "warn", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-unsafe-assignment": "off", + "@typescript-eslint/no-floating-promises": "warn", + "@typescript-eslint/no-non-null-asserted-optional-chain": "warn", + "@typescript-eslint/no-unsafe-call": "off", + "@typescript-eslint/no-empty-function": "warn", + "@typescript-eslint/dot-notation": "warn", + }, + }, ]; diff --git a/apps/website/next.config.js b/apps/website/next.config.js index 708b230..f84feb7 100644 --- a/apps/website/next.config.js +++ b/apps/website/next.config.js @@ -1,3 +1,5 @@ +import { withContentCollections } from "@content-collections/next"; + /** @type {import("next").NextConfig} */ const config = { reactStrictMode: true, @@ -25,4 +27,4 @@ const config = { typescript: { ignoreBuildErrors: true }, }; -export default config; +export default withContentCollections(config); diff --git a/apps/website/package.json b/apps/website/package.json index 2c54cb8..1b1ac5c 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -20,16 +20,27 @@ "@amaxa/ui": "workspace:*", "@amaxa/validators": "workspace:*", "framer-motion": "^11.2.11", + "fumadocs-core": "^13.3.2", + "fumadocs-ui": "^13.3.2", + "github-slugger": "^2.0.0", "lucide-react": "^0.416.0", "next": "^14.2.3", "react": "18.3.1", - "react-dom": "18.3.1" + "react-dom": "18.3.1", + "react-syntax-highlighter": "^15.5.0", + "rehype-autolink-headings": "^7.1.0", + "rehype-slug": "^6.0.0", + "vaul": "^0.9.1" }, "devDependencies": { "@amaxa/eslint-config": "workspace:*", "@amaxa/prettier-config": "workspace:*", "@amaxa/tailwind-config": "workspace:*", "@amaxa/tsconfig": "workspace:*", + "@content-collections/core": "^0.6.4", + "@content-collections/mdx": "^0.1.3", + "@content-collections/next": "^0.2.0", + "@tailwindcss/typography": "^0.5.14", "@types/node": "^20.12.9", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", diff --git a/apps/website/public/flowchart.png b/apps/website/public/flowchart.png new file mode 100644 index 0000000..d132360 Binary files /dev/null and b/apps/website/public/flowchart.png differ diff --git a/apps/website/public/guides-ss.png b/apps/website/public/guides-ss.png new file mode 100644 index 0000000..4f94707 Binary files /dev/null and b/apps/website/public/guides-ss.png differ diff --git a/apps/website/public/platform-dark.png b/apps/website/public/platform-dark.png new file mode 100644 index 0000000..9c022ab Binary files /dev/null and b/apps/website/public/platform-dark.png differ diff --git a/apps/website/src/app/(blog)/blog/category/[slug]/page.tsx b/apps/website/src/app/(blog)/blog/category/[slug]/page.tsx new file mode 100644 index 0000000..41c4a34 --- /dev/null +++ b/apps/website/src/app/(blog)/blog/category/[slug]/page.tsx @@ -0,0 +1,64 @@ +import type { Metadata } from "next"; +import { notFound } from "next/navigation"; +import BlogCard from "@/components/blog/blog-card"; +import { constructMetadata } from "@/lib/blog/constructMetadata"; +import { BLOG_CATEGORIES } from "@/lib/blog/content"; +import { getBlurDataURL } from "@/lib/blog/images"; +import { allBlogPosts } from "content-collections"; + +export async function generateStaticParams() { + return BLOG_CATEGORIES.map((category) => ({ + slug: category.slug, + })); +} + +export async function generateMetadata({ + params, +}: { + params: { slug: string }; +}): Promise { + const category = BLOG_CATEGORIES.find( + (category) => category.slug === params.slug, + ); + if (!category) { + return; + } + + const { title, description } = category; + + return constructMetadata({ + title: `${title} Poster – Propdock`, + description, + image: `/api/og/help?title=${encodeURIComponent( + title, + )}&summary=${encodeURIComponent(description)}`, + }); +} + +export default async function BlogCategory({ + params, +}: { + params: { + slug: string; + }; +}) { + const data = BLOG_CATEGORIES.find( + (category) => category.slug === params.slug, + ); + if (!data) { + notFound(); + } + const articles = await Promise.all( + allBlogPosts + .filter((post) => post.categories.includes(data.slug)) + .sort((a, b) => b.publishedAt.localeCompare(a.publishedAt)) + .map(async (post) => ({ + ...post, + blurDataURL: await getBlurDataURL(post.image), + })), + ); + + return articles.map((article, idx) => ( + + )); +} diff --git a/apps/website/src/app/(blog)/blog/layout.tsx b/apps/website/src/app/(blog)/blog/layout.tsx new file mode 100644 index 0000000..13d639a --- /dev/null +++ b/apps/website/src/app/(blog)/blog/layout.tsx @@ -0,0 +1,25 @@ +import type { ReactNode } from "react"; +import BlogLayoutHero from "@/components/blog/blog-layout-hero"; +import MaxWidthWrapper from "@/components/blog/max-width-wrapper"; + +import Footer from "~/app/(marketing)/_components/footer"; + +export default async function BlogLayout({ + children, +}: { + children: ReactNode; +}) { + return ( +
+
+ +
+ + {children} + +
+
+
+
+ ); +} diff --git a/apps/website/src/app/(blog)/blog/page.tsx b/apps/website/src/app/(blog)/blog/page.tsx new file mode 100644 index 0000000..615eb18 --- /dev/null +++ b/apps/website/src/app/(blog)/blog/page.tsx @@ -0,0 +1,21 @@ +import BlogCard from "@/components/blog/blog-card"; +import { getBlurDataURL } from "@/lib/blog/images"; +import { allBlogPosts } from "content-collections"; + +export default async function Blog() { + const articles = await Promise.all( + allBlogPosts + .sort( + (a, b) => + new Date(b.publishedAt).getTime() - new Date(a.publishedAt).getTime(), + ) + .map(async (post) => ({ + ...post, + blurDataURL: await getBlurDataURL(post.image), + })), + ); + + return articles.map((article: any, idx: any) => ( + + )); +} diff --git a/apps/website/src/app/(marketing)/_components/header.tsx b/apps/website/src/app/(marketing)/_components/header.tsx index f16cc07..29f54d6 100644 --- a/apps/website/src/app/(marketing)/_components/header.tsx +++ b/apps/website/src/app/(marketing)/_components/header.tsx @@ -10,15 +10,13 @@ import NavigationSection from "./nav"; export const Header = () => { return ( -
- logo - +
+ +
+ + ámaxa + +
diff --git a/apps/website/src/app/(marketing)/_components/hero.tsx b/apps/website/src/app/(marketing)/_components/hero.tsx index 96df458..0c6716a 100644 --- a/apps/website/src/app/(marketing)/_components/hero.tsx +++ b/apps/website/src/app/(marketing)/_components/hero.tsx @@ -8,18 +8,18 @@ import { Button } from "@amaxa/ui/button"; export default function Hero() { return ( - +
-

+ {" "} +

+ {" "} We help you effect
change in the world.

-

We connect high school students, college students, professionals, & retirees to high-impact projects with our 9 global partner nonprofits.

-
@@ -36,7 +36,6 @@ export default function Hero() {
-

Trusted by over{" "} diff --git a/apps/website/src/app/(marketing)/_components/nav.tsx b/apps/website/src/app/(marketing)/_components/nav.tsx index 054637e..469189d 100644 --- a/apps/website/src/app/(marketing)/_components/nav.tsx +++ b/apps/website/src/app/(marketing)/_components/nav.tsx @@ -35,6 +35,20 @@ export default function NavigationSection() { + + + + Blog + + + + + + + Platform + + + ); diff --git a/apps/website/src/app/(marketing)/_components/new-hero.tsx b/apps/website/src/app/(marketing)/_components/new-hero.tsx new file mode 100644 index 0000000..580c9fa --- /dev/null +++ b/apps/website/src/app/(marketing)/_components/new-hero.tsx @@ -0,0 +1,57 @@ +import Link from "next/link"; +import { ChevronRight } from "lucide-react"; + +import { cn } from "@amaxa/ui"; +import { Badge } from "@amaxa/ui/badge"; +import { Button } from "@amaxa/ui/button"; + +export function Hero() { + return ( +

+
+ + + Proudly Open Source + + + +
+
+

+ We help you effect +
+ change in the world. +

+

+ We connect high school students, college students, professionals, & + retirees to high-impact projects with our 9 global partner nonprofits. +

+
+
+
+
+ + + + + + + +
+
+
+
+ ); +} diff --git a/apps/website/src/app/(marketing)/_components/project.tsx b/apps/website/src/app/(marketing)/_components/project.tsx index 24755e6..5516ea9 100644 --- a/apps/website/src/app/(marketing)/_components/project.tsx +++ b/apps/website/src/app/(marketing)/_components/project.tsx @@ -133,7 +133,7 @@ export function Projects() { )); return ( -
+

Our Projects

diff --git a/apps/website/src/app/(marketing)/layout.tsx b/apps/website/src/app/(marketing)/layout.tsx index a16f763..6358b5e 100644 --- a/apps/website/src/app/(marketing)/layout.tsx +++ b/apps/website/src/app/(marketing)/layout.tsx @@ -12,14 +12,11 @@ export default function Layout({ }>) { return (
-
-
-
-
{children}
-
- {modal} -
-
+
+
{children}
+
+ {modal} +
); } diff --git a/apps/website/src/app/(marketing)/page.tsx b/apps/website/src/app/(marketing)/page.tsx index 715be1d..1b5a9b5 100644 --- a/apps/website/src/app/(marketing)/page.tsx +++ b/apps/website/src/app/(marketing)/page.tsx @@ -6,7 +6,7 @@ import { Testimonials } from "./_components/testimonials"; export default function Home() { return ( -
+
diff --git a/apps/website/src/app/(marketing)/platform/page.tsx b/apps/website/src/app/(marketing)/platform/page.tsx new file mode 100644 index 0000000..d7eb820 --- /dev/null +++ b/apps/website/src/app/(marketing)/platform/page.tsx @@ -0,0 +1,15 @@ +import React from "react"; + +import { BeamSection } from "~/components/beam-section"; +import PlatformHero from "~/components/platform-hero"; +import { SphereMask } from "~/components/sphere-mask"; + +export default function Page() { + return ( +
+ + + +
+ ); +} diff --git a/apps/website/src/app/(marketing)/project/page.tsx b/apps/website/src/app/(marketing)/project/page.tsx index 439213f..5258158 100644 --- a/apps/website/src/app/(marketing)/project/page.tsx +++ b/apps/website/src/app/(marketing)/project/page.tsx @@ -1,9 +1,88 @@ +"use client"; + import React from "react"; +import { motion } from "framer-motion"; + +import { BlurImage } from "~/components/ui/apple-cards"; + +const projects = [ + { + title: "Feeding Gaza: support for families in crisis", + image: "/gazachamps.png", + }, + { + title: "Nyaka Global, Giving light: solar solutions for Ugandan grandmas", + image: "/nyaka.jpg", + }, + { + title: `Ukraine : “Frontline support: providing urgent medical aid to Ukrainians caught in the crossfire.”`, + image: "/ukraine.png", + }, + { + title: "Karina’s Library", + image: "/libr.png", + }, + { + title: + "Global Forest: Going green: planting trees and tracking carbon sequestration", + image: "/forest.png", + }, + { + title: + "ISNAD: Expanding learning and community: comprehensive support for Palestinian students", + image: "/insad.png", + }, + { + title: "LGBTQ+ Artists", + image: "/lgbtq.png", + }, + { + title: `Mental Health First Aid: Mind matters, research, expert opinions, and peer to peer education`, + image: "/mhfa.png", + }, + { + title: "Educhildren", + image: "/educhildren.webp", + }, +]; + +const ProjectCard = ({ + project, +}: { + project: { + title: string; + image: string; + }; +}) => { + return ( +
+

Project

+ +
+
+ + {project.title} + +
+
+ +
+ +
+ ); +}; export default function Page() { return ( -
-

Project

+
+ {projects.map((project, index) => ( + + ))}
); } diff --git a/apps/website/src/app/(marketing)/team/_components/author-card.tsx b/apps/website/src/app/(marketing)/team/_components/author-card.tsx index bc796b6..72c04a8 100644 --- a/apps/website/src/app/(marketing)/team/_components/author-card.tsx +++ b/apps/website/src/app/(marketing)/team/_components/author-card.tsx @@ -8,23 +8,28 @@ interface MemberCardProps { export const PersonCard = ({ name, role, image }: MemberCardProps) => { return ( -
-
-
- Illustration 1 -
+
+
+
+
+ Illustration 1 +
- - {name} • {role} - + + {name} • {role} + +
+
+

{name}

+
); }; diff --git a/apps/website/src/app/(marketing)/team/page.tsx b/apps/website/src/app/(marketing)/team/page.tsx index 2b220b5..47a974b 100644 --- a/apps/website/src/app/(marketing)/team/page.tsx +++ b/apps/website/src/app/(marketing)/team/page.tsx @@ -27,7 +27,7 @@ export default function Page() { return (

Meet The Team!

-
+
{members.map((member, index) => ( ))} diff --git a/apps/website/src/app/(posts)/blog/[slug]/layout.tsx b/apps/website/src/app/(posts)/blog/[slug]/layout.tsx new file mode 100644 index 0000000..e6a5c2a --- /dev/null +++ b/apps/website/src/app/(posts)/blog/[slug]/layout.tsx @@ -0,0 +1,17 @@ +import { Suspense } from "react"; + +import Footer from "~/app/(marketing)/_components/footer"; + +interface MarketingLayoutProps { + children: React.ReactNode; +} + +export default function MarketingLayout({ children }: MarketingLayoutProps) { + return ( + <> + + {children} +