From 8413bb4be61eab2d85a1f0da4396fd03e6a172b7 Mon Sep 17 00:00:00 2001 From: Son Juwan Date: Mon, 27 Oct 2025 14:28:21 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feat/#11:=20image,string=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/drawable/img_home_logo.png | Bin 0 -> 5395 bytes app/src/main/res/values/strings.xml | 3 +++ 2 files changed, 3 insertions(+) create mode 100644 app/src/main/res/drawable/img_home_logo.png diff --git a/app/src/main/res/drawable/img_home_logo.png b/app/src/main/res/drawable/img_home_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c69773d07cc6ce6f0e631f5f25824c394b05ee50 GIT binary patch literal 5395 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6402b20..8dfb7e0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -6,4 +6,7 @@ community mypage + + 전체보기 + \ No newline at end of file From 5dcba79e024a68b03abf749b4c39a0f520764797 Mon Sep 17 00:00:00 2001 From: Son Juwan Date: Mon, 27 Oct 2025 14:28:30 +0900 Subject: [PATCH 2/4] =?UTF-8?q?feat/#11:=20Icon=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/drawable/ic_home_arrow_right.xml | 9 +++++++++ app/src/main/res/drawable/ic_home_post_arrow.xml | 9 +++++++++ app/src/main/res/drawable/ic_home_textall_arrow.xml | 9 +++++++++ 3 files changed, 27 insertions(+) create mode 100644 app/src/main/res/drawable/ic_home_arrow_right.xml create mode 100644 app/src/main/res/drawable/ic_home_post_arrow.xml create mode 100644 app/src/main/res/drawable/ic_home_textall_arrow.xml diff --git a/app/src/main/res/drawable/ic_home_arrow_right.xml b/app/src/main/res/drawable/ic_home_arrow_right.xml new file mode 100644 index 0000000..3bd8317 --- /dev/null +++ b/app/src/main/res/drawable/ic_home_arrow_right.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_home_post_arrow.xml b/app/src/main/res/drawable/ic_home_post_arrow.xml new file mode 100644 index 0000000..cc1ec88 --- /dev/null +++ b/app/src/main/res/drawable/ic_home_post_arrow.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_home_textall_arrow.xml b/app/src/main/res/drawable/ic_home_textall_arrow.xml new file mode 100644 index 0000000..a5e5ff2 --- /dev/null +++ b/app/src/main/res/drawable/ic_home_textall_arrow.xml @@ -0,0 +1,9 @@ + + + From 6374ccd7954643aae17f5b3c85e91d24fba073ad Mon Sep 17 00:00:00 2001 From: Son Juwan Date: Mon, 27 Oct 2025 14:28:41 +0900 Subject: [PATCH 3/4] =?UTF-8?q?feat/#11:=20Home=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/caches/deviceStreaming.xml | 348 +++++++++++++++++- .../home/component/HomeBottomContent.kt | 67 ++++ .../home/component/HomeCardItem.kt | 91 +++++ .../home/component/HomeCarousel.kt | 89 +++++ .../home/component/HomeContentField.kt | 74 ++++ .../home/component/HomePostContainer.kt | 103 ++++++ 6 files changed, 760 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/com/hsLink/hslink/presentation/home/component/HomeBottomContent.kt create mode 100644 app/src/main/java/com/hsLink/hslink/presentation/home/component/HomeCardItem.kt create mode 100644 app/src/main/java/com/hsLink/hslink/presentation/home/component/HomeCarousel.kt create mode 100644 app/src/main/java/com/hsLink/hslink/presentation/home/component/HomeContentField.kt create mode 100644 app/src/main/java/com/hsLink/hslink/presentation/home/component/HomePostContainer.kt diff --git a/.idea/caches/deviceStreaming.xml b/.idea/caches/deviceStreaming.xml index 5c90e4f..5d41895 100644 --- a/.idea/caches/deviceStreaming.xml +++ b/.idea/caches/deviceStreaming.xml @@ -51,18 +51,6 @@ diff --git a/app/src/main/java/com/hsLink/hslink/presentation/home/component/HomeBottomContent.kt b/app/src/main/java/com/hsLink/hslink/presentation/home/component/HomeBottomContent.kt new file mode 100644 index 0000000..86d40a4 --- /dev/null +++ b/app/src/main/java/com/hsLink/hslink/presentation/home/component/HomeBottomContent.kt @@ -0,0 +1,67 @@ +package com.hsLink.hslink.presentation.home.component + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.hsLink.hslink.R +import com.hsLink.hslink.core.designsystem.theme.HsLinkTheme +import com.hsLink.hslink.core.util.noRippleClickable + +@Preview(showBackground = true) +@Composable +private fun HomeBottomContentPreview() { + HsLinkTheme { + HomeBottomContent( + onClick = {}, + ) + } +} + +@Composable +fun HomeBottomContent( + onClick: () -> Unit, + modifier: Modifier = Modifier, +) { + Column( + modifier = modifier + .fillMaxWidth() + .padding(horizontal = 24.dp, vertical = 32.dp), + horizontalAlignment = Alignment.Start, + verticalArrangement = Arrangement.spacedBy(4.dp) + ) { + Image( + painter = painterResource(id = R.drawable.img_home_logo), + contentDescription = null, + modifier = Modifier + .height(48.dp) + .width(92.dp), + ) + Spacer(modifier = Modifier.height(8.dp)) + + Text( + text = "이용약관 및 개인정보 취급방침", + color = HsLinkTheme.colors.Grey400, + style = HsLinkTheme.typography.btm_M, + modifier = Modifier.noRippleClickable(onClick = onClick) + ) + Text( + text = "리뷰운영정책", + color = HsLinkTheme.colors.Grey400, + style = HsLinkTheme.typography.btm_M, + modifier = Modifier.noRippleClickable(onClick = onClick) + ) + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hsLink/hslink/presentation/home/component/HomeCardItem.kt b/app/src/main/java/com/hsLink/hslink/presentation/home/component/HomeCardItem.kt new file mode 100644 index 0000000..6a4cdee --- /dev/null +++ b/app/src/main/java/com/hsLink/hslink/presentation/home/component/HomeCardItem.kt @@ -0,0 +1,91 @@ +package com.hsLink.hslink.presentation.home.component + +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.hsLink.hslink.R +import com.hsLink.hslink.core.designsystem.theme.HsLinkTheme + +@Preview(showBackground = true) +@Composable +private fun PreviewHomeCardItem() { + HsLinkTheme { + HomeCardItem( + userName = "John Doe", + userMajor = "Computer Science", + userInfo = "Senior at XYZ University", + modifier = Modifier + ) + } +} + +@Composable +fun HomeCardItem( + userName: String, + userMajor: String, + userInfo: String, + modifier: Modifier = Modifier, +) { + Row( + modifier = modifier + .fillMaxWidth() + .border( + width = 1.dp, + color = HsLinkTheme.colors.Grey100, + shape = RoundedCornerShape(8.dp) + ) + .padding(16.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Column( + modifier = Modifier.weight(1f), + verticalArrangement = Arrangement.spacedBy(4.dp) + ) { + Text( + text = userName, + color = HsLinkTheme.colors.Grey700, + style = HsLinkTheme.typography.title_16Strong, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + + Text( + text = userMajor, + color = HsLinkTheme.colors.Grey700, + style = HsLinkTheme.typography.body_14Normal, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + + Text( + text = userInfo, + color = HsLinkTheme.colors.Grey400, + style = HsLinkTheme.typography.caption_12Normal, maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + + Spacer(modifier = Modifier.weight(1f)) + + Icon( + imageVector = ImageVector.vectorResource(id = R.drawable.ic_home_arrow_right), + contentDescription = null, + tint = HsLinkTheme.colors.Grey200 + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hsLink/hslink/presentation/home/component/HomeCarousel.kt b/app/src/main/java/com/hsLink/hslink/presentation/home/component/HomeCarousel.kt new file mode 100644 index 0000000..3bdd183 --- /dev/null +++ b/app/src/main/java/com/hsLink/hslink/presentation/home/component/HomeCarousel.kt @@ -0,0 +1,89 @@ +package com.hsLink.hslink.presentation.home.component + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.PagerState +import androidx.compose.foundation.pager.rememberPagerState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import coil.compose.AsyncImage +import com.hsLink.hslink.core.designsystem.theme.HsLinkTheme + +@Preview(showBackground = true) +@Composable +private fun HomeCarouselPreview() { + HsLinkTheme { + HomeCarousel( + pagerImages = listOf( + "https://example.com/image1.jpg", + "https://example.com/image2.jpg", + "https://example.com/image3.jpg" + ), + modifier = Modifier + ) + } +} + +@Composable +fun HomeCarousel( + pagerImages: List, + modifier: Modifier = Modifier, +) { + val pagerState = rememberPagerState(pageCount = { pagerImages.size }) + + Box( + modifier = modifier.fillMaxWidth() + ) { + HorizontalPager( + state = pagerState, + modifier = Modifier + .fillMaxWidth() + .height(180.dp) + ) { page -> + AsyncImage( + model = pagerImages[page], + contentDescription = "Pager Image $page", + contentScale = ContentScale.FillBounds, + ) + } + + HomeCarouselIndicator( + pagerState = pagerState, + modifier = Modifier + .align(Alignment.BottomEnd) + .padding(bottom = 8.dp, end = 16.dp) + ) + } +} + +@Composable +private fun HomeCarouselIndicator( + pagerState: PagerState, + modifier: Modifier = Modifier, +) { + Row( + modifier = modifier + .background( + color = HsLinkTheme.colors.Grey400, + shape = RoundedCornerShape(12.dp) + ) + .padding(horizontal = 8.dp, vertical = 4.dp) + ) { + Text( + text = "${pagerState.currentPage + 1} / ${pagerState.pageCount}", + color = HsLinkTheme.colors.Grey100, + style = HsLinkTheme.typography.caption_12Normal + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hsLink/hslink/presentation/home/component/HomeContentField.kt b/app/src/main/java/com/hsLink/hslink/presentation/home/component/HomeContentField.kt new file mode 100644 index 0000000..2f38e7b --- /dev/null +++ b/app/src/main/java/com/hsLink/hslink/presentation/home/component/HomeContentField.kt @@ -0,0 +1,74 @@ +package com.hsLink.hslink.presentation.home.component + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.hsLink.hslink.R +import com.hsLink.hslink.core.designsystem.theme.HsLinkTheme + +@Composable +fun HomeContentField( + mainText: String, + subText: String, + modifier: Modifier = Modifier, +) { + Column( + modifier = modifier + .fillMaxWidth() + .padding(horizontal = 20.dp), + verticalArrangement = Arrangement.spacedBy(4.dp) + ) { + Text( + text = mainText, + color = HsLinkTheme.colors.DeepBlue500, + style = HsLinkTheme.typography.title_14Strong + ) + Row( + modifier = Modifier + .fillMaxWidth(), + ) { + Text( + text = subText, + color = HsLinkTheme.colors.Grey700, + style = HsLinkTheme.typography.title_20Strong + ) + + Spacer(modifier = Modifier.weight(1F)) + + Text( + text = stringResource(id = R.string.home_content_field_all), + color = HsLinkTheme.colors.DeepBlue500, + style = HsLinkTheme.typography.btm_M + ) + + Icon( + imageVector = ImageVector.vectorResource(id = R.drawable.ic_home_textall_arrow), + contentDescription = null, + tint = HsLinkTheme.colors.DeepBlue500, + ) + } + } +} + +@Preview(showBackground = true) +@Composable +private fun HomeContentFieldPreview() { + HsLinkTheme { + HomeContentField( + mainText = "Main Text", + subText = "Sub Text", + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hsLink/hslink/presentation/home/component/HomePostContainer.kt b/app/src/main/java/com/hsLink/hslink/presentation/home/component/HomePostContainer.kt new file mode 100644 index 0000000..9ccb464 --- /dev/null +++ b/app/src/main/java/com/hsLink/hslink/presentation/home/component/HomePostContainer.kt @@ -0,0 +1,103 @@ +package com.hsLink.hslink.presentation.home.component + +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.hsLink.hslink.R +import com.hsLink.hslink.core.designsystem.theme.HsLinkTheme +import com.hsLink.hslink.core.util.noRippleClickable + + +@Preview(showBackground = true) +@Composable +private fun HomePostContainerPreview() { + HsLinkTheme { + HomePostContainer( + posts = listOf( + HomePost(id = "1", title = "2026 카카오 신입 공채", route = "route1"), + HomePost(id = "2", title = "선배가 알려주는 이력서 꿀팁", route = "route2") + ), + onPostClick = {} + ) + } +} + +data class HomePost( + val id: String, + val title: String, + val route: String, +) + +@Composable +fun HomePostContainer( + posts: List, + onPostClick: (HomePost) -> Unit, + modifier: Modifier = Modifier, +) { + Column( + modifier = modifier + .fillMaxWidth() + .border( + width = 1.dp, + color = HsLinkTheme.colors.Grey100, + shape = RoundedCornerShape(8.dp) + ) + .padding(horizontal = 12.dp, vertical = 4.dp) + ) { + posts.forEachIndexed { index, post -> + HomePostContent( + postTitle = post.title, + onClick = { onPostClick(post) } + ) + + if (index < posts.lastIndex) { + HorizontalDivider( + thickness = 1.dp, + color = HsLinkTheme.colors.Grey100 + ) + } + } + } +} + +@Composable +private fun HomePostContent( + postTitle: String, + onClick: () -> Unit, + modifier: Modifier = Modifier, +) { + Row( + modifier = modifier + .fillMaxWidth() + .noRippleClickable(onClick = onClick) + .padding(vertical = 13.dp, horizontal = 16.dp) + ) { + Text( + text = postTitle, + color = HsLinkTheme.colors.Grey700, + style = HsLinkTheme.typography.title_16Strong + ) + + Spacer(modifier = Modifier.weight(1f)) + + Icon( + imageVector = ImageVector.vectorResource(id = R.drawable.ic_home_post_arrow), + contentDescription = null, + tint = Color.Unspecified + ) + } +} \ No newline at end of file From 1b5f2e3bd4922939345f47f0bbfda85add0e9823 Mon Sep 17 00:00:00 2001 From: Son Juwan Date: Mon, 27 Oct 2025 14:28:48 +0900 Subject: [PATCH 4/4] =?UTF-8?q?feat/#11:=20Home=20=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hslink/presentation/home/HomeScreen.kt | 178 +++++++++++++++++- 1 file changed, 170 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/hsLink/hslink/presentation/home/HomeScreen.kt b/app/src/main/java/com/hsLink/hslink/presentation/home/HomeScreen.kt index 6e1030a..20e1431 100644 --- a/app/src/main/java/com/hsLink/hslink/presentation/home/HomeScreen.kt +++ b/app/src/main/java/com/hsLink/hslink/presentation/home/HomeScreen.kt @@ -1,12 +1,38 @@ package com.hsLink.hslink.presentation.home +import androidx.compose.foundation.Image +import androidx.compose.foundation.background import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Text +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material3.HorizontalDivider import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.hsLink.hslink.R +import com.hsLink.hslink.core.designsystem.component.HsLinkTopBar import com.hsLink.hslink.core.designsystem.theme.HsLinkTheme +import com.hsLink.hslink.presentation.home.component.HomeBottomContent +import com.hsLink.hslink.presentation.home.component.HomeCardItem +import com.hsLink.hslink.presentation.home.component.HomeCarousel +import com.hsLink.hslink.presentation.home.component.HomeContentField +import com.hsLink.hslink.presentation.home.component.HomePost +import com.hsLink.hslink.presentation.home.component.HomePostContainer +@Preview(showBackground = true) +@Composable +private fun HomeScreenPreview() { + HsLinkTheme { + HomeScreen(paddingValues = PaddingValues()) + } +} @Composable fun HomeRoute( @@ -22,11 +48,147 @@ fun HomeScreen( paddingValues: PaddingValues, modifier: Modifier = Modifier, ) { - Text( - text = "Home Screen", - style = HsLinkTheme.typography.body_16Normal, - color = HsLinkTheme.colors.SkyBlue100, + LazyColumn( modifier = modifier - .padding(paddingValues) - ) -} \ No newline at end of file + .fillMaxSize() + .background(color = HsLinkTheme.colors.Common) + .padding(paddingValues), + ) { + item { + HsLinkTopBar( + modifier = Modifier, + title = { + Image( + painter = painterResource(id = R.drawable.img_home_logo), + contentDescription = null, + modifier = Modifier + .height(48.dp) + .width(92.dp), + contentScale = ContentScale.FillBounds, + ) + }, + rightIconFirst = null, + rightIconSecond = null, + leftIcon = null + ) + } + + item { + HomeCarousel( + pagerImages = listOf( + "https://cdn.edujin.co.kr/news/photo/202209/39788_81397_67.png", + "image2", + "image3" + ), + ) + } + + item { + Spacer(modifier = Modifier.height(32.dp)) + + HomeContentField( + mainText = "멘토링 신청", + subText = "한성선배님께 멘토링을\n신청해보세요!", + ) + } + + item { + Spacer(modifier = Modifier.height(16.dp)) + + HomeCardItem( + userName = "송효재", + userMajor = "회계재무경영", + userInfo = "구직중,졸업", + modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp) + ) + } + + item { + Spacer(modifier = Modifier.height(40.dp)) + + HomeContentField( + mainText = "인기 게시글", + subText = "실시간 인기 게시글을\n확인해보세요!", + ) + } + + item { + Spacer(modifier = Modifier.height(16.dp)) + + HomePostContainer( + posts = listOf( + HomePost( + id = "1", + title = "2026 카카오 신입 공채", + route = "route1" + ), + HomePost( + id = "2", + title = "선배가 알려주는 이력서 꿀팁", + route = "route2" + ), + HomePost( + id = "3", + title = "선배가 알려주는 이력서 꿀팁", + route = "route3" + ), + HomePost( + id = "4", + title = "선배가 알려주는 이력서 꿀팁", + route = "route4" + ), + HomePost( + id = "5", + title = "선배가 알려주는 이력서 꿀팁", + route = "route5" + ) + + ), + onPostClick = {}, + modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp) + ) + } + + item { + Spacer(modifier = Modifier.height(40.dp)) + + HomeContentField( + mainText = "최신 홍보 게시글", + subText = "실시간 홍보 게시물을\n확인해보세요!", + ) + } + + item { + HomeCardItem( + userName = "한성대학생이 카카오에 취직하는 가장 확실한 방법을 알려드립니다.", + userMajor = "한성대학교에 다니는 후배들이 취업고민이 많을 것 같은디,테스트용입니다", + userInfo = "08학번 성규현", + modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp) + ) + } + + item { + Spacer(modifier = Modifier.height(36.dp)) + + HorizontalDivider( + thickness = 1.dp, + color = HsLinkTheme.colors.Grey100 + ) + } + + item { + HomeBottomContent( + onClick = { }, + ) + } + + item { + HorizontalDivider( + thickness = 1.dp, + color = HsLinkTheme.colors.Grey100 + ) + } + + } + +}