/* EmptyState — 마ì´íŽ˜ì´ì§€ 리스트류 ë°ì´í„° ì—†ìŒ ê³µí†µ ìƒíƒœ */
.empty-state {
display: flex;
flex-direction: column;
align-items: center;
gap: 20px;
padding: 80px 16px;
background: #ffffff;
}
.empty-state__icon-text {
display: flex;
flex-direction: column;
align-items: center;
gap: 12px;
}
.empty-state__message {
font-family: Pretendard, sans-serif;
font-size: 14px;
font-weight: 500;
line-height: 18px;
letter-spacing: 0.0014em;
color: #9b9b9b;
text-align: center;
margin: 0;
}
.empty-state__button {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 4px;
padding: 7px 20px;
border: none;
border-radius: 8px;
text-decoration: none;
cursor: pointer;
}
.empty-state__button--dark {
background: #202020;
}
.empty-state__button--dark .empty-state__button-label {
color: #ffffff;
}
/* accent(1:1ë¬¸ì˜ Empty 등) — Figma CS-003: 빈 안내는 하단 80px 패딩으로 ëë‚˜ê³ ,
ê·¸ 아래 ë³„ë„ ButtonArea(pad 16/16/20)ì— 328×52 ì „í ë²„íŠ¼ì´ ë†“ìž„.
컨테ì´ë„ˆ gap 96 = 빈 안내 하단 80 + ButtonArea ìƒë‹¨ 16 */
.empty-state--accent {
gap: 96px;
padding: 80px 16px 20px;
}
.empty-state__button--accent {
width: 100%;
height: 52px;
border-radius: 8px;
background: #f0f4fe;
}
/* Figma Button/Buttons ë¼ë²¨ 16px/500 (dark variant 14px/500ê³¼ 구분) */
.empty-state__button--accent .empty-state__button-label {
font-size: 16px;
line-height: 24px;
color: #3c56d6;
}
.empty-state__button-label {
font-family: Pretendard, sans-serif;
font-size: 14px;
font-weight: 500;
line-height: 18px;
letter-spacing: 0.0014em;
white-space: nowrap;
}
/* ë°°ê²½ 딤 — ëª¨ë“ ë°”í…€ì‹œíŠ¸ 공통 톤. 열림/닫힘 시 페ì´ë“œ.
닫히는 ë™ì•ˆ(opacityê°€ 1→0으로 트랜지션 ë˜ëŠ” 250ms) pointer-eventsê°€ ê³„ì† autoë¼
화면 ì „ì²´ë¥¼ ë®ì€ 채 í´ë¦ì„ ê°€ë¡œì±„ê³ ìžˆì—ˆìŒ â€” 닫기를 누른 ì§í›„ ê°™ì€ íŠ¸ë¦¬ê±°ë¥¼ 다시
누르거나 다른 요소를 íƒí•˜ë©´ ê·¸ í´ë¦ì´ ì´ ë³´ì´ì§€ë„ 않는 ë”¤ì— ë¨¹í˜€ 아무 ë°˜ì‘ì´
없어 ë³´ì´ëŠ” ë¬¸ì œ(바텀시트 ì¸í„°ëž™ì…˜ì´ ê°„í—ì 으로 안 먹히는 ì›ì¸)였ìŒ.
is-visibleì¼ ë•Œë§Œ í´ë¦ì„ ë°›ë„ë¡ í•´ì„œ 닫히기 시작하는 즉시 아래 요소가 í´ë¦ì„ 받게 함 */
.bottom-sheet__dim {
position: fixed;
inset: 0;
z-index: 30;
background-color: rgba(0, 0, 0, 0.5);
opacity: 0;
pointer-events: none;
transition: opacity 0.25s ease;
}
.bottom-sheet__dim.is-visible {
opacity: 1;
pointer-events: auto;
}
/* 바텀시트 본체 — Figma BottomSheet/Variation 공통.
닫힌 ìƒíƒœ(translateY(100%))ì—서 열린 ìƒíƒœ(translateY(0))로 슬ë¼ì´ë“œì—… —
드래그로 ë‹«ì„ ë•ŒëŠ” BottomSheet.tsxê°€ ì¸ë¼ì¸ style로 transitionì„ ë„ê³
ì†ê°€ë½ì„ 그대로 ë”°ë¼ê°€ê²Œ 함. 딤과 ë™ì¼í•œ ì´ìœ 로 닫히는 중(슬ë¼ì´ë“œë‹¤ìš´ ì• ë‹ˆë©”ì´ì…˜
0.3s)ì—ë„ í™”ë©´ì— ê±¸ì³ ìžˆëŠ” ë™ì•ˆì€ í´ë¦ì„ 가로챌 수 있어 pointer-events를 맞춤 */
.bottom-sheet {
position: fixed;
left: 0;
right: 0;
bottom: 0;
z-index: 31;
width: 100%;
background-color: #ffffff;
/* Figma BottomSheet/Variation — ìƒë‹¨ radius 12 */
border-radius: 12px 12px 0 0;
padding-bottom: env(safe-area-inset-bottom, 0px);
transform: translateY(100%);
pointer-events: none;
transition: transform 0.3s cubic-bezier(0.32, 0.72, 0, 1);
}
.bottom-sheet.is-visible {
transform: translateY(0);
pointer-events: auto;
}
/* PC ë ˆì´ì•„웃ì—서 .portal 등 다른 모달과 ë™ì¼í•˜ê²Œ ë·°í¬íЏ 중앙(501~1000px)/.site
우측 ì •ë ¬(1001px~) ê·œì¹™ì„ ë”°ë¦„ — 안 맞추면 ì‹¤ì œ 콘í…ì¸ ì—´ê³¼ 어긋나 ë³´ìž„.
딤(.bottom-sheet__dim)ì€ ì‹œíŠ¸ 패ë„ê³¼ ë³„ê°œì˜ í˜•ì œ ì—˜ë¦¬ë¨¼íŠ¸ë¼ íŒ¨ë„ë§Œ ì¢í˜€ì„œëŠ”
안 ë˜ê³ ë”¤ë„ ë˜‘ê°™ì´ ì¢í˜€ì•¼ PCì—서 배너 ì˜ì—까지 화면 ì „ì²´ë¥¼ ë®ì§€ 않ìŒ.
가로 ì¤‘ì•™ì •ë ¬(translateX)ê³¼ 슬ë¼ì´ë“œì—…(translateY)ì„ í•œ transformì— ê°™ì´ ëª…ì‹œ */
@media (min-width: 501px) {
.bottom-sheet {
left: 50%;
max-width: 500px;
transform: translateX(-50%) translateY(100%);
}
.bottom-sheet.is-visible {
transform: translateX(-50%) translateY(0);
}
.bottom-sheet__dim {
left: 50%;
right: auto;
width: 500px;
transform: translateX(-50%);
}
}
@media (min-width: 1001px) {
.bottom-sheet {
left: auto;
right: calc((100vw - 1000px) / 2);
max-width: var(--pc-content-width);
transform: translateY(100%);
}
.bottom-sheet.is-visible {
transform: translateY(0);
}
.bottom-sheet__dim {
left: auto;
right: calc((100vw - 1000px) / 2);
width: var(--pc-content-width);
transform: none;
}
}
/* í—¤ë”/드래그핸들/타ì´í‹€ — Figma BottomSheetHeader(CT-003/CL-006 공통 실측):
패딩 16/24/16, 핸들 #D3D3D3 + 핸들-타ì´í‹€ 간격 20, 타ì´í‹€ 18px/600/lh24/-0.01em.
(기존엔 ShareBottomSheetë§Œ 로컬로 ì´ ê°’ì„ ë§žì¶”ê³ ìžˆì—ˆìŒ â€” 공용 셸로 승격) */
.bottom-sheet__header {
display: flex;
flex-direction: column;
align-items: center;
padding: 16px 24px 16px;
touch-action: none;
user-select: none;
cursor: grab;
}
.bottom-sheet__drag-handle {
width: 60px;
height: 4px;
border-radius: 999px;
background-color: #d3d3d3;
margin-bottom: 20px;
}
.bottom-sheet__title {
margin: 0;
font-family: Pretendard, sans-serif;
font-size: 18px;
font-weight: 600;
line-height: 24px;
letter-spacing: -0.01em;
color: #1a1a1a;
}
/* ë²¤ë” aurora.cssê°€ 화면마다 다른 ì¡°ìƒ í´ëž˜ìФ(.order-confirm__btn-group .btn,
.cash-receipt__btn-wrap .btn 등)ì— height/border-radius/color를 ì´ë¯¸ ì •ì˜í•´ë‘” 경우가
ë§Žì•„(ëª…ì‹œë„ 0,2,0), ì „ì— ë‹¨ì¼ í´ëž˜ìФ(.btn--dark/.btn--caution, ëª…ì‹œë„ 0,1,0)로는
화면마다 우연히 ê·¸ ì¡°ìƒ í´ëž˜ìŠ¤ëª…ê³¼ ê²¹ì¹ ë•Œë§ˆë‹¤ ê³„ì† ë°€ë ¸ë‹¤(주문완료/ê²°ì œì‹¤íŒ¨/
현금ì˜ìˆ˜ì¦ 모달ì—서 ì‹¤ì œë¡œ ë°œìƒ, 매번 화면별로 ìž¬ì •ì˜í•´ì•¼ í–ˆìŒ) — ì´ ì»´í¬ë„ŒíЏ
ìžì‹ ì˜ í´ëž˜ìŠ¤ë¥¼ ë‘ ë²ˆ 걸어(.eoshin-btn.eoshin-btn) 명시ë„를 0,2,0으로 맞춰서
ì–´ë–¤ í™”ë©´ì˜ ì–´ë–¤ wrapper í´ëž˜ìФì—ì„œë„ ë” ì´ìƒ 안 깨지게 한다(로드 ìˆœì„œìƒ ì´
파ì¼ì´ ë²¤ë” CSS보다 í•ìƒ ë‚˜ì¤‘ì— ë¡œë“œë˜ë¯€ë¡œ ë™ë¥ ì´ë©´ ì´ íŒŒì¼ì´ ì´ê¸´ë‹¤) */
.eoshin-btn.eoshin-btn {
height: 52px;
border: 0;
border-radius: 8px;
font-family: Pretendard, sans-serif;
font-size: 16px;
}
.eoshin-btn.eoshin-btn--dark {
background-color: #f0f4fe;
color: #3c56d6;
font-weight: 500;
}
.eoshin-btn.eoshin-btn--caution {
background-color: #4a69ea;
color: #ffffff;
font-weight: 600;
}
.eoshin-btn.eoshin-btn:disabled {
background-color: #e6e6e6;
color: #ababab;
cursor: default;
}
/* 배송비 ìƒì„¸ë³´ê¸° 바텀시트 — Figma CT-003(5218:34201). í—¤ë”(드래그핸들+타ì´í‹€)는
공용 BottomSheet 스펙(16px 패딩)ì„ ê·¸ëŒ€ë¡œ ì“°ê³ , ì´ í”„ë ˆìž„ ê³ ìœ ì½˜í…ì¸ (ì œíœ´ì—…ì²´ 표/
안내문/CTA)ë§Œ Figma 실측(24px 좌우 패딩)대로 새로 ë§Œë“ ë‹¤. */
.delivery-fee-detail-sheet__section-title {
margin: 0;
padding: 12px 24px;
font-family: Pretendard, sans-serif;
font-size: 16px;
font-weight: 600;
color: #404040;
}
/* Figma는 ê° ì…€(LabelContainer/ValueContainer)ì— ê°œë³„ í…Œë‘리(#e6e6e6)를 그리는ë°, 그대로
옮기면 ì…€ì´ ë§žë¶™ëŠ” ìžë¦¬ë§ˆë‹¤ í…Œë‘리가 ê²¹ì³ ë‘ ë°°ë¡œ ë‘êº¼ì›Œì§ â€” 표 ë°”ê¹¥ì€ í•œ 번만, ì…€ 사ì´ëŠ”
êµ¬ë¶„ì„ í•˜ë‚˜ë§Œ 긋는 형태로 ì •ë¦¬ */
.delivery-fee-detail-sheet__table {
display: flex;
flex-direction: column;
margin: 0 24px;
border: 1px solid #e6e6e6;
border-radius: 4px;
overflow: hidden;
}
.delivery-fee-detail-sheet__row {
display: flex;
align-items: stretch;
}
.delivery-fee-detail-sheet__row + .delivery-fee-detail-sheet__row {
border-top: 1px solid #e6e6e6;
}
.delivery-fee-detail-sheet__row-label {
display: flex;
flex: 0 0 100px;
align-items: center;
justify-content: center;
padding: 8px;
border-right: 1px solid #e6e6e6;
background-color: #fafafa;
font-family: Pretendard, sans-serif;
font-size: 13px;
font-weight: 600;
color: #404040;
text-align: center;
}
/* Figma Value ì…€ì€ textAlign CENTER — 좌측 ì •ë ¬ë¡œ ìƒˆë˜ ê²ƒ(CT-003 ê°ì‚¬)ì„ ê°€ìš´ë°ë¡œ 맞춤 */
.delivery-fee-detail-sheet__row-value {
display: flex;
flex: 1;
align-items: center;
justify-content: center;
padding: 8px 24px;
font-family: Pretendard, sans-serif;
font-size: 13px;
font-weight: 400;
color: #404040;
text-align: center;
}
.delivery-fee-detail-sheet__notice {
margin: 0;
padding: 12px 24px;
font-family: Pretendard, sans-serif;
font-size: 12px;
font-weight: 400;
line-height: 18px;
color: #404040;
}
/* Figma Button/CTAArea — 하단 패딩 12(기존 20ì—서 ìˆ˜ì •), 버튼 2ê°œ(닫기/확ì¸)ê°€
gap 8로 나란히 ì ˆë°˜ì”© 차지 */
.delivery-fee-detail-sheet__cta {
display: flex;
gap: 8px;
padding: 12px 16px;
}
.delivery-fee-detail-sheet__cta .btn {
flex: 1;
width: 100%;
height: 52px;
border-radius: 8px;
}
/* ── ê²°ì œê¸ˆì•¡ — Figma PriceList(5911:41964) ── */
.cart__price-header {
margin: 0;
padding: 4px 16px;
font-family: Pretendard, sans-serif;
font-size: 16px;
font-weight: 600;
line-height: 24px;
color: #1a1a1a;
}
.cart .price-tag {
padding: 4px 16px 20px;
}
/* 벤ë”(aurora.css) .price-tag__details{display:grid}는 align-items를 안 ì •í•´ì„œ 기본값
stretchê°€ ì ìš©ë¨ â€” "배송비 ìƒì„¸ë³´ê¸°" 행처럼 dt(버튼 í¬í•¨, 28px)ê°€ dd(순수 í…스트, 18px)보다
í° í–‰ì—서 ddê°€ ì…€ ìœ„ìª½ì— ë¶™ì–´ë²„ë ¤, dt ì•ˆì˜ í…스트(위 규칙으로 세로 중앙 ì •ë ¬ë¨)와 ddì˜
금액 í…스트가 서로 다른 높ì´ì— ë– ë³´ì˜€ìŒ â€” 그리드 ìžì²´ë¥¼ 세로 중앙 ì •ë ¬ë¡œ 맞춘다 */
.cart .price-tag__details {
align-items: center;
}
.cart .price-tag__details dt,
.cart .price-tag__details dd {
font-size: 14px;
font-weight: 500;
line-height: 18px;
}
.cart .price-tag__details dt {
color: #9b9b9b;
}
/* Figma LeftSide(5911:41973) — "ì´ ë°°ì†¡ë¹„" ë¼ë²¨ + "배송비 ìƒì„¸ë³´ê¸°" ë²„íŠ¼ì„ gap:8, 세로 중앙
ì •ë ¬ë¡œ ë¬¶ì€ ê°€ë¡œ auto-layout. dtê°€ 기본 blockì´ë¼ 버튼(28px)ì´ í…스트(18px)보다 커서
위쪽 기준으로만 나란히 놓ì´ê³ ë²„íŠ¼ì´ í…스트보다 아래로 ì²˜ì ¸ ë³´ì˜€ìŒ â€” ì´ dtë§Œ flex로 바꿔서
중앙 ì •ë ¬í•œë‹¤(ë²„íŠ¼ì´ ì—†ëŠ” "ìƒí’ˆ 금액" dt는 ì˜í–¥ë°›ì§€ 않ë„ë¡ :has로 í•œì •) */
.cart .price-tag__details dt:has(.cart__delivery-info-btn) {
display: flex;
align-items: center;
}
/* Figma PriceValue는 숫ìž+"ì›"ì´ í•˜ë‚˜ì˜ í…스트 노드(#404040)ì¸ë°, 벤ë”(aurora.css)ê°€
dd em(숫ìž)ì—는 color:var(--black-color);font-weight:700ì„ ì§ì ‘ ì§€ì •í•´ë‘ê³ ìžˆì–´
ddì—ë§Œ ìƒ‰ì„ ì¤˜ë„ emì€ ìƒì†ì„ 안 ë°›ê³ ë²¤ë” ê°’ì„ ê·¸ëŒ€ë¡œ 씀 — dd/dd em 둘 다 맞춰야
숫ìžì™€ "ì›" 글ìžìƒ‰ì´ 통ì¼ëœë‹¤ */
.cart .price-tag__details dd {
color: #404040;
}
.cart .price-tag__details dd em {
color: #404040;
font-weight: 500;
margin: 0;
}
/* ë²¤ë” PriceTag(component.css/aurora.css)는 final-amountì˜ dt/dd emì„ ê°ê°
굵게(700)/20px/point-color로 키워 강조하는ë°, Figma TotalPriceLabel/TotalPriceValue는
16px/600/#1a1a1a, 17px/600/#3c56d6ì´ë¼ ë²¤ë” ê¸°ë³¸ê°’ì´ ë” í¬ê³ êµµê³ ìƒ‰ë„ ë‹¬ëžìŒ —
위와 ê°™ì€ ì´ìœ 로 dd/dd em 둘 다 ì§€ì •í•´ì•¼ 숫ìžì™€ "ì›" 글ìžê°€ ë™ì¼í•˜ê²Œ ë³´ì¸ë‹¤ */
.cart .price-tag__final-amount dt {
color: #1a1a1a;
font-size: 16px;
font-weight: 600;
line-height: 24px;
}
.cart .price-tag__final-amount dd {
font-size: 17px;
font-weight: 600;
line-height: 26px;
color: #3c56d6;
}
.cart .price-tag__final-amount dd em {
font-size: 17px;
font-weight: 600;
color: #3c56d6;
margin: 0;
}
.cart .price-tag__division {
border-top: 1px solid #e6e6e6;
border-top-style: solid;
}
.cart__delivery-info-btn {
margin-left: 8px;
padding: 4px 8px;
border: 1px solid #e6e6e6;
border-radius: 4px;
background-color: #ffffff;
font-family: Pretendard, sans-serif;
font-size: 12px;
line-height: 18px;
color: #9b9b9b;
cursor: pointer;
}
/* 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;
}
/* ì²´í¬ë°•스 ì›í˜•/기본 색ìƒ(Figma CT-001_ìž¥ë°”êµ¬ë‹ˆëª©ë¡ 5911:41894)ì€ ì—¬ëŸ¬ í™”ë©´ì´ ê³µìœ í•˜ëŠ”
ì»´í¬ë„ŒíŠ¸ë¼ _sharedComponents.css로 ì´ì „ — ë¼ë²¨(15px 등 ì´ í™”ë©´ ì „ìš© í¬ê¸°)ë§Œ 남긴다.
CartProductCard.tsxë„ ë™ì¼í•œ ê·œì¹™ì„ ì”€(ê°’ì´ ê°™ì•„ 로드 순서 무관).
_sharedComponents.cssì˜ ë¯¸ì²´í¬ íšŒìƒ‰ 규칙(.check-radio input[type='checkbox'] ~
.check-radio__label, ëª…ì‹œë„ 0,3,1)ì´ .cart .check-radio__label(0,2,0)ì„ ì´ê²¨ ì „ì²´ì„ íƒ
ë¼ë²¨ì´ 회색으로 ìƒˆë˜ ë¬¸ì œ(CT-002 ê°ì‚¬) — Figma는 ì²´í¬ ì—¬ë¶€ì™€ 무관하게 í•ìƒ #1B1B1B
ê³ ì •ì´ë¼, 미체í¬/ì²´í¬ ë‘ ìƒíƒœ ëª¨ë‘ ê³µìœ ê·œì¹™ë³´ë‹¤ 한 단계 ë†’ì€ ëª…ì‹œë„로 장바구니ì—서만
ìž¬ê³ ì •í•œë‹¤(ê³µìœ íŒŒì¼ì€ 다른 í™”ë©´ë“¤ì´ ì“°ë¯€ë¡œ 건드리지 않ìŒ) */
.cart .check-radio__label,
.cart .check-radio input[type='checkbox'] ~ .check-radio__label,
.cart .check-radio input:checked[type='checkbox'] ~ .check-radio__label {
font-family: Pretendard, sans-serif;
font-size: 15px;
font-weight: 500;
line-height: 24px;
color: #1b1b1b;
}
/* 빈 장바구니ì—서 ì²´í¬ë°•스를 disabled 처리하면 ë²¤ë” common.cssì˜ .disabled{opacity:.4}ê°€
ëž˜í¼ ì „ì²´ë¥¼ í리게 만들어 ë¼ë²¨ì´ ì—¬ì „ížˆ 회색으로 ë³´ì¸ë‹¤ — Figma CT-002(5236:35312)ì˜
0/0 ìƒíƒœëŠ” í림 ì—†ì´ ì¼ë°˜ ë¯¸ì²´í¬ ëª¨ì–‘(빈 ì› + #1B1B1B ë¼ë²¨)ì´ë¯€ë¡œ ì´ í™”ë©´ì—서만 ë˜ëŒë¦°ë‹¤ */
.cart__select-manager .check-radio.disabled {
opacity: 1;
}
/* ── ìƒë‹¨ ì „ì²´ì„ íƒ ë°” — Figma TopBar/FilterBar(5911:41896) ── */
.cart__select-manager {
display: flex;
align-items: center;
justify-content: space-between;
height: 48px;
padding: 0 16px;
border-bottom: 1px solid #e6e6e6;
}
.cart__delete-selected-btn {
padding: 6px 16px;
border: 1px solid #f5f5f5;
border-radius: 4px;
background-color: #fafafa;
font-family: Pretendard, sans-serif;
font-size: 14px;
font-weight: 500;
line-height: 18px;
color: #404040;
cursor: pointer;
}
/* Figma 장바구니 빈 ìƒíƒœ(5236:35318)ì˜ "ì„ íƒì‚ì œ" 버튼 — ë°°ê²½/í…Œë‘리/í…스트 ì „ë¶€
회색조로 ë°”ë€ë‹¤(#e6e6e6/#ababab) */
.cart__delete-selected-btn:disabled {
border-color: #e6e6e6;
background-color: #e6e6e6;
color: #ababab;
cursor: default;
}
/* ì²´í¬ë°•스 ì›í˜•/기본 색ìƒì€ _sharedComponents.css로 ì´ì „ — ë¼ë²¨(15px 등 ì´ í™”ë©´ ì „ìš©
í¬ê¸°)ë§Œ CartTopSelectManager.css와 ë™ì¼ 규칙으로 ë³µì œ(ê°’ì´ ê°™ì•„ 로드 순서 무관).
Figma CT-001_장바구니목ë¡(5911:41894).
_sharedComponents.cssì˜ ë¯¸ì²´í¬ íšŒìƒ‰ 규칙(.check-radio input[type='checkbox'] ~
.check-radio__label, ëª…ì‹œë„ 0,3,1)ì´ .cart .check-radio__label(0,2,0)ì„ ì´ê²¨ ë¼ë²¨ì´
회색으로 ìƒˆë˜ ë¬¸ì œ(CT-002 ê°ì‚¬) — Figma BrandNameì€ ì²´í¬ ì—¬ë¶€ì™€ 무관하게 í•ìƒ
#1B1B1B ê³ ì •ì´ë¼, 미체í¬/ì²´í¬ ë‘ ìƒíƒœ ëª¨ë‘ ê³µìœ ê·œì¹™ë³´ë‹¤ 한 단계 ë†’ì€ ëª…ì‹œë„로
장바구니ì—서만 ìž¬ê³ ì •í•œë‹¤(ê³µìœ íŒŒì¼ì€ 다른 í™”ë©´ë“¤ì´ ì“°ë¯€ë¡œ 건드리지 않ìŒ) */
.cart .check-radio__label,
.cart .check-radio input[type='checkbox'] ~ .check-radio__label,
.cart .check-radio input:checked[type='checkbox'] ~ .check-radio__label {
font-family: Pretendard, sans-serif;
font-size: 15px;
font-weight: 500;
line-height: 24px;
color: #1b1b1b;
}
/* ── ìƒí’ˆ 카드 — Figma CartContainer(5911:41903) ── */
.cart__product-card {
display: flex;
flex-direction: column;
gap: 12px;
margin-bottom: 16px;
padding: 12px;
border: 1px solid #e6e6e6;
border-radius: 8px;
background-color: #ffffff;
}
.cart__product-card__header {
display: flex;
align-items: center;
justify-content: space-between;
}
.cart__product-card__close-btn {
position: relative;
width: 20px;
height: 20px;
cursor: pointer;
}
.cart__product-card__close-btn::before,
.cart__product-card__close-btn::after {
position: absolute;
top: 50%;
left: 50%;
content: '';
width: 12px;
height: 1.5px;
background-color: #9b9b9b;
}
.cart__product-card__close-btn::before {
transform: translate(-50%, -50%) rotate(45deg);
}
.cart__product-card__close-btn::after {
transform: translate(-50%, -50%) rotate(-45deg);
}
/* ìž…ì 파트너/"구매 ì œí•œ ìƒí’ˆ" 그룹 ë¼ë²¨ — Figma CartContainerì—” 없는 ì •ë³´ë¼(ìƒí’ˆë§ˆë‹¤
í—¤ë”ê°€ 있는 구조) í—¤ë” ì²´í¬ë°•스 ë¼ë²¨(BrandName, 15/500)ê³¼ ê°™ì€ í†¤ìœ¼ë¡œë§Œ 얹는다 */
.cart__product-card__partner-name {
margin: 0;
font-family: Pretendard, sans-serif;
font-size: 15px;
font-weight: 500;
line-height: 24px;
color: #1b1b1b;
}
/* 구매 ì œí•œ ìƒí’ˆ í—¤ë” â€” ì²´í¬ë°•스 ì—†ì´ ë¼ë²¨ë§Œ ë…¸ì¶œí• ë•Œ ì²´í¬ë°•스 ë¼ë²¨ê³¼ ê°™ì€ íƒ€ì´í¬ ìœ ì§€ */
.cart__product-card__header-label {
font-family: Pretendard, sans-serif;
font-size: 15px;
font-weight: 500;
line-height: 24px;
color: #1b1b1b;
}
/* 배송그룹 카드 안ì—서 ìƒí’ˆ 블ë¡(í—¤ë”+ì´ë¯¸ì§€+ì •ë³´+옵션 스테í¼)ì´ ë°˜ë³µëœë‹¤ — Figma
CT-001ì˜ CartContainerë„ ìƒí’ˆë§ˆë‹¤ í—¤ë”(ì²´í¬ë°•스+브랜드명+X)를 반복하는 ê°™ì€ êµ¬ì¡°ë¼
êµ¬ë¶„ì„ ì—†ì´ ì¹´ë“œì˜ gap(12px)만으로 경계를 표시한다 */
.cart__product-card__product {
display: flex;
flex-direction: column;
gap: 12px;
}
.cart__product-card__content {
display: flex;
gap: 11px;
}
/* ì¸ë„¤ì¼ 박스 í¬ê¸°/ì´ë¯¸ì§€ 꽉채움/"ì´ë¯¸ì§€ì—†ìŒ" ìžë¦¬í‘œì‹œìž ë³´ì¡´ 로ì§ì€ 주문서와 ê³µìœ í•˜ëŠ”
공용 리셋(_layout.cssì˜ .thumb-item__media 등)으로 ì´ì „ë¨ â€” ì´ íŒŒì¼ì—” 카드 ë ˆì´ì•„웃
ìžì²´(가로 배치, í)ë§Œ 남긴다 */
.cart__product-card__image.thumb-item {
width: 72px;
flex: none;
}
.cart__product-card__info {
display: flex;
flex-direction: column;
gap: 8px;
min-width: 0;
}
.cart__product-card__name.editor {
margin: 0;
font-family: Pretendard, sans-serif;
font-size: 14px;
font-weight: 500;
line-height: 18px;
color: #1b1b1b;
}
.cart__product-card__original-price {
display: block;
font-family: Pretendard, sans-serif;
font-size: 13px;
font-weight: 400;
line-height: 18px;
color: #9b9b9b;
}
.cart__product-card__price-row {
display: flex;
align-items: center;
gap: 8px;
margin: 0;
}
.cart__product-card__discount-rate {
font-family: Pretendard, sans-serif;
font-size: 17px;
font-weight: 600;
line-height: 26px;
color: #ff272b;
}
.cart__product-card__sale-price {
font-family: Pretendard, sans-serif;
font-size: 17px;
font-weight: 600;
line-height: 26px;
color: #1a1a1a;
}
.cart__product-card__base-product-name {
margin: 0 0 8px;
font-size: 13px;
color: #9b9b9b;
}
/* ── 옵션/수량/합계 박스 — Figma StepperBox(5911:41919) ── */
.cart__product-card__stepper-box {
display: flex;
flex-direction: column;
gap: 16px;
padding: 12px;
border-radius: 8px;
background-color: #fafafa;
}
.cart__product-card__option {
display: flex;
align-items: center;
justify-content: space-between;
}
.cart__product-card__option .option-label {
font-family: Pretendard, sans-serif;
font-size: 13px;
line-height: 18px;
color: #404040;
}
/* 옵션행/스테í¼í–‰ ì‚ì œ(X) 버튼 — Figma Icon/General/Close(CT-001 5911:41894 StepperBox ë‚´,
16x16 stroke #9B9B9B w1.5). CSS ì •ì˜ê°€ 아예 없어 빈 버튼으로 ë Œë”ë§ë˜ë˜ 것(ê°ì‚¬ ì§€ì )ì„
카드 í—¤ë” X(.cart__product-card__close-btn, 20px í”„ë ˆìž„ì— 12px íš = 0.6 비율)와 ê°™ì€
ì˜ì‚¬ìš”소 ë°©ì‹ìœ¼ë¡œ 구현 — 16px í”„ë ˆìž„ì´ë¯€ë¡œ íš ê¸¸ì´ëŠ” ê°™ì€ ë¹„ìœ¨ì˜ 10px */
.cart__delete-btn {
position: relative;
flex: none;
width: 16px;
height: 16px;
padding: 0;
border: 0;
background: none;
cursor: pointer;
}
.cart__delete-btn::before,
.cart__delete-btn::after {
position: absolute;
top: 50%;
left: 50%;
content: '';
width: 10px;
height: 1.5px;
background-color: #9b9b9b;
}
.cart__delete-btn::before {
transform: translate(-50%, -50%) rotate(45deg);
}
.cart__delete-btn::after {
transform: translate(-50%, -50%) rotate(-45deg);
}
.cart__product-card__stepper-row {
display: flex;
align-items: center;
justify-content: space-between;
}
/* ë²¤ë” QuantityChanger(component.css)는 ì›ëž˜ width:90px/height:26pxì— í…Œë‘리를
var(--default-color)로 그리는ë°, ì´ í”„ë¡œì 트가 --default-color ìžì²´ë¥¼ ì „ì—ì—서
#e1eaef(ì–´ì‹ ë¸Œëžœë“œ ë³´ë”색)로 바꿔놔서(style.css) 장바구니 스테í¼ë„ ê·¸ ìƒ‰ì´ ê·¸ëŒ€ë¡œ
ìƒˆê³ ìžˆì—ˆë‹¤ — Figma StepperButton/Number(ê° 36x36, í…Œë‘리 #e6e6e6)ì— ë§žì¶° í¬ê¸°ì™€
í…Œë‘ë¦¬ìƒ‰ì„ ëª…ì‹œì 으로 다시 ì§€ì •í•œë‹¤. 벤ë”ê°€ ì´ë¯¸ ê°€ìš´ë° Number 박스 좌우로
border-right/border-left를 ê·¸ë ¤ì£¼ëŠ” 구조ë¼(í•˜ë‚˜ì˜ ë°”ê¹¥ í…Œë‘리 + 안쪽 êµ¬ë¶„ì„ ) ê·¸
구조는 그대로 ë‘ê³ ì¹˜ìˆ˜Â·ìƒ‰ë§Œ êµì²´í•˜ë©´ Figmaì˜ "3ì¹¸ì´ ë¶™ì–´ìžˆëŠ” 스테í¼" ëª¨ì–‘ì´ ëœë‹¤ */
.cart .quantity-changer {
width: 108px;
height: 36px;
border-radius: 8px;
border-color: #e6e6e6;
}
.cart .quantity-changer__decrease-btn,
.cart .quantity-changer__increase-btn {
width: 36px;
border-color: #e6e6e6;
}
.cart .quantity-changer__input {
width: 36px;
}
.cart .quantity-changer__input input {
font-family: Pretendard, sans-serif;
font-size: 14px;
font-weight: 600;
color: #1b1b1b;
}
.cart__product-card__total-price {
font-family: Pretendard, sans-serif;
font-size: 18px;
font-weight: 600;
line-height: 24px;
color: #1a1a1a;
}
/* ── 카드 하단 배송 안내 — Figma DeliveryInformation(5911:41930) ── */
.cart__product-card__delivery-info {
display: flex;
align-items: center;
justify-content: space-between;
margin: 0;
font-family: Pretendard, sans-serif;
font-size: 13px;
line-height: 18px;
}
.cart__product-card__delivery-free-msg {
color: #3c56d6;
}
.cart__product-card__delivery-fee {
font-weight: 600;
color: #404040;
}
/* ── 배송그룹(파트너) ì˜ì— — Figma CartContainerSection(5911:41902)ì—” 그룹별 ì²´í¬ë°•스
í–‰ì´ ì—†ì–´(ì „ì²´ì„ íƒ ë°”ë¡œ 아래 바로 ìƒí’ˆ 카드가 ì´ì–´ì§) ì œê±°í•˜ê³ , ê·¸ ì¤„ì´ ê°–ê³ ìžˆë˜
위쪽 여백만 ì„¹ì…˜ì— ë‚¨ê²¨ 카드 ê°„ ê°„ê²©ì„ ìœ ì§€í•œë‹¤ ── */
.cart__delivery-section {
padding: 16px 16px 0;
}
/* ── 하단 CTA — Figma Button/CTAArea(5911:41987). 버튼 하나만 ë‘ë„ë¡ í†µí•©í–ˆìœ¼ë¯€ë¡œ
ì „ì²´ 너비를 ì±„ìš°ê³ , ë°°ê²½/치수를 Figma ì¸ë””ê³ ìŠ¤íŽ™ìœ¼ë¡œ 맞춤 ── */
.cart__fixed-order-btn {
/* Figma CT-001/002 — CTA는 ë·°í¬íЏ í•˜ë‹¨ì— ë¶™ëŠ” ë°”. ë²¤ë” fixed ëŒ€ì‹ sticky+bottom:0ì„
ì“°ë©´ 긴 목ë¡ì—서는 í•˜ë‹¨ì— ë¶™ì–´ ë”°ë¼ì˜¤ê³ , 스í¬ë¡¤ ëì—서는 푸터를 가리지 않ê³
문서 í름 ìžë¦¬(푸터 위)로 ìžì—°ìŠ¤ëŸ½ê²Œ 안착한다. ì§§ì€ í™”ë©´(빈 장바구니)ì—서는
.cart(flex column, min-height 화면 높ì´)ì˜ margin-top:autoê°€ 최하단으로 민다 */
position: sticky;
bottom: 0;
z-index: 5;
margin-top: auto;
max-width: none;
min-width: 0;
width: 100%;
padding: 12px 16px;
background-color: #fff;
/* Figma Button/CTAAreaì—는 ìƒë‹¨ êµ¬ë¶„ì„ ì´ ì—†ìŒ â€” ë²¤ë” ê¸°ë³¸ border-top(1px #ececec) ì œê±° */
border-top: none;
}
/* ë²¤ë” Button ëŒ€ì‹ ë„¤ì´í‹°ë¸Œ button으로 ì§ì ‘ 구성(Download ì•„ì´ì½˜ + ë¼ë²¨ + ChevronRight,
Figma Button/Buttons 5911:41987)하므로 flex 배치와 기본 리셋(border/cursor)까지 여기서 ì •ì˜ */
.cart__fixed-order-btn .cart__order-btn {
display: flex;
align-items: center;
justify-content: center;
gap: 4px;
width: 100%;
height: 52px;
border: 0;
border-radius: 8px;
background-color: #4a69ea;
color: #ffffff;
cursor: pointer;
/* ë² ì´ìФ 스킨 기본 버튼 í…스트(Montserrat 14px/400)ê°€ Figma ButtonLabel
(Pretendard SemiBold 16px, lineHeight 24px)보다 ìž‘ê³ ì–‡ê²Œ ìƒˆê³ ìžˆì—ˆìŒ */
font-family: Pretendard, sans-serif;
font-size: 16px;
font-weight: 600;
line-height: 24px;
}
/* Figma Button/CTAArea Disabled 배리언트(5236:35325) — 장바구니가 비었거나
ì„ íƒëœ ìƒí’ˆì´ ì—†ì„ ë•Œ "구매하기 (0ì›)"ê°€ 회색조로 ë°”ë€ë‹¤(ì•„ì´ì½˜ë„ currentColor로
함께 íšŒìƒ‰ì´ ë¨) */
.cart__fixed-order-btn .cart__order-btn:disabled {
background-color: #e6e6e6;
color: #ababab;
cursor: default;
}
/* ë²¤ë” aurora.cssì— ìš°ë¦¬ê°€ 쓰는 í´ëž˜ìŠ¤ëª…ê³¼ 우연히 ê°™ì€ .cart__naver-pay-btn{margin:20px 10px}
ê·œì¹™ì´ ìžˆìŒ â€” 네ì´ë²„íŽ˜ì´ ë²„íŠ¼ì´ ì•„ì§ ì•ˆ ê·¸ë ¤ì§„(빈 컨테ì´ë„ˆ) ìƒíƒœì—ì„œë„ ì´ ì—¬ë°±ì´
flex ë ˆì´ì•„ì›ƒì— ê·¸ëŒ€ë¡œ ë°˜ì˜ë˜ì–´ ì˜†ì˜ êµ¬ë§¤í•˜ê¸° ë²„íŠ¼ì´ 20pxë§Œí¼ ì¢ê²Œ ëˆŒë ¤ ìžˆì—ˆìŒ */
.cart__fixed-order-btn .cart__naver-pay-btn {
margin: 0;
}
/* Cart.tsxê°€ ì§ì ‘ ë Œë”ë§í•˜ëŠ”(서브컴í¬ë„ŒíŠ¸ê°€ 아닌) 페ì´ì§€ 루트 ì „ìš© 스타ì¼. */
/* 페ì´ì§€ 골격 — Figma CT-001/002 ëª¨ë‘ êµ¬ë§¤í•˜ê¸° CTAê°€ ë·°í¬íЏ í•˜ë‹¨ì— ë¶™ëŠ” ë°” 구조.
콘í…ì¸ ê°€ ì§§ì•„ë„(빈 장바구니 등) CTAê°€ 화면 ìµœí•˜ë‹¨ì— ì˜¤ë„ë¡ í—¤ë”를 뺀 화면 높ì´ë¥¼
최소로 ì±„ìš°ê³ , CTA(.cart__fixed-order-btn { margin-top: auto })를 아래로 민다.
스í¬ë¡¤ì´ ìƒê¸°ëŠ” 긴 목ë¡ì—서는 CTAì˜ sticky bottomì´ ë·°í¬íЏ í•˜ë‹¨ì— ë¶™ì–´ ë”°ë¼ì˜¨ë‹¤ */
.cart {
display: flex;
flex-direction: column;
min-height: calc(100dvh - var(--header-height));
}