wip: Add legal

This commit is contained in:
Sol Irvine
2023-08-21 09:25:30 +09:00
parent 9fc2c779e3
commit 7002f0fd0f
13 changed files with 1192 additions and 22 deletions

View File

@@ -0,0 +1,115 @@
'use client';
import { useTranslations } from 'next-intl';
import Link from 'next/link';
export default function Disclosures() {
const t = useTranslations('Index');
return (
<>
<div className="mx-auto font-serif">
<h4 className="mx-auto max-w-4xl text-2xl font-extrabold tracking-tight sm:text-3xl">
{t('disclosurePage.title')}
</h4>
<div className="mx-auto max-w-4xl">
<div className="font-multilingual my-12 text-lg">
<section className="font-multilingual mb-36 mt-12 flex flex-col space-y-6 text-lg md:space-y-3">
<div className="flex flex-col space-y-2 md:flex-row md:space-x-3 md:space-y-0">
<div className="md:w-1/3">{t('disclosurePage.distributor.label')}</div>
<div className="md:w-2/3">
<div>{t('disclosurePage.distributor.value')}</div>
</div>
</div>
<div className="flex flex-col space-y-2 md:flex-row md:space-x-3 md:space-y-0">
<div className="md:w-1/3">{t('disclosurePage.representative.label')}</div>
<div className="md:w-2/3">
<div>{t('disclosurePage.representative.value')}</div>
</div>
</div>
<div className="flex flex-col space-y-2 md:flex-row md:space-x-3 md:space-y-0">
<div className="md:w-1/3">{t('disclosurePage.address.label')}</div>
<div className="md:w-2/3">
<div>{t('disclosurePage.address.one')}</div>
<div>{t('disclosurePage.address.two')}</div>
</div>
</div>
<div className="flex flex-col space-y-2 md:flex-row md:space-x-3 md:space-y-0">
<div className="md:w-1/3">{t('disclosurePage.phone.label')}</div>
<div className="md:w-2/3">
<div>{t('disclosurePage.phone.value')}</div>
</div>
</div>
<div className="flex flex-col space-y-2 md:flex-row md:space-x-3 md:space-y-0">
<div className="md:w-1/3">{t('disclosurePage.email.label')}</div>
<div className="md:w-2/3">
<Link
href={`mailto:${t('disclosurePage.homepage.value')}`}
className="transition-opacity duration-150 hover:opacity-90"
>
<div>{t('disclosurePage.email.value')}</div>
</Link>
</div>
</div>
<div className="flex flex-col space-y-2 md:flex-row md:space-x-3 md:space-y-0">
<div className="md:w-1/3">
<div>{t('disclosurePage.homepage.label')}</div>
</div>
<div className="md:w-2/3">
<div></div>
<Link
href={t('disclosurePage.homepage.value')}
className="transition-opacity duration-150 hover:opacity-90"
>
{t('disclosurePage.homepage.value')}
</Link>
</div>
</div>
<div className="flex flex-col space-y-2 md:flex-row md:space-x-3 md:space-y-0">
<div className="md:w-1/3">{t('disclosurePage.price.label')}</div>
<div className="md:w-2/3">
<div>{t('disclosurePage.price.value')}</div>
</div>
</div>
<div className="flex flex-col space-y-2 md:flex-row md:space-x-3 md:space-y-0">
<div className="md:w-1/3">{t('disclosurePage.otherCharges.label')}</div>
<div className="md:w-2/3">
<div>{t('disclosurePage.otherCharges.value')}</div>
</div>
</div>
<div className="flex flex-col space-y-2 md:flex-row md:space-x-3 md:space-y-0">
<div className="md:w-1/3">{t('disclosurePage.paymentMethod.label')}</div>
<div className="md:w-2/3">
<div>{t('disclosurePage.paymentMethod.value')}</div>
</div>
</div>
<div className="flex flex-col space-y-2 md:flex-row md:space-x-3 md:space-y-0">
<div className="md:w-1/3">{t('disclosurePage.paymentPeriod.label')}</div>
<div className="md:w-2/3">
<div>{t('disclosurePage.paymentPeriod.value')}</div>
</div>
</div>
<div className="flex flex-col space-y-2 md:flex-row md:space-x-3 md:space-y-0">
<div className="md:w-1/3">{t('disclosurePage.delivery.label')}</div>
<div className="md:w-2/3">
<div>{t('disclosurePage.delivery.value')}</div>
</div>
</div>
<div className="flex flex-col space-y-2 md:flex-row md:space-x-3 md:space-y-0">
<div className="md:w-1/3">{t('disclosurePage.returnsAndExchanges.label')}</div>
<div className="md:w-2/3">
<div>{t('disclosurePage.returnsAndExchanges.one')}</div>
<div className="pt-4">{t('disclosurePage.returnsAndExchanges.two')}</div>
</div>
</div>
<div className="pt-8">
<Link href="/" className="transition-opacity duration-150 hover:opacity-90">
{t('disclosurePage.return')}
</Link>
</div>
</section>
</div>
</div>
</div>
</>
);
}

