Skip to content

Commit 0f06316

Browse files
feat: expand fortunes and collection art
1 parent 187b230 commit 0f06316

4 files changed

Lines changed: 179 additions & 12 deletions

File tree

app/byeoril-data.ts

Lines changed: 118 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,23 @@ export type Tab = "today" | "collection" | "records" | "about";
22
export type View = "main" | "capture" | "card" | "report" | "examples" | "guide";
33
export type Outcome = "happened" | "close" | "missed";
44
export type Category = "교통" | "음식" | "사람" | "일상" | "기타";
5-
export type AssetKind = "usb" | "signal" | "elevator" | "bread" | "delivery" | "cable";
5+
export type AssetKind =
6+
| "usb"
7+
| "signal"
8+
| "elevator"
9+
| "bread"
10+
| "delivery"
11+
| "cable"
12+
| "umbrella"
13+
| "coffee"
14+
| "bus"
15+
| "earbuds"
16+
| "fries"
17+
| "laundry"
18+
| "receipt"
19+
| "mascot"
20+
| "key"
21+
| "book";
622

723
export type Fortune = {
824
id: number;
@@ -82,6 +98,96 @@ export const fortunes: Fortune[] = [
8298
asset: "signal",
8399
category: "교통",
84100
},
101+
{
102+
id: 27,
103+
title: "비가 오기 직전에 우산을 챙긴 자신을 발견할 수도 있습니다.",
104+
cardTitle: "비 오기 1분 전에 우산 챙김",
105+
copy: "기상청보다 빨랐던 건 아니고, 오늘만큼은 가방 속 우산을 기억해냈습니다.",
106+
aside: "오늘의 나\n제법 준비됨.",
107+
asset: "umbrella",
108+
category: "일상",
109+
},
110+
{
111+
id: 28,
112+
title: "카페 쿠폰 도장이 오늘 딱 다 찰 수도 있습니다.",
113+
cardTitle: "커피 한 잔이 공짜가 됨",
114+
copy: "그동안 마신 커피가 드디어 한 잔으로 돌아왔습니다. 작지만 확실한 회수입니다.",
115+
aside: "이건 과거의\n내가 샀다.",
116+
asset: "coffee",
117+
category: "음식",
118+
},
119+
{
120+
id: 29,
121+
title: "버스에 타자마자 빈자리가 보일 수도 있습니다.",
122+
cardTitle: "타자마자 내 자리가 있었음",
123+
copy: "누가 비워둔 건 아니지만 앉는 순간만큼은 도시가 당신 편이었습니다.",
124+
aside: "출발 전에\n착석 완료.",
125+
asset: "bus",
126+
category: "교통",
127+
},
128+
{
129+
id: 30,
130+
title: "이어폰이 주머니에서 얌전히 나올 수도 있습니다.",
131+
cardTitle: "이어폰이 안 엉켜 있었음",
132+
copy: "주머니 안에서 무슨 일이 있었는지는 몰라도 오늘은 평화 협정이 유지됐습니다.",
133+
aside: "서로 싸우지\n않았구나.",
134+
asset: "earbuds",
135+
category: "일상",
136+
},
137+
{
138+
id: 31,
139+
title: "감자튀김 봉투 밑에서 하나를 더 찾을 수도 있습니다.",
140+
cardTitle: "끝난 줄 알았는데 감튀 하나 더",
141+
copy: "세상을 구할 양은 아니지만 마지막 한 입이 하루를 조금 연장했습니다.",
142+
aside: "너 거기\n있었구나!",
143+
asset: "fries",
144+
category: "음식",
145+
},
146+
{
147+
id: 32,
148+
title: "세탁한 양말의 짝이 한 번에 맞을 수도 있습니다.",
149+
cardTitle: "양말 짝을 바로 맞춤",
150+
copy: "사라진 양말의 미스터리는 오늘만 휴업입니다. 두 짝 모두 무사합니다.",
151+
aside: "오늘은\n둘이 같이 옴.",
152+
asset: "laundry",
153+
category: "일상",
154+
},
155+
{
156+
id: 33,
157+
title: "결제 금액이 기분 좋게 딱 떨어질 수도 있습니다.",
158+
cardTitle: "결제 금액이 딱 떨어짐",
159+
copy: "통장 잔고까지 깔끔해진 건 아니지만 숫자 모양만큼은 마음에 듭니다.",
160+
aside: "0원이\n줄 맞췄다.",
161+
asset: "receipt",
162+
category: "기타",
163+
},
164+
{
165+
id: 34,
166+
title: "생각하던 친구에게 먼저 연락이 올 수도 있습니다.",
167+
cardTitle: "생각난 친구한테 먼저 연락 옴",
168+
copy: "텔레파시까지는 아니고 비슷한 시간에 서로 심심했던 것 같습니다.",
169+
aside: "나도 방금\n생각했는데.",
170+
asset: "mascot",
171+
category: "사람",
172+
},
173+
{
174+
id: 35,
175+
title: "가방 속 열쇠가 한 번에 손에 잡힐 수도 있습니다.",
176+
cardTitle: "열쇠를 한 번에 찾아냄",
177+
copy: "가방 정리를 잘한 결과는 아닐 확률이 높지만 손끝의 촉이 정확했습니다.",
178+
aside: "오늘은\n바로 잡힘.",
179+
asset: "key",
180+
category: "일상",
181+
},
182+
{
183+
id: 36,
184+
title: "책을 펼쳤는데 찾던 페이지가 나올 수도 있습니다.",
185+
cardTitle: "펼치자마자 찾던 페이지였음",
186+
copy: "책갈피 없이도 도착했습니다. 기억력보다 우연의 활약이 조금 컸습니다.",
187+
aside: "여기였네.\n한 번에 찾음.",
188+
asset: "book",
189+
category: "기타",
190+
},
85191
];
86192

