diff --git a/app/page.tsx b/app/page.tsx
index 258c0d1..1525f01 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -60,4 +60,4 @@ export default function Home() {
);
}
-const TAGS = [{ label: "hair" }, { label: "fire" }];
+const TAGS = [{ label: "hair" }, { label: "fire" }, { label: "plant" }];
diff --git a/lib/svg-generator.ts b/lib/svg-generator.ts
index 91e2bfb..eed95ee 100644
--- a/lib/svg-generator.ts
+++ b/lib/svg-generator.ts
@@ -10,6 +10,9 @@ export async function generateThemedSVG(username: string, themeKey: string) {
const cellSize = 14;
const background = theme.background || "#ffffff";
+ const backgroundPattern = theme.backgroundPattern;
+ const patternId = `pattern_${themeKey}`;
+
const baseDot = theme.showBaseDot ?? false;
const elements = weeks.flatMap((week, weekIndex) =>
@@ -44,9 +47,18 @@ export async function generateThemedSVG(username: string, themeKey: string) {
}),
);
+ const defs = backgroundPattern
+ ? `${backgroundPattern.replace(
+ /]*?)>/g,
+ ``
+ )}`
+ : "";
+ const fillValue = backgroundPattern ? `url(#${patternId})` : background;
+
const svg = `
diff --git a/lib/themes.ts b/lib/themes.ts
index dfa7973..76b750b 100644
--- a/lib/themes.ts
+++ b/lib/themes.ts
@@ -7,6 +7,7 @@ export interface ThemeStyle {
label: string;
emoji?: string;
background?: string;
+ backgroundPattern?: string;
showBaseDot?: boolean;
}
@@ -61,9 +62,47 @@ export const FireTheme: ThemeStyle = {
},
};
+export const PlantTheme: ThemeStyle = {
+ label: "Plant",
+ emoji: "🌿",
+ background: "#f0fdf4",
+ backgroundPattern: `
+
+
+
+
+
+
+
+
+
+
+
+
+ `,
+ showBaseDot: true,
+ getEmoji: (level: CommitLevel): string | null => {
+ switch (level) {
+ case "none":
+ return null;
+ case "low":
+ return "🫘"; // 씨앗
+ case "medium":
+ return "🌱"; // 새싹
+ case "high":
+ return "🌿"; // 풀잎
+ case "max":
+ return "🌻"; // 꽃
+ default:
+ return null;
+ }
+ },
+};
+
export const themes: Record = {
hair: HairTheme,
fire: FireTheme,
+ plant: PlantTheme,
};
export function getCommitLevel(commitCount: number): CommitLevel {