View File

@@ -0,0 +1,45 @@
import Footer from 'components/layout/footer';
import { SupportedLocale } from 'components/layout/navbar/language-control';
import Navbar from 'components/layout/navbar';
import { getCart } from 'lib/shopify';
import { cookies } from 'next/headers';
import { Suspense } from 'react';
import Disclosures from './disclosures';
export const runtime = 'edge';
const { SITE_NAME } = process.env;
export const metadata = {
title: SITE_NAME,
description: SITE_NAME,
openGraph: {
type: 'website'
}
};
export default async function DisclosuresPage({
params: { locale }
}: {
params: { locale?: SupportedLocale };
}) {
const cartId = cookies().get('cartId')?.value;
let cart;
if (cartId) {
cart = await getCart(cartId);
}
return (
<div>
<Navbar cart={cart} locale={locale} compact />
<div className="py-24 md:py-48">
<Disclosures />
</div>
<Suspense>
<Footer cart={cart} />
</Suspense>
</div>
);
}

View File

@@ -0,0 +1,45 @@
import Footer from 'components/layout/footer';
import { SupportedLocale } from 'components/layout/navbar/language-control';
import Navbar from 'components/layout/navbar';
import { getCart } from 'lib/shopify';
import { cookies } from 'next/headers';
import { Suspense } from 'react';
import PrivacyPolicy from './privacy-policy';
export const runtime = 'edge';
const { SITE_NAME } = process.env;
export const metadata = {
title: SITE_NAME,
description: SITE_NAME,
openGraph: {
type: 'website'
}
};
export default async function PrivacyPage({
params: { locale }
}: {
params: { locale?: SupportedLocale };
}) {
const cartId = cookies().get('cartId')?.value;
let cart;
if (cartId) {
cart = await getCart(cartId);
}
return (
<div>
<Navbar cart={cart} locale={locale} compact />
<div className="py-24 md:py-48">
<PrivacyPolicy />
</div>
<Suspense>
<Footer cart={cart} />
</Suspense>
</div>
);
}

View File