87193
export const outcomeMeta: Record<
@@ -105,7 +211,7 @@ export const gradeGuide = [
105211
{ grade: "혼함", stars: 1, copy: "자주 일어나는 일. 별일 아닌데 기록해줘서 감사." },
106212
{ grade: "꽤 괜찮음", stars: 2, copy: "가끔 있는 일. 생각보다 운이 좋으셨네요." },
107213
{ grade: "이왜진", stars: 3, copy: "잘 안 일어나는 일. 피식, 할 만합니다." },
108-
{ grade: "대충 기적", stars: 4, copy: "진짜 드문 일. 자랑해도 됩니다." },
214+
{ grade: "오늘 좀 됨", stars: 4, copy: "진짜 드문 일. 자랑해도 됩니다." },
109215
{ grade: "우주 개입", stars: 5, copy: "이 정도면 우주가 도운 날." },
110216
];
111217

@@ -149,11 +255,21 @@ export function makeSampleRecords(now = new Date()): RecordItem[] {
149255
const safeDay = (value: number) => Math.max(1, Math.min(lastDay, value));
150256
return [
151257
{ id: "sample-23", date: monthDate(key, safeDay(7)), time: "08:42", fortuneId: 23, title: "얘가 마침 여기 있었음", outcome: "happened", category: "일상", note: "버튼 누르려 했는데 이미 열려 있었음", sample: true },
258+
{ id: "sample-27", date: monthDate(key, safeDay(8)), time: "07:48", fortuneId: 27, title: "비 오기 1분 전에 우산 챙김", outcome: "happened", category: "일상", note: "나오자마자 비가 왔는데 우산 있었음", sample: true },
152259
{ id: "sample-24", date: monthDate(key, safeDay(10)), time: "11:21", fortuneId: 24, title: "마지막 하나, 내가 가져감", outcome: "missed", category: "음식", note: "마지막 소금빵이 남아 있었음", sample: true },
260+
{ id: "sample-28", date: monthDate(key, safeDay(9)), time: "13:06", fortuneId: 28, title: "커피 한 잔이 공짜가 됨", outcome: "close", category: "음식", note: "쿠폰 도장이 딱 열 개 됨", sample: true },
153261
{ id: "sample-22", date: monthDate(key, safeDay(11)), time: "14:11", fortuneId: 22, title: "신호등이 내 편이었음 (8초)", outcome: "close", category: "교통", note: "건너는 동안 계속 초록불이었음", sample: true },
262+
{ id: "sample-29", date: monthDate(key, safeDay(6)), time: "08:18", fortuneId: 29, title: "타자마자 내 자리가 있었음", outcome: "happened", category: "교통", note: "문 앞에 빈자리 하나 있었음", sample: true },
154263
{ id: "sample-21", date: monthDate(key, safeDay(12)), time: "16:33", fortuneId: 21, title: "오늘도 USB와 화해 성공", outcome: "missed", category: "일상", note: "한 번에 꽂음", sample: true },
264+
{ id: "sample-30", date: monthDate(key, safeDay(5)), time: "09:31", fortuneId: 30, title: "이어폰이 안 엉켜 있었음", outcome: "close", category: "일상", note: "주머니에서 그대로 나옴", sample: true },
155265
{ id: "sample-25", date: monthDate(key, safeDay(13)), time: "18:14", fortuneId: 25, title: "배달이 예상보다 빨리 옴", outcome: "close", category: "음식", note: "예정보다 3분 빨랐음", sample: true },
266+
{ id: "sample-31", date: monthDate(key, safeDay(4)), time: "17:22", fortuneId: 31, title: "끝난 줄 알았는데 감튀 하나 더", outcome: "happened", category: "음식", note: "봉투 구석에서 하나 찾음", sample: true },
156267
{ id: "sample-26", date: monthDate(key, safeDay(14)), time: "09:17", fortuneId: 26, title: "오늘은 앞뒤를 구별했음", outcome: "missed", category: "일상", note: "충전선을 한 번에 꽂음", sample: true },
268+
{ id: "sample-32", date: monthDate(key, safeDay(3)), time: "20:04", fortuneId: 32, title: "양말 짝을 바로 맞춤", outcome: "close", category: "일상", note: "한 짝도 안 사라짐", sample: true },
269+
{ id: "sample-33", date: monthDate(key, safeDay(2)), time: "12:30", fortuneId: 33, title: "결제 금액이 딱 떨어짐", outcome: "missed", category: "기타", note: "총액이 12,000원이었음", sample: true },
270+
{ id: "sample-34", date: monthDate(key, safeDay(15)), time: "21:09", fortuneId: 34, title: "생각난 친구한테 먼저 연락 옴", outcome: "happened", category: "사람", note: "메시지 보내려는데 먼저 옴", sample: true },
271+
{ id: "sample-35", date: monthDate(key, safeDay(16)), time: "10:42", fortuneId: 35, title: "열쇠를 한 번에 찾아냄", outcome: "close", category: "일상", note: "가방 깊숙한 데서 바로 잡힘", sample: true },
272+
{ id: "sample-36", date: monthDate(key, safeDay(17)), time: "22:16", fortuneId: 36, title: "펼치자마자 찾던 페이지였음", outcome: "happened", category: "기타", note: "책갈피 없이 한 번에 찾음", sample: true },
157273
];
158274
}
159275

