diff --git a/apps/client/src/assets/chippi_level1.png b/apps/client/src/assets/chippi_level1.png
new file mode 100644
index 00000000..df1f05e7
Binary files /dev/null and b/apps/client/src/assets/chippi_level1.png differ
diff --git a/apps/client/src/assets/chippi_level2.png b/apps/client/src/assets/chippi_level2.png
new file mode 100644
index 00000000..0811edef
Binary files /dev/null and b/apps/client/src/assets/chippi_level2.png differ
diff --git a/apps/client/src/assets/chippi_level3.png b/apps/client/src/assets/chippi_level3.png
new file mode 100644
index 00000000..d1aa4398
Binary files /dev/null and b/apps/client/src/assets/chippi_level3.png differ
diff --git a/apps/client/src/assets/chippi_level4.png b/apps/client/src/assets/chippi_level4.png
new file mode 100644
index 00000000..0d3fd7c3
Binary files /dev/null and b/apps/client/src/assets/chippi_level4.png differ
diff --git a/apps/client/src/assets/chippi_level5.png b/apps/client/src/assets/chippi_level5.png
new file mode 100644
index 00000000..3d4a45d9
Binary files /dev/null and b/apps/client/src/assets/chippi_level5.png differ
diff --git a/apps/client/src/layout/Layout.tsx b/apps/client/src/layout/Layout.tsx
index b88d3aff..dbb56cc7 100644
--- a/apps/client/src/layout/Layout.tsx
+++ b/apps/client/src/layout/Layout.tsx
@@ -1,15 +1,10 @@
import { Outlet } from 'react-router-dom';
-import OptionsMenuButton from '@shared/components/optionsMenuButton/OptionsMenuButton';
const Layout = () => {
return (
<>
{/* TODO: 필요시 레이아웃 추가 */}
{/* TODO: 사이드바 추가 */}
-
>
diff --git a/apps/client/src/pages/level/Level.tsx b/apps/client/src/pages/level/Level.tsx
index 572d7809..2ec7b1e1 100644
--- a/apps/client/src/pages/level/Level.tsx
+++ b/apps/client/src/pages/level/Level.tsx
@@ -1,5 +1,54 @@
-const Level = () => {
- return
;
-};
+import { Icon } from '@pinback/design-system/icons';
+import { cn } from '@pinback/design-system/utils';
+import LevelScene from '@pages/level/components/LevelScene';
+import LevelInfoCard from '@pages/level/components/LevelInfoCard';
+import TreeStatusCard from '@pages/level/components/TreeStatusCard';
+import { getTreeLevel } from '@pages/level/utils/treeLevel';
+import { TreeLevel } from '@pages/level/types/treeLevelType';
+import { Badge } from '@pinback/design-system/ui';
-export default Level;
+export default function Level() {
+ const acorns = 1; // TODO: API 연결되면 교체
+ const info = getTreeLevel(acorns);
+
+ return (
+
+ );
+}
diff --git a/apps/client/src/pages/level/components/LevelInfoCard.tsx b/apps/client/src/pages/level/components/LevelInfoCard.tsx
index 324dc1e6..fe6d287f 100644
--- a/apps/client/src/pages/level/components/LevelInfoCard.tsx
+++ b/apps/client/src/pages/level/components/LevelInfoCard.tsx
@@ -1,7 +1,7 @@
import { cn } from '@pinback/design-system/utils';
import { Level } from '@pinback/design-system/ui';
import { Icon, type IconName } from '@pinback/design-system/icons';
-import { TREE_LEVEL_TABLE, type TreeLevel } from '../utils/treeLevel';
+import { TREE_LEVEL_TABLE, TreeLevel } from '@pages/level/types/treeLevelType';
const LEVEL_TOOLTIP_ICON = {
1: 'tooltip_1',
diff --git a/apps/client/src/pages/level/components/LevelScene.tsx b/apps/client/src/pages/level/components/LevelScene.tsx
new file mode 100644
index 00000000..8b498d87
--- /dev/null
+++ b/apps/client/src/pages/level/components/LevelScene.tsx
@@ -0,0 +1,34 @@
+import { cn } from '@pinback/design-system/utils';
+import { TreeLevel } from '@pages/level/types/treeLevelType';
+import { HTMLAttributes } from 'react';
+
+import chippi_level1 from '../../../assets/chippi_level1.png';
+import chippi_level2 from '../../../assets/chippi_level2.png';
+import chippi_level3 from '../../../assets/chippi_level3.png';
+import chippi_level4 from '../../../assets/chippi_level4.png';
+import chippi_level5 from '../../../assets/chippi_level5.png';
+
+const SCENE_BY_LEVEL: Record = {
+ 1: chippi_level1,
+ 2: chippi_level2,
+ 3: chippi_level3,
+ 4: chippi_level4,
+ 5: chippi_level5,
+} as const;
+
+interface LevelSceneProps extends HTMLAttributes {
+ level: TreeLevel;
+}
+
+export default function LevelScene({ level, className }: LevelSceneProps) {
+ const src = SCENE_BY_LEVEL[level];
+ return (
+
+

+
+ );
+}
diff --git a/apps/client/src/pages/level/components/TreeStatusCard.tsx b/apps/client/src/pages/level/components/TreeStatusCard.tsx
index 16ee63ec..e09fa9fa 100644
--- a/apps/client/src/pages/level/components/TreeStatusCard.tsx
+++ b/apps/client/src/pages/level/components/TreeStatusCard.tsx
@@ -1,6 +1,6 @@
import { Level, Progress } from '@pinback/design-system/ui';
import { cn } from '@pinback/design-system/utils';
-import { getTreeLevel } from '../utils/treeLevel';
+import { getTreeLevel } from '@pages/level/utils/treeLevel';
export interface TreeStatusCardProps {
acorns: number;
diff --git a/apps/client/src/pages/level/types/treeLevelType.ts b/apps/client/src/pages/level/types/treeLevelType.ts
new file mode 100644
index 00000000..1f3dcc79
--- /dev/null
+++ b/apps/client/src/pages/level/types/treeLevelType.ts
@@ -0,0 +1,25 @@
+export type TreeLevelRowShape = {
+ level: number;
+ name: string;
+ min: number;
+ max?: number;
+ rangeLabel: string;
+};
+
+export const TREE_LEVEL_TABLE = [
+ { level: 1, name: '잊힌 기록의 숲', min: 0, max: 0, rangeLabel: '0개' },
+ { level: 2, name: '햇살의 터전', min: 1, max: 2, rangeLabel: '1–2개' },
+ { level: 3, name: '기록의 오솔길', min: 3, max: 4, rangeLabel: '3–4개' },
+ { level: 4, name: '지식 나무 언덕', min: 5, max: 6, rangeLabel: '5–6개' },
+ { level: 5, name: '도토리 만개 숲', min: 7, rangeLabel: '7개 이상' },
+] as const satisfies readonly TreeLevelRowShape[];
+
+export type TreeLevel = (typeof TREE_LEVEL_TABLE)[number]['level'];
+
+export type TreeLevelRow = TreeLevelRowShape;
+
+export type TreeLevelResult = TreeLevelRow & {
+ progressToNext: number;
+ nextMin?: number;
+ remainingToNext?: number;
+};
diff --git a/apps/client/src/pages/level/utils/treeLevel.ts b/apps/client/src/pages/level/utils/treeLevel.ts
index 44541475..793f5d48 100644
--- a/apps/client/src/pages/level/utils/treeLevel.ts
+++ b/apps/client/src/pages/level/utils/treeLevel.ts
@@ -1,27 +1,8 @@
-type TreeLevelRowShape = {
- level: number;
- name: string;
- min: number;
- max?: number;
- rangeLabel: string;
-};
-
-export const TREE_LEVEL_TABLE = [
- { level: 1, name: '잊힌 기록의 숲', min: 0, max: 0, rangeLabel: '0개' },
- { level: 2, name: '햇살의 터전', min: 1, max: 2, rangeLabel: '1–2개' },
- { level: 3, name: '기록의 오솔길', min: 3, max: 4, rangeLabel: '3–4개' },
- { level: 4, name: '지식 나무 언덕', min: 5, max: 6, rangeLabel: '5–6개' },
- { level: 5, name: '도토리 만개 숲', min: 7, rangeLabel: '7개 이상' },
-] as const satisfies readonly TreeLevelRowShape[];
-
-export type TreeLevel = (typeof TREE_LEVEL_TABLE)[number]['level'];
-export type TreeLevelRow = TreeLevelRowShape;
-
-export type TreeLevelResult = TreeLevelRow & {
- progressToNext: number;
- nextMin?: number;
- remainingToNext?: number;
-};
+import {
+ TREE_LEVEL_TABLE,
+ TreeLevelResult,
+ TreeLevelRow,
+} from '@pages/level/types/treeLevelType';
function findLevelRow(count: number, rows: readonly TreeLevelRow[]) {
const idx = rows.findIndex(
@@ -48,3 +29,5 @@ export function getTreeLevel(acorns: number): TreeLevelResult {
const { row, next } = findLevelRow(acorns, TREE_LEVEL_TABLE);
return { ...row, ...calcProgress(acorns, row, next) };
}
+
+export { TREE_LEVEL_TABLE };
diff --git a/packages/tailwind-config/shared-styles.css b/packages/tailwind-config/shared-styles.css
index ef2c3991..2d2dfd8d 100644
--- a/packages/tailwind-config/shared-styles.css
+++ b/packages/tailwind-config/shared-styles.css
@@ -180,7 +180,7 @@
--color-gradient-end: #33d08f;
/* Secondary Color */
- --color-secondary: #f4f2ec;
+ --color-subcolor: #f4f2ec;
/* Grayscale */
--color-gray0: #f7f7fb;