diff --git a/com.twin.app.shoptime/src/components/TToast/TToastEnhanced.jsx b/com.twin.app.shoptime/src/components/TToast/TToastEnhanced.jsx index ef0c49fa..31efd73e 100644 --- a/com.twin.app.shoptime/src/components/TToast/TToastEnhanced.jsx +++ b/com.twin.app.shoptime/src/components/TToast/TToastEnhanced.jsx @@ -1,19 +1,14 @@ -import React, { - useEffect, - useRef, - useState, -} from 'react'; +import React, { useEffect, useRef, useState } from 'react'; import classNames from 'classnames'; -import { - useDispatch, - useSelector, -} from 'react-redux'; +import { useDispatch, useSelector } from 'react-redux'; +import Spotlight from '@enact/spotlight'; import Spottable from '@enact/spotlight/Spottable'; import { changeAppStatus } from '../../actions/commonActions'; import BuyOption from '../../views/DetailPanel/components/BuyOption'; +import ThemeContents from '../../views/DetailPanel/ThemeProduct/ThemeContents'; import css from './TToastEnhanced.module.less'; const SpottableToast = Spottable('div'); @@ -37,6 +32,17 @@ export default function TToastEnhanced({ productInfo, // ๐Ÿš€ BuyOption์— ์ „๋‹ฌํ•  ์ƒํ’ˆ ์ •๋ณด selectedPatnrId, // ๐Ÿš€ BuyOption์— ์ „๋‹ฌํ•  ํŒŒํŠธ๋„ˆ ID selectedPrdtId, // ๐Ÿš€ BuyOption์— ์ „๋‹ฌํ•  ์ƒํ’ˆ ID + // ๐Ÿš€ ThemeContents ๊ด€๋ จ props + themeItems, + setSelectedIndex, + videoVerticalVisible, + currentVideoShowId, + tabIndex, + handleItemFocus, + tabTitle, + panelInfo, + direction, + version, ...rest }) { const dispatch = useDispatch(); @@ -60,6 +66,12 @@ export default function TToastEnhanced({ // ์•ฝ๊ฐ„์˜ ์ง€์—ฐ์„ ๋‘๊ณ  ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹œ์ž‘ const showTimer = setTimeout(() => { setIsVisible(true); + // themeContents ํƒ€์ž…์ผ ๋•Œ ํฌ์ปค์Šค ์„ค์ • + if (type === 'themeContents') { + setTimeout(() => { + Spotlight.focus('theme-contents-close-button'); + }, 100); + } }, 50); startTimer(); @@ -68,36 +80,40 @@ export default function TToastEnhanced({ clearTimeout(showTimer); clearTimer(); }; - }, []); + }, [type]); - // BuyOption ์ปจํ…Œ์ด๋„ˆ ref + // BuyOption, ThemeContents ์ปจํ…Œ์ด๋„ˆ ref const buyOptionRef = useRef(null); + const themeContentsRef = useRef(null); - // BuyOption ํƒ€์ž…์ผ ๋•Œ ์ „์—ญ ํฌ์ปค์Šค ๊ฐ์ง€ + // BuyOption, ThemeContents ํƒ€์ž…์ผ ๋•Œ ์ „์—ญ ํฌ์ปค์Šค ๊ฐ์ง€ useEffect(() => { - if (type === 'buyOption') { - // BuyOption์ด ํฌ์ปค์Šค๋ฅผ ๋ฐ›์•˜๋Š”์ง€ ์ถ”์ ํ•˜๋Š” ํ”Œ๋ž˜๊ทธ - let hasBuyOptionReceivedFocus = false; + if (type === 'buyOption' || type === 'themeContents') { + // ํฌ์ปค์Šค๋ฅผ ๋ฐ›์•˜๋Š”์ง€ ์ถ”์ ํ•˜๋Š” ํ”Œ๋ž˜๊ทธ + let hasComponentReceivedFocus = false; + const componentRef = type === 'buyOption' ? buyOptionRef : themeContentsRef; const handleFocusChange = (e) => { - // 1. BuyOption ๋‚ด๋ถ€๋กœ ํฌ์ปค์Šค๊ฐ€ ๋“ค์–ด์˜จ ๊ฒฝ์šฐ - ํ”Œ๋ž˜๊ทธ๋ฅผ true๋กœ ์„ค์ • - if(!cursorVisible){ - if (buyOptionRef.current && buyOptionRef.current.contains(e.target)) { - if (!hasBuyOptionReceivedFocus) { - hasBuyOptionReceivedFocus = true; - console.log('[TToastEnhanced] BuyOption received focus - now tracking focus leaving'); + // 1. ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€๋กœ ํฌ์ปค์Šค๊ฐ€ ๋“ค์–ด์˜จ ๊ฒฝ์šฐ - ํ”Œ๋ž˜๊ทธ๋ฅผ true๋กœ ์„ค์ • + if (!cursorVisible) { + if (componentRef.current && componentRef.current.contains(e.target)) { + if (!hasComponentReceivedFocus) { + hasComponentReceivedFocus = true; + console.log(`[TToastEnhanced] ${type} received focus - now tracking focus leaving`); } return; // ๋‚ด๋ถ€์— ํฌ์ปค์Šค๊ฐ€ ์žˆ์œผ๋ฉด ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์Œ } - // 2. BuyOption์ด ํฌ์ปค์Šค๋ฅผ ๋ฐ›์€ ์ ์ด ์žˆ๊ณ , ํ˜„์žฌ ์™ธ๋ถ€๋กœ ํฌ์ปค์Šค๊ฐ€ ์ด๋™ํ•œ ๊ฒฝ์šฐ - Toast ๋‹ซ๊ธฐ + // 2. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํฌ์ปค์Šค๋ฅผ ๋ฐ›์€ ์ ์ด ์žˆ๊ณ , ํ˜„์žฌ ์™ธ๋ถ€๋กœ ํฌ์ปค์Šค๊ฐ€ ์ด๋™ํ•œ ๊ฒฝ์šฐ - Toast ๋‹ซ๊ธฐ + // themeContents๋Š” spotlightRestrict: 'self-only'์ด๋ฏ€๋กœ keyboard๋กœ๋Š” ํฌ์ปค์Šค๊ฐ€ ๋‚˜๊ฐ€์ง€ ์•Š์Œ + // ๋”ฐ๋ผ์„œ ์ด๋Š” mouse click ๋“ฑ์œผ๋กœ ๋‹ค๋ฅธ ์š”์†Œ๋ฅผ ํด๋ฆญํ•œ ๊ฒฝ์šฐ๋งŒ ํ•ด๋‹น if ( - hasBuyOptionReceivedFocus && - buyOptionRef.current && - !buyOptionRef.current.contains(e.target) + hasComponentReceivedFocus && + componentRef.current && + !componentRef.current.contains(e.target) ) { console.log( - '[TToastEnhanced] Focus left BuyOption after receiving focus - closing toast' + `[TToastEnhanced] Focus left ${type} after receiving focus - closing toast` ); handleClose(); } @@ -195,6 +211,22 @@ export default function TToastEnhanced({ selectedPrdtId={selectedPrdtId} /> + ) : type === 'themeContents' ? ( +
+ +
) : (
{text}
diff --git a/com.twin.app.shoptime/src/components/TToast/TToastEnhanced.module.less b/com.twin.app.shoptime/src/components/TToast/TToastEnhanced.module.less index 3a853d6b..d9e8291a 100644 --- a/com.twin.app.shoptime/src/components/TToast/TToastEnhanced.module.less +++ b/com.twin.app.shoptime/src/components/TToast/TToastEnhanced.module.less @@ -115,6 +115,14 @@ height: 400px; } +.themeContents { + height: auto; + max-height: 80vh; + background: linear-gradient(0deg, rgba(0, 0, 0, 0.53) 0%, rgba(20.56, 4.68, 32.71, 0.53) 60%, rgba(199, 32, 84, 0) 98%), linear-gradient(180deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.40) 45%, rgba(0, 0, 0, 0.40) 100%), rgba(30, 30, 30, 0.80); + border-radius: 12px; + overflow: hidden; +} + // ์ปจํ…์ธ  ์Šคํƒ€์ผ - ๊ฐ„๋‹จํ•œ ๋ฉ”์‹œ์ง€๋งŒ .content { display: flex; 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 fcb270cc..c1f0f87c 100644 --- a/com.twin.app.shoptime/src/views/DetailPanel/ProductAllSection/ProductAllSection.jsx +++ b/com.twin.app.shoptime/src/views/DetailPanel/ProductAllSection/ProductAllSection.jsx @@ -923,16 +923,33 @@ export default function ProductAllSection({ [] ); - const handleThemeItemButtonClick = useCallback( - pipe( - () => setOpenThemeItemOverlay(true), - tap(() => { - const timerId = setTimeout(() => Spotlight.focus('theme-close-button'), 0); - timersRef.current.push(timerId); + const handleThemeItemButtonClick = useCallback(() => { + dispatch( + showToast({ + id: 'theme-contents-toast', + message: '', + type: 'themeContents', + duration: 0, // ์ˆ˜๋™์œผ๋กœ ๋‹ซ์„ ๋•Œ๊นŒ์ง€ ์œ ์ง€ + position: 'bottom-center', + // ThemeContents ๊ด€๋ จ props + themeItems: themeProducts, + setSelectedIndex, + videoVerticalVisible: false, + currentVideoShowId: null, + tabIndex: 0, + handleItemFocus: () => {}, + tabTitle: ['THEME'], + panelInfo, + direction: 'horizontal', + version: 2, + onToastClose: () => { + setTimeout(() => { + Spotlight.focus('theme-open-button'); + }, 100); + }, }) - ), - [setOpenThemeItemOverlay] - ); + ); + }, [dispatch, themeProducts, setSelectedIndex, panelInfo]); const handleProductDetailsClick = useCallback(() => { dispatch(minimizeModalMedia()); @@ -1463,6 +1480,10 @@ export default function ProductAllSection({ className={css.themeButton} onClick={handleThemeItemButtonClick} spotlightId="theme-open-button" + onMouseDown={(e) => { + e.preventDefault(); + handleThemeItemButtonClick(); + }} >
{$L('THEME ITEM')}
diff --git a/com.twin.app.shoptime/src/views/DetailPanel/ThemeProduct/ThemeContents.jsx b/com.twin.app.shoptime/src/views/DetailPanel/ThemeProduct/ThemeContents.jsx index 0045f074..700b23b0 100644 --- a/com.twin.app.shoptime/src/views/DetailPanel/ThemeProduct/ThemeContents.jsx +++ b/com.twin.app.shoptime/src/views/DetailPanel/ThemeProduct/ThemeContents.jsx @@ -1,20 +1,55 @@ -import React, { useCallback, useEffect, useRef } from 'react'; +import React, { useCallback, useEffect, useRef, useState } from 'react'; import { useDispatch } from 'react-redux'; import Spotlight from '@enact/spotlight'; +import SpotlightContainerDecorator from '@enact/spotlight/SpotlightContainerDecorator'; +import Spottable from '@enact/spotlight/Spottable'; import arrowDownIcon from '../../../../assets/images/icons/ic-arrow-down.svg'; import { updatePanel } from '../../../actions/panelActions'; import TButton from '../../../components/TButton/TButton'; -import TVirtualGridList from '../../../components/TVirtualGridList/TVirtualGridList'; -import { LOG_CONTEXT_NAME, LOG_MENU, LOG_MESSAGE_ID, panel_names } from '../../../utils/Config'; +import { LOG_CONTEXT_NAME, LOG_MESSAGE_ID, panel_names } from '../../../utils/Config'; import { $L } from '../../../utils/helperMethods'; -import PlayerItemCard, { TYPES } from '../../PlayerPanel/PlayerItemCard/PlayerItemCard'; -import ListEmptyContents from '../../PlayerPanel/PlayerTabContents/TabContents/ListEmptyContents/ListEmptyContents'; import css from './ThemeContents.module.less'; import { sendLogTotalRecommend } from '../../../actions/logActions'; +const Container = SpotlightContainerDecorator( + { + enterTo: 'default-element', + preserveId: true, + spotlightDirection: 'vertical', // THEME ITEM ๋ฒ„ํŠผ -> ๋ฆฌ์ŠคํŠธ(์•„๋ž˜) ์ด๋™ + spotlightRestrict: 'self-only', + leaveFor: {}, // arrow key๋กœ ๋น ์ ธ๋‚˜๊ฐ€์ง€ ์•Š๋„๋ก ์„ค์ • + }, + 'div' +); + +const ItemsContainer = SpotlightContainerDecorator( + { + enterTo: 'default-element', + preserveId: true, + spotlightDirection: 'horizontal', // ๋ฆฌ์ŠคํŠธ ๋‚ด ์ขŒ/์šฐ ์ด๋™ + spotlightRestrict: 'self-only', + }, + 'div' +); + +const ButtonContainer = SpotlightContainerDecorator( + { + enterTo: 'default-element', + preserveId: true, + spotlightDirection: 'horizontal', + // ๋ฒ„ํŠผ์—์„œ ์•„๋ž˜ ๋ฆฌ์ŠคํŠธ๋กœ ํฌ์ปค์Šค ์ด๋™ํ•ด์•ผ ํ•˜๋ฏ€๋กœ self-only๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค + }, + 'div' +); + +const SpottableItemCard = Spottable({ + allowDisabledFocus: true, + noAutoFocus: true, +})('div'); + export default function ThemeContents({ themeItems, setSelectedIndex, @@ -31,6 +66,74 @@ export default function ThemeContents({ const dispatch = useDispatch(); const isClickBlocked = useRef(false); const blockTimeoutRef = useRef(null); + const [focusedIndex, setFocusedIndex] = useState(-1); + + // Mock ๋ฐ์ดํ„ฐ + const mockItems = [ + { + prdtId: 'mock-1', + prdtNm: 'Origami Removable Connecting Rack 2-pack', + prdtImgPath: 'https://placehold.co/120x120', + salePrice: '$32.98', + originalPrice: '$150.00', + patnrLogoPath: null, + patncNm: 'Partner 1', + showId: 'show-1', + catNm: 'Category', + energyLabels: [], + }, + { + prdtId: 'mock-2', + prdtNm: 'Origami Removable Connecting Rack 2-pack', + prdtImgPath: 'https://placehold.co/120x120', + salePrice: '$32.98', + originalPrice: '$150.00', + patnrLogoPath: null, + patncNm: 'Partner 2', + showId: 'show-2', + catNm: 'Category', + energyLabels: [], + }, + { + prdtId: 'mock-3', + prdtNm: 'Origami Removable Connecting Rack 2-pack', + prdtImgPath: 'https://placehold.co/120x120', + salePrice: '$32.98', + originalPrice: '$150.00', + patnrLogoPath: null, + patncNm: 'Partner 3', + showId: 'show-3', + catNm: 'Category', + energyLabels: [], + }, + { + prdtId: 'mock-4', + prdtNm: 'Origami Removable Connecting Rack 2-pack', + prdtImgPath: 'https://placehold.co/120x120', + salePrice: '$32.98', + originalPrice: '$150.00', + patnrLogoPath: null, + patncNm: 'Partner 4', + showId: 'show-4', + catNm: 'Category', + energyLabels: [], + }, + { + prdtId: 'mock-5', + prdtNm: 'Origami Removable Connecting Rack 2-pack', + prdtImgPath: 'https://placehold.co/120x120', + salePrice: '$32.98', + originalPrice: '$150.00', + patnrLogoPath: null, + patncNm: 'Partner 5', + showId: 'show-5', + catNm: 'Category', + energyLabels: [], + }, + ]; + + // themeItems๊ฐ€ ๋น„์–ด์žˆ์œผ๋ฉด mock ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ + const displayItems = themeItems && themeItems.length > 0 ? themeItems : mockItems; const handleThemeItemButtonClick = useCallback(() => { if (onThemeItemClose) { @@ -38,125 +141,6 @@ export default function ThemeContents({ } }, [onThemeItemClose]); - const handleFocus = useCallback( - () => () => { - if (handleItemFocus) { - handleItemFocus(LOG_MENU.THEME_ITEMS); - } - }, - [handleItemFocus] - ); - - const renderItem = useCallback( - ({ index, ...rest }) => { - const { - prdtId, - prdtNm, - prdtImgPath, - salePrice, - originalPrice, - patnrLogoPath, - patncNm, - showId, - catNm, - energyLabels, - } = themeItems[index]; - - const handleItemClick = () => { - const params = { - tabTitle: tabTitle[tabIndex], - productId: prdtId, - productTitle: prdtNm, - showType: panelInfo?.shptmBanrTpNm, - category: catNm, - partner: patncNm, - contextName: LOG_CONTEXT_NAME.PRODUCT, - messageId: LOG_MESSAGE_ID.CONTENTCLICK, - }; - dispatch(sendLogTotalRecommend(params)); - - // ์ค‘๋ณตํด๋ฆญ๋ฐฉ์ง€ - if (isClickBlocked.current) { - return; - } - - isClickBlocked.current = true; - - // ์ด์ „ ํƒ€์ด๋จธ๊ฐ€ ์žˆ์œผ๋ฉด ์ •๋ฆฌ - if (blockTimeoutRef.current) { - clearTimeout(blockTimeoutRef.current); - } - - blockTimeoutRef.current = setTimeout(() => { - isClickBlocked.current = false; - blockTimeoutRef.current = null; - }, 600); - - if (!prdtId) return; - - setSelectedIndex(index); - dispatch( - updatePanel({ - name: panel_names.PLAYER_PANEL, - panelInfo: { - prdtId, - showId, - shptmBanrTpNm: 'THEME', - isUpdatedByClick: true, - }, - }) - ); - }; - - const productNameDangerouslySetInnerHTML = () => { - return prdtNm ? { __html: prdtNm } : { __html: '' }; - }; - - return ( - { - // v2์—์„œ ์ฒซ ๋ฒˆ์งธ ์•„์ดํ…œ์ผ ๋•Œ ์œ„๋กœ ๊ฐ€๋ฉด THEME ITEM ๋ฒ„ํŠผ์œผ๋กœ - e.stopPropagation(); - e.preventDefault(); - Spotlight.focus('below-tab-theme-button'); - } - : undefined - } - type={TYPES.themeHorizontal} - spotlightId={`tabTheme-item-${index}`} - version={version} - /> - ); - }, - [ - themeItems, - currentVideoShowId, - isClickBlocked, - dispatch, - handleFocus, - version, - tabIndex, - tabTitle, - panelInfo, - setSelectedIndex, - ] - ); - // cleanup useEffect useEffect(() => { return () => { @@ -166,33 +150,155 @@ export default function ThemeContents({ }; }, []); + // ํ† ์ŠคํŠธ๊ฐ€ ์—ด๋ฆฌ๋ฉด ๋‹ซ๊ธฐ(=THEME ITEM) ๋ฒ„ํŠผ๋ถ€ํ„ฐ ํฌ์ปค์Šค๋˜๋„๋ก ๋ณด์ • + useEffect(() => { + Spotlight.focus('theme-contents-close-button'); + }, []); + + // ํ‚ค ์ด๋™ ๋ณด์ •: ์œ„/์•„๋ž˜ ์ด๋™ ์‹œ THEME ITEM ๋ฒ„ํŠผ <-> ์ฒซ ๋ฒˆ์งธ ์•„์ดํ…œ์œผ๋กœ ํ™•์‹คํžˆ ์—ฐ๊ฒฐ + useEffect(() => { + if (!displayItems || displayItems.length === 0) return; + + const firstItemId = 'theme-toast-item-0'; + Spotlight.set('theme-contents-close-button', { + next: { down: firstItemId }, + }); + + displayItems.slice(0, 5).forEach((_, index) => { + const itemId = `theme-toast-item-${index}`; + Spotlight.set(itemId, { + next: { up: 'theme-contents-close-button' }, + }); + }); + }, [displayItems]); + return ( - <> -
- {themeItems && themeItems.length > 0 ? ( - - ) : ( - - )} -
-
+ +
{$L('THEME ITEM')}
-
- + + + {displayItems && displayItems.length > 0 ? ( + displayItems.slice(0, 5).map((item, index) => { + const { + prdtId, + prdtNm, + prdtImgPath, + salePrice, + originalPrice, + patnrLogoPath, + patncNm, + showId, + catNm, + energyLabels, + } = item; + + const spotlightItemId = `theme-toast-item-${index}`; + + const handleItemClick = () => { + const params = { + tabTitle: tabTitle[tabIndex], + productId: prdtId, + productTitle: prdtNm, + showType: panelInfo?.shptmBanrTpNm, + category: catNm, + partner: patncNm, + contextName: LOG_CONTEXT_NAME.PRODUCT, + messageId: LOG_MESSAGE_ID.CONTENTCLICK, + }; + dispatch(sendLogTotalRecommend(params)); + + if (isClickBlocked.current) { + return; + } + + isClickBlocked.current = true; + + if (blockTimeoutRef.current) { + clearTimeout(blockTimeoutRef.current); + } + + blockTimeoutRef.current = setTimeout(() => { + isClickBlocked.current = false; + blockTimeoutRef.current = null; + }, 600); + + if (!prdtId) return; + + setSelectedIndex(index); + dispatch( + updatePanel({ + name: panel_names.PLAYER_PANEL, + panelInfo: { + prdtId, + showId, + shptmBanrTpNm: 'THEME', + isUpdatedByClick: true, + }, + }) + ); + }; + + return ( + { + if (e.key === 'Enter' || e.key === ' ') { + handleItemClick(); + } + }} + onFocus={() => { + setFocusedIndex(index); + handleItemFocus?.(index); + }} + onBlur={() => setFocusedIndex(-1)} + onMouseEnter={() => Spotlight.focus(spotlightItemId)} + > + {prdtId} +
+
{prdtNm}
+
+ {salePrice} + {originalPrice} +
+ {energyLabels && energyLabels.length > 0 && ( +
+ {energyLabels.map((label, labelIndex) => ( +
+ {/* ์—๋„ˆ์ง€ ๋ผ๋ฒจ ๋ Œ๋”๋ง */} + {label} +
+ ))} +
+ )} +
+
+ ); + }) + ) : ( +
No items
+ )} +
+ ); } diff --git a/com.twin.app.shoptime/src/views/DetailPanel/ThemeProduct/ThemeContents.module.less b/com.twin.app.shoptime/src/views/DetailPanel/ThemeProduct/ThemeContents.module.less index e82e30e5..a1537559 100644 --- a/com.twin.app.shoptime/src/views/DetailPanel/ThemeProduct/ThemeContents.module.less +++ b/com.twin.app.shoptime/src/views/DetailPanel/ThemeProduct/ThemeContents.module.less @@ -1,5 +1,149 @@ -@import "../../../../style/CommonStyle.module.less"; -@import "../../../../style/utils.module.less"; +@import "../../../style/CommonStyle.module.less"; +@import "../../../style/utils.module.less"; + +// Toast wrapper ์Šคํƒ€์ผ +.toastWrapper { + width: 100%; + height: 390px; + display: inline-flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + gap: 30px; + padding: 60px; + background: linear-gradient( + 0deg, + rgba(0, 0, 0, 0.53) 0%, + rgba(20.56, 4.68, 32.71, 0.53) 60%, + rgba(199, 32, 84, 0) 98% + ), + linear-gradient(180deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.4) 45%, rgba(0, 0, 0, 0.4) 100%), + rgba(30, 30, 30, 0.8); + overflow: visible; // ํฌ์ปค์Šค ํ…Œ๋‘๋ฆฌ๊ฐ€ ์ž˜๋ฆฌ์ง€ ์•Š๋„๋ก +} + +.topButtonWrapper { + width: 635px; + height: 60px; + display: inline-flex; + justify-content: flex-start; + align-items: center; +} + +.itemsWrapper { + display: inline-flex; + flex-direction: row; + gap: 18px; + justify-content: flex-start; + align-items: center; + flex-wrap: nowrap; + overflow-x: auto; + overflow-y: visible; // ํฌ์ปค์Šค ํ…Œ๋‘๋ฆฌ ๋ณด์กด + flex: none; + padding: 4px; // ํฌ์ปค์Šค ํ…Œ๋‘๋ฆฌ(4px box-shadow) ํ‘œ์‹œ ๊ณต๊ฐ„ ํ™•๋ณด +} + +.itemCard { + width: 470px; + height: 180px; + padding: 30px; + background: linear-gradient(0deg, 0%, 100%), #2C2C2C; + border-radius: 12px; + justify-content: flex-start; + align-items: flex-start; + gap: 15px; + display: inline-flex; + flex-shrink: 0; + cursor: pointer; + outline: none; + transition: all 0.2s ease; + position: relative; + + &:focus { + outline: none; + box-shadow: 0 0 0 4px @PRIMARY_COLOR_RED; + } + + &:global(.spotlight) { + box-shadow: 0 0 0 4px @PRIMARY_COLOR_RED; + } +} + +.focused { + box-shadow: 0 0 0 4px @PRIMARY_COLOR_RED; +} + +.itemImage { + width: 120px; + height: 120px; + padding-left: 0.41px; + padding-right: 0.41px; + padding-top: 0.51px; + padding-bottom: 0.51px; + flex-shrink: 0; +} + +.itemInfo { + flex: 1 1 0; + align-self: stretch; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + gap: 10px; + display: inline-flex; +} + +.itemName { + align-self: stretch; + color: #EAEAEA; + font-size: 20px; + font-family: @baseFont; + font-weight: 400; + line-height: 25px; + word-wrap: break-word; +} + +.itemPrice { + padding-top: 1px; + padding-bottom: 1px; + justify-content: flex-start; + align-items: center; + gap: 5px; + display: inline-flex; +} + +.salePrice { + color: #C70850; + font-size: 20px; + font-family: @baseFont; + font-weight: 700; + line-height: 16.67; + word-wrap: break-word; +} + +.originalPrice { + color: #C2C2C2; + font-size: 16px; + font-family: @baseFont; + font-weight: 400; + text-decoration: line-through; + line-height: 16.67; + word-wrap: break-word; +} + +.energyLabels { + justify-content: flex-end; + align-items: flex-end; + gap: 5px; + display: inline-flex; +} + +.energyLabel { + width: 54px; + height: 30px; + position: relative; + overflow: hidden; +} .container { width: 100%; @@ -33,10 +177,10 @@ } .themeButton { - width: 100% !important; + width: 635px !important; height: 60px !important; padding: 20px 30px !important; - background: rgba(255, 255, 255, 0.05) !important; + background: #c72054 !important; overflow: visible !important; border-radius: 6px !important; border: none !important;