app/byeoril-ui.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ export function FortuneObject({ kind, compact = false }: { kind: AssetKind; comp
4343
</span>
4444
);
4545
}
46+
if (kind === "mascot") {
47+
return <span className={`object-art object-mascot ${compact ? "compact" : ""}`} aria-hidden="true"><Mascot /></span>;
48+
}
4649
return <span className={`object-art object-${kind} ${compact ? "compact" : ""}`} aria-hidden="true"><i/><b/><em/></span>;
4750
}
4851

@@ -52,7 +55,7 @@ export function FortuneScene({ kind, speech, card = false }: { kind: AssetKind;
5255
{kind === "elevator" && <><span className="scene-floor-plane"/><span className="scene-depth-shadow"/></>}
5356
<span className="scene-spark spark-a"/><span className="scene-spark spark-b"/><span className="scene-spark spark-c"/>
5457
<FortuneObject kind={kind} />
55-
<Mascot className="scene-character" waiting={kind === "elevator"} />
58+
{kind !== "mascot" && <Mascot className="scene-character" resting={kind === "book" || kind === "laundry"} waiting={kind === "elevator"} />}
5659
<span className="scene-speech">{speech.split("\n").map((line, index) => <span key={`${line}-${index}`}>{line}</span>)}</span>
5760
</div>
5861
);

app/globals.css

Lines changed: 39 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)