diff --git a/src/components/PostHeader/EmojiGroup/EmojiBadge.module.scss b/src/components/PostHeader/EmojiGroup/EmojiBadge.module.scss
index cedfb59..d4fb7dc 100644
--- a/src/components/PostHeader/EmojiGroup/EmojiBadge.module.scss
+++ b/src/components/PostHeader/EmojiGroup/EmojiBadge.module.scss
@@ -4,7 +4,7 @@
display: inline-flex;
align-items: center;
justify-content: center;
- background: #666666;
+ background-color: rgba(0,0,0,0.54);
border-radius: 16px;
color: #ffffff;
white-space: nowrap;
diff --git a/src/pages/HomePage/HomePage.module.scss b/src/pages/HomePage/HomePage.module.scss
index 99f966c..cefdd21 100644
--- a/src/pages/HomePage/HomePage.module.scss
+++ b/src/pages/HomePage/HomePage.module.scss
@@ -28,9 +28,11 @@ body {
width: 1200px;
padding: 90px;
overflow: hidden;
+ animation: slide-in-left 1s ease;
&--reverse {
flex-direction: row-reverse;
+ animation: slide-in-right 1s ease;
}
&__context {
@@ -111,3 +113,25 @@ body {
}
}
}
+
+@keyframes slide-in-left {
+ 0% {
+ opacity: 0.5;
+ transform: translateX(50px);
+ }
+ 100% {
+ opacity: 1;
+ transform: translateX(0);
+ }
+}
+
+@keyframes slide-in-right {
+ 0% {
+ opacity: 0.5;
+ transform: translateX(-50px);
+ }
+ 100% {
+ opacity: 1;
+ transform: translateX(0);
+ }
+}
\ No newline at end of file
diff --git a/src/pages/ListPage/components/ItemCard.jsx b/src/pages/ListPage/components/ItemCard.jsx
index 6838093..c2d3896 100644
--- a/src/pages/ListPage/components/ItemCard.jsx
+++ b/src/pages/ListPage/components/ItemCard.jsx
@@ -1,11 +1,10 @@
-// src/components/ItemCard/ItemCard.jsx
-import React from 'react';
import { Link } from 'react-router-dom';
import styles from './ItemCard.module.scss';
import ShowAvatars from './ShowAvatars';
import ShowEmoji from './ShowEmoji';
import { getBackgroundStylesFromPostData } from '@/utils/getBackgroundStylesFromPostData';
import { getContentStylesFromPostData } from '@/utils/getContentStylesFromPostData';
+import { getIsCardDarkFromPostData } from '../../../utils/getIsCardDarkFromPostData';
const ItemCard = ({
id,
@@ -24,43 +23,79 @@ const ItemCard = ({
// 이미지: 하얀색 텍스트 / 어두운색 overlay 적용
const contentStyle = getContentStylesFromPostData(backgroundImageURL);
+ //카드가 밝은 색인지 어두운 색인지 판별
+ //이미지: true
+ //어두운 색: true
+ //밝은 색: false
+ const isCardDark = getIsCardDarkFromPostData(backgroundImageURL);
+
+ //isCardDark true: 밝은색 선
+ //isCardDark false: 어두운색 선
+ const myDivClassName = isCardDark
+ ? `${styles['item-card__myDiv']} ${styles['card-dark']}`
+ : `${styles['item-card__myDiv']} ${styles['card-light']}`;
+
return (
+ {/* 밝은조명 효과 */}
+
+ {/* 어두운 음영 효과 */}
+
To. {name}
-
{messageCount}명이 작성했어요!
- {/* 프로필 아바타 영역 (최대 3) */}
- {recentMessages.length > 0 ? (
+
+ {/* 프로필 아바타 영역 (최대 3) */}
+
- ) : (
-
- )}
+
-
+
+ {!messageCount ? (
+ `아직 받은 메세지가 없어요🥲`
+ ) : (
+
+ {messageCount}명이 작성했어요!
+
+ )}
+
+
+
{/* 반응 이모지 영역 (최대 3) */}
- {topReactions.length > 0 ? (
+
);
};
+const Skeleton = () => {
+ return (
+
+
+
+
+
+
+
+ {new Array(3).fill(0).map((_, i) => (
+
+ ))}
+
+
+
+ );
+};
+
+ItemCard.skeleton = Skeleton;
+
export default ItemCard;
diff --git a/src/pages/ListPage/components/ItemCard.module.scss b/src/pages/ListPage/components/ItemCard.module.scss
index 2f70c89..3ed95e5 100644
--- a/src/pages/ListPage/components/ItemCard.module.scss
+++ b/src/pages/ListPage/components/ItemCard.module.scss
@@ -17,15 +17,36 @@
transform: translateZ(0);
&:hover {
transform: scale(1.05);
- }
+ }
+
+ &__shinning {
+ position: absolute;
+ width: 90px;
+ height: 200px;
+ right: 20px;
+ top: 20px;
+ background-color: #ffffff;
+ filter: blur(60px);
+ z-index: -1;
+ }
+
+ &__shadow {
+ position: absolute;
+ width: 10px;
+ height: 200px;
+ left: 20px;
+ top: 20px;
+ background-color: #222222;
+ filter: blur(55px);
+ z-index: -1;
+ }
&__content {
display: flex;
flex-direction: column;
- justify-content: center;
- gap: 10px;
+ gap: 12px;
height: 100%;
- padding: 30px 24px;
+ padding: 30px 24px 20px;
color: var(--color-gray-900);
}
@@ -39,13 +60,27 @@
margin: 0;
font-size: var(--font-size-24);
font-weight: var(--font-weight-bold);
+ line-height: 36px;
+ height:36px;
}
+ &__avatars-area {
+ height: 29px;
+ }
+
&__meta {
- margin: 4px 0;
font-size: var(--font-size-16);
+ line-height: 26px;
+ height: 26px;
+ flex-grow: 1;
}
+ &__emojis-area {
+ height: 36px;
+ display: flex;
+ align-items: center;
+ }
+
&__top-reactions {
display: flex;
gap: 8px;
@@ -64,6 +99,73 @@
&__myDiv {
width: 100%;
margin: 1% 0;
- border: 0.5px solid rgba(0, 0, 0, 0.12);
+ border-bottom: 1px solid rgba(0, 0, 0, 0.12);
+ &.card-dark {
+ border: 1px solid rgba(255, 255, 255, 0.4);
+ }
+ &.card-light {
+ border: 1px solid rgba(0, 0, 0, 0.12);
+ }
}
}
+
+.skeleton-card {
+ position: relative;
+ width: 275px;
+ height: 260px;
+ overflow: hidden;
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);
+ border-radius: 16px;
+ border: 1px solid rgba(0, 0, 0, 0.1);
+ transform: scale(1);
+ transition: transform 0.5s;
+ will-change: transform;
+ transform: translateZ(0);
+
+ &__content {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+ height: 100%;
+ padding: 30px 24px 20px;
+ }
+
+ &__title {
+ @include skeleton-style;
+ width: 100%;
+ height:36px;
+ }
+
+ &__profile {
+ @include skeleton-style;
+ width: 30%;
+ height: 30px;
+ border-radius: 16px;
+ }
+
+ &__meta {
+ @include skeleton-style;
+ height: 26px;
+ flex-grow: 1;
+ }
+
+ &__emojis-area {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ height: 36px;
+ }
+
+ &__emoji {
+ @include skeleton-style;
+ width: 64px;
+ height: 32px;
+ border-radius: 16px;
+ }
+
+ &__myDiv {
+ width: 100%;
+ margin: 1% 0;
+ border: 1px solid rgba(0, 0, 0, 0.12);
+ }
+}
\ No newline at end of file
diff --git a/src/pages/ListPage/components/Slider.jsx b/src/pages/ListPage/components/Slider.jsx
index 9331fd3..515f913 100644
--- a/src/pages/ListPage/components/Slider.jsx
+++ b/src/pages/ListPage/components/Slider.jsx
@@ -41,6 +41,8 @@ const Slider = ({ cards, hasNext, loadMore }) => {
{isDesktop ? (
+ {visibleCards.length === 0 &&
+ new Array(4).fill(0).map((_, i) =>
)}
{visibleCards.map((card) => (
{
scrollObserverRef={scrollObserverRef}
>
+ {visibleCards.length === 0 &&
+ new Array(4).fill(0).map((_, i) => )}
{visibleCards.map((card) => (
{
+ if (!backgroundImageURL) {
+ return false;
+ } else {
+ const urlObj = new URL(backgroundImageURL);
+ const parts = urlObj.pathname.split('/'); // ['','dxho7f5dm','image','upload','v1749409044','colors','6a6a6a.png']
+ const folderCandidate = parts[5]; // public_id 시작 부분 (index 5)
+ if (folderCandidate === 'colors') {
+ const imageHexColor = getColorFromCloudinaryImageUrl(backgroundImageURL);
+ const isColorDark = getIsColorDark(imageHexColor);
+ if (isColorDark) {
+ return true;
+ } else {
+ return false;
+ }
+ } else if (folderCandidate === 'images') {
+ return true;
+ } else {
+ return true;
+ }
+ }
+};