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)}
+ >
+
+
+
{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;