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;