Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: cocktail card - save to image #7

Merged
merged 28 commits into from
Jan 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
79646c0
feat: template for cocktail card
mildrrnt Jan 3, 2024
fbd2c38
feat: all cocktail cards
mildrrnt Jan 3, 2024
a10037b
feat: added elements
mildrrnt Jan 3, 2024
4629135
feat: html-to-image
mildrrnt Jan 3, 2024
fad247d
refactor: change padding parameters
mildrrnt Jan 5, 2024
780f7cb
feat: change background and box height
mildrrnt Jan 10, 2024
4a8529e
style: apply Prettier
mildrrnt Jan 10, 2024
3855c23
style: spacing
mildrrnt Jan 10, 2024
3139f49
style: spacing
mildrrnt Jan 10, 2024
7ed56b9
style: spacing
mildrrnt Jan 10, 2024
982e424
style: run prettier
mildrrnt Jan 10, 2024
cf43c5b
fix: restore id for downloading
mildrrnt Jan 10, 2024
b2afcd4
refactor: move images to /src
mildrrnt Jan 11, 2024
ccbd0ee
style: format
mildrrnt Jan 11, 2024
8f7b5b4
fix: package.json dependencies
mildrrnt Jan 11, 2024
2162433
style: format
mildrrnt Jan 11, 2024
4c5651f
style: format
mildrrnt Jan 11, 2024
d04c5f2
refactor: overflowing
mildrrnt Jan 12, 2024
85718af
style: format
mildrrnt Jan 12, 2024
41c60e9
Merge branch 'dev' of https://github.com/esc-chula/gearfest-frontend …
mildrrnt Jan 19, 2024
23558e3
fix: image assets
mildrrnt Jan 19, 2024
e29db94
feat: cocktail card layout
mildrrnt Jan 19, 2024
704c82b
fix: background using twMerge
mildrrnt Jan 19, 2024
589f22c
fix: background using twMerge
mildrrnt Jan 19, 2024
c9e1671
style: format
mildrrnt Jan 19, 2024
dc2a4ef
Merge branch 'dev' of https://github.com/esc-chula/gearfest-frontend …
shalluv Jan 22, 2024
4f9f88b
chore: remove dup files
shalluv Jan 22, 2024
cac4cd6
refactor(cards): refactor codes
shalluv Jan 22, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,13 @@
"astro": "^4.0.7",
"clsx": "2.0.0",
"framer-motion": "10.16.16",
"html-to-image": "1.11.11",
"nanostores": "0.9.5",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"sharp": "^0.33.1",
"tailwindcss": "^3.4.0",
"tailwind-merge": "2.2.0",
"typescript": "^5.3.3"
},
"devDependencies": {
Expand Down
27 changes: 27 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file modified src/assets/elements/lavender-lemonade.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/elements/logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/assets/elements/summer-berry-sangria.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
47 changes: 47 additions & 0 deletions src/components/story/ButtonSet.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import { BACKGROUND_BOX, TEXT, type Cocktail } from "@/data/cocktail";
import { cn } from "@/lib/utils";
import * as htmlToImage from "html-to-image";
interface Props extends Cocktail {}

const ButtonSet = ({ variant }: Props): JSX.Element => {
const downloadImage = () => {
const result = document.getElementById("result");
if (!result) return;
htmlToImage.toJpeg(result, { quality: 0.96 }).then(function (dataUrl) {
const link = document.createElement("a");
link.download = "result.jpeg";
link.href = dataUrl;
link.click();
});
};

return (
<div className="relative mx-auto mb-16 mt-2 flex w-64 gap-4" id="buttonset">
<a
href="/"
className={cn(
`flex w-full flex-wrap items-center justify-center gap-4 rounded-3xl border border-rose-200 px-2 py-1.5
text-center font-semibold shadow-md`,
BACKGROUND_BOX[variant],
TEXT[variant]
)}
>
กลับสู่หน้าหลัก
</a>
<button
className={cn(
`flex w-full flex-wrap items-center justify-center gap-2 rounded-3xl border border-rose-200 px-2 py-1.5
text-center font-semibold shadow-md`,
BACKGROUND_BOX[variant],
TEXT[variant]
)}
onClick={downloadImage}
>
<i className="icon-[mdi--download]"></i>
บันทึกรูป
</button>
</div>
);
};

export default ButtonSet;
36 changes: 36 additions & 0 deletions src/components/story/Card.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { useRef, type ReactNode } from "react";

import { cn } from "@/lib/utils";

import { BACKGROUND_BOX, NAME, TEXT, type Cocktail } from "@/data/cocktail";

interface Props extends Cocktail {
children: ReactNode;
img: string;
}

const Card = ({ variant, children, img }: Props) => {
const ref = useRef<HTMLDivElement>(null);

return (
<div
ref={ref}
className={cn(
"border-1 z-10 mt-1 block h-[36rem] w-[22rem] max-w-full items-center justify-center text-pretty rounded-2xl border-[#FFEEE8] px-2 py-2 text-center shadow-md",
BACKGROUND_BOX[variant]
)}
>
<div className="mx-auto h-[35rem] rounded-2xl border border-amber-50 px-3">
<img src={img} className="mx-auto w-[7rem]" />
<h1 className={cn(`pb-2 text-2xl font-bold`, TEXT[variant])}>
{NAME[variant]}
</h1>
<div className="text-pretty pb-4 text-xs font-medium text-mutedbrown">
{children}
</div>
</div>
</div>
);
};

export default Card;
63 changes: 63 additions & 0 deletions src/components/story/FooterDecorator.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
---
import { Image } from "astro:assets";

import Cake1 from "@/assets/elements/cake-1.png";
import Calendar from "@/assets/elements/calendar.png";
import Donut from "@/assets/elements/donut.png";
import Drinks from "@/assets/elements/drinks.png";
import Heart1 from "@/assets/elements/heart-1.png";
import Letter from "@/assets/elements/letter.png";
import Orange from "@/assets/elements/orange.png";
import Palette from "@/assets/elements/palette.png";
import Strawberry from "@/assets/elements/strawberry.png";
---

<div
class="pointer-events-none absolute inset-x-0 -left-[1.25rem] bottom-32 select-none opacity-80"
>
<Image
class="absolute left-0 top-[48px] h-32 w-[152px]"
src={Calendar}
alt=""
/>
<Image
class="absolute left-[471.56px] top-[8.91px] h-[166.91px] w-[140.50px] origin-top-left rotate-[62.88deg]"
src={Palette}
alt=""
/>
<Image
class="absolute left-[193px] top-0 h-[90px] w-24"
src={Heart1}
alt=""
/>
<Image
class="absolute left-[226.20px] top-[15px] h-[105.82px] w-[109.92px] origin-top-left rotate-[1.19deg]"
src={Orange}
alt=""
/>
<Image
class="absolute left-[142px] top-[45px] h-[104px] w-[118px]"
src={Donut}
alt=""
/>
<Image
class="absolute left-[117px] top-[45px] h-[121px] w-[70px]"
src={Drinks}
alt=""
/>
<Image
class="absolute left-[226px] top-[67.43px] h-[115.51px] w-[129.02px] origin-top-left rotate-[-17.79deg]"
src={Letter}
alt=""
/>
<Image
class="absolute left-[207px] top-[69px] h-[88px] w-[88px]"
src={Strawberry}
alt=""
/>
<Image
class="absolute left-[315px] top-[71px] h-[82px] w-[84px]"
src={Cake1}
alt=""
/>
</div>
40 changes: 40 additions & 0 deletions src/data/cocktail.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
export interface Cocktail {
variant: "raspberry" | "cosmo" | "pina" | "gin" | "lagoon" | "lalemon";
}

export const BACKGROUND: Record<Cocktail["variant"], string> = {
raspberry: "bg-raspberry",
cosmo: "bg-cosmo",
pina: "bg-pina",
gin: "bg-gin",
lagoon: "bg-lagoon",
lalemon: "bg-lalemon",
};

export const BACKGROUND_BOX: Record<Cocktail["variant"], string> = {
raspberry: "bg-raspberrybox",
cosmo: "bg-cosmobox",
pina: "bg-pinabox",
gin: "bg-ginbox",
lagoon: "bg-lagoonbox",
lalemon: "bg-lalemonbox",
};

export const TEXT: Record<Cocktail["variant"], string> = {
raspberry: "text-salmon",
cosmo: "text-peach",
pina: "text-pineapple",
gin: "text-leaf",
lagoon: "text-tropical",
lalemon: "text-lavender",
};

export const NAME: Record<Cocktail["variant"], string> = {
raspberry: "Summer Berry Sangria",
cosmo: "Cosmopolitan",
pina: "Pina Colada",
gin: "Gin and Tonic",
lagoon: "Blue Lagoon",
lalemon: "Lavender Lemonade",
};

4 changes: 3 additions & 1 deletion src/layouts/BaseLayout.astro
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
import "@/style.css";
import { ViewTransitions } from "astro:transitions";
interface Props {
pageTitle?: string;
}
Expand All @@ -14,10 +15,11 @@ const { pageTitle = "GearFestival" } = Astro.props;
<meta name="viewport" content="width=device-width" />
<meta name="generator" content={Astro.generator} />
<title>{pageTitle}</title>
<ViewTransitions />
</head>
<body>
<main
class="absolute left-1/2 flex min-h-screen w-full max-w-md -translate-x-1/2 outline-dashed outline-2 outline-black"
class="absolute left-1/2 flex min-h-screen w-full max-w-md -translate-x-1/2 font-sans outline-dashed outline-2 outline-black"
>
<slot />
</main>
Expand Down
34 changes: 34 additions & 0 deletions src/layouts/CocktailCard.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
---
import { Image } from "astro:assets";

import BaseLayout from "@/layouts/BaseLayout.astro";
import Card from "@/components/story/Card";
import ButtonSet from "@/components/story/ButtonSet";
import FooterDecorator from "@/components/story/FooterDecorator.astro";

import Logo from "@/assets/elements/logo.png";
import { BACKGROUND, type Cocktail } from "@/data/cocktail";

interface Props extends Cocktail {
img: string;
}

const { variant, img } = Astro.props;
---

<BaseLayout>
<div
id="result"
class:list={[
"relative flex w-full flex-col items-center justify-center gap-4 overflow-hidden bg-cover bg-repeat pb-16",
BACKGROUND[variant],
]}
>
<Image src={Logo} class="mx-auto mt-8 w-20" alt="" />
<Card client:load variant={variant} img={img}>
<slot />
</Card>
<ButtonSet client:load variant={variant} />
<FooterDecorator />
</div>
</BaseLayout>
6 changes: 6 additions & 0 deletions src/lib/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { clsx, type ClassValue } from "clsx";
import { twMerge } from "tailwind-merge";

export function cn(...args: ClassValue[]) {
return twMerge(clsx(args));
}
26 changes: 26 additions & 0 deletions src/pages/cocktail/bluelagoon.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
---
import CocktailCard from "@/layouts/CocktailCard.astro";
import BlueLagoon from "@/assets/elements/blue-lagoon.png";
---

<CocktailCard variant="lagoon" img={BlueLagoon.src}>
บลู ลากูน – เครื่องดื่มสีสดใสที่เกิดจากการผสมกันระหว่าง
<br />วอดก้า บลูคูราโซ่ และน้ำมะนาว เนื่องด้วยรสชาติที่ให้ความสดชื่น
และสีสันที่สวยงามจึงเป็นเครื่องดื่มที่มักเป็นที่นิยมในงานสังสรรค์
<br /><br />
คุณเปรียบเสมือนค็อกเทลดังกล่าว คุณเป็นมนุษย์ที่ชอบเข้าสังคม สดใส ร่าเริง
ชอบพูดคุยและทำความรู้จักกับผู้คนใหม่ ๆ
เปรียบเหมือนผีเสื้อที่บินไปหาดอกไม้มากมาย
<br /><br />
คุณเป็นคนที่มีความเป็นเด็กน้อยในตัวสูง
ตื่นเต้นกับสิ่งที่แปลกใหม่รอบตัวจนในบางทีคุณอาจจะมีแนวโน้มที่จะเป็นคนเบื่อง่าย


<br /><br />
ถึงแม้ภายนอกคุณจะดูสดใส แต่จริง ๆ
คุณก็มีมุมที่มีความลึกลับที่คนนอกอาจจะเข้าไม่ถึง
<br /><br />
“Love has absolutely no pattern,
<br />and no one will ever be perfect“
<br />—Taylor swift
</CocktailCard>
26 changes: 26 additions & 0 deletions src/pages/cocktail/cosmopolitan.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
---
import CocktailCard from "@/layouts/CocktailCard.astro";
import Cosmo from "@/assets/elements/cosmopolitan.png";
---

<CocktailCard variant="cosmo" img={Cosmo.src}>
วอดก้า แครนเบอรี่ และน้ำมะนาว สามส่วนผสมหลักที่เข้ากันได้อย่างไม่น่าเชื่อ
รวมกันเป็นค็อกเทลรสเปรี้ยวอมหวานสีชมพูสดใส
<br />ที่ครองใจสาว ๆ นักดื่มทั่วโลก
<br /><br />
คุณเปรียบเสมือนค็อกเทลดังกล่าว คุณเป็นคนขี้เล่น มีเสน่ห์
<br />และมักจะเต็มเปี่ยมไปด้วยพลังงานในการทำสิ่งต่าง ๆ
<br />คุณเป็นคนที่ให้ลุคสบาย ๆ แต่ในขณะเดียวกัน ก็แฝงไปด้วยความมั่นใจในตนเอง
มีอารมณ์ขัน
<br />และเป็นคนที่มักจะปล่อยวางในสถานการณ์ที่ควบคุมไม่ได้ได้ดี
แต่ในบางครั้งด้วยความที่คุณเป็นคนคารมคมคาย
<br /><br />
คนอื่นอาจมองว่าคุณเป็นคนเจ้าชู้ ไม่จริงจังกับความสัมพันธ์
จากการที่คุณสามารถเข้ากับคนง่าย
<br />คุณอาจจะต้องใช้ระยะเวลาและความจริงใจในการพิสูจน์
<br />ซึ่งหากผ่านพ้นไปได้แล้วจะได้เจอกับความรักที่คุณตามหาแน่นอน
<br /><br />
“Love has absolutely no pattern,
<br />and no one will ever be perfect“
<br />—Taylor swift
</CocktailCard>
Loading
Loading