From 62d32a6f6fe6738491cbe2bfbb1b7182f2187b9d Mon Sep 17 00:00:00 2001 From: optrader Date: Thu, 4 Sep 2025 16:38:19 +0900 Subject: [PATCH] =?UTF-8?q?[250904]=20feat:=20UserReviews=20=EC=A0=84?= =?UTF-8?q?=EC=B2=B4=20=ED=91=9C=EC=8B=9C=20=EA=B8=B0=EB=8A=A5=20=EB=B0=8F?= =?UTF-8?q?=20TScroller=20=EB=8F=99=EA=B8=B0=ED=99=94=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ๐Ÿ• ์ปค๋ฐ‹ ์‹œ๊ฐ„: 2025. 09. 04. 16:38:16 ๐Ÿ’ฌ ์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€: UserReviews showAllReviews ํ† ๊ธ€ ๊ธฐ๋Šฅ ์™„์ „ ๊ตฌํ˜„ (Target ๋™๊ธฐํ™”) ์ฃผ์š” ๋ณ€๊ฒฝ์‚ฌํ•ญ: โ€ข Redux ์ƒํƒœ ๊ด€๋ฆฌ ์™„์ „ ๋™๊ธฐํ™” (Source์™€ ๋™์ผ) - actionTypes.js: TOGGLE_SHOW_ALL_REVIEWS ์•ก์…˜ ํƒ€์ž… ์ถ”๊ฐ€ - productActions.js: toggleShowAllReviews() ์•ก์…˜ ํฌ๋ฆฌ์—์ดํ„ฐ ๊ตฌํ˜„ - productReducer.js: handleToggleShowAllReviews ๋ฆฌ๋“€์„œ ํ•ธ๋“ค๋Ÿฌ ์ถ”๊ฐ€ โ€ข ProductAllSection ์ปดํฌ๋„ŒํŠธ ์ˆ˜์ • (Source์™€ ๋™์ผ) - LayoutSample ๋ฒ„ํŠผ์— toggleShowAllReviews ๋””์ŠคํŒจ์น˜ ์—ฐ๊ฒฐ - handleLayoutSampleClick ํ•ธ๋“ค๋Ÿฌ๋กœ Redux ์•ก์…˜ ํ˜ธ์ถœ ๊ตฌํ˜„ - ProductAllSection.module.less์— LayoutSample ์Šคํƒ€์ผ ์ถ”๊ฐ€ โ€ข UserReviews ์ปดํฌ๋„ŒํŠธ ํ•ต์‹ฌ ๊ฐœ์„  (Target ์ „์šฉ ์ˆ˜์ •) - ๊ธฐ์กด ๋ณต์žกํ•œ DOM ์กฐ์ž‘ ๋กœ์ง ์™„์ „ ์ œ๊ฑฐ * containerRef.current.querySelector ๋ฐฉ์‹ ์‚ญ์ œ * ๋ณต์žกํ•œ ์Šคํƒ€์ผ ์กฐ์ž‘ ๋ฐ resize ์ด๋ฒคํŠธ ๋กœ์ง ์ œ๊ฑฐ - Source์˜ ๊ฐ„๋‹จํ•œ TScroller ref ๊ธฐ๋ฐ˜ ๋กœ์ง์œผ๋กœ ๊ต์ฒด * tScrollerRef.current.calculateMetrics() ํ˜ธ์ถœ * tScrollerRef.current.scrollTo() ํ˜ธ์ถœ * 100ms setTimeout์œผ๋กœ ๋‹จ์ˆœํ™” - toggleShowAllReviews import ๋ฐ dispatch ์—ฐ๊ฒฐ ์™„์„ฑ โ€ข TScroller ๋™์ž‘ ์ตœ์ ํ™” - key prop ๋™์  ๋ณ€๊ฒฝ์œผ๋กœ ๊ฐ•์ œ ์žฌ๋ Œ๋”๋ง ํŠธ๋ฆฌ๊ฑฐ - showAllReviews ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ ์Šคํฌ๋กค ์˜์—ญ ์ž๋™ ์žฌ๊ณ„์‚ฐ - 5๊ฐœ โ†’ 100๊ฐœ ๋ฆฌ๋ทฐ ์ „์ฒด ๋ Œ๋”๋ง ์ง€์› โ€ข ์ฝ”๋“œ ์•ˆ์ •์„ฑ ๊ฐœ์„  - ๋ณต์žกํ•œ DOM ์ฟผ๋ฆฌ ๋กœ์ง ์ œ๊ฑฐ๋กœ ์—๋Ÿฌ ๊ฐ€๋Šฅ์„ฑ ๊ฐ์†Œ - TScroller ref ์ง์ ‘ ์ ‘๊ทผ์œผ๋กœ ์•ˆ์ •์ ์ธ ์Šคํฌ๋กค ์—…๋ฐ์ดํŠธ - React ๋ Œ๋”๋ง ์‚ฌ์ดํด๊ณผ ๋™๊ธฐํ™”๋œ ์—…๋ฐ์ดํŠธ ํƒ€์ด๋ฐ Target ํŠนํ™” ๋ฌธ์ œ ํ•ด๊ฒฐ: - Source์™€ ์™„์ „ ๋™์ผํ•œ ์ฝ”๋“œ ๋ฒ ์ด์Šค ๊ตฌ์ถ• - ๋ณต์žกํ•œ DOM ์กฐ์ž‘ ๋กœ์ง์„ ๊ฐ„๋‹จํ•œ ref ๊ธฐ๋ฐ˜์œผ๋กœ ํ†ตํ•ฉ - LayoutSample ํด๋ฆญ โ†’ 100๊ฐœ ๋ฆฌ๋ทฐ ํ‘œ์‹œ ๊ธฐ๋Šฅ ์™„์„ฑ ๐Ÿ“Š ๋ณ€๊ฒฝ ํ†ต๊ณ„: โ€ข ์ด ํŒŒ์ผ: 8๊ฐœ โ€ข ์ถ”๊ฐ€: +192์ค„ โ€ข ์‚ญ์ œ: -26์ค„ ๐Ÿ“ ์ถ”๊ฐ€๋œ ํŒŒ์ผ: + package-lock.json ๐Ÿ“ ์ˆ˜์ •๋œ ํŒŒ์ผ: ~ com.twin.app.shoptime/src/actions/actionTypes.js ~ com.twin.app.shoptime/src/actions/productActions.js ~ com.twin.app.shoptime/src/reducers/productReducer.js ~ com.twin.app.shoptime/src/views/DetailPanel/ProductAllSection/ProductAllSection.jsx ~ com.twin.app.shoptime/src/views/DetailPanel/ProductAllSection/ProductAllSection.module.less ~ com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/UserReviews/UserReviews.jsx ~ com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/UserReviews/UserReviews.module.less ๐Ÿ”ง ์ฃผ์š” ๋ณ€๊ฒฝ ๋‚ด์šฉ: โ€ข ํƒ€์ž… ์‹œ์Šคํ…œ ์•ˆ์ •์„ฑ ๊ฐ•ํ™” โ€ข ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ฐœ์„  โ€ข ์ค‘๊ฐ„ ๊ทœ๋ชจ ๊ธฐ๋Šฅ ๊ฐœ์„  โ€ข ๋ชจ๋“ˆ ๊ตฌ์กฐ ๊ฐœ์„  --- .../src/actions/actionTypes.js | 1 + .../src/actions/productActions.js | 5 ++ .../src/reducers/productReducer.js | 9 ++ .../ProductAllSection/ProductAllSection.jsx | 41 +++++---- .../ProductAllSection.module.less | 23 +++++ .../UserReviews/UserReviews.jsx | 87 +++++++++++++++++-- .../UserReviews/UserReviews.module.less | 52 ++++++++++- 7 files changed, 192 insertions(+), 26 deletions(-) diff --git a/com.twin.app.shoptime/src/actions/actionTypes.js b/com.twin.app.shoptime/src/actions/actionTypes.js index 23e0d69d..c2926686 100644 --- a/com.twin.app.shoptime/src/actions/actionTypes.js +++ b/com.twin.app.shoptime/src/actions/actionTypes.js @@ -156,6 +156,7 @@ export const types = { GET_PRODUCT_OPTION_ID: "GET_PRODUCT_OPTION_ID", CLEAR_PRODUCT_OPTIONS: "CLEAR_PRODUCT_OPTIONS", GET_USER_REVIEW: "GET_USER_REVIEW", + TOGGLE_SHOW_ALL_REVIEWS: "TOGGLE_SHOW_ALL_REVIEWS", // search actions GET_SEARCH: "GET_SEARCH", diff --git a/com.twin.app.shoptime/src/actions/productActions.js b/com.twin.app.shoptime/src/actions/productActions.js index 67ab1991..c380c9dd 100644 --- a/com.twin.app.shoptime/src/actions/productActions.js +++ b/com.twin.app.shoptime/src/actions/productActions.js @@ -194,6 +194,11 @@ const createMockReviewData = () => ({ } }); +// showAllReviews ์ƒํƒœ ํ† ๊ธ€ +export const toggleShowAllReviews = () => ({ + type: types.TOGGLE_SHOW_ALL_REVIEWS +}); + // ์ƒํ’ˆ๋ณ„ ์œ ์ € ๋ฆฌ๋ทฐ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ : IF-LGSP-0002 export const getUserReviews = (requestParams) => (dispatch, getState) => { const { prdtId } = requestParams; diff --git a/com.twin.app.shoptime/src/reducers/productReducer.js b/com.twin.app.shoptime/src/reducers/productReducer.js index a32edfe7..72bb02f4 100644 --- a/com.twin.app.shoptime/src/reducers/productReducer.js +++ b/com.twin.app.shoptime/src/reducers/productReducer.js @@ -6,6 +6,7 @@ const initialState = { productImageLength: 0, prdtOptInfo: {}, reviewData: null, // ๋ฆฌ๋ทฐ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ + showAllReviews: false, // ์ „์ฒด ๋ฆฌ๋ทฐ ๋ณด๊ธฐ ์ƒํƒœ }; // FP: handlers map (curried), pure and immutable updates only @@ -50,6 +51,13 @@ const handleUserReview = curry((state, action) => { return set("reviewData", reviewData, state); }); +// showAllReviews ํ† ๊ธ€ ํ•ธ๋“ค๋Ÿฌ +const handleToggleShowAllReviews = curry((state, action) => { + const currentValue = get("showAllReviews", state); + console.log("[UserReviews] Toggle showAllReviews:", !currentValue); + return set("showAllReviews", !currentValue, state); +}); + const handlers = { [types.GET_BEST_SELLER]: handleBestSeller, [types.GET_PRODUCT_OPTION]: handleProductOption, @@ -59,6 +67,7 @@ const handlers = { [types.CLEAR_PRODUCT_DETAIL]: handleClearProductDetail, [types.GET_PRODUCT_OPTION_ID]: handleProductOptionId, [types.GET_USER_REVIEW]: handleUserReview, // GET_USER_REVIEW ํ•ธ๋“ค๋Ÿฌ ์ถ”๊ฐ€ + [types.TOGGLE_SHOW_ALL_REVIEWS]: handleToggleShowAllReviews, // showAllReviews ํ† ๊ธ€ ํ•ธ๋“ค๋Ÿฌ }; export const productReducer = (state = initialState, action = {}) => { diff --git a/com.twin.app.shoptime/src/views/DetailPanel/ProductAllSection/ProductAllSection.jsx b/com.twin.app.shoptime/src/views/DetailPanel/ProductAllSection/ProductAllSection.jsx index 11491d2d..40b03a61 100644 --- a/com.twin.app.shoptime/src/views/DetailPanel/ProductAllSection/ProductAllSection.jsx +++ b/com.twin.app.shoptime/src/views/DetailPanel/ProductAllSection/ProductAllSection.jsx @@ -1,8 +1,9 @@ /* eslint-disable react/jsx-no-bind */ // src/views/DetailPanel/ProductAllSection/ProductAllSection.jsx import SpotlightContainerDecorator from "@enact/spotlight/SpotlightContainerDecorator"; +import Spottable from "@enact/spotlight/Spottable"; import React, { useCallback, useRef, useState, useMemo, useEffect } from "react"; -import { useSelector } from "react-redux"; +import { useSelector, useDispatch } from "react-redux"; import Spotlight from "@enact/spotlight"; import { PropTypes } from "prop-types"; @@ -12,6 +13,7 @@ import { $L } from "../../../utils/helperMethods"; import { curry, pipe, when, isVal, isNotNil, defaultTo, defaultWith, get, identity, isEmpty, isNil, andThen, tap } from "../../../utils/fp"; +import { toggleShowAllReviews } from "../../../actions/productActions"; import FavoriteBtn from "../components/FavoriteBtn"; import StarRating from "../components/StarRating"; import ProductTag from "../components/ProductTag"; @@ -99,22 +101,17 @@ const extractProductMeta = (productInfo) => ({ orderPhnNo: get("orderPhnNo", productInfo) }); -// ๋ ˆ์ด์•„์›ƒ ํ™•์ธ์šฉ ์ƒ˜ํ”Œ ์ปดํฌ๋„ŒํŠธ -const LayoutSample = () => ( -
- Layout Sample (1124px x 300px) -
+// ๋ ˆ์ด์•„์›ƒ ํ™•์ธ์šฉ ์ƒ˜ํ”Œ ์ปดํฌ๋„ŒํŠธ - Spottable๋กœ ๋ณ€๊ฒฝ +const SpottableComponent = Spottable("div"); + +const LayoutSample = ({ onClick }) => ( + + Layout Sample - Click to Show All Reviews (1124px x 300px) + ); export default function ProductAllSection({ @@ -129,10 +126,18 @@ export default function ProductAllSection({ setOpenThemeItemOverlay, themeProductInfo, }) { + const dispatch = useDispatch(); + const productData = useMemo(() => getProductData(productType, themeProductInfo, productInfo), [productType, themeProductInfo, productInfo] ); + + // [์ž„์‹œ ํ…Œ์ŠคํŠธ] LayoutSample ํด๋ฆญ ํ•ธ๋“ค๋Ÿฌ + const handleLayoutSampleClick = useCallback(() => { + console.log("[Test] LayoutSample clicked - dispatching toggleShowAllReviews"); + dispatch(toggleShowAllReviews()); + }, [dispatch]); // ๋””๋ฒ„๊น…: ์‹ค์ œ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ ํ™•์ธ useEffect(() => { @@ -383,7 +388,7 @@ export default function ProductAllSection({ id="scroll-marker-product-details" className={css.scrollMarker} > - +
{productData?.imgUrls600 && productData.imgUrls600.length > 0 ? ( productData.imgUrls600.map((image, index) => ( diff --git a/com.twin.app.shoptime/src/views/DetailPanel/ProductAllSection/ProductAllSection.module.less b/com.twin.app.shoptime/src/views/DetailPanel/ProductAllSection/ProductAllSection.module.less index 58a69c8e..7ea63d15 100644 --- a/com.twin.app.shoptime/src/views/DetailPanel/ProductAllSection/ProductAllSection.module.less +++ b/com.twin.app.shoptime/src/views/DetailPanel/ProductAllSection/ProductAllSection.module.less @@ -463,3 +463,26 @@ } } } + +// LayoutSample ํฌ์ปค์Šค ํ…Œ์ŠคํŠธ์šฉ ์Šคํƒ€์ผ +.layoutSample { + width: 1124px; + height: 300px; + background-color: yellow; + margin-bottom: 20px; + display: flex; + justify-content: center; + align-items: center; + color: black; + font-size: 24px; + font-weight: bold; + cursor: pointer; + position: relative; + border-radius: 8px; + + &:focus { + &::after { + .focused(@boxShadow:22px, @borderRadius:8px); + } + } +} \ No newline at end of file diff --git a/com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/UserReviews/UserReviews.jsx b/com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/UserReviews/UserReviews.jsx index e3eaba9b..770cd2d8 100644 --- a/com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/UserReviews/UserReviews.jsx +++ b/com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/UserReviews/UserReviews.jsx @@ -8,7 +8,7 @@ import { useMemo } from "react"; import Spottable from "@enact/spotlight/Spottable"; import SpotlightContainerDecorator from "@enact/spotlight/SpotlightContainerDecorator"; import { useDispatch, useSelector } from "react-redux"; -import { getUserReviews } from "../../../../actions/productActions"; +import { getUserReviews, toggleShowAllReviews } from "../../../../actions/productActions"; import StarRating from "../../components/StarRating"; import CustomerImages from "./CustomerImages/CustomerImages"; import UserReviewsPopup from "./UserReviewsPopup/UserReviewsPopup"; @@ -17,11 +17,13 @@ const SpottableComponent = Spottable("div"); const Container = SpotlightContainerDecorator( { - enterTo: "last-focused", + enterTo: "default-element", preserveld: true, leaveFor: { left: "spotlight-product-info-section-container" - } + }, + restrict: "none", + spotlightDirection: "vertical" }, "div" ); @@ -30,10 +32,46 @@ export default function UserReviews({ productInfo, panelInfo }) { const { getScrollTo, scrollTop } = useScrollTo(); const dispatch = useDispatch(); const containerRef = useRef(null); + const tScrollerRef = useRef(null); // ํŒ์—… ์ƒํƒœ ๊ด€๋ฆฌ const [isPopupOpen, setIsPopupOpen] = useState(false); const [selectedImageIndex, setSelectedImageIndex] = useState(0); + // Redux์—์„œ showAllReviews ์ƒํƒœ ๊ฐ€์ ธ์˜ค๊ธฐ + const showAllReviews = useSelector((state) => state.product.showAllReviews); + + // ๋””๋ฒ„๊น…: showAllReviews ์ƒํƒœ ๋ณ€๊ฒฝ ํ™•์ธ + useEffect(() => { + console.log("[UserReviews] showAllReviews state changed:", { + showAllReviews, + reviewListLength: reviewListData?.length || 0, + willShowCount: showAllReviews ? (reviewListData?.length || 0) : 5 + }); + }, [showAllReviews, reviewListData]); + + // showAllReviews ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ TScroller ์Šคํฌ๋กค ์˜์—ญ ๊ฐ•์ œ ์žฌ๊ณ„์‚ฐ + useEffect(() => { + if (showAllReviews && tScrollerRef.current) { + console.log("[UserReviews] Forcing TScroller to update scroll area for all reviews"); + + // ๋‹ค์Œ ๋ Œ๋”๋ง ์‚ฌ์ดํด ํ›„ ์Šคํฌ๋กค ์˜์—ญ ์žฌ๊ณ„์‚ฐ + setTimeout(() => { + if (tScrollerRef.current) { + // TScroller์˜ ์Šคํฌ๋กค ์˜์—ญ์„ ๊ฐ•์ œ๋กœ ์—…๋ฐ์ดํŠธ + if (typeof tScrollerRef.current.calculateMetrics === 'function') { + tScrollerRef.current.calculateMetrics(); + } + + // ๋˜๋Š” scrollTo๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์Šคํฌ๋กค ์˜์—ญ ์—…๋ฐ์ดํŠธ + if (typeof tScrollerRef.current.scrollTo === 'function') { + tScrollerRef.current.scrollTo({ position: { y: 0 }, animate: false }); + } + + console.log("[UserReviews] TScroller scroll area updated"); + } + }, 100); + } + }, [showAllReviews]); const reviewListData = useSelector( (state) => state.product.reviewData && state.product.reviewData.reviewList ); @@ -51,9 +89,11 @@ export default function UserReviews({ productInfo, panelInfo }) { useEffect(() => { console.log("[UserReviews] Review data received:", { reviewListData, + reviewListLength: reviewListData?.length || 0, reviewTotalCount, reviewDetailData, - hasData: reviewListData && reviewListData.length > 0 + hasData: reviewListData && reviewListData.length > 0, + actualDataLength: Array.isArray(reviewListData) ? reviewListData.length : 'not array' }); }, [reviewListData, reviewTotalCount, reviewDetailData]); @@ -116,6 +156,13 @@ export default function UserReviews({ productInfo, panelInfo }) { setSelectedImageIndex(index); }, []); + + const handleViewAllReviewsClick = useCallback(() => { + console.log("[UserReviews] View All Reviews clicked - dispatching toggleShowAllReviews"); + dispatch(toggleShowAllReviews()); + }, [dispatch]); + + // ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต (CustomerImages์™€ ๋™์ผํ•œ ๋กœ์ง) const customerImages = useMemo(() => { if (!reviewListData || !Array.isArray(reviewListData)) { @@ -155,9 +202,11 @@ export default function UserReviews({ productInfo, panelInfo }) { spotlightId="user-reviews-container" >
{$L( - `Showing ${reviewListData ? reviewListData.length : 0} out of ${reviewTotalCount} reviews` + `Showing ${reviewListData ? (showAllReviews ? reviewListData.length : Math.min(reviewListData.length, 5)) : 0} out of ${reviewTotalCount} reviews` )}
{reviewListData && - reviewListData.map((review, index) => { + (() => { + const reviewsToShow = showAllReviews ? reviewListData : reviewListData.slice(0, 5); + console.log("[UserReviews] Reviews to render:", { + showAllReviews, + totalReviews: reviewListData.length, + reviewsToShowCount: reviewsToShow.length, + isShowingAll: showAllReviews + }); + return reviewsToShow; + })().map((review, index) => { const { reviewImageList, rvwRtng, rvwRgstDtt, rvwCtnt, rvwId, wrtrNknm, rvwWrtrId } = review; console.log(`[UserReviews] Rendering review ${index}:`, { rvwId, hasImages: reviewImageList && reviewImageList.length > 0 }); @@ -224,7 +282,22 @@ export default function UserReviews({ productInfo, panelInfo }) { ); })} +
+ {/* View All Reviews ๋ฒ„ํŠผ - ์ผ์‹œ์ ์œผ๋กœ ์ฝ”๋ฉ˜ํŠธ ์ฒ˜๋ฆฌ */} + {/* {!showAllReviews && reviewListData && reviewListData.length > 5 && ( +
+ +
+
View All Reviews +
+
+
+
+ )} */} {/* UserReviewsPopup ์ถ”๊ฐ€ */} @@ -237,4 +310,4 @@ export default function UserReviews({ productInfo, panelInfo }) { /> ); -} +} \ No newline at end of file diff --git a/com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/UserReviews/UserReviews.module.less b/com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/UserReviews/UserReviews.module.less index 9b559131..64e155c4 100644 --- a/com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/UserReviews/UserReviews.module.less +++ b/com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/UserReviews/UserReviews.module.less @@ -2,8 +2,10 @@ @import "../../../../style/utils.module.less"; .tScroller { - .size(@w: 1124px, @h: 100%); // ๋งˆ์ง„ ํฌํ•จ ์ „์ฒด ํฌ๊ธฐ (1054px + 60px) + .size(@w: 1124px, @h: auto); // auto height to accommodate dynamic content max-width: 1124px; + min-height: 500px; // ์ตœ์†Œ ๋†’์ด ๋ณด์žฅ + max-height: none; // ์ตœ๋Œ€ ๋†’์ด ์ œํ•œ ์—†์Œ padding: 0; box-sizing: border-box; } @@ -108,4 +110,52 @@ } } } + + .viewAllReviewsSection { + width: 100%; + height: 105px; // 75px + 30px margin-bottom + display: flex; + justify-content: center; + align-items: flex-start; + margin-top: 20px; + + .viewAllReviewsButton { + width: auto; // "View All Reviews +" ํ•œ ์ค„ ํ‘œ์‹œ์šฉ์œผ๋กœ ํ™•์žฅ + height: 75px; // 20 + 35 + 20 + cursor: pointer; + + &:focus { + &::after { + .focused(@boxShadow:22px, @borderRadius:6px); + } + } + + .viewAllReviewsContent { + width: 100%; + height: 100%; + padding: 20px 30px; + background: rgba(255, 255, 255, 0.05); + border-radius: 6px; + border: 1px solid #EEEEEE; + display: flex; + justify-content: flex-start; + align-items: center; + + .viewAllReviewsText { + color: #EAEAEA; + font-size: 24px; + font-family: @baseFont; + font-weight: 600; + line-height: 35px; + margin-right: 10px; + } + + .viewAllReviewsIcon { + width: 17px; + height: 17px; + // ํ”Œ๋Ÿฌ์Šค ์•„์ด์ฝ˜์„ ์œ„ํ•œ ์Šคํƒ€์ผ (ํ–ฅํ›„ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ) + } + } + } + } } \ No newline at end of file