@@ -0,0 +1,168 @@
'use client';
import { useTranslations } from 'next-intl';
export default function PrivacyPolicy() {
const t = useTranslations('Index');
return (
<>
<div className="mx-auto max-w-3xl text-white">
<div className="md:text-4x text-center font-serif text-3xl font-bold leading-tight text-white md:mb-16">
{t('privacy.title')}
</div>
<div className="mb-24 text-lg leading-normal">
<div className="text-sb-highlight text-center">{t('privacy.lastModifiedDate')}</div>
<div className="mt-4">
<p>{t('privacy.pleaseRead')}</p>
<p className="mt-4">{t('privacy.usedFor')}</p>
</div>
<div className="my-8 text-center font-serif text-xl font-bold text-white md:my-12 md:text-2xl">
{t('privacy.definitions.title')}
</div>
<div>
<p>{t('privacy.definitions.capitalizedTerms')}</p>
<p className="mt-4">{t('privacy.definitions.affiliate')}</p>
<p className="mt-4">{t('privacy.definitions.account')}</p>
<p className="mt-4">{t('privacy.definitions.company')}</p>
<p className="mt-4">{t('privacy.definitions.cookies')}</p>
<p className="mt-4">{t('privacy.definitions.country')}</p>
<p className="mt-4">{t('privacy.definitions.dataController')}</p>
<p className="mt-4">{t('privacy.definitions.device')}</p>
<p className="mt-4">{t('privacy.definitions.doNotTrack')}</p>
<p className="mt-4">{t('privacy.definitions.personalData')}</p>
<p className="mt-4">{t('privacy.definitions.service')}</p>
<p className="mt-4">{t('privacy.definitions.serviceProvider')}</p>
<p className="mt-4">{t('privacy.definitions.site')}</p>
<p className="mt-4">{t('privacy.definitions.socialMedia')}</p>
<p className="mt-4">{t('privacy.definitions.usageData')}</p>
<p className="mt-4">{t('privacy.definitions.you')}</p>
</div>
<div className="my-8 text-center font-serif text-xl font-bold text-white md:my-12 md:text-2xl">
{t('privacy.collectingAndUsing.title')}
</div>
<div>
<p>{t('privacy.collectingAndUsing.inScope')}</p>
</div>
<div className="my-8 text-center font-serif text-xl font-bold text-white md:my-12 md:text-2xl">
{t('privacy.usageData.title')}
</div>
<div>
<p>{t('privacy.usageData.deviceInfo')}</p>
<p className="mt-4">{t('privacy.usageData.mobileInfo')}</p>
<p className="mt-4">{t('privacy.usageData.deviceInfo')}</p>
</div>
<div className="my-8 text-center font-serif text-xl font-bold text-white md:my-12 md:text-2xl">
{t('privacy.cookies.title')}
</div>
<div>
<p>{t('privacy.cookies.trackers')}</p>
<p className="mt-4">{t('privacy.cookies.doNotAccept')}</p>
</div>
<div className="my-8 text-center font-serif text-xl font-bold text-white md:my-12 md:text-2xl">
{t('privacy.personal.title')}
</div>
<div>
<p>{t('privacy.personal.usage.intro')}</p>
<ul className="list-disc pl-6">
<li className="mt-4">{t('privacy.personal.usage.maintain')}</li>
<li className="mt-4">{t('privacy.personal.usage.performance')}</li>
<li className="mt-4">{t('privacy.personal.usage.contact')}</li>
<li className="mt-4">{t('privacy.personal.usage.requests')}</li>
</ul>
<p className="mt-8">{t('privacy.personal.sharing.title')}</p>
<ul className="list-disc pl-6">
<li className="mt-4">{t('privacy.personal.sharing.monitor')}</li>
<li className="mt-4">{t('privacy.personal.sharing.merger')}</li>
<li className="mt-4">{t('privacy.personal.sharing.affiliates')}</li>
<li className="mt-4">{t('privacy.personal.sharing.businessPartners')}</li>
<li className="mt-4">{t('privacy.personal.sharing.socialMedia')}</li>
</ul>
</div>
<div className="my-8 text-center font-serif text-xl font-bold text-white md:my-12 md:text-2xl">
{t('privacy.personal.retention.title')}
</div>
<div>
<p>{t('privacy.personal.retention.asNecessary')}</p>
<p className="mt-4">{t('privacy.personal.retention.internalAnalysis')}</p>
</div>
<div className="my-8 text-center font-serif text-xl font-bold text-white md:my-12 md:text-2xl">
{t('privacy.personal.transfer.title')}
</div>
<div>
<p>{t('privacy.personal.transfer.transborder')}</p>
</div>
<div className="my-8 text-center font-serif text-xl font-bold text-white md:my-12 md:text-2xl">
{t('privacy.personal.disclosure.title')}
</div>
<div>
<p>{t('privacy.personal.disclosure.merger')}</p>
<p className="mt-4">{t('privacy.personal.disclosure.mandatory')}</p>
<p className="mt-4">{t('privacy.personal.disclosure.goodFaith')}</p>
<p className="mt-4">{t('privacy.personal.disclosure.noGuarantee')}</p>
</div>
<div className="my-8 text-center font-serif text-xl font-bold text-white md:my-12 md:text-2xl">
{t('privacy.personal.processing.title')}
</div>
<div>
<p>{t('privacy.personal.processing.limitedUse')}</p>
<p className="mt-4">{t('privacy.personal.processing.thirdParties.intro')}</p>
<ul className="list-disc pl-6">
<li className="mt-4">{t('privacy.personal.processing.thirdParties.monitor')}</li>
<li className="mt-4">{t('privacy.personal.processing.thirdParties.marketing')}</li>
<li className="mt-4">{t('privacy.personal.processing.thirdParties.services')}</li>
<li className="mt-4">{t('privacy.personal.processing.thirdParties.protection')}</li>
<li className="mt-4">{t('privacy.personal.processing.thirdParties.ads')}</li>
<li className="mt-4">{t('privacy.personal.processing.thirdParties.liability')}</li>
</ul>
<p className="mt-4">{t('privacy.personal.processing.creditCards')}</p>
<p className="mt-4">{t('privacy.personal.processing.cookies')}</p>
</div>
<div className="my-8 text-center font-serif text-xl font-bold text-white md:my-12 md:text-2xl">
{t('privacy.personal.mobile.title')}
</div>
<div>
<p>{t('privacy.personal.mobile.optOut')}</p>
</div>
<div className="my-8 text-center font-serif text-xl font-bold text-white md:my-12 md:text-2xl">
{t('privacy.personal.doNotTrack.title')}
</div>
<div>
<p>{t('privacy.personal.doNotTrack.noResponse')}</p>
<p className="mt-4">{t('privacy.personal.doNotTrack.browser')}</p>
</div>
<div className="my-8 text-center font-serif text-xl font-bold text-white md:my-12 md:text-2xl">
{t('privacy.personal.links.title')}
</div>
<div>
<p>{t('privacy.personal.links.external')}</p>
<p className="mt-4">{t('privacy.personal.links.disclaimer')}</p>
</div>
<div className="my-8 text-center font-serif text-xl font-bold text-white md:my-12 md:text-2xl">
{t('privacy.changes.title')}
</div>
<div>
<p>{t('privacy.changes.updates')}</p>
<p className="mt-4">{t('privacy.changes.review')}</p>
</div>
<div className="my-8 text-center font-serif text-xl font-bold text-white md:my-12 md:text-2xl">
{t('privacy.contactUs.title')}
</div>
<div>
<p>
{t('privacy.contactUs.questions')}{' '}
<a
href={`mailto:${t('email-address.support')}`}
className="hover:text-green-600"
aria-label={t('privacy.contactUs.ariaLabel')}
>
{t('email-address.support')}
</a>
</p>
</div>
</div>
</div>
</>
);
}

