minor fixes #41
7 changed files with 179 additions and 64 deletions
11
Dockerfile
11
Dockerfile
|
@ -1,11 +0,0 @@
|
|||
FROM node:20.10.0
|
||||
|
||||
WORKDIR /app
|
||||
COPY . .
|
||||
|
||||
RUN npm install --force
|
||||
RUN npm run build
|
||||
|
||||
EXPOSE 6080
|
||||
|
||||
CMD ["npm", "run", "start"]
|
|
@ -13,6 +13,7 @@ export function Footer() {
|
|||
<Link href="/features">{t('navigation.features')}</Link>
|
||||
<Link href="/download">{t('navigation.download')}</Link>
|
||||
<Link href="/community">{t('navigation.community')}</Link>
|
||||
<Link href="/join">{t('navigation.join')}</Link>
|
||||
<Link href="https://blog.parchlinux.com">{t('navigation.blog')}</Link>
|
||||
<Link href="/team">{t('navigation.team')}</Link>
|
||||
<Link href="/privacy">{t('footer.privacyPolicy')}</Link>
|
||||
|
|
58
data/community.js
Normal file
58
data/community.js
Normal file
|
@ -0,0 +1,58 @@
|
|||
const category = {
|
||||
develop: {
|
||||
en: 'Develop',
|
||||
fa: 'توسعه'
|
||||
},
|
||||
communication: {
|
||||
en: 'Communication',
|
||||
fa: 'ارتباطات'
|
||||
},
|
||||
multimedia: {
|
||||
en: 'Multimedia',
|
||||
fa: 'چندرسانهای'
|
||||
},
|
||||
}
|
||||
|
||||
const communityData = {
|
||||
categories: Object.values(category),
|
||||
apps: [
|
||||
{
|
||||
name: {
|
||||
en: 'Neovim',
|
||||
fa: 'نئوویم',
|
||||
},
|
||||
desc: {
|
||||
en: 'Powerful and extendable text editor',
|
||||
fa: 'ویرایشگر متن قدرتمند و قابل تمدید',
|
||||
},
|
||||
cat: category.develop,
|
||||
href: '#'
|
||||
},
|
||||
{
|
||||
name: {
|
||||
en: 'Discord',
|
||||
fa: 'دیسکورد',
|
||||
},
|
||||
desc: {
|
||||
en: 'Voice & text chat application',
|
||||
fa: 'اپلیکیشن چت صوتی و متنی',
|
||||
},
|
||||
cat: category.communication,
|
||||
href: '#'
|
||||
},
|
||||
{
|
||||
name: {
|
||||
en: 'OBS Studio',
|
||||
fa: 'OBS استودیو',
|
||||
},
|
||||
desc: {
|
||||
en: 'Screen recorder and streaming software',
|
||||
fa: 'نرمافزار ضبط صفحه نمایش و پخش زنده',
|
||||
},
|
||||
cat: category.multimedia,
|
||||
href: '#'
|
||||
},
|
||||
]
|
||||
}
|
||||
|
||||
export default communityData;
|
|
@ -17,6 +17,7 @@ export default {
|
|||
navigation: {
|
||||
blog: 'Blog',
|
||||
community: 'Community',
|
||||
join: 'Join',
|
||||
download: 'Download',
|
||||
features: 'Features',
|
||||
team: 'Team',
|
||||
|
@ -34,6 +35,11 @@ export default {
|
|||
},
|
||||
|
||||
community: {
|
||||
title: 'Parch Linux Community Software',
|
||||
search: 'Search apps...'
|
||||
},
|
||||
|
||||
join: {
|
||||
title: 'Join Our Community',
|
||||
caption: {
|
||||
forum: 'Forums',
|
||||
|
|
|
@ -17,6 +17,7 @@ export default {
|
|||
navigation: {
|
||||
blog: 'بلاگ',
|
||||
community: 'جامعه',
|
||||
join: 'پیوستن',
|
||||
download: 'دانلود',
|
||||
features: 'امکانات',
|
||||
team: 'تیم',
|
||||
|
@ -34,6 +35,12 @@ export default {
|
|||
},
|
||||
|
||||
community: {
|
||||
title: 'برنامههای جامعه پارچ لینوکس',
|
||||
search: 'جستجوی برنامهها...'
|
||||
},
|
||||
|
||||
|
||||
join: {
|
||||
title: 'به جامعهٔ ما بپیوندید',
|
||||
caption: {
|
||||
forum: 'فروم',
|
||||
|
|
|
@ -1,65 +1,52 @@
|
|||
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
|
||||
import { useTranslation } from "@/utils/translation"
|
||||
import { Users, Book, MessageCircle, Code, ArrowLeftCircle, ArrowRightCircle } from 'lucide-react'
|
||||
import { Button } from "@/components/ui/button"
|
||||
import Link from "next/link"
|
||||
import { SiBluesky, SiDiscord, SiMastodon, SiTelegram, SiX } from "@icons-pack/react-simple-icons";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { Card, CardHeader } from "@/components/ui/card";
|
||||
import { SiGitlab } from "@icons-pack/react-simple-icons";
|
||||
import { useTranslation } from "@/utils/translation";
|
||||
|
||||
const CommunityCard = ({ icon: Icon, caption, link, text, url, arrow: Arrow }) => (
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<div className="flex gap-4 justify-between">
|
||||
<CardTitle>
|
||||
<Icon className="h-6 w-6 inline-block align-middle me-2" />
|
||||
{caption}
|
||||
</CardTitle>
|
||||
<Button asChild variant="outline" className="rounded-full">
|
||||
<Link href={url}>{link} <Arrow size={16} /></Link>
|
||||
</Button>
|
||||
</div>
|
||||
</CardHeader>
|
||||
<CardContent>{text}</CardContent>
|
||||
</Card>
|
||||
)
|
||||
import communityData from "@/data/community";
|
||||
import { useCallback, useEffect, useState } from "react";
|
||||
|
||||
export default function Community() {
|
||||
const { t, lang } = useTranslation();
|
||||
const [apps, setApps] = useState(communityData.apps);
|
||||
|
||||
const arrow = lang == 'fa' ? ArrowLeftCircle : ArrowRightCircle
|
||||
const search = q => {
|
||||
setApps(communityData.apps.filter(app => JSON.stringify(app).toLowerCase().includes(q)))
|
||||
}
|
||||
|
||||
return (
|
||||
<main className="py-12 md:py-24 lg:py-32">
|
||||
<div className="container mx-auto px-4 md:px-6">
|
||||
<h2 className="text-3xl font-bold sm:text-4xl md:text-5xl text-center mb-8">{t('community.title')}</h2>
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
||||
<CommunityCard
|
||||
icon={Users}
|
||||
caption={t('community.caption.forum')}
|
||||
url="https://forum.parchlinux.com"
|
||||
link={t('community.link.forum')}
|
||||
text={t('community.text.forum')}
|
||||
arrow={arrow} />
|
||||
<CommunityCard
|
||||
icon={Book}
|
||||
caption={t('community.caption.wiki')}
|
||||
url="https://wiki.parchlinux.com"
|
||||
link={t('community.link.wiki')}
|
||||
text={t('community.text.wiki')}
|
||||
arrow={arrow} />
|
||||
<CommunityCard
|
||||
icon={MessageCircle}
|
||||
caption={t('community.caption.chat')}
|
||||
url="https://matrix.to/#/%23parch:bsd.cafe"
|
||||
link={t('community.link.chat')}
|
||||
text={t('community.text.chat')}
|
||||
arrow={arrow} />
|
||||
<CommunityCard
|
||||
icon={Code}
|
||||
caption={t('community.caption.contrib')}
|
||||
url="https://git.parchlinux.com"
|
||||
link={t('community.link.contrib')}
|
||||
text={t('community.text.contrib')}
|
||||
arrow={arrow} />
|
||||
<h2 className="text-3xl font-bold sm:text-4xl md:text-5xl text-center mb-8">
|
||||
{t("community.title")}
|
||||
</h2>
|
||||
<div className="my-12">
|
||||
<input type="search"
|
||||
className="bg-background rounded-full border shadow-lg p-3 block mx-auto w-[40rem] max-w-full"
|
||||
placeholder={t("community.search")}
|
||||
onInput={(e) => search(e.target.value.trim().toLowerCase())} />
|
||||
</div>
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
|
||||
{apps.map(app => (
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<div className="flex gap-2">
|
||||
<div className="grow space-y-2">
|
||||
<h3 className="text-lg font-bold">{app.name[lang]}</h3>
|
||||
<p className="text-sm text-muted-foreground mt-2">{app.desc[lang]}</p>
|
||||
<p className="">{app.cat[lang]}</p>
|
||||
</div>
|
||||
<div className="shrink-0">
|
||||
<Button variant="outline" size="icon" asChild>
|
||||
<a href={app.href} target="_blank">
|
||||
<SiGitlab className="h-4 w-4" />
|
||||
</a>
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</CardHeader>
|
||||
</Card>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
|
67
pages/join.jsx
Normal file
67
pages/join.jsx
Normal file
|
@ -0,0 +1,67 @@
|
|||
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
|
||||
import { useTranslation } from "@/utils/translation"
|
||||
import { Users, Book, MessageCircle, Code, ArrowLeftCircle, ArrowRightCircle } from 'lucide-react'
|
||||
import { Button } from "@/components/ui/button"
|
||||
import Link from "next/link"
|
||||
import { SiBluesky, SiDiscord, SiMastodon, SiTelegram, SiX } from "@icons-pack/react-simple-icons";
|
||||
|
||||
const JoinCard = ({ icon: Icon, caption, link, text, url, arrow: Arrow }) => (
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<div className="flex gap-4 justify-between">
|
||||
<CardTitle>
|
||||
<Icon className="h-6 w-6 inline-block align-middle me-2" />
|
||||
{caption}
|
||||
</CardTitle>
|
||||
<Button asChild variant="outline" className="rounded-full">
|
||||
<Link href={url}>{link} <Arrow size={16} /></Link>
|
||||
</Button>
|
||||
</div>
|
||||
</CardHeader>
|
||||
<CardContent>{text}</CardContent>
|
||||
</Card>
|
||||
)
|
||||
|
||||
export default function Join() {
|
||||
const { t, lang } = useTranslation();
|
||||
|
||||
const arrow = lang == 'fa' ? ArrowLeftCircle : ArrowRightCircle
|
||||
|
||||
return (
|
||||
<main className="py-12 md:py-24 lg:py-32">
|
||||
<div className="container mx-auto px-4 md:px-6">
|
||||
<h2 className="text-3xl font-bold sm:text-4xl md:text-5xl text-center mb-8">{t('join.title')}</h2>
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
||||
<JoinCard
|
||||
icon={Users}
|
||||
caption={t('join.caption.forum')}
|
||||
url="#"
|
||||
link={t('join.link.forum')}
|
||||
text={t('join.text.forum')}
|
||||
arrow={arrow} />
|
||||
<JoinCard
|
||||
icon={Book}
|
||||
caption={t('join.caption.wiki')}
|
||||
url="#"
|
||||
link={t('join.link.wiki')}
|
||||
text={t('join.text.wiki')}
|
||||
arrow={arrow} />
|
||||
<JoinCard
|
||||
icon={MessageCircle}
|
||||
caption={t('join.caption.chat')}
|
||||
url="#"
|
||||
link={t('join.link.chat')}
|
||||
text={t('join.text.chat')}
|
||||
arrow={arrow} />
|
||||
<JoinCard
|
||||
icon={Code}
|
||||
caption={t('join.caption.contrib')}
|
||||
url="#"
|
||||
link={t('join.link.contrib')}
|
||||
text={t('join.text.contrib')}
|
||||
arrow={arrow} />
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
)
|
||||
}
|
Loading…
Add table
Reference in a new issue