diff --git a/components/dashboard/best-worth/index.tsx b/components/compositions/dashboard/best-worth/index.tsx
similarity index 100%
rename from components/dashboard/best-worth/index.tsx
rename to components/compositions/dashboard/best-worth/index.tsx
diff --git a/components/dashboard/character/index.tsx b/components/compositions/dashboard/character/index.tsx
similarity index 100%
rename from components/dashboard/character/index.tsx
rename to components/compositions/dashboard/character/index.tsx
diff --git a/components/dashboard/happy/index.tsx b/components/compositions/dashboard/happy/index.tsx
similarity index 100%
rename from components/dashboard/happy/index.tsx
rename to components/compositions/dashboard/happy/index.tsx
diff --git a/components/dashboard/money/index.tsx b/components/compositions/dashboard/money/index.tsx
similarity index 100%
rename from components/dashboard/money/index.tsx
rename to components/compositions/dashboard/money/index.tsx
diff --git a/components/dashboard/sad/index.tsx b/components/compositions/dashboard/sad/index.tsx
similarity index 100%
rename from components/dashboard/sad/index.tsx
rename to components/compositions/dashboard/sad/index.tsx
diff --git a/components/compositions/dashboard/tree-info.tsx b/components/compositions/dashboard/tree-info.tsx
new file mode 100644
index 0000000..ecbc0b5
--- /dev/null
+++ b/components/compositions/dashboard/tree-info.tsx
@@ -0,0 +1,89 @@
+import Badge from '@/components/badge'
+import Button from '@/components/button'
+import React from 'react'
+
+const TreeInfo = () => {
+ return (
+ <>
+
+
+
+ 내 정원에 심어진 나무는
+
+ 총 999그루
+
+
+
+
+
+
+ 김디엔님에 대해 알아보세요!
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ )
+}
+
+export default TreeInfo
diff --git a/components/compositions/header/alert/alert-card.tsx b/components/compositions/header/alert/alert-card.tsx
new file mode 100644
index 0000000..f323995
--- /dev/null
+++ b/components/compositions/header/alert/alert-card.tsx
@@ -0,0 +1,86 @@
+import { cn } from '@/lib/client/utils'
+import React from 'react'
+
+interface AlertCardProps {
+ isRead?: boolean
+}
+
+const AlertCard = ({ isRead = false }: AlertCardProps) => {
+ return (
+
+ )
+}
+
+export default AlertCard
diff --git a/components/compositions/header/alert/index.tsx b/components/compositions/header/alert/index.tsx
new file mode 100644
index 0000000..5585862
--- /dev/null
+++ b/components/compositions/header/alert/index.tsx
@@ -0,0 +1,57 @@
+import Drawer from '@/components/ui/drawer'
+import React, { useState } from 'react'
+import AlertCard from './alert-card'
+
+const Alert = () => {
+ const [openAlert, setOpenAlert] = useState(false)
+ return (
+ 알림,
+ options: {
+ onBackClick() {
+ setOpenAlert(false)
+ },
+ showRight: false,
+ },
+ }}
+ open={openAlert}
+ onChangeOpen={setOpenAlert}
+ trigger={
+
+ }
+ >
+
+
+ )
+}
+
+export default Alert
diff --git a/components/compositions/header/edit-setting/index.tsx b/components/compositions/header/edit-setting/index.tsx
new file mode 100644
index 0000000..8715faa
--- /dev/null
+++ b/components/compositions/header/edit-setting/index.tsx
@@ -0,0 +1,30 @@
+import Drawer from '@/components/ui/drawer'
+import React, { useState } from 'react'
+
+const EditProfile = () => {
+ const [openAlert, setOpenAlert] = useState(false)
+ return (
+ 프로필 수정,
+ options: {
+ onBackClick() {
+ setOpenAlert(false)
+ },
+ showRight: false,
+ },
+ }}
+ open={openAlert}
+ onChangeOpen={setOpenAlert}
+ trigger={
+
+ }
+ >
+ TODO: #26 머지 후 작업
+
+ )
+}
+
+export default EditProfile
diff --git a/components/compositions/header/setting/index.tsx b/components/compositions/header/setting/index.tsx
new file mode 100644
index 0000000..512cf8c
--- /dev/null
+++ b/components/compositions/header/setting/index.tsx
@@ -0,0 +1,77 @@
+import Drawer from '@/components/ui/drawer'
+import React, { useState } from 'react'
+import Modal from '@/components/modal'
+import WriteList from '@/components/compositions/header/write-list'
+import EditProfile from '@/components/compositions/header/edit-setting'
+
+const Setting = () => {
+ const [openSetting, setOpenSetting] = useState(false)
+ return (
+ 설정,
+ options: {
+ onBackClick() {
+ setOpenSetting(false)
+ },
+ showRight: false,
+ },
+ }}
+ open={openSetting}
+ onChangeOpen={setOpenSetting}
+ trigger={
+
+ }
+ >
+
+
+
+ 계정 관리
+
+
+
+
+ 로그아웃
+
+ }
+ title="로그아웃"
+ description="정말 로그아웃 하시겠어요?"
+ />
+
+ 서비스 탈퇴
+
+ }
+ title="서비스 탈퇴"
+ description={`탈퇴 시 모든 정보가 사라져요.
+ 정말 탈퇴하시겠어요?`}
+ />
+
+
+
+
+ )
+}
+
+export default Setting
diff --git a/components/compositions/header/write-list/index.tsx b/components/compositions/header/write-list/index.tsx
new file mode 100644
index 0000000..3d5af96
--- /dev/null
+++ b/components/compositions/header/write-list/index.tsx
@@ -0,0 +1,45 @@
+import KnowingFilterGroup from '@/components/knowing-filter-group'
+import Drawer from '@/components/ui/drawer'
+import React, { useState } from 'react'
+import WriteListCard from '@/components/compositions/header/write-list/wirte-list-card'
+
+const WriteList = () => {
+ const [openAlert, setOpenAlert] = useState(false)
+ return (
+ 작성목록,
+ options: {
+ onBackClick() {
+ setOpenAlert(false)
+ },
+ showRight: false,
+ },
+ }}
+ open={openAlert}
+ onChangeOpen={setOpenAlert}
+ trigger={
+
+ }
+ >
+
+
+
+ 999명의 친구가 이유를
+ 적었어요
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default WriteList
diff --git a/components/compositions/header/write-list/wirte-list-card.tsx b/components/compositions/header/write-list/wirte-list-card.tsx
new file mode 100644
index 0000000..13fe3b9
--- /dev/null
+++ b/components/compositions/header/write-list/wirte-list-card.tsx
@@ -0,0 +1,76 @@
+import React from 'react'
+
+const WriteListCard = () => {
+ return (
+
+ )
+}
+
+export default WriteListCard
diff --git a/components/header/index.tsx b/components/header/index.tsx
index 533955d..03637da 100644
--- a/components/header/index.tsx
+++ b/components/header/index.tsx
@@ -1,12 +1,13 @@
import { useRouter } from 'next/router'
-import { ReactNode, useCallback, useEffect, useRef, useState } from 'react'
+import { ReactNode, useCallback, useEffect, useRef } from 'react'
import { Variants, motion, useAnimation } from 'framer-motion'
-import Drawer from '@/components/ui/drawer'
import { fadeInProps } from '@/variants'
import { useSettingStore } from '@/stores/setting.store'
import useScrollDirection from '@/hooks/use-scroll-direction'
import { cn } from '@/lib/client/utils'
+import Setting from '@/components/compositions/header/setting'
+import Alert from '@/components/compositions/header/alert'
const logoVariants: Variants = {
initial: {},
@@ -116,8 +117,6 @@ const Header = ({ center = , rightIcon, options }: HeaderProps) => {
const { showRight, onBackClick } = options ?? { showRight: true }
const headerRef = useRef(null)
const router = useRouter()
- const [openAlert, setOpenAlert] = useState(false)
- const [openSetting, setOpenSetting] = useState(false)
const { scrollTop, direction } = useScrollDirection()
@@ -140,19 +139,11 @@ const Header = ({ center = , rightIcon, options }: HeaderProps) => {
useEffect(() => {
if (typeof window !== 'undefined' && headerRef.current) {
- const observer = new IntersectionObserver((entries) => {
- entries.forEach((entry) => {
- setIntersecting(entry.isIntersecting)
- })
- })
-
const element = headerRef.current
- observer.observe(element)
element.addEventListener('resize', handleResize)
handleResize()
return () => {
element.removeEventListener('resize', handleResize)
- observer.disconnect()
}
}
}, [handleResize, setIntersecting])
@@ -187,7 +178,6 @@ const Header = ({ center = , rightIcon, options }: HeaderProps) => {
/>
-
{center}
@@ -195,95 +185,8 @@ const Header = ({ center = , rightIcon, options }: HeaderProps) => {
{showRight
? rightIcon ?? (
<>
-
-
-
-
- }
- >
- 작성목록}
- options={{
- onBackClick() {
- setOpenAlert(false)
- },
-
- showRight: false,
- }}
- />
- 112
- 112
- 112
- 112
- 112
- 112
- 112
- 112
- 112
- 112
- 112
-
-
-
-
- }
- >
- 설정}
- options={{
- onBackClick() {
- setOpenSetting(false)
- },
- showRight: false,
- }}
- />
- 112
- 112
- 112
- 112
- 112
- 112
- 112
- 112
- 112
- 112
- 112
-
+
+
>
)
: null}
diff --git a/components/knowing-filter-group/index.tsx b/components/knowing-filter-group/index.tsx
index 4f262d6..ced1a42 100644
--- a/components/knowing-filter-group/index.tsx
+++ b/components/knowing-filter-group/index.tsx
@@ -1,7 +1,129 @@
-import React from 'react'
+import { AnimatePresence, motion } from 'framer-motion'
+import React, { HTMLAttributes, useState } from 'react'
+import FilterText from '../filter-text'
+import { cn } from '@/lib/client/utils'
+import { fadeInProps } from '@/variants'
+import FilterButton from '../filter-button'
-const KnowingFilterGroup = () => {
- return
+type KnowFilterType = 'period' | 'route'
+const filterItems: {
+ [key in 'period' | 'route']: { label: string; value: string }[]
+} = {
+ period: [
+ {
+ label: '전체',
+ value: 'ALL',
+ },
+ {
+ label: '초등학교',
+ value: 'ELEMENTARY_SCHOOL',
+ },
+ {
+ label: '중·고등학교',
+ value: 'MIDDLE_AND_HIGH_SCHOOL',
+ },
+ {
+ label: '대학교',
+ value: 'UNIVERSITY',
+ },
+ {
+ label: '직장',
+ value: 'WORK',
+ },
+ {
+ label: '모임',
+ value: 'SOCIAL',
+ },
+ {
+ label: '기타',
+ value: 'ETC',
+ },
+ ],
+ route: [
+ {
+ label: '전체',
+ value: 'ALL',
+ },
+ {
+ label: '6개월 미만',
+ value: 'SIX_MONTHS',
+ },
+ {
+ label: '6개월-1년',
+ value: 'ONE_YEAR',
+ },
+ {
+ label: '1년-4년',
+ value: 'FOUR_YEARS',
+ },
+ {
+ label: '4년 이상',
+ value: 'INFINITE',
+ },
+ ],
+}
+
+interface KnowingFilter extends HTMLAttributes {}
+
+const KnowingFilterGroup = (props: KnowingFilter) => {
+ const [knowState, setKnowState] = useState('period')
+ const [selectedFilterItem, setSelectedFilterItem] = useState('ALL')
+
+ const onKnowFilterClick = (type: KnowFilterType) => () => {
+ setSelectedFilterItem('ALL')
+ setKnowState(type)
+ }
+ return (
+
+
+
+
+
+
+ {knowState && (
+
+ {filterItems[knowState].map((item) => (
+ setSelectedFilterItem(item.value)}
+ key={item.value}
+ label={item.label}
+ />
+ ))}
+
+ )}
+
+
+ )
}
export default KnowingFilterGroup
diff --git a/components/modal/index.tsx b/components/modal/index.tsx
index 92ee390..7da259b 100644
--- a/components/modal/index.tsx
+++ b/components/modal/index.tsx
@@ -1,6 +1,5 @@
import {
Dialog,
- DialogClose,
DialogContent,
DialogDescription,
DialogFooter,
@@ -8,35 +7,68 @@ import {
DialogTitle,
DialogTrigger,
} from '@/components/ui/dialog'
-import { ForwardedRef, forwardRef } from 'react'
+import { Close } from '@radix-ui/react-dialog'
+import { ForwardedRef, PropsWithChildren, ReactNode, forwardRef } from 'react'
interface ModalProps
extends React.ComponentPropsWithoutRef,
React.ComponentPropsWithoutRef {
- children: React.ReactNode
title?: string
description?: string
+ footer?: ReactNode[]
trigger: React.ReactNode
}
-export const Modal = forwardRef(
- ({ children, title, description, trigger }, ref) => {
+export const Modal = forwardRef>(
+ (
+ {
+ children,
+ title,
+ description,
+ trigger,
+ footer = [
+
+ 취소
+ Close
+ ,
+ ,
+ ],
+ },
+ ref,
+ ) => {
return (
)
diff --git a/components/ui/dialog/index.tsx b/components/ui/dialog/index.tsx
index b88da42..5a3ae6f 100644
--- a/components/ui/dialog/index.tsx
+++ b/components/ui/dialog/index.tsx
@@ -1,6 +1,5 @@
import * as React from 'react'
import * as DialogPrimitive from '@radix-ui/react-dialog'
-import { X } from 'lucide-react'
import { cn } from '@/lib/client/utils'
@@ -29,23 +28,23 @@ DialogOverlay.displayName = DialogPrimitive.Overlay.displayName
const DialogContent = React.forwardRef<
React.ElementRef,
- React.ComponentPropsWithoutRef
+ React.ComponentPropsWithoutRef & {
+ footer?: React.ReactNode
+ }
+ // py-12 px-4
>(({ className, children, ...props }, ref) => (
- {children}
-
-
- Close
-
+ {children}
+ {props.footer}
))
@@ -69,13 +68,7 @@ const DialogFooter = ({
className,
...props
}: React.HTMLAttributes) => (
-
+
)
DialogFooter.displayName = 'DialogFooter'
@@ -85,11 +78,8 @@ const DialogTitle = React.forwardRef<
>(({ className, ...props }, ref) => (
))
DialogTitle.displayName = DialogPrimitive.Title.displayName
diff --git a/components/ui/drawer/index.tsx b/components/ui/drawer/index.tsx
index 7942e3e..574bcc7 100644
--- a/components/ui/drawer/index.tsx
+++ b/components/ui/drawer/index.tsx
@@ -1,6 +1,8 @@
+import { HeaderProps } from '@/components/header'
+import BaseLayout from '@/layout/base-layout'
import { useBrowserLayoutEffect } from '@/lib/client/utils'
import { drawerInOutProps } from '@/variants'
-import { AnimatePresence, LazyMotion, domAnimation, m } from 'framer-motion'
+import { AnimatePresence, LazyMotion, domAnimation } from 'framer-motion'
import {
PropsWithChildren,
ReactNode,
@@ -16,6 +18,7 @@ interface DrawerProps {
open?: boolean
onChangeOpen?: (state: boolean) => void
trigger?: ReactNode
+ header?: HeaderProps & { showHeader?: boolean }
}
function css(element: HTMLElement, style: Partial) {
@@ -31,6 +34,7 @@ const Drawer = ({
open = false,
onChangeOpen,
children,
+ header,
}: PropsWithChildren) => {
const id = useId()
const [isMounted, setIsMounted] = useState(open)
@@ -49,16 +53,18 @@ const Drawer = ({
left: '0px',
top: '0px',
width: '100dvw',
- height: '100dvh',
+ height: 'calc(var(--vh,1vh)*100)',
})
+ document.body.style.overflowY = 'hidden'
} else {
css(ref.current, {
position: 'fixed',
left: '0px',
top: '0px',
width: '0px',
- height: '0px',
+ height: 'calc(var(--vh,1vh)*100)',
})
+ document.body.style.overflowY = ''
}
const newIsMountState = state ?? !isMounted
setIsMounted(newIsMountState)
@@ -84,7 +90,7 @@ const Drawer = ({
if (isMounted) {
css(ref.current, {
display: 'block',
- zIndex: '100',
+ zIndex: '10',
})
}
}
@@ -102,12 +108,16 @@ const Drawer = ({
{isMounted ? (
-
- {children}
-
+
+
) : null}
,
diff --git a/layout/base-layout.tsx b/layout/base-layout.tsx
index 9d24691..b4a2213 100644
--- a/layout/base-layout.tsx
+++ b/layout/base-layout.tsx
@@ -2,7 +2,7 @@ import React, { PropsWithChildren } from 'react'
import LocalFont from 'next/font/local'
import { cn } from '@/lib/client/utils'
import Header, { HeaderProps } from '@/components/header'
-import { motion } from 'framer-motion'
+import { HTMLMotionProps, motion } from 'framer-motion'
import { fadeInProps } from '@/variants'
const pretendard = LocalFont({
@@ -34,17 +34,20 @@ interface BaseLayoutProps {
showHeader?: boolean
header?: HeaderProps
className?: string
+ framer?: HTMLMotionProps<'main'>
}
const BaseLayout = ({
className,
children,
- showHeader = true,
header,
+ showHeader = true,
+ framer,
}: PropsWithChildren) => {
return (
{
- const [knowState, setKnowState] = useState('period')
- const [selectedFilterItem, setSelectedFilterItem] = useState('ALL')
const headerHeight = useSettingStore((state) => state.headerHeight)
const { direction, scrollTop } = useScrollDirection()
- const onKnowFilterClick = (type: KnowFilterType) => () => {
- setSelectedFilterItem('ALL')
- setKnowState(type)
- }
const shouldShowHeader = scrollTop > headerHeight && direction === 'UP'
return (
-
-
-
-
-
-
- {knowState && (
-
- {filterItems[knowState].map((item) => (
- setSelectedFilterItem(item.value)}
- key={item.value}
- label={item.label}
- />
- ))}
-
- )}
-
-
-
+
+
{/* 내 정원에 심어진 나무는? */}
-
-
-
- 내 정원에 심어진 나무는
-
-
- 총 999그루
-
-
-
-
-
-
-
- 김디엔님에 대해 알아보세요!
-
-
-
-
-
-
-
-
-
-
-
-
-
+
{/* 가장 중요한 것 - 파이차트 */}
diff --git a/pages/test.tsx b/pages/test.tsx
deleted file mode 100644
index 631b4d8..0000000
--- a/pages/test.tsx
+++ /dev/null
@@ -1,16 +0,0 @@
-import ComboboxDropdown from '@/components/combobox'
-
-const Page = () => {
- return (
- <>
-
- console.log(option)}
- />
-
- >
- )
-}
-
-export default Page
diff --git a/styles/theme/colors.ts b/styles/theme/colors.ts
index e920f34..c43a76c 100644
--- a/styles/theme/colors.ts
+++ b/styles/theme/colors.ts
@@ -91,6 +91,7 @@ export const colors = {
green2: '#E2F6E9',
green3: '#ECFFE8',
blue1: '#E2F5FF',
+ blue2: '#EFFAFF',
yellow1: '#FFFDE7',
orange1: '#FFF1DB',
gray1: '#FAFAFA',
diff --git a/tailwind.config.ts b/tailwind.config.ts
index 1d9d40e..0e893e9 100644
--- a/tailwind.config.ts
+++ b/tailwind.config.ts
@@ -78,7 +78,7 @@ const config = {
'mainTitle1-medium': [
'28px',
{
- fontWeight: 'medium',
+ fontWeight: '500',
lineHeight: '38px',
},
],
@@ -92,7 +92,7 @@ const config = {
'mainTitle2-medium': [
'24px',
{
- fontWeight: 'medium',
+ fontWeight: '500',
lineHeight: '34px',
},
],
@@ -107,7 +107,7 @@ const config = {
'20px',
{
lineHeight: '28px',
- fontWeight: 'medium',
+ fontWeight: '500',
},
],
subTitle2: '18px',
@@ -129,7 +129,7 @@ const config = {
'body3-medium': [
'14px',
{
- fontWeight: 'medium',
+ fontWeight: '500',
lineHeight: '20px',
},
],