From 2319ed72db53859c9bd2acafc26e4024cc2c43f4 Mon Sep 17 00:00:00 2001 From: Sol Irvine <sol@zenzen.io> Date: Mon, 14 Aug 2023 14:33:42 +0900 Subject: [PATCH] wip: Saving work --- app/[lang]/favicon.ico | Bin 15086 -> 0 bytes app/[lang]/layout.tsx | 19 +++++++++------- app/[lang]/page.tsx | 7 ++---- app/context/language-context.tsx | 7 +++++- components/grid/three-items.tsx | 18 +++++++-------- components/grid/tile.tsx | 2 +- components/icons/namemark.tsx | 34 +++++++++++++++++++++++++++ components/label.tsx | 24 +++++++++++++------ components/layout/menu/modal.tsx | 38 +++++++++++++++---------------- dictionaries/en.json | 12 +++++++--- dictionaries/ja.json | 12 +++++++--- lib/shopify/fragments/product.ts | 3 +++ lib/shopify/types.ts | 3 +++ tailwind.config.js | 2 +- 14 files changed, 124 insertions(+), 57 deletions(-) delete mode 100644 app/[lang]/favicon.ico create mode 100644 components/icons/namemark.tsx diff --git a/app/[lang]/favicon.ico b/app/[lang]/favicon.ico deleted file mode 100644 index dc7d8431e47ee24c71eebaffe30786769b348353..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 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 Cr`cHm diff --git a/app/[lang]/layout.tsx b/app/[lang]/layout.tsx index 49c86e089..20fbbfd69 100644 --- a/app/[lang]/layout.tsx +++ b/app/[lang]/layout.tsx @@ -4,6 +4,7 @@ import localFont from 'next/font/local'; import { ReactNode, Suspense } from 'react'; import { LanguageProvider } from 'app/context/language-context'; +import { getDictionary } from 'dictionaries'; import './globals.css'; const { TWITTER_CREATOR, TWITTER_SITE, SITE_NAME } = process.env; @@ -38,12 +39,6 @@ const cinzel = localFont({ variable: '--font-cinzel' }); -const mincho = localFont({ - src: '../fonts/A-OTF-A1MinchoStd-Bold.otf', - display: 'swap', - variable: '--font-cinzel' -}); - const alpina = localFont({ src: [ { @@ -60,6 +55,12 @@ const alpina = localFont({ variable: '--font-alpina' }); +const mincho = localFont({ + src: '../fonts/A-OTF-A1MinchoStd-Bold.otf', + display: 'swap', + variable: '--font-mincho' +}); + export async function generateStaticParams() { return i18n.locales.map((locale) => ({ lang: locale })); } @@ -69,13 +70,15 @@ export default async function RootLayout({ params }: { children: ReactNode; - params: { lang: string }; + params: { lang: Locale }; }) { + const dictionary = await getDictionary(params?.lang); + return ( <html lang={params.lang} className={`${cinzel.variable} ${alpina.variable} ${mincho.variable}`}> <body className="bg-dark text-white selection:bg-green-800 selection:text-green-400"> <div className="mx-auto max-w-screen-2xl"> - <LanguageProvider language={params.lang as Locale}> + <LanguageProvider language={params.lang as Locale} dictionary={dictionary}> <Navbar /> <Suspense> <main>{children}</main> diff --git a/app/[lang]/page.tsx b/app/[lang]/page.tsx index 3f6d51aa6..1db45240c 100644 --- a/app/[lang]/page.tsx +++ b/app/[lang]/page.tsx @@ -4,8 +4,7 @@ import Footer from 'components/layout/footer'; import { LanguageControl } from 'components/layout/navbar/language-control'; import type { Locale } from '../../i18n-config'; -import Image from 'next/image'; -import Namemark from 'public/assets/images/namemark.png'; +import LogoNamemark from 'components/icons/namemark'; import { Suspense } from 'react'; export const runtime = 'edge'; @@ -20,15 +19,13 @@ export const metadata = { }; export default async function HomePage({ params: { lang } }: { params: { lang: Locale } }) { - // const dictionary = await getDictionary(lang); - return ( <> <div className="invisible absolute right-40 top-12 md:visible"> <LanguageControl lang={lang} /> </div> <div className="px-6 pb-12 pt-6 md:pb-48 md:pl-6 md:pt-12"> - <Image src={Namemark} alt="suginomori brewery" className="max-w-[260px] md:max-w-[600px]" /> + <LogoNamemark className="w-[260px] fill-current md:w-[600px]" /> </div> <ThreeItemGrid lang={lang} /> <Suspense> diff --git a/app/context/language-context.tsx b/app/context/language-context.tsx index 5f31007d7..fd80929d7 100644 --- a/app/context/language-context.tsx +++ b/app/context/language-context.tsx @@ -6,24 +6,29 @@ import { ReactNode, createContext, useContext, useState } from 'react'; interface IContextProps { currentLanguage?: Locale; setCurrentLanguage: (language: Locale) => void; + currentDictionary?: any; } export const LanguageContext = createContext<IContextProps>({} as IContextProps); export function LanguageProvider({ language, + dictionary, children }: { language: Locale; + dictionary?: any; children: ReactNode | ReactNode[] | string; }) { const [currentLanguage, setCurrentLanguage] = useState<Locale>(language || 'en'); + const [currentDictionary] = useState<any | undefined>(dictionary); return ( <LanguageContext.Provider value={{ currentLanguage, - setCurrentLanguage + setCurrentLanguage, + currentDictionary }} > {children} diff --git a/components/grid/three-items.tsx b/components/grid/three-items.tsx index 04fac5b76..df539ed89 100644 --- a/components/grid/three-items.tsx +++ b/components/grid/three-items.tsx @@ -1,36 +1,35 @@ import clsx from 'clsx'; -import { GridTileImage } from 'components/grid/tile'; import { Locale } from 'i18n-config'; import { getCollectionProducts } from 'lib/shopify'; import type { Product } from 'lib/shopify/types'; import Link from 'next/link'; import Label from '../label'; +import { GridTileImage } from './tile'; function ThreeItemGridItem({ item, priority }: { item: Product; priority?: boolean }) { + const size = item?.variants?.[0]?.selectedOptions?.find((option) => option.name === 'size'); return ( - <div className={clsx('md:col-span-2 md:row-span-1')}> + <div className={clsx('col-span-1 row-span-1 md:col-span-2 md:row-span-1')}> <Link - className="relative block aspect-bottle h-full w-full overflow-hidden bg-black/30" + className="relative block aspect-tall w-full overflow-hidden bg-black/30" href={`/product/${item.handle}`} > <GridTileImage src={item.featuredImage.url} - height={1690} - width={1192} fill sizes={'(min-width: 768px) 33vw, 100vw'} priority={priority} alt={item.title} - className="h-full w-full object-cover" /> </Link> - <div className="font-multingual max-w-sm pt-4"> + <div className="font-multilingual max-w-sm pt-4"> <Label title={item.title as string} amount={item.priceRange.maxVariantPrice.amount} currencyCode={item.priceRange.maxVariantPrice.currencyCode} + size={size?.value} /> - <div className="line-clamp-4 pt-2">{item?.description}</div> + <div className="font-regular line-clamp-4 pt-2">{item?.summary?.value}</div> </div> </div> ); @@ -52,7 +51,8 @@ export async function ThreeItemGrid({ lang }: { lang: Locale }) { return ( <section className={clsx( - 'mx-auto grid max-w-screen-2xl gap-6 px-4 pb-4 md:grid-cols-6', + 'mx-auto grid max-w-screen-2xl gap-6 px-4 pb-4 ', + 'grid-cols-1 md:grid-cols-6', 'grid-rows-3 md:grid-rows-1' )} > diff --git a/components/grid/tile.tsx b/components/grid/tile.tsx index 1b24cb438..4729255bc 100644 --- a/components/grid/tile.tsx +++ b/components/grid/tile.tsx @@ -20,7 +20,7 @@ export function GridTileImage({ {props.src ? ( // eslint-disable-next-line jsx-a11y/alt-text -- `alt` is inherited from `props`, which is being enforced with TypeScript <Image - className={clsx('h-full w-full object-contain', { + className={clsx('h-full w-full object-cover', { 'transition duration-300 ease-in-out hover:scale-105': isInteractive })} {...props} diff --git a/components/icons/namemark.tsx b/components/icons/namemark.tsx new file mode 100644 index 000000000..4eca417a3 --- /dev/null +++ b/components/icons/namemark.tsx @@ -0,0 +1,34 @@ +import clsx from 'clsx'; + +export default function LogoNamemark(props: React.ComponentProps<'svg'>) { + return ( + <svg + xmlns="http://www.w3.org/2000/svg" + xmlnsXlink="http://www.w3.org/1999/xlink" + fill="none" + viewBox="0 0 300 99" + className={clsx(props?.className || 'h-10 w-10 fill-current')} + > + <g clipPath="url(#clip0_1_7)"> + <rect width="300" height="99" fill="url(#pattern0)" /> + </g> + <defs> + <pattern id="pattern0" patternContentUnits="objectBoundingBox" width="1" height="1"> + <use + xlinkHref="#image0_1_7" + transform="matrix(0.00102848 0 0 0.0031173 -0.672667 -0.209479)" + /> + </pattern> + <clipPath id="clip0_1_7"> + <rect width="300" height="99" fill="white" /> + </clipPath> + <image + id="image0_1_7" + width="1627" + height="418" + xlinkHref="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABlsAAAGiCAYAAABgaXC/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAF0mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDEgNzkuYzAyMDRiMmRlZiwgMjAyMy8wMi8wMi0xMjoxNDoyNCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjUgKE1hY2ludG9zaCkiIHhtcDpDcmVhdGVEYXRlPSIyMDIzLTA2LTIyVDIyOjM0OjA2KzA5OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMy0wNi0yMlQyMzoxNDoyOSswOTowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyMy0wNi0yMlQyMzoxNDoyOSswOTowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MzQxODc1YTctNzRlMS00NzA4LThkM2UtYzA2NjNhNTk5NzgxIiB4bXBNTTpEb2N1bWVu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" + /> + </defs> + </svg> + ); +} diff --git a/components/label.tsx b/components/label.tsx index 287a0fd41..3d92faf1d 100644 --- a/components/label.tsx +++ b/components/label.tsx @@ -4,22 +4,32 @@ import Price from './price'; const Label = ({ title, amount, - currencyCode + currencyCode, + size }: { title: string; amount: string; currencyCode: string; + size?: string; }) => { return ( <div className={clsx('@container/label')}> <div className="font-multilingual flex flex-col space-y-2"> <h3 className="mr-4 line-clamp-2 flex-grow text-3xl">{title}</h3> - <Price - className="flex-none" - amount={amount} - currencyCode={currencyCode} - currencyCodeClassName="hidden @[275px]/label:inline" - /> + <div className="flex flex-row items-center space-x-2"> + <Price + className="flex-none" + amount={amount} + currencyCode={currencyCode} + currencyCodeClassName="hidden @[275px]/label:inline" + /> + {!!size && ( + <> + <div>/</div> + <div>{size}</div> + </> + )} + </div> </div> </div> ); diff --git a/components/layout/menu/modal.tsx b/components/layout/menu/modal.tsx index 7e869f570..78c4d4711 100644 --- a/components/layout/menu/modal.tsx +++ b/components/layout/menu/modal.tsx @@ -9,7 +9,7 @@ import { Fragment, useRef, useState } from 'react'; import { LanguageControl } from '../navbar/language-control'; export function MenuModal() { - const { currentLanguage } = useLanguage(); + const { currentLanguage, currentDictionary } = useLanguage(); let [isOpen, setIsOpen] = useState(false); let closeButtonRef = useRef(null); @@ -43,17 +43,6 @@ export function MenuModal() { > <div className="fixed inset-0 z-20" /> </Transition.Child> - <Transition.Child as={Fragment}> - <div className="fixed right-5 top-6 z-40 px-2 py-1 md:top-11"> - <div className="flex flex-row space-x-6"> - <LanguageControl lang={currentLanguage} /> - - <button ref={closeButtonRef} onClick={close} className=""> - <CloseIcon className="h-10 w-10 stroke-current transition-opacity duration-150 hover:opacity-50" /> - </button> - </div> - </div> - </Transition.Child> <Transition.Child as={Fragment} @@ -66,6 +55,16 @@ export function MenuModal() { > <div className="fixed inset-0 z-30 backdrop-blur-sm"> <Dialog.Panel> + <div className="fixed right-5 top-6 z-40 px-2 py-1 md:top-11"> + <div className="flex flex-row space-x-6"> + <LanguageControl lang={currentLanguage} /> + + <button ref={closeButtonRef} onClick={close} className=""> + <CloseIcon className="h-10 w-10 stroke-current transition-opacity duration-150 hover:opacity-50" /> + </button> + </div> + </div> + <div className="fixed inset-0 grid grid-cols-1 place-content-center bg-dark/80"> <div className="flex flex-row justify-end"> <div className="flex flex-col space-y-4 px-6 text-right"> @@ -74,7 +73,7 @@ export function MenuModal() { href="/products" className="font-serif text-4xl font-normal transition-opacity duration-150 hover:opacity-50" > - products + {currentDictionary?.menu?.products} </Link> </div> @@ -83,7 +82,7 @@ export function MenuModal() { href="/shops" className="font-serif text-4xl font-normal transition-opacity duration-150 hover:opacity-50" > - shop list + {currentDictionary?.menu?.shops} </Link> </div> @@ -92,7 +91,7 @@ export function MenuModal() { href="/about" className="font-serif text-4xl font-normal transition-opacity duration-150 hover:opacity-50" > - about narai + {currentDictionary?.menu?.about} </Link> </div> @@ -101,7 +100,7 @@ export function MenuModal() { href="/bar" className="font-serif text-4xl font-normal transition-opacity duration-150 hover:opacity-50" > - sagyobar + {currentDictionary?.menu?.bar} </Link> </div> @@ -110,7 +109,7 @@ export function MenuModal() { href="/concept" className="font-serif text-4xl font-normal transition-opacity duration-150 hover:opacity-50" > - concept + {currentDictionary?.menu?.concept} </Link> </div> @@ -119,7 +118,7 @@ export function MenuModal() { href="/stories" className="font-serif text-4xl font-normal transition-opacity duration-150 hover:opacity-50" > - stories + {currentDictionary?.menu?.stories} </Link> </div> @@ -128,7 +127,7 @@ export function MenuModal() { href="/company" className="font-serif text-4xl font-normal transition-opacity duration-150 hover:opacity-50" > - company + {currentDictionary?.menu?.company} </Link> </div> @@ -137,6 +136,7 @@ export function MenuModal() { href="/contact" className="font-serif text-4xl font-normal transition-opacity duration-150 hover:opacity-50" > + {currentDictionary?.menu?.contact} contact </Link> </div> diff --git a/dictionaries/en.json b/dictionaries/en.json index 250e9f084..ddb07fdf7 100644 --- a/dictionaries/en.json +++ b/dictionaries/en.json @@ -1,6 +1,12 @@ { - "hello": { - "title": "Hello World", - "description": "This is a description" + "menu": { + "products": "products", + "shops": "shop list", + "about": "about narai", + "bar": "sagyobar", + "concept": "concept", + "stories": "stories", + "company": "company", + "contact": "contact" } } diff --git a/dictionaries/ja.json b/dictionaries/ja.json index 63ac1ad5f..d064af1de 100644 --- a/dictionaries/ja.json +++ b/dictionaries/ja.json @@ -1,6 +1,12 @@ { - "hello": { - "title": "こんにちは", - "description": "これはせつめいですよ" + "menu": { + "products": "商品", + "shops": "取り扱い店", + "about": "naraiについて", + "bar": "sagyobar", + "concept": "コンセプト", + "stories": "ストーリー", + "company": "会社概要", + "contact": "contact" } } diff --git a/lib/shopify/fragments/product.ts b/lib/shopify/fragments/product.ts index be14dedca..0d37d1627 100644 --- a/lib/shopify/fragments/product.ts +++ b/lib/shopify/fragments/product.ts @@ -9,6 +9,9 @@ const productFragment = /* GraphQL */ ` title description descriptionHtml + summary: metafield(namespace: "custom", key: "product_summary") { + value + } options { id name diff --git a/lib/shopify/types.ts b/lib/shopify/types.ts index b51ab3e30..2a7479067 100644 --- a/lib/shopify/types.ts +++ b/lib/shopify/types.ts @@ -115,6 +115,9 @@ export type ShopifyProduct = { title: string; description: string; descriptionHtml: string; + summary: { + value: string; + }; options: ProductOption[]; priceRange: { maxVariantPrice: Money; diff --git a/tailwind.config.js b/tailwind.config.js index b3297fe32..7f686e8df 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -15,7 +15,7 @@ module.exports = { japan: ['var(--font-mincho)', 'sans-serif'] }, aspectRatio: { - bottle: '1.11' + tall: '596 / 845' }, keyframes: { fadeIn: {