/* BannerDot
* Figma 노드: 5356:44479 (비활성), 5356:44480 (활성)
* 배너 슬ë¼ì´ë” ì¸ë””ì¼€ì´í„° ë„트 버튼
*/
/* ── 기본 비활성 ë„트 — Figma #000000 a0.25 ── */
.banner-dot {
display: inline-block;
width: 8px;
height: 8px;
border-radius: 50%;
background: rgba(0, 0, 0, 0.25);
border: none;
padding: 0;
cursor: pointer;
transition:
width 0.2s ease-in-out,
border-radius 0.2s ease-in-out,
background 0.2s ease-in-out,
opacity 0.15s ease-in-out;
flex-shrink: 0;
}
/* ── hover: 약간 어둡게 ── */
.banner-dot:hover {
background: rgba(0, 0, 0, 0.45);
}
/* ── focus-visible: 키보드 í¬ì»¤ìФ ë§ â”€â”€ */
.banner-dot:focus-visible {
outline: 2px solid #101F3B;
outline-offset: 2px;
}
/* ── active(눌림): ë” ì–´ë‘¡ê²Œ ── */
.banner-dot:active {
opacity: 0.7;
}
/* ── 활성 ë„트 (현재 슬ë¼ì´ë“œ) — Figma General/Pagination: 비활성과 ê°™ì€
8×8 ì›í˜•, fill #202020 (알약형 아님) ── */
.banner-dot--active {
width: 8px;
height: 8px;
border-radius: 50%;
background: #202020;
cursor: default;
}
/* 활성 ë„트는 hover 효과 ì œê±° (ì´ë¯¸ ì„ íƒëœ 슬ë¼ì´ë“œ) */
.banner-dot--active:hover {
background: #202020;
opacity: 1;
}
/* OptionDropdown — 네ì´í‹°ë¸Œ <select> ëŒ€ì‹ ì“°ëŠ” 커스텀 드ë¡ë‹¤ìš´.
ì›ëž˜ ìƒí’ˆìƒì„¸ 구매 바텀시트(.purchase-sheet) 안ì—서만 스코프해 ì“°ë˜ ê±¸
ì´ë©”ì¼ ë„ë©”ì¸ ì„ íƒ ë“± 다른 ê³³ì—ì„œë„ ìž¬ì‚¬ìš©í•˜ë„ë¡ ì»´í¬ë„ŒíЏ ì†Œìœ CSS로 승격.
펼침 목ë¡ì€ 문서 íë¦„ì— ìžë¦¬ë¥¼ 차지하지 않ë„ë¡ íŠ¸ë¦¬ê±° 기준 ì ˆëŒ€ 위치로 ë„ìš°ê³
(ì˜ˆì „ì—” 목ë¡ì´ ì‹¤ì œ ë ˆì´ì•„웃 높ì´ë¥¼ 차지해 ì—´ 때마다 아래 콘í…ì¸ ê°€ ë°€ë ¤ ë‚´ë ¤ê°”ìŒ),
opacity/transform으로 ì—´ê³ ë‹«ížˆëŠ” íŠ¸ëžœì§€ì…˜ì„ ì¤€ë‹¤ */
.option-dropdown {
position: relative;
width: 100%;
margin-bottom: 12px;
}
.option-dropdown__trigger {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
height: 40px;
padding: 0 12px;
background-color: #ffffff;
border: 1px solid #e6e6e6;
border-radius: 8px;
font-family: Pretendard, sans-serif;
font-size: 14px;
font-weight: 500;
text-align: left;
}
.option-dropdown.is-disabled .option-dropdown__trigger {
cursor: not-allowed;
opacity: 0.5;
}
/* 펼침 ìƒíƒœ — Figma Option/BottomSheet(6901:32152): 컨테ì´ë„ˆ ì „ì²´ê°€ 1px #202020
ë³´ë”로 ë°”ë€Œê³ , 목ë¡ì´ íŠ¸ë¦¬ê±°ì— ë¶™ì–´ 한 박스처럼 ì´ì–´ì§„다(트리거 하단 ë¼ìš´ë“œ ì œê±°,
목ë¡ì€ ìƒë‹¨ ë¼ìš´ë“œ ì œê±° + ìƒë‹¨ ë³´ë” ì—†ì´ íŠ¸ë¦¬ê±° ë³´ë”를 그대로 ì´ì–´ë°›ìŒ) */
.option-dropdown.is-open .option-dropdown__trigger {
border-color: #202020;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
.option-dropdown.is-open .option-dropdown__list {
border-color: #202020;
border-top: none;
border-top-left-radius: 0;
border-top-right-radius: 0;
}
.option-dropdown__placeholder {
color: #9b9b9b;
}
.option-dropdown__value {
color: #404040;
}
.option-dropdown__chevron {
flex-shrink: 0;
transform: rotate(90deg);
transition: transform 0.2s;
}
.option-dropdown.is-open .option-dropdown__chevron {
transform: rotate(-90deg);
}
/* 트리거 바로 아래 ë– ìžˆëŠ” ëª©ë¡ â€” ê¸°ë³¸ê°’ì€ ì‚´ì§ ìœ„(-4px)·투명 ìƒíƒœë¡œ 숨겨ë‘ê³
is-openì¼ ë•Œë§Œ ì œìžë¦¬ë¡œ ë‚´ë ¤ì˜¤ë©° 나타나게 해서 여닫는 íŠ¸ëžœì§€ì…˜ì„ ë§Œë“ ë‹¤.
position:absoluteë¼ ë¬¸ì„œ í름(ë ˆì´ì•„웃 밀림)ì—는 ì˜í–¥ì„ 안 주지만, opacity/visibility만으로
숨기면 ì‹¤ì œ 박스 í¬ê¸°(240px)는 ê³„ì† ì°¨ì§€í•˜ê³ ìžˆì–´ì„œ — 바텀시트처럼 ë³¸ë¬¸ì´ ìŠ¤í¬ë¡¤ 가능한
컨테ì´ë„ˆ ì•ˆì— ìžˆìœ¼ë©´ ì´ ì•ˆ ë³´ì´ëŠ” 240px 박스까지 scrollHeightì— ìž¡í˜€ 바텀시트가 닫힌
ìƒíƒœì—ì„œë„ ì‹¤ì œë³´ë‹¤ í¬ê²Œ(ë˜ëŠ” 스í¬ë¡¤ 가능하게) 계산ë˜ëŠ” ë¬¸ì œê°€ 있었ìŒ.
닫혀 ìžˆì„ ë•Œ max-height:0 + overflow:hidden으로 박스 ìžì²´ë¥¼ ì ‘ì–´ì„œ ì–´ë–¤ ì¡°ìƒì˜
스í¬ë¡¤ ì˜ì—ì—ë„ ìž¡ížˆì§€ 않게 í•˜ê³ , 열릴 때만 ì‹¤ì œ 높ì´ë¡œ 펼ì³ì§€ë„ë¡ íŠ¸ëžœì§€ì…˜í•œë‹¤. */
.option-dropdown__list {
position: absolute;
top: 100%;
left: 0;
right: 0;
z-index: 10;
max-height: 0;
overflow: hidden;
background-color: #ffffff;
border: 1px solid #e6e6e6;
border-radius: 8px;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);
opacity: 0;
transform: translateY(-4px);
visibility: hidden;
pointer-events: none;
transition: max-height 0.2s ease, opacity 0.15s ease, transform 0.15s ease, visibility 0.2s;
scrollbar-width: none;
}
.option-dropdown__list::-webkit-scrollbar {
display: none;
}
.option-dropdown.is-open .option-dropdown__list {
max-height: 240px;
overflow-y: auto;
opacity: 1;
transform: translateY(0);
visibility: visible;
pointer-events: auto;
}
/* 바텀시트 안ì—서는 ì˜¤ë²„ë ˆì´ë¡œ ë„ìš°ì§€ ì•Šê³ ì‹¤ì œ ë ˆì´ì•„웃 ê³µê°„ì„ ì°¨ì§€í•˜ê²Œ 한다 —
펼ì³ì§€ëŠ” ë§Œí¼ ì‹œíŠ¸ ìžì²´ê°€ 늘어나며(하단 ê³ ì •ì´ë¼ 위쪽 가장ìžë¦¬ê°€ 위로 올ë¼ì˜¤ë©°) 펼ì³ì§„다.
페ì´ì§€ì— 그냥 ë†“ì˜€ì„ ë•Œ(ì˜¤ë²„ë ˆì´)와 달리, 바텀시트 스í¬ë¡¤ ì˜ì— 안ì—서는 ì´ë ‡ê²Œ ì‹¤ì œë¡œ
ìžë¦¬ë¥¼ 차지해야 트리거 아래 다른 내용과 겹치지 ì•Šê³ , 화면 아래로 ìž˜ë¦¬ì§€ë„ ì•ŠëŠ”ë‹¤. */
.option-dropdown--in-sheet .option-dropdown__list {
position: static;
top: auto;
left: auto;
right: auto;
box-shadow: none;
}
/* (펼침 목ë¡ì´ íŠ¸ë¦¬ê±°ì— ë¶™ëŠ” 한 박스 êµ¬ì¡°ë¼ in-sheetì—ì„œë„ ë³„ë„ ê°„ê²© ì—†ìŒ) */
.option-dropdown__item {
display: flex;
align-items: center;
justify-content: space-between;
height: 40px;
padding: 0 12px;
font-family: Pretendard, sans-serif;
font-size: 14px;
font-weight: 500;
color: #404040;
cursor: pointer;
}
.option-dropdown__item.is-disabled {
color: #ababab;
cursor: not-allowed;
}
.option-dropdown__item-note {
flex-shrink: 0;
margin-left: 12px;
font-family: Pretendard, sans-serif;
font-size: 12px;
font-weight: 400;
color: #9b9b9b;
}
/* í’ˆì ˆ ì˜µì…˜ì˜ ìž¬ìž…ê³ ì•Œë¦¼ 칩 — Figma NoticeButton(6901:32209) 실측: ë°°ê²½ #f0f4fe,
radius 4, ì•„ì´ì½˜-í…스트 gap 4px, í…스트 12px/400/#3c56d6 */
.option-dropdown__restock-chip {
display: flex;
flex-shrink: 0;
align-items: center;
gap: 4px;
margin-left: 12px;
padding: 4px 8px;
border: none;
border-radius: 4px;
background-color: #f0f4fe;
font-family: Pretendard, sans-serif;
font-size: 12px;
font-weight: 400;
color: #3c56d6;
cursor: pointer;
}
/* ì¸ê¸° 검색어 — Figma Bar/SectionHeaderBar(5236:30518) + RankSection(5236:30519).
"OO시 ì—…ë°ì´íЏ" ìº¡ì…˜ì€ ì‹¤ì œ APIì— ê°±ì‹ ì‹œê° ë°ì´í„°ê°€ 없어 ëºë‹¤(PopularSearchKeyword.tsx ì°¸ê³ ) */
.popular-search-keyword {
padding: 12px 16px 20px;
}
.popular-search-keyword__title {
margin: 0 0 16px;
font-family: Pretendard, sans-serif;
font-size: 17px;
font-weight: 600;
line-height: 26px;
color: #1a1a1a;
}
/* Figma RankContainer — 2ì—´, ì—´ ì‚¬ì´ 28px. 5개씩 세로로 채운 ë’¤ ë‹¤ìŒ ì—´ë¡œ 넘어가야
해서(1~5ì—´/6~10ì—´) grid-auto-flow:column + í–‰ 5ê°œ ê³ ì •ìœ¼ë¡œ 배열한다 */
.popular-search-keyword__list {
display: grid;
grid-template-columns: repeat(2, 1fr);
grid-template-rows: repeat(5, auto);
grid-auto-flow: column;
column-gap: 28px;
row-gap: 12px;
margin: 0;
padding: 0;
list-style: none;
}
.popular-search-keyword__item button {
display: flex;
align-items: center;
width: 100%;
gap: 8px;
border: none;
background: none;
padding: 0;
text-align: left;
cursor: pointer;
}
.popular-search-keyword__rank {
font-family: Pretendard, sans-serif;
font-size: 14px;
font-weight: 600;
line-height: 18px;
letter-spacing: 0.02em;
color: #404040;
}
/* Figma 실측 — 1~3위 숫ìžë§Œ 브랜드 í¬ì¸íЏ 컬러로 ê°•ì¡° */
.popular-search-keyword__item:nth-child(-n + 3) .popular-search-keyword__rank {
color: #3c56d6;
}
.popular-search-keyword__label {
overflow: hidden;
font-family: Pretendard, sans-serif;
font-size: 14px;
font-weight: 500;
line-height: 18px;
letter-spacing: 0.02em;
color: #404040;
white-space: nowrap;
text-overflow: ellipsis;
}
/* PcOceanBackdrop — Figma "웹앱"(9553:43993, 1440×1080 시안). PC(1001px~) ì „ìš©.
.pc-ocean__scene ì´ ì‹œì•ˆ 좌표계(1440×1080) 그대로ì´ê³ , ì»´í¬ë„ŒíŠ¸ê°€ ë·°í¬íŠ¸ì— ë§žëŠ”
cover ë°°ìœ¨ì„ ê³„ì‚°í•´ transform: scale 로 통째로 확대/축소한다(바닥 중앙 앵커).
ë°°ê²½ì€ ìž¥ì‹ì´ë¯€ë¡œ pointer-events 차단, 콘í…ì¸ (.page__content.site)는 z-index로 위. */
.pc-ocean {
display: none;
}
@media (min-width: 1001px) {
.pc-ocean {
display: block;
position: fixed;
inset: 0;
z-index: 0;
overflow: hidden;
pointer-events: none;
/* 시안 하늘색 — exportë“¤ì´ ì´ ìƒ‰ì„ ë°°ê²½ìœ¼ë¡œ êµ½ê³ ë‚˜ì˜¤ë¯€ë¡œ 플랫 단색ì´ì–´ì•¼ ì´ìŒì„ ì´ ì—†ë‹¤ */
background: #f3f3f6;
}
/* 새 ë°°ê²½ì´ ì½˜í…ì¸ ë¥¼ ë®ì§€ 않ë„ë¡ ì•± 카드 ì»¬ëŸ¼ì„ ìœ„ë¡œ — Layout 마í¬ì—…ì€ ê·¸ëŒ€ë¡œ ë‘ê³
ìŠ¤íƒ ìˆœì„œë§Œ ì •ë¦¬í•œë‹¤ */
.page .page__content.site {
position: relative;
z-index: 1;
}
/* 구 PC 좌측 패ë„(ê·¸ë¼ë””언트+ë¡œê³ , Figma 5236:41112)ì€ ì´ ë°°ê²½ìœ¼ë¡œ 대체 —
마í¬ì—…/스타ì¼ì€ 남겨ë‘ê³ í‘œì‹œë§Œ ëˆë‹¤(롤백 시 ì´ ì¤„ë§Œ ì œê±°) */
.page .banner--left {
visibility: hidden;
}
/* ── 시안 좌표계 장면 — left/scaleì€ ì»´í¬ë„ŒíŠ¸ê°€ 앱 컬럼 기준으로 계산해 ì¸ë¼ì¸ 주입 ── */
.pc-ocean__scene {
position: absolute;
bottom: 0;
width: 1440px;
height: 1080px;
transform-origin: bottom left;
}
.pc-ocean__scene > img {
position: absolute;
}
.pc-ocean__sun {
left: 42px;
top: 3px;
width: 256px;
height: 256px;
}
.pc-ocean__bird--1 {
left: 254px;
top: 53px;
width: 21px;
height: 47px;
}
.pc-ocean__bird--2 {
left: 1350px;
top: 200px;
width: 45px;
height: 46px;
}
/* 바다 물결 밴드 — 시안 벡터가 1920px로 í”„ë ˆìž„(1440)ì„ ì˜¤ë¥¸ìª½ìœ¼ë¡œ 넘게 ê·¸ë ¤ì ¸ 있다
(넘치는 ë¶€ë¶„ì€ .pc-ocean overflowì—서 잘림) */
.pc-ocean__waves {
left: 0;
top: 741px;
width: 1920px;
height: 339px;
}
/* 왼쪽 물결·낚시꾼 í¬ë¡ — 시안 (0,560)~(788,1080) */
.pc-ocean__ocean-left {
left: 0;
top: 560px;
width: 788px;
height: 520px;
}
/* ── 좌측 íŒ¨ë„ â€” 앱 컬럼 왼쪽 67px(시안 ê°)·세로 중앙. translateY/scaleì€ ì»´í¬ë„ŒíŠ¸ê°€
ì¸ë¼ì¸ìœ¼ë¡œ 주입(í™”ë©´ì´ ë‚®ìœ¼ë©´ sideScale < 1로 축소, 우측 ë·세로 중앙 ê³ ì •) ── */
.pc-ocean__side {
position: absolute;
right: calc(50% - 13px); /* = .site 왼쪽(50% + 80px)ì—서 67px 왼쪽 */
top: 43.3%; /* 시안 íŒ¨ë„ ì„¸ë¡œ 중심(468/1080) — 1440×1080ì—서 시안과 ë™ì¼ 위치 */
width: 493px;
transform-origin: center right;
}
/* 슬로건 + ë¡œê³ â€” Figma Frame 48095973(íŒ¨ë„ ìœ„, 우측 ì •ë ¬, gap 24, 오른쪽 여백 67) */
.pc-ocean__brand {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 24px;
margin: 0 67px 40px 0;
height: 78px;
}
.pc-ocean__slogan {
margin: 0;
font-size: 18px;
font-weight: 500;
text-align: right;
color: #000;
}
.pc-ocean__logo {
display: block;
width: 206px;
height: auto;
}
/* 좌측 카드 2장 — ë””ìžì´ë„ˆ export를 그대로 배치(투명 ë¼ìš´ë“œ 코너 í¬í•¨).
시안: QR 카드 150×478, 등급 안내 카드 343×478ì´ ë‚˜ëž€ížˆ 붙는다 */
.pc-ocean__panel {
display: flex;
filter: drop-shadow(0 12px 40px rgba(31, 53, 87, 0.08));
}
.pc-ocean__qr-frame {
width: 150px;
height: 478px;
flex-shrink: 0;
}
/* 카드 ì‚¬ì´ ì„¸ë¡œ ì ì„ â€” 시안 실측: #bcbcbc, 대시 4px/간격 2px, 위 18px·아래 8px 여백.
ë‘ ì¹´ë“œê°€ 150+343=493ì„ ì±„ìš°ë¯€ë¡œ íì„ ì°¨ì§€í•˜ì§€ 않게 ê²¹ì³ ê·¸ë¦°ë‹¤ */
.pc-ocean__divider {
width: 1px;
margin: 18px 0 8px -1px;
flex-shrink: 0;
background: repeating-linear-gradient(180deg, #bcbcbc 0 4px, transparent 4px 6px);
}
.pc-ocean__grade-section {
width: 343px;
height: 478px;
flex-shrink: 0;
}
}
/* Figma CL-007 Toast/Type — ë‹¤í¬ ë°°ê²½(#202020) + radius 12, 하단 ê³ ì •.
position:fixed는 ë·°í¬íЏ 기준ì´ë¼ PCì—서 .page__content.site(우측 --pc-content-width
컬럼)ê°€ ì•„ë‹ˆë¼ í™”ë©´ ì •ì¤‘ì•™ì— ëœ¨ëŠ” ë¬¸ì œê°€ ìžˆì—ˆìŒ â€” _productDetail.cssì˜ .share-toast와
ë™ì¼í•œ 3단 ë¸Œë ˆì´í¬í¬ì¸íŠ¸ë¡œ 콘í…ì¸ ì»¬ëŸ¼ í/위치를 그대로 ë”°ë¼ê°€ê²Œ 함 */
/* 페ì´ë“œ+슬ë¼ì´ë“œì—… ì¸/아웃 — ToastProviderê°€ BottomSheet와 ë™ì¼í•œ mount-hold 패턴으로
is-visible í´ëž˜ìŠ¤ë¥¼ 붙였다 뗀다. ë¸Œë ˆì´í¬í¬ì¸íŠ¸ë§ˆë‹¤ 가로 ì •ë ¬ìš© transform(translateX)ì´
달ë¼ì„œ, 닫힌 ìƒíƒœì˜ translateY(8px)를 ê° ë¸Œë ˆì´í¬í¬ì¸íŠ¸ì˜ ê¸°ì¡´ transformì— ì´ì–´ë¶™ì´ê³
is-visibleì—서 ê·¸ 오프셋만 0으로 ë˜ëŒë¦°ë‹¤(BottomSheet.css와 ë™ì¼í•œ ë°©ì‹) */
.app-toast {
position: fixed;
left: 20px;
right: 20px;
bottom: 90px;
z-index: 100;
display: flex;
align-items: center;
justify-content: space-between;
gap: 24px;
/* Figma Toast/Type — ë†’ì´ 48 ê³ ì •(좌우 16, ìƒí•˜ 0), fill #202020 a0.88 */
padding: 0 16px;
min-height: 48px;
border-radius: 12px;
background-color: rgba(32, 32, 32, 0.88);
box-sizing: border-box;
opacity: 0;
transform: translateY(8px);
transition: opacity 0.25s ease, transform 0.25s ease;
pointer-events: none;
}
.app-toast.is-visible {
opacity: 1;
transform: translateY(0);
pointer-events: auto;
}
@media (min-width: 501px) {
.app-toast {
left: 50%;
right: auto;
width: calc(500px - 40px);
transform: translateX(-50%) translateY(8px);
}
.app-toast.is-visible {
transform: translateX(-50%) translateY(0);
}
}
@media (min-width: 1001px) {
.app-toast {
left: auto;
right: calc((100vw - 1000px) / 2 + 20px);
width: calc(var(--pc-content-width) - 40px);
transform: translateY(8px);
}
.app-toast.is-visible {
transform: translateY(0);
}
}
.app-toast__content {
display: flex;
align-items: center;
gap: 8px;
min-width: 0;
}
/* Figma CL-007 — ì°œ(WishList) 변형만 ì•„ì´ì½˜-í…스트 gap 4(카트 ë³€í˜•ì€ 8) */
.app-toast__content--like {
gap: 4px;
}
.app-toast__message {
font-family: Pretendard, sans-serif;
font-size: 13px;
font-weight: 400;
color: #ffffff;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* ì•¡ì…˜("보러가기") — Figma 13px/400(메시지와 ë™ì¼ 굵기) */
.app-toast__action {
flex-shrink: 0;
background: none;
border: none;
padding: 0;
font-family: Pretendard, sans-serif;
font-size: 13px;
font-weight: 400;
color: #ffffff;
white-space: nowrap;
}