View File

@@ -2,7 +2,7 @@ import Footer from 'components/layout/footer';
import { SupportedLocale } from 'components/layout/navbar/language-control';
import Navbar from 'components/layout/navbar';
import Stories from 'components/layout/stories';
import StoriesDetail from 'components/layout/stories-detail';
import { BLOG_HANDLE } from 'lib/constants';
import { getCart } from 'lib/shopify';
import { cookies } from 'next/headers';
@@ -35,7 +35,7 @@ export default async function StoriesPage({
<div>
<Navbar cart={cart} locale={locale} compact />
<div className="py-24 md:py-48">
<Stories handle={BLOG_HANDLE} locale={locale} />
<StoriesDetail handle={BLOG_HANDLE} locale={locale} />
</div>
<Suspense>

View File

@@ -0,0 +1,45 @@
import Footer from 'components/layout/footer';
import { SupportedLocale } from 'components/layout/navbar/language-control';
import Navbar from 'components/layout/navbar';
import { getCart } from 'lib/shopify';
import { cookies } from 'next/headers';
import { Suspense } from 'react';
import TermsOfUse from './terms-of-use';
export const runtime = 'edge';
const { SITE_NAME } = process.env;
export const metadata = {
title: SITE_NAME,
description: SITE_NAME,
openGraph: {
type: 'website'
}
};
export default async function TermsPage({
params: { locale }
}: {
params: { locale?: SupportedLocale };
}) {
const cartId = cookies().get('cartId')?.value;
let cart;
if (cartId) {
cart = await getCart(cartId);
}
return (
<div>
<Navbar cart={cart} locale={locale} compact />
<div className="py-24 md:py-48">
<TermsOfUse />
</div>
<Suspense>
<Footer cart={cart} />
</Suspense>
</div>
);
}

View File

@@ -0,0 +1,145 @@
'use client';
import { useTranslations } from 'next-intl';
export default function TermsOfUse() {
const t = useTranslations('Index');
return (
<>
<div className="mx-auto max-w-3xl text-white">
<div className="text-center font-serif text-2xl font-bold leading-tight text-white md:mb-16 md:text-4xl">
{t('terms.title')}
</div>
<div className="mb-24 text-lg leading-normal">
<div className="mt-4 text-center">{t('terms.pleaseRead')}</div>
<div className="my-8 text-center font-serif text-xl font-bold text-white md:my-16 md:text-2xl">
{t('terms.definitions.title')}
</div>
<div>
<p>{t('terms.definitions.capitalizedTerms')}</p>
<p className="mt-4">{t('terms.definitions.affiliate')}</p>
<p className="mt-4">{t('terms.definitions.account')}</p>
<p className="mt-4">{t('terms.definitions.company')}</p>
<p className="mt-4">{t('terms.definitions.country')}</p>
<p className="mt-4">{t('terms.definitions.feedback')}</p>
<p className="mt-4">{t('terms.definitions.goods')}</p>
<p className="mt-4">{t('terms.definitions.orders')}</p>
<p className="mt-4">{t('terms.definitions.service')}</p>
<p className="mt-4">{t('terms.definitions.site')}</p>
<p className="mt-4">{t('terms.definitions.socialMedia')}</p>
<p className="mt-4">{t('terms.definitions.you')}</p>
</div>
<div className="my-8 text-center font-serif text-xl font-bold text-white md:my-16 md:text-2xl">
{t('terms.acknowledgment.title')}
</div>
<div>
<p>{t('terms.acknowledgment.intro')}</p>
<p className="mt-4">{t('terms.acknowledgment.acceptance')}</p>
<p className="mt-4">{t('terms.acknowledgment.access')}</p>
<p className="mt-4">{t('terms.acknowledgment.age')}</p>
<p className="mt-4">{t('terms.acknowledgment.privacy')}</p>
</div>
<div className="my-8 text-center font-serif text-xl font-bold text-white md:my-16 md:text-2xl">
{t('terms.orders.title')}
</div>
<div>
<p>{t('terms.orders.contract')}</p>
<p className="mt-4">{t('terms.orders.requiredInfo')}</p>
<p className="mt-4">{t('terms.orders.reps')}</p>
<p className="mt-4">{t('terms.orders.onwardTransfers')}</p>
<p className="mt-4">{t('terms.orders.cancellation')}</p>
<p className="mt-4">{t('terms.orders.returns.policy')}</p>
<p className="mt-4">{t('terms.orders.returns.damagedGoods')}</p>
<p className="mt-4">{t('terms.orders.returns.exceptions.title')}</p>
<ul className="list-disc pl-6">
<li className="mt-4">{t('terms.orders.returns.exceptions.personalized')}</li>
<li className="mt-4">{t('terms.orders.returns.exceptions.expired')}</li>
<li className="mt-4">{t('terms.orders.returns.exceptions.hygiene')}</li>
<li className="mt-4">{t('terms.orders.returns.exceptions.mixed')}</li>
<li className="mt-4">{t('terms.orders.returns.exceptions.digital')}</li>
</ul>
</div>
<div className="my-8 text-center font-serif text-xl font-bold text-white md:my-16 md:text-2xl">
{t('terms.inaccuracies.title')}
</div>
<div>
<p>{t('terms.inaccuracies.errorsPossible')}</p>
<p className="mt-4">{t('terms.inaccuracies.noGuarantees')}</p>
</div>
<div className="my-8 text-center font-serif text-xl font-bold text-white md:my-16 md:text-2xl">
{t('terms.prices.title')}
</div>
<div>
<p>{t('terms.prices.changes')}</p>
<p className="mt-4">{t('terms.prices.payments')}</p>
</div>
<div className="my-8 text-center font-serif text-xl font-bold text-white md:my-16 md:text-2xl">
{t('terms.promotions.title')}
</div>
<div>
<p>{t('terms.promotions.conflicts')}</p>
</div>
<div className="my-8 text-center font-serif text-xl font-bold text-white md:my-16 md:text-2xl">
{t('terms.ip.title')}
</div>
<div>
<p>{t('terms.ip.ownership')}</p>
<p className="mt-4">{t('terms.ip.protections')}</p>
<p className="mt-4">{t('terms.ip.trademarks')}</p>
<p className="mt-4">{t('terms.ip.assignment')}</p>
</div>
<div className="my-8 text-center font-serif text-xl font-bold text-white md:my-16 md:text-2xl">
{t('terms.thirdPartyLinks.title')}
</div>
<div>
<p>{t('terms.thirdPartyLinks.noControl')}</p>
</div>
<div className="my-8 text-center font-serif text-xl font-bold text-white md:my-16 md:text-2xl">
{t('terms.liability.title')}
</div>
<div>
<p>{t('terms.liability.directDamages')}</p>
<p className="mt-4">{t('terms.liability.noSpecialDamages')}</p>
<p className="mt-4">{t('terms.liability.noSpecialDamages')}</p>
</div>
<div className="my-8 text-center font-serif text-xl font-bold text-white md:my-16 md:text-2xl">
{t('terms.disclaimer.title')}
</div>
<div>
<p>{t('terms.disclaimer.asIs')}</p>
<p className="mt-4">{t('terms.disclaimer.conflicts')}</p>
</div>
<div className="my-8 text-center font-serif text-xl font-bold text-white md:my-16 md:text-2xl">
{t('terms.misc.title')}
</div>
<div>
<p>{t('terms.misc.governingLaw')}</p>
<p className="mt-4">{t('terms.misc.severability')}</p>
<p className="mt-4">{t('terms.misc.waiver')}</p>
<p className="mt-4">{t('terms.misc.translation')}</p>
<p className="mt-4">{t('terms.misc.changes')}</p>
</div>
<div className="my-8 text-center font-serif text-xl font-bold text-white md:my-16 md:text-2xl">
{t('terms.contactUs.title')}
</div>
<div className="mb-12">
<p>
{t('terms.contactUs.instructions')}
<a
href={`mailto:${t('email-address.support')}`}
className="branded-link"
aria-label={t('privacy.contactUs.ariaLabel')}
>
{t('email-address.support')}
</a>
.
</p>
</div>
<div>
<div className="text-center font-normal text-white">{t('terms.lastModifiedDate')}</div>
</div>
</div>
</div>
</>
);
}