The CSS classes used across different web pages in the web application have been updated. This change mainly consists of adjustments to spacing on various elements to improve the visual layout. The alterations should enhance the readability and user experience of the mentioned pages.
133 lines
3.4 KiB
TypeScript
133 lines
3.4 KiB
TypeScript
import { ChevronDown } from 'lucide-react';
|
|
|
|
import { SitePageHeader } from '~/(marketing)/_components/site-page-header';
|
|
import { createI18nServerInstance } from '~/lib/i18n/i18n.server';
|
|
import { withI18n } from '~/lib/i18n/with-i18n';
|
|
|
|
export const generateMetadata = async () => {
|
|
const { t } = await createI18nServerInstance();
|
|
|
|
return {
|
|
title: t('marketing:faq'),
|
|
};
|
|
};
|
|
|
|
async function FAQPage() {
|
|
const { t } = await createI18nServerInstance();
|
|
|
|
// replace this content
|
|
// with translations
|
|
const faqItems = [
|
|
{
|
|
question: `Do you offer a free trial?`,
|
|
answer: `Yes, we offer a 14-day free trial. You can cancel at any time during the trial period and you won't be charged.`,
|
|
},
|
|
{
|
|
question: `Can I cancel my subscription?`,
|
|
answer: `You can cancel your subscription at any time. You can do this from your account settings.`,
|
|
},
|
|
{
|
|
question: `Where can I find my invoices?`,
|
|
answer: `You can find your invoices in your account settings.`,
|
|
},
|
|
{
|
|
question: `What payment methods do you accept?`,
|
|
answer: `We accept all major credit cards and PayPal.`,
|
|
},
|
|
{
|
|
question: `Can I upgrade or downgrade my plan?`,
|
|
answer: `Yes, you can upgrade or downgrade your plan at any time. You can do this from your account settings.`,
|
|
},
|
|
{
|
|
question: `Do you offer discounts for non-profits?`,
|
|
answer: `Yes, we offer a 50% discount for non-profits. Please contact us to learn more.`,
|
|
},
|
|
];
|
|
|
|
const structuredData = {
|
|
'@context': 'https://schema.org',
|
|
'@type': 'FAQPage',
|
|
mainEntity: faqItems.map((item) => {
|
|
return {
|
|
'@type': 'Question',
|
|
name: item.question,
|
|
acceptedAnswer: {
|
|
'@type': 'Answer',
|
|
text: item.answer,
|
|
},
|
|
};
|
|
}),
|
|
};
|
|
|
|
return (
|
|
<div>
|
|
<script
|
|
key={'ld:json'}
|
|
type="application/ld+json"
|
|
dangerouslySetInnerHTML={{ __html: JSON.stringify(structuredData) }}
|
|
/>
|
|
|
|
<div className={'container mx-auto'}>
|
|
<div className={'flex flex-col space-y-16'}>
|
|
<SitePageHeader
|
|
title={t('marketing:faq')}
|
|
subtitle={t('marketing:faqSubtitle')}
|
|
/>
|
|
|
|
<div
|
|
className={
|
|
'm-auto flex w-full max-w-xl items-center justify-center'
|
|
}
|
|
>
|
|
<div className="flex w-full flex-col">
|
|
{faqItems.map((item, index) => {
|
|
return <FaqItem key={index} item={item} />;
|
|
})}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
export default withI18n(FAQPage);
|
|
|
|
function FaqItem({
|
|
item,
|
|
}: React.PropsWithChildren<{
|
|
item: {
|
|
question: string;
|
|
answer: string;
|
|
};
|
|
}>) {
|
|
return (
|
|
<details className={'group border-b px-2 py-4'}>
|
|
<summary
|
|
className={
|
|
'flex items-center justify-between hover:cursor-pointer hover:underline'
|
|
}
|
|
>
|
|
<h2
|
|
className={
|
|
'hover:underline-none cursor-pointer font-sans text-lg font-medium'
|
|
}
|
|
>
|
|
{item.question}
|
|
</h2>
|
|
|
|
<div>
|
|
<ChevronDown
|
|
className={'h-5 transition duration-300 group-open:-rotate-180'}
|
|
/>
|
|
</div>
|
|
</summary>
|
|
|
|
<div
|
|
className={'flex flex-col space-y-2 py-1 text-muted-foreground'}
|
|
dangerouslySetInnerHTML={{ __html: item.answer }}
|
|
/>
|
|
</details>
|
|
);
|
|
}
|