/* 메인 */
#contents {width:100% !important;max-width:100% !important;}
#container #contents .xans-layout-mobileaction {display:none !important;}
#container #contents > .section {max-width:1680px;}

/* 스마트배너 */
.xans-smart-banner-admin {margin:0 auto 120px;}

/* 메인 타이틀 */
.main_title {display:flex;flex-shrink:0;align-items:flex-end;}
.main_title .main_title_txt01 {font-size:32px;font-weight:700;line-height:1;color:#111;}
.main_title .main_title_txt02 {margin-left:20px;font-size:18px;font-weight:400;line-height:1;color:#999;}
.main_title.ez-align-left {text-align:left;justify-content:flex-start;}
.main_title.ez-align-center {text-align:center;justify-content:center;}
.main_title.ez-align-right {text-align:right;justify-content:flex-end;}

/* 메인 상품진열 */
.main_product_list {max-width:1680px !important;width:92%;margin:0 auto 120px;padding:0;}
.main_product_list .main_title {margin-bottom:50px;}

/* 이미지&텍스트갤러리 */
.main_image_text_gallery {max-width:1680px !important;width:92%;margin:0 auto 120px;padding:0;}
.main_image_text_gallery .main_title {margin-bottom:50px;}
.main_image_text_gallery .main_3dan_banner ul {display:flex;justify-content:flex-start;flex-wrap:wrap;margin:0 -10px;}
.main_image_text_gallery .main_3dan_banner ul li {margin:0 0 30px;flex:1;max-width:566px;box-sizing:border-box;padding:0 10px;}
.main_image_text_gallery .main_3dan_banner ul.ez-column-1 {flex-direction:column;align-items:center;}
.main_image_text_gallery .main_3dan_banner ul.ez-column-2 {width:calc(66.66% + 13px);margin:0 auto;}
.main_image_text_gallery .main_3dan_banner ul.ez-column-2 li {flex:0 1 50%;}
.main_image_text_gallery .main_3dan_banner ul.ez-column-3 li {flex:0 1 33.3334%;}
.main_image_text_gallery .main_3dan_banner ul.ez-column-4 li {flex:0 1 25%;}
.main_image_text_gallery .main_3dan_banner ul.ez-column-5 li {flex:0 1 20%;}
.main_image_text_gallery .main_3dan_banner .main_image_text_gallery_more {display:none;}
.main_image_text_gallery .main_3dan_banner ul li a {font-size:0;display:block;position:relative;text-align:center;}
.main_image_text_gallery .main_3dan_banner ul li a picture {overflow:hidden;width:100%;height:100%;font-size:0;position:relative;}
.main_image_text_gallery .main_3dan_banner ul li a picture [data-ez-image='removed'] {width:100%;height:100%;object-fit:none;background-color:rgb(244, 245, 248);aspect-ratio:546/348;}
.main_image_text_gallery .main_3dan_banner ul li a .main_3dan_banner_txt {width:100%;margin-top:30px;text-align:left;}
.main_image_text_gallery .main_3dan_banner ul li a .main_3dan_banner_txt .main_3dan_banner_txt01 {font-size:32px;font-weight:700;line-height:1;color:#1a1a1a;}
.main_image_text_gallery .main_3dan_banner ul li a .main_3dan_banner_txt .main_banner_more {font-size:16px;font-weight:400;line-height:1.5;color:#1a1a1a;margin-top:15px;}
.main_image_text_gallery .main_3dan_banner ul li a:hover .main_3dan_banner_txt .main_banner_more {text-decoration:underline;color:#333;}

/* 메인 텍스트배너 */
.main_text {max-width:1680px !important;width:92%;margin:0 auto 120px;padding:0;background:#7f7f7f;}
.main_text .main_title_inner {width:100%;}
.main_text .main_title_inner .main_long_banner_txt {padding:37px 2%;}
.main_text .main_title_inner .main_long_banner_txt .main_title_txt01 {font-size:24px;font-weight:500;color:#fff;line-height:1;margin-bottom:25px;}
.main_text .main_title_inner .main_long_banner_txt .main_title_txt02 {font-size:16px;font-weight:300;color:#fff;line-height:1.5;}
.main_text .main_text_link a {display:inline-block;font-size:15px;font-weight:300;line-height:1;padding:0 0 5px 0;margin-top:30px;border-bottom:1px solid #fff;color:#fff;}
.main_text.ez-align-left {align-items:start;text-align:left;}
.main_text.ez-align-center {align-items:center;text-align:center;}
.main_text.ez-align-right {align-items:end;text-align:right;}
.main_text.ez-textsize-large .main_long_banner_txt .main_title_txt01 {font-size:30px;}
.main_text.ez-textsize-large .main_long_banner_txt .main_title_txt02 {font-size:20px;}
.main_text.ez-textsize-large .main_text_link a {font-size:16px;}
.main_text.ez-textsize-small .main_long_banner_txt .main_title_txt01 {font-size:22px;}
.main_text.ez-textsize-small .main_long_banner_txt .main_title_txt02 {font-size:14px;}
.main_text.ez-textsize-small .main_text_link a {font-size:12px;}

/* 메인상품분류 슬라이드 상품진열 */
.main_product_slide {position:relative;max-width:1680px !important;width:92%;margin:0 auto 120px;padding:0;}
.main_product_slide .main_title {margin-bottom:50px;}
.main_product_slide .inner {width:100%; background-color: #7f7f7f;}
.main_product_slide .swiper-container.special_slide {padding:0 0 50px 0;}
.main_product_slide .swiper-container.special_slide .swiper-scrollbar {height:2px;left:0;width:100%;transition:all 0.3s;-webkit-transition:all 0.3s;-o-transition:all 0.3s;-moz-transition:all 0.3s;-ms-transition:all 0.3s;}
.main_product_slide .swiper-container.special_slide .swiper-scrollbar:hover {height:5px;}
.main_product_slide .swiper-container.special_slide .swiper-scrollbar .swiper-scrollbar-drag {background:#1a1a1a;cursor:pointer;border-radius:0;}
.main_product_slide .swiper-prev-special,
.main_product_slide .swiper-next-special {width:50px;height:50px;top:36%;position:absolute;z-index:2;margin:0;cursor:pointer;}
.main_product_slide .swiper-prev-special {background:url("/SkinImg/img/slide_ar_l.svg") no-repeat center; background-size:50px; left:-70px;}
.main_product_slide .swiper-next-special {background:url("/SkinImg/img/slide_ar_r.svg") no-repeat center; background-size:50px; right:-70px;}
.main_product_slide.section_full .swiper-prev-special {left:1%;}
.main_product_slide.section_full .swiper-next-special {right:1%;}

/* 메인 비디오배너 */
.main_video {width:100% !important;max-width:100% !important;position:relative;margin:0 auto 120px;padding:0;}
.main_video .background_video {position:absolute;top:auto;bottom:0;right:0;z-index:-1;width:100%;height:60%;background-color:#7f7f7f;}
.main_video .main_video_title {padding:50px 0 60px;max-width:1680px !important;width:92%;margin:0 auto;}
.main_video .main_video_title .main_title_txt01 {font-size:48px;font-weight:700;color:#fff;line-height:1.5;text-align:center;position:relative;height:100%;word-break:keep-all;}
.main_video .main_video_title .main_title_txt02 {font-size:20px;font-weight:300;color:#fff;line-height:1.8;text-align:center;position:relative;margin-top:10px;word-break:keep-all;}
.main_video .main_video_box {position:relative;width:40%;padding-bottom:22.5%;height:0;overflow:hidden;max-width:100%;margin:0 auto;}
.main_video .main_video_box iframe,
.main_video .main_video_box object,
.main_video .main_video_box embed {position:absolute;top:0;left:0;right:0;bottom:0;width:100%;height:100%;}
.main_video.ez-align-left .main_video_title .main_title_txt01,
.main_video.ez-align-left .main_video_title .main_title_txt02 {text-align:left;}
.main_video.ez-align-right .main_video_title .main_title_txt01,
.main_video.ez-align-right .main_video_title .main_title_txt02 {text-align:right;}

/* 메인 탭상품 상품진열 */
.main_product_category {max-width:1680px !important;width:92%;margin:0 auto 120px;padding:0;}
.main_product_category .main_title {flex:1 1 auto;}
.main_product_category .main_product_inner {display:flex;justify-content:space-between;align-items:flex-end;margin-bottom:50px;}
.main_product_category .main_product_inner .main_product_tab {display:flex;}
.main_product_category .main_product_inner .main_product_tab li {margin-left:25px;}
.main_product_category .main_product_inner .main_product_tab li .button {font-size:16px;line-height:1;font-weight:400;color:#a3a3a3;white-space:nowrap;}
.main_product_category .main_product_inner .main_product_tab li .button:after {content: "";position:relative;display:block;top:7px;width:100%;height:1px; background-color: #000;-webkit-transform: scaleX(0); -ms-transform: scaleX(0); transform: scaleX(0);-webkit-transform-origin: 100% 0; -ms-transform-origin: 100% 0; transform-origin: 100% 0;-webkit-transition: -webkit-transform .3s cubic-bezier(.45,.46,.05,.96);-o-transition: transform .3s cubic-bezier(.45,.46,.05,.96);transition: transform .3s cubic-bezier(.45,.46,.05,.96);transition: transform .3s cubic-bezier(.45,.46,.05,.96),-webkit-transform .3s cubic-bezier(.45,.46,.05,.96);}
.main_product_category .main_product_inner .main_product_tab li .button.active:after {-webkit-transform: scaleX(1); -ms-transform: scaleX(1); transform: scaleX(1);-webkit-transform-origin: 0 0; -ms-transform-origin: 0 0; transform-origin: 0 0;-webkit-transition: -webkit-transform .5s cubic-bezier(.45,.46,.05,.96);-o-transition: transform .5s cubic-bezier(.45,.46,.05,.96);transition: transform .5s cubic-bezier(.45,.46,.05,.96);transition: transform .5s cubic-bezier(.45,.46,.05,.96),-webkit-transform .5s cubic-bezier(.45,.46,.05,.96);}
.main_product_category .main_product_inner .main_product_tab li .button.active {color:#1a1a1a;}
.main_product_category .main_product_inner.ez-align-left .main_title {text-align:left;justify-content:flex-start;}
.main_product_category .main_product_inner.ez-align-center .main_title {text-align:center;justify-content:center;}
.main_product_category .main_product_inner.ez-align-right .main_title {text-align:right;justify-content:flex-end;}
.main_product_category .tabcontent {display:none;}
.main_product_category .tabcontent.active {display:block;}

/* 메인 지도 */
.main_map {max-width:100% !important;width:100% !important;height:100%;padding:0;background-color:#7f7f7f;margin:0 auto 120px;}
.main_map .main_map_banner {display:flex;justify-content:space-between;align-items:center;width:92%;max-width:1680px;margin:0 auto;position:relative;}
.main_map.section_full .main_map_banner {max-width:100% !important;width:100% !important;}
.main_map .main_map_banner picture {overflow:hidden;max-width:700px;width:100%;height:100%;font-size:0;position:relative;}
.main_map .main_map_banner picture [data-ez-image='removed'] {width:100%;height:100%;object-fit:none;background-color:rgb(244, 245, 248);aspect-ratio:700/430;}
.main_map .main_map_banner .main_map_box{width:42%;height:100%;max-width:700px;position:relative;text-align:center;}
.main_map .main_map_banner .main_map_box .main_map_banner_txt01 {bottom:25%;left:4%;font-size:48px;font-weight:700;line-height:1;color:#fff;letter-spacing:1.5px;position: absolute;z-index:2;}
.main_map .main_map_banner .main_map_box .main_long_banner_link {position:absolute;bottom:0px;background-color:#fff;}
.main_map .main_map_banner .main_map_box .main_long_banner_link a {font-size:20px;font-weight:700;line-height:1;color:#1a1a1a;padding:22px 30px 22px 37px;display:flex;align-items:center;transition:all 0.3s;-webkit-transition:all 0.3s;-o-transition:all 0.3s;-moz-transition:all 0.3s;-ms-transition:all 0.3s;}
.main_map .main_map_banner .main_map_box .main_long_banner_link a i {font-weight:400;margin-left:60px;font-style:normal;}
.main_map .main_map_banner .main_map_banner_txt_box {padding:5% 0 5% 0;width:50%;height:100%;word-break:keep-all; display:flex;align-items:flex-start;flex-direction:column;justify-content:space-between;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;font-size:18px;color:#e8e8e8;}
.main_map .main_map_banner .main_map_box .main_long_banner_link a:hover {background-color:#1a1a1a;color:#fff;}
.main_map .main_map_banner .main_map_box .main_long_banner_link a:hover .icon[class*="icoPlus"]:before,
.main_map .main_map_banner .main_map_box .main_long_banner_link a:hover .icon[class*="icoPlus"]:after {background:#fff;}
.main_map.ez-align-left .main_map_banner .main_map_banner_txt_box {align-items:flex-start;}
.main_map.ez-align-left .main_map_banner .main_map_banner_txt_box .main_map_banner_txt {text-align:left;}
.main_map.ez-align-center .main_map_banner .main_map_banner_txt_box {align-items:center;}
.main_map.ez-align-center .main_map_banner .main_map_banner_txt_box .main_map_banner_txt {align-items:center;text-align:center;}
.main_map.ez-align-right .main_map_banner .main_map_banner_txt_box {align-items:flex-end;}
.main_map.ez-align-right .main_map_banner .main_map_banner_txt_box .main_map_banner_txt {text-align:right;}

@media all and (min-width:1025px) {
	/* 이미지&텍스트갤러리 */
	.main_image_text_gallery .main_3dan_banner ul.fs_medium li a .main_3dan_banner_txt {margin-top:20px;}
	.main_image_text_gallery .main_3dan_banner ul.fs_medium li a .main_3dan_banner_txt .main_3dan_banner_txt01 {font-size:22px;}
	.main_image_text_gallery .main_3dan_banner ul.fs_small li a .main_3dan_banner_txt {margin-top:20px;}
	.main_image_text_gallery .main_3dan_banner ul.fs_small li a .main_3dan_banner_txt .main_3dan_banner_txt01 {font-size:20px;}
	.main_image_text_gallery[data-ez-item-length='2'] .main_3dan_banner ul {width:calc(66.66% + 13px);margin:0 auto;}
}

@media all and (max-width:1680px) {

	/* 메인 타이틀 */
	.main_title .main_title_txt01 {font-size:calc(21px + (32 - 21) * ((100vw - 370px) / (1680 - 370)));}
	.main_title .main_title_txt02 {font-size:calc(13px + (18 - 13) * ((100vw - 370px) / (1680 - 370)));}

	/* 이미지&텍스트갤러리 */
	.main_image_text_gallery .main_3dan_banner ul li a .main_3dan_banner_txt .main_3dan_banner_txt01 {font-size:calc(24px + (32 - 24) * ((100vw - 370px) / (1680 - 370)));}
	.main_image_text_gallery .main_3dan_banner ul li a .main_3dan_banner_txt .main_banner_more {font-size:calc(13px + (16 - 13) * ((100vw - 370px) / (1680 - 370)));}

	/* 메인상품분류 슬라이드 상품진열 */
	.main_product_slide .swiper-prev-special {left:-50px;}
	.main_product_slide .swiper-next-special {right:-50px;}

	/* 메인 비디오배너 */
	.main_video .main_video_title .main_title_txt01 {font-size:calc(32px + (48 - 32) * ((100vw - 370px) / (1680 - 370)));}
	.main_video .main_video_title .main_title_txt02 {font-size:calc(16px + (20 - 16) * ((100vw - 370px) / (1680 - 370)));}

	/* 메인 지도 */
	.main_map .main_map_banner .main_map_box .main_long_banner_link a {font-size:calc(13px + (20 - 13) * ((100vw - 370px) / (1680 - 370)));}
	.main_map .main_map_banner .main_map_banner_txt_box {font-size:calc(15px + (18 - 15) * ((100vw - 370px) / (1680 - 370)));}

}

@media all and (max-width:1024px) {

	/* 스마트배너 */
	.xans-smart-banner-admin {margin:0 auto 80px;}

	/* 메인 상품진열 */
	.main_product_list {margin:0 auto 80px;}
	.main_product_list .main_title {margin-bottom:35px;}

	/* 이미지&텍스트갤러리 */
	.main_image_text_gallery {margin:0 auto 80px;}
	.main_image_text_gallery .main_3dan_banner ul {flex-direction:column;justify-content:flex-start;flex-wrap:nowrap;margin:0 !important;width:100% !important;}
	.main_image_text_gallery .main_3dan_banner ul li {margin:0 0 35px 0;padding:0;max-width:100%;width:100%;flex:1;}
	.main_image_text_gallery .main_3dan_banner ul li a .main_3dan_banner_txt {margin-top:15px;}
	.main_image_text_gallery .main_3dan_banner ul li a .main_3dan_banner_txt .main_banner_more {margin-top:10px;}
	.main_image_text_gallery .main_3dan_banner ul li a picture img {width:100%;}

	/* 이미지&텍스트갤러리 슬라이드 */
	.main_image_text_gallery .main_3dan_banner.ez-mobile-layout-slide ul {scroll-snap-type:x mandatory;scroll-behavior:smooth;overflow-x:auto;flex-direction:row;justify-content:flex-start !important;align-items: flex-start;gap:10px;width:100%;}
	.main_image_text_gallery .main_3dan_banner.ez-mobile-layout-slide ul::-webkit-scrollbar {display:none;}
	.main_image_text_gallery .main_3dan_banner.ez-mobile-layout-slide ul li {scroll-snap-align:center;margin:0;max-width:100%;width:88%;flex:none;}
	.main_image_text_gallery .main_3dan_banner.ez-mobile-layout-slide ul li a {overflow:hidden;}

	/* 이미지&텍스트갤러리 더보기 */
	.main_image_text_gallery .main_3dan_banner.ez-mobile-layout-more ul li {display:none;opacity:0.3;}
	.main_image_text_gallery .main_3dan_banner.ez-mobile-layout-more ul li:nth-child(1),
	.main_image_text_gallery .main_3dan_banner.ez-mobile-layout-more ul li:nth-child(2),
	.main_image_text_gallery .main_3dan_banner.ez-mobile-layout-more ul li:nth-child(3) {display:block;opacity:1;}
	.main_image_text_gallery .main_3dan_banner.ez-mobile-layout-more .main_image_text_gallery_more {display:block;padding-bottom:20px;}

	/* 메인 텍스트배너 */
	.main_text {margin:0 auto 80px;}

	/* 메인상품분류 슬라이드 상품진열 */
	.main_product_slide {width:92%;margin:0 auto 80px;}
	.main_product_slide .main_title {margin-bottom:20px;}
	.main_product_slide .swiper-prev-special,
	.main_product_slide .swiper-next-special{display:none;}

	/* 메인 비디오배너 */
	.main_video {margin:0 auto 80px;}
	.main_video .main_video_box {width:90%;padding-bottom:50.70%;}
	.main_video .main_video_title .main_title_txt02 {margin-top:10px;}

	/* 메인 탭상품 상품진열 */
	.main_product_category {margin:0 auto 80px;}
	.main_product_category .main_title {margin-bottom:20px;}
	.main_product_category .main_product_inner {flex-direction:column;margin-bottom:30px;}
	.main_product_category .main_product_inner .main_product_tab {width:100%;margin-top:10px;overflow:hidden;overflow-x:auto;}
	.main_product_category .main_product_inner .main_product_tab li {margin-left:10px;}
	.main_product_category .main_product_inner .main_product_tab li:first-child {margin-left:0;}
	.main_product_category .main_product_inner .main_product_tab li .button {font-size:16px;line-height:1;font-weight:400;color:#8a8a8a;white-space:nowrap;padding:0px 0px 8px 0px;}
	.main_product_category .main_product_inner .main_product_tab li .button:after {display:none;}
	.main_product_category .main_product_inner .main_product_tab li .button.active {color:#1a1a1a;border-bottom:2px solid #1a1a1a;}
	.main_product_category .main_product_inner.ez-align-left {align-items:flex-start;}
	.main_product_category .main_product_inner.ez-align-center {align-items:center;}
	.main_product_category .main_product_inner.ez-align-right {align-items:end;}
	.main_product_category .tabcontent .ec-base-product .prdList.grid3.list_gallery > li,
	.main_product_category .tabcontent .ec-base-product .prdList.grid4.list_gallery > li,
	.main_product_category .tabcontent .ec-base-product .prdList.grid3 > li,
	.main_product_category .tabcontent .ec-base-product .prdList.grid4 > li {width:50%;}
	.main_product_category .tabcontent .ec-base-product .prdList.grid5 > li,
	.main_product_category .tabcontent .ec-base-product .prdList.grid5.list_gallery > li {width:33.33%;}
	.main_product_category .tabcontent .ec-base-product .prdList.grid3 .description {margin:10px 0 0 0;}

	/* 메인 지도 */
	.main_map {width:100%;height:auto;padding:0;margin:0 auto 80px;}
	.main_map .main_map_banner {display:flex;flex-direction:column;margin:0 auto;}
	.main_map .main_map_banner .main_map_box {width:100%;margin:0 auto;}
	.main_map .main_map_banner .main_map_box .main_map_banner_txt01 {font-size:43px;bottom:42%;width:92%;text-align:center;}
	.main_map .main_map_banner .main_map_box .main_long_banner_link a {padding:12px 14px 12px 15px;}
	.main_map .main_map_banner .main_map_box .main_long_banner_link a i {margin-left:20px;}
	.main_map .main_map_banner .main_map_banner_txt_box {margin:5% auto;padding:0;width:100%;}
}

@media all and (max-width:767px) {

	/* 스마트배너 */
	.xans-smart-banner-admin {margin:0 auto 50px;}

	/* 메인타이틀 */
	.main_title .main_title_txt02 {margin-left:10px;}

	/* 메인 상품진열 */
	.main_product_list {margin:0 auto 50px;}

	/* 이미지&텍스트갤러리 */
	.main_image_text_gallery {margin:0 auto 50px;}
	.main_image_text_gallery .main_title {margin-bottom:35px;}

	/* 메인 텍스트배너 */
	.main_text {margin:0 auto 50px;}

	/* 메인상품분류 슬라이드 상품진열 */
	.main_product_slide {margin:0 auto 50px;}

	/* 메인 비디오배너 */
	.main_video {margin:32% auto 50px;}

	/* 메인 탭상품 상품진열 */
	.main_product_category {margin:0 auto 50px;}

	/* 메인 지도 */
	.main_map {margin:0 auto 50px;}
}
/* ===== 2026-09-05 EZ 그릇+내용물 이식: 시안 CSS 통째 병합(카페24-프레임워크 G95) =====
   카페24 라이브 optimizer 번들이 새 @css() 참조 파일을 안 잡아, 이미 번들되는 이 파일에
   시안 CSS 전체를 병합한다(SoyThree R6과 동일 조치, 템플릿_가이드 §9-4-3 4단계 1번). */

/* ---- css/layout.css (헤더/푸터 .main-layout-* 전체) ---- */
  
    /* 
       [SYSTEM RULE] 
       1. All Layout Components use 'main-layout-' prefix.
       2. Hero Carousel uses 'mc-' prefix.
       3. Promo Section uses 'ps-' prefix.
       4. Quick Icons uses 'qi-' prefix.
       5. Best Items uses 'bi-' prefix.
       6. Notice & Community uses 'nc-' prefix.
       7. Group Banner uses 'gb-' prefix.
       8. Time Sale uses 'ts-' prefix.
       9. Division Banner uses 'dv-' prefix.
    */

    :root {
      /* [2026-08-07] SoyTwo 전역 브랜드 토큰 — SOYONE(--ml-accent 레드 #b63535)와 시각적으로
         분리하기 위해, 벤치마크(COS)의 미니멀 모노톤 아이덴티티(강한 컬러 액센트 없이 흑백+
         상품사진 위주)를 참고해 accent를 뉴트럴 블랙 계열로 바꿨다. 버튼/링크/포커스 등 전역
         UI가 이 변수 하나로 전부 갈리므로(Tier A 전역 테마) 이 한 줄만으로 두 템플릿이 시각적으로
         구분된다 — 헤더/푸터 마크업 구조 자체는 아직 SOYONE 그대로(§SoyTwo.md §7-10 참고). */
      --ml-bg: #ffffff;
      --ml-fg: #151515;
      --ml-muted: #888888;
      --ml-border: #eeeeee;
      --ml-accent: #1a1a1a;
      --ml-kakao: #fee500;
      --ml-max-width: 1440px;
      --ml-content-width: 1115px;
      --ml-font: 'Pretendard', -apple-system, BlinkMacSystemFont, system-ui, Roboto, sans-serif;
    }

    * {
      box-sizing: border-box;
      margin: 0;
      padding: 0;
    }

    /* body의 overflow-x:hidden만으론 부족함 - 캐러셀 슬라이드류(.ps-slide 등)가
       overflow:hidden인 뷰포트 안에서도 자기 레이아웃 박스 자체는 페이지 밖까지
       넘어가 있어서, 진짜 루트 스크롤 요소인 html에도 명시해야 가로 스크롤이
       실제로 막힘(실측: 모바일에서 91px 가로 스크롤이 실제로 됐었음). */
    html {
      overflow-x: hidden;
    }

    body {
      /* layout/basic/css/common.css(실제 카페24 원본 파일, 수정하지 않음)의
         body{min-width:1480px} 규칙을 명시적으로 되돌림 — 이 속성을 다시 선언
         안 하면 파일 로드 순서를 바꿔도 캐스케이드가 그 규칙을 계속 적용한다
         (같은 프로퍼티를 재선언한 나중 규칙만 이긴다). 1200~1479px 폭에서
         헤더 툴바가 화면 밖으로 잘려나가던 실제 버그의 근본 원인(실측 확인). */
      min-width: 0;
      font-family: var(--ml-font);
      background: #fff;
      color: var(--ml-fg);
      line-height: 1.6;
      -webkit-font-smoothing: antialiased;
      /* [실측 확인] overflow-x: hidden → clip 로 교체. body에 overflow-x:hidden을
         쓰면 CSS 스펙의 자동 보정 규칙(x/y 중 하나만 non-visible이면 나머지
         visible도 auto로 바뀜)에 의해 body의 overflow-y가 강제로 auto가 되어
         body 자신이 하나의 독립된 스크롤 컨테이너가 되어 버린다. 그런데 실제
         문서 스크롤은 그 바깥의 html에서 일어나므로(위 html 규칙 참고) body
         내부 스크롤 위치는 항상 0으로 고정 — position:sticky 자식 요소가
         "가장 가까운 스크롤 컨테이너"로 이 움직이지 않는 body를 잡아버려 전혀
         고정되지 않고 페이지와 함께 스크롤되어 사라지는 버그가 있었다(상단 메뉴
         고정 실측 중 발견). overflow-x: clip은 가로 넘침을 그대로 잘라내면서도
         스펙상 "스크롤 컨테이너"를 만들지 않아 sticky를 깨지 않는다(실측 확인:
         고정도 되고 가로 스크롤도 0px로 완전 차단됨) — hidden→clip 교체만으로
         두 요구사항이 동시에 해결됨. */
      overflow-x: clip;
    }

    ul,
    ol {
      list-style: none;
    }

    a {
      text-decoration: none;
      color: inherit;
      transition: 0.2s;
    }

    img {
      max-width: 100%;
      height: auto;
      display: block;
    }

    button {
      background: none;
      border: none;
      cursor: pointer;
      font-family: inherit;
    }

    .container {
      max-width: var(--ml-content-width);
      margin: 0 auto;
      padding: 0 20px;
      position: relative;
    }

    /* --- [LAYOUT] 1. Header (Isolated) --- */
    /* [2026-08-08] 재실측 정정: 벤치마크(COS, ecudemo131980.cafe24.com)의 #header는
       sticky+흰 배경 상시 고정이 아니라 **position:fixed, background:transparent 상시
       투명 오버레이**였다(실측: 홈 히어로 위뿐 아니라 흰 배경 카테고리 페이지에서도
       클래스가 동일하게 bs_bg_off, 배경은 항상 rgba(255,255,255,0)). 로고/텍스트 색만
       페이지별로 검정↔흰색 버전을 다르게 노출해 명도를 맞춘다(라이브는 페이지마다
       수동 CSS로 지정하지만, 우리는 레이아웃 하나를 전 페이지가 공유하므로 대신
       js/layout.js의 IntersectionObserver가 히어로 섹션(.ss-section 첫 번째, 홈 전용)
       노출 여부를 보고 #header에 is-on-hero를 토글 — 히어로가 없는 서브페이지는 관찰 대상
       자체가 없어 자동으로 기본(어두운 글자, 투명배경=사실상 흰 헤더처럼 보임) 상태를 유지한다.
       header가 flow 밖으로 빠지므로 #container에 헤더 높이만큼 padding-top을 주고,
       홈 히어로(.ss-container)만 그 패딩을 음수 마진으로 상쇄해 투명 헤더 밑으로
       파고들게 한다(아래 #container/.ss-container 규칙 참고). */
    :root {
      --hd-h: 96px;
    }

    /* [2026-09-06] 실측 발견(대표님 지적 "저게 뭐가 틀린지 몰라?") — 라이브 CSS 번들에
       `layout/basic/css/layout.css`(우리가 안 쓰는 줄 알았던 다른 파일, 그런데도 카페24가
       자동으로 번들에 포함시킴 — main_supply.html/detail_layout.html 등 다른 템플릿
       파일이 참조해서 번들 후보에 들어가는 것으로 추정)의 옛 `#header{background:#fff;
       position:relative;z-index:998}` 규칙이 캐스케이드에서 섞여 들어와, 우리 투명헤더
       규칙과 동일 specificity(#header 단독)라 번들 내 등장 순서에 따라 배경색이 흰색으로
       덮어써지고 있었다(히어로 위에 흰 띠가 떠 있는 것처럼 보이던 증상, 스크린샷 대조로
       발견). `!important`로 순서와 무관하게 확정. */
    /* [2026-09-06 2차 재발견 — 대표님 "틀린걸 잡아낸건 맞아?" 지적으로 스크린샷을 더 자세히
       봐서 발견] background/position만 !important로 막고 border-bottom은 안 막아서,
       라이브 CSS 번들에 섞여드는 그 옛 #header{border-bottom:1px solid #e8e8e8} 규칙이
       여전히 새어나와 히어로 위에 가느다란 회색 선이 남아 있었다(skin1은 border-bottom:0).
       원본 규칙의 전체 프로퍼티(width/margin/padding/background/position/z-index/
       box-sizing/border-bottom)를 이번엔 전부 대조해 border-bottom도 명시적으로 무력화. */
    #header {
      position: fixed !important;
      top: 0;
      left: 0;
      width: 100%;
      z-index: 1000;
      background: transparent !important;
      border-bottom: 0 !important;
      color: var(--ml-fg);
    }

    /* [2026-09-06 3차 재발견 — 대표님 지적 "메뉴: 색상, 섹션이동시 고정안됨 / 스크롤 이동시
       섹션 고정안됨"] 캐스케이드 충돌의 정체는 #header 단독 선택자 하나가 아니라 여러 개였다
       — layout/basic/css/layout.css(참조 안 하는 줄 알았는데 실제로 라이브 번들에 섞여
       들어오는 그 파일)에는 `#header.fixed{transform:translateY(-60px);border-bottom:1px
       solid #e8e8e8 !important}`도 있다. 이 "fixed" 클래스는 별개의 구형 스크립트
       (layout/basic/js/layout.js의 fixedHeader(), scrollY>header.offsetTop이면 부여)가
       계속 토글하는데, 그 스크립트 자신의 주석조차 "이 마진 보정은 죽은 전제라 필요 없다"고
       적혀 있었다 — 즉 클래스는 계속 붙는데 그걸 위한 원래 처리 로직은 이미 제거된 상태였고,
       거기에 옛 파일의 이 규칙만 남아 스크롤할 때마다 헤더가 -60px 위로 밀려 잘려 보이던 것
       ("섹션이동시/스크롤 이동시 메뉴가 고정 안 된다"). border-bottom도 이 선택자에서
       !important로 다시 살아나 색이 어긋나 보이는 원인이었다("메뉴 색상" 지적). 이 클래스
       자체를 제거하기보다(다른 기능에 영향 줄 위험) 카페24-프레임워크 G100/G102가 확정한
       패턴대로 해당 선택자의 모든 프로퍼티를 명시적으로 무력화한다. */
    #header.fixed {
      transform: none !important;
      border-bottom: 0 !important;
    }

    /* [2026-08-09, 전달.md] "메뉴쪽도 안보이는데 최상단 그라데이션 적용해" — 로고/메뉴가
       흰 글자로 바뀌는 구간(어두운/사진 배경 섹션 위, js/layout.js watchHeroSection)에만
       상단에 옅은 검정 그라데이션을 깔아 배경이 밝아도(예: 잔디+흰 꽃) 대비를 보장한다.
       흰 배경 섹션(프로덕트탭/후기 등)에서는 is-on-hero가 안 붙으므로 기존처럼 그라데이션
       없이 어두운 글자 그대로 — 디자인을 해치지 않는다. */
    #header::before {
      content: "";
      position: absolute;
      inset: 0 0 auto 0;
      height: 160px;
      background: linear-gradient(180deg, rgba(0, 0, 0, 0.45), rgba(0, 0, 0, 0));
      z-index: -1;
      opacity: 0;
      transition: opacity 0.3s ease;
      pointer-events: none;
    }

    #header.is-on-hero {
      color: #fff;
    }

    #header.is-on-hero::before {
      opacity: 1;
    }

    /* [2026-08-10] 다크 섹션이 없는 서브페이지(js/layout.js watchHeroSection) — 투명
       헤더가 서브페이지 상단 콘텐츠(카테고리 배너 이미지 등)와 부딪히지 않도록 명시적
       흰 배경으로 고정한다. */
    #header.is-subpage,
    #header.is-subpage #main-layout-header-root {
      background: #fff !important;
      color: #151515;
    }

    /* [2026-08-11, 전달.md] "상단 흰색에 살짝 그림자 효과로 가시성확보" — 기존 1px
       헤어라인은 사실상 안 보여 살짝 퍼지는 그림자로 강화(js/layout.js에서 홈 스크롤 시에도
       이 클래스를 재사용하므로 서브페이지·홈 스크롤 둘 다 적용됨). */
    #header.is-subpage {
      box-shadow: 0 2px 10px rgba(0, 0, 0, 0.08);
    }

    #main-layout-header-root {
      width: 100%;
      background: transparent;
    }

    #container {
      padding-top: var(--hd-h);
    }

    /* [2026-08-08] 재실측 정정: 실제 벤치마크(COS)의 띠배너는 마진을 준 독립 플로팅
       캡슐이 아니라, #header 상단 정중앙에 **absolute로 붙어(top:0) 아래쪽 모서리만
       둥근 반투명 유리 탭**이었다(실측: rgba(255,255,255,0.2), border-radius
       "0 0 22px 22px", 헤더 행 위에 겹쳐 얹힌다). color:inherit로 #header의
       is-on-hero 상태(흰/검정 글자)를 그대로 물려받는다 — 홈 히어로 위에서는 흰
       글자, 흰 배경 서브페이지에서는 어두운 글자로 자동 전환. height:40px·
       overflow:hidden·align-items:flex-start는 tb-track 롤링(js/layout.js
       startTopbannerRolling, translateY(-tIdx*40px))이 그대로 의존하므로 유지. */
    .main-layout-topbanner {
      position: absolute;
      top: 0;
      left: 50%;
      z-index: 5;
      transform: translateX(-50%);
      background: rgba(255, 255, 255, 0.16);
      backdrop-filter: blur(6px);
      color: inherit;
      height: 40px;
      width: fit-content;
      max-width: calc(100vw - 40px);
      border-radius: 0 0 18px 18px;
      padding: 0 46px 0 22px;
      display: flex;
      align-items: flex-start;
      justify-content: center;
      font-size: 13px;
      font-weight: 500;
      letter-spacing: -0.02em;
      overflow: hidden;
    }

    .tb-close {
      position: absolute;
      right: 14px;
      top: 50%;
      transform: translateY(-50%);
      background: none;
      border: none;
      color: inherit;
      font-size: 17px;
      line-height: 1;
      opacity: 0.65;
      cursor: pointer;
    }

    .tb-close:hover {
      opacity: 1;
    }

    /* [2026-08-02] 공지사항 최신 5개 세로 롤링 — js/layout.js의 startTopbannerRolling()이
       아이템 높이(40px)만큼 translateY로 한 칸씩 밀어 올린다. */
    .tb-track {
      display: flex;
      flex-direction: column;
      transition: transform 0.6s cubic-bezier(0.65, 0, 0.35, 1);
    }

    .tb-item {
      height: 40px;
      list-style: none;
      display: flex;
      align-items: center;
      justify-content: center;
    }

    .tb-item a {
      color: inherit;
      text-decoration: none;
      white-space: nowrap;
      overflow: hidden;
      text-overflow: ellipsis;
      /* [2026-08-07] 시각 리디자인: 캡슐 배지가 메시지 길이에 상관없이 컴팩트한
         폭을 유지하도록 90vw → 고정 상한으로 축소(벤치마크 COS 알림 배지 참고). */
      max-width: min(90vw, 320px);
    }

    /* [2026-08-08] 재실측 정정: 상시 투명 오버레이로 바뀌며 흰 배경/보더/스크롤 축소
       애니메이션(is-stuck)을 전부 제거 — 벤치마크는 스크롤해도 헤더가 줄어들지 않고
       항상 같은 크기로 떠 있다(실측 확인, height 120px 고정). */
    .main-layout-header-main {
      height: var(--hd-h);
      display: flex;
      align-items: center;
      background: transparent;
    }

    /* [2026-08-07] 시각 리디자인: 로고 중앙정렬 + GNB 별도 행(2행 구조) → 벤치마크(COS)처럼
       로고+GNB가 좌측에 붙고 아이콘 묶음이 우측에 붙는 단일 행(flex) 구조로 전환.
       모바일(1024px 이하)에서는 media query가 display:grid로 되돌려 기존
       grid-column 기반 배치(햄버거/로고/검색)를 그대로 재사용한다 — 그 로직은
       손대지 않았다. */
    .main-layout-header-container {
      max-width: var(--ml-max-width);
      margin: 0 auto;
      padding: 0 24px;
      width: 100%;
      display: flex;
      align-items: center;
      gap: 24px;
      min-width: 0;
    }

    .main-layout-brand-group {
      display: flex;
      align-items: center;
      gap: 36px;
      min-width: 0;
      flex: 1 1 auto;
    }

    .main-layout-header-left {
      display: flex;
      align-items: center;
      gap: 20px;
      min-width: 0;
      /* 아이콘 묶음(검색+툴바)을 우측으로 고정 — brand-group은 줄어들 수 있어도
         이 묶음과 그 뒤 toolbar는 원래 크기를 유지한다(COS 우측 아이콘 클러스터 참고). */
      margin-left: auto;
      flex-shrink: 0;
    }

    .main-layout-search-trigger {
      position: relative;
      cursor: pointer;
      display: flex;
      align-items: center;
      color: inherit;
    }

    /* 실제 터치 히트영역을 44x44로 확대(아이콘 시각크기·레이아웃은 그대로 유지).
       모바일 실측 결과 원래 24x24는 손가락 터치 기준(최소 44x44)에 못 미쳤다. */
    .main-layout-search-trigger::before {
      content: '';
      position: absolute;
      top: 50%;
      left: 50%;
      width: 44px;
      height: 44px;
      transform: translate(-50%, -50%);
    }

    .main-layout-search-trigger svg {
      width: 24px;
      height: 24px;
    }

    .main-layout-search-rolling {
      height: 20px;
      overflow: hidden;
      width: 150px;
      position: relative;
    }

    .main-layout-rolling-wrap {
      transition: transform 0.4s cubic-bezier(0.65, 0, 0.35, 1);
    }

    .main-layout-rolling-item {
      height: 20px;
      font-size: 13px;
      font-weight: 700;
      color: var(--ml-fg);
      display: flex;
      align-items: center;
      gap: 8px;
    }

    .main-layout-rolling-item em {
      font-style: normal;
      color: var(--ml-accent);
      font-size: 11px;
    }

    .main-layout-logo {
      text-align: left;
      flex-shrink: 0;
    }

    .main-layout-logo a {
      font-size: 26px;
      font-weight: 900;
      letter-spacing: 0.2em;
      text-transform: uppercase;
      color: inherit;
    }

    /* [2026-09-06] 대표님 지적 "메뉴 흰색으로" — 로고(.main-layout-logo a)만 color:inherit이
       명시돼 있고 GNB(브랜드/스토어/갤러리/커뮤니티)·툴바(login/join/cart)의 <a>는 이 규칙이
       없어 카페24 네이티브 common.css의 전역 `a{color:var(--font-color-base)}`(#000)가 그대로
       이겼다 — #header.is-on-hero가 흰색을 줘도 <li>까지만 상속되고 <a> 자체엔 안 먹힘.
       layout.css에 있던 범용 `a{color:inherit}`로 커버되는 줄 알았으나 홈 페이지 번들엔 그
       규칙 자체가 안 실려 있었다(G95/G99와 동일 계열, layout.html 경유 참조). 로고와 동일하게
       명시. */
    .main-layout-gnb a,
    .main-layout-toolbar a {
      color: inherit;
    }

    .main-layout-toolbar {
      display: flex;
      justify-content: flex-end;
      align-items: center;
      min-width: 0;
      flex-shrink: 0;
      gap: 22px;
    }

    /* [2026-08-08] 재실측 정정: 벤치마크 실제 마크업은 "LOGIN"이 아니라 소문자
       "login / join"이었다 — 대문자 볼드가 아니라 가벼운 소문자 텍스트. */
    .main-layout-toolbar-item {
      cursor: pointer;
      display: flex;
      align-items: center;
      position: relative;
      font-size: 13px;
      font-weight: 500;
      text-transform: lowercase;
      color: inherit;
    }

    .main-layout-toolbar-item svg {
      width: 24px;
      height: 24px;
      stroke-width: 1.5px;
      color: inherit;
    }

    .main-layout-cart-count {
      position: absolute;
      top: -6px;
      right: -10px;
      background: var(--ml-fg);
      color: #fff;
      font-size: 10px;
      font-weight: 800;
      min-width: 18px;
      height: 18px;
      border-radius: 50%;
      display: flex;
      align-items: center;
      justify-content: center;
    }

    /* [2026-08-07] 시각 리디자인: 구 header-bottom(54px 별도 행)은 main-layout-header-main으로
       합쳐지며 제거됨 — 카테고리 토글은 이제 우측 아이콘 묶음(.main-layout-toolbar) 안의
       평범한 flex 아이템이라 더 이상 absolute 배치가 필요 없다. 트리거 로직(js/layout.js
       megaToggle/megaMenu)은 손대지 않았다. */
    .main-layout-category-toggle {
      width: 22px;
      height: 14px;
      display: flex;
      flex-direction: column;
      justify-content: space-between;
      cursor: pointer;
    }

    .main-layout-category-toggle span {
      display: block;
      width: 100%;
      height: 1.5px;
      background: currentColor;
      transition: 0.3s;
    }

    .main-layout-category-toggle.is-active span:nth-child(1) {
      transform: translateY(6.25px) rotate(45deg);
    }

    .main-layout-category-toggle.is-active span:nth-child(2) {
      opacity: 0;
    }

    .main-layout-category-toggle.is-active span:nth-child(3) {
      transform: translateY(-6.25px) rotate(-45deg);
    }

    .main-layout-gnb {
      display: flex;
      /* [텍스트 오버플로우 방지] GNB 항목은 어드민에서 이름을 자유롭게 바꿀 수
         있다(§2-3). flex 기본값(nowrap)에서 항목이 길어지거나 개수가 늘면
         메뉴줄이 조용히 옆으로 넘쳐버릴 수 있어, 넘칠 경우 다음 줄로
         자연스럽게 줄바꿈되게 한다(가로 넘침보다 안전). */
      flex-wrap: wrap;
      /* [2026-08-07] 시각 리디자인: 로고 옆 좌측정렬 배치로 전환되며 center → flex-start,
         로고와 더 밀착되도록 gap도 40px → 30px로 축소(벤치마크 COS 참고). */
      justify-content: flex-start;
      row-gap: 8px;
      gap: 30px;
    }

    .main-layout-gnb li {
      position: relative;
      font-size: 14px;
      font-weight: 700;
      color: inherit;
      cursor: pointer;
      white-space: nowrap;
    }

    /* [2026-08-10] li 전체가 아니라 직계 링크에만 걸어야 한다 — li 전체에 opacity를
       걸면 그 안의 드롭다운(.main-layout-gnb-dropdown)까지 같이 반투명해진다(opacity는
       자식이 값을 덮어써도 상쇄 안 되는 합성 속성이라 자식 규칙으로 못 되돌림). */
    .main-layout-gnb li:hover > a {
      opacity: 0.6;
    }

    /* [2026-08-10] 벤치마크(ecudemo131980.cafe24.com) 실측 그대로 — 항목별 하위메뉴는
       그 li 자신이 품고 있다가 li:hover에만 순수 CSS로 열린다(JS 불필요, 실제 사이트도
       동일 패턴 `li:hover .bs_wrap { opacity:1; visibility:visible; }`). */
    .main-layout-gnb-dropdown {
      position: absolute;
      top: 100%;
      left: 0;
      margin-top: 14px;
      min-width: 160px;
      background: #fff;
      border-radius: 4px;
      box-shadow: 0 12px 30px rgba(0, 0, 0, 0.12);
      padding: 18px 20px;
      opacity: 0;
      visibility: hidden;
      transition: opacity 0.2s ease, visibility 0.2s ease;
      z-index: 1001;
    }

    .main-layout-gnb li:hover .main-layout-gnb-dropdown {
      opacity: 1;
      visibility: visible;
    }

    .main-layout-gnb-dropdown li {
      font-size: 13px;
      font-weight: 500;
      color: #666;
      padding: 6px 0;
      opacity: 1;
    }

    .main-layout-gnb-dropdown li a {
      color: inherit;
    }

    .main-layout-gnb-dropdown li:hover {
      opacity: 1;
      color: #000;
      font-weight: 700;
    }

    /* 모바일 전용 햄버거 (header-container 직계 자식, PC에서는 기본 숨김) */
    .main-layout-hamburger {
      position: relative;
      display: none;
      width: 22px;
      height: 14px;
      padding: 0;
      border: 0;
      background: none;
      flex-direction: column;
      justify-content: space-between;
      cursor: pointer;
    }

    /* 실제 터치 히트영역을 44x44로 확대(아이콘 시각크기 22x14·그리드 레이아웃은 그대로 유지).
       모바일 실측 결과 원래 22x14는 유일한 로그인/장바구니/전체메뉴 진입 경로인데
       손가락 터치 기준(최소 44x44)에 크게 못 미쳐 "안 눌린다"고 느껴졌다. */
    .main-layout-hamburger::before {
      content: '';
      position: absolute;
      top: 50%;
      left: 50%;
      width: 44px;
      height: 44px;
      transform: translate(-50%, -50%);
    }

    .main-layout-hamburger span {
      display: block;
      width: 100%;
      height: 1.5px;
      background: currentColor;
      transition: 0.3s;
    }

    .main-layout-hamburger.is-active span:nth-child(1) {
      transform: translateY(6.25px) rotate(45deg);
    }

    .main-layout-hamburger.is-active span:nth-child(2) {
      opacity: 0;
    }

    .main-layout-hamburger.is-active span:nth-child(3) {
      transform: translateY(-6.25px) rotate(-45deg);
    }

    /* --- [LAYOUT] Search Layer --- */
    #main-layout-search-root {
      position: fixed;
      inset: 0;
      background: rgba(255, 255, 255, 0.98);
      z-index: 2000;
      visibility: hidden;
      opacity: 0;
      transition: all 0.4s cubic-bezier(0.165, 0.84, 0.44, 1);
      display: flex;
      flex-direction: column;
      align-items: center;
      padding-top: 80px;
      backdrop-filter: blur(20px);
    }

    #main-layout-search-root.is-active {
      visibility: visible;
      opacity: 1;
    }

    .main-layout-search-close {
      position: absolute;
      top: 40px;
      right: 40px;
      font-size: 40px;
      cursor: pointer;
      color: var(--ml-fg);
      background: none;
      border: none;
      font-weight: 200;
    }

    .main-layout-search-form {
      width: 100%;
      max-width: 800px;
      border-bottom: 2px solid var(--ml-fg);
      padding: 10px 0;
      margin-bottom: 60px;
      display: flex;
      align-items: center;
    }

    .main-layout-search-form input {
      flex: 1;
      min-width: 0;
      border: none;
      font-size: 32px;
      font-weight: 700;
      outline: none;
      background: transparent;
      color: var(--ml-fg);
    }

    .main-layout-search-form input::placeholder {
      color: #ccc;
    }

    .main-layout-search-form svg {
      color: var(--ml-fg);
    }

    /* [2026-07-29] 검색 제출 버튼 — 실제 제출 가능한 <button type="submit">으로
       바뀌면서 브라우저 기본 버튼 스타일(테두리/배경/패딩)이 붙는 걸 리셋해
       기존 장식용 svg 하나만 있던 시절과 시각적으로 동일하게 유지한다. */
    .main-layout-search-form button {
      display: flex;
      align-items: center;
      background: none;
      border: none;
      padding: 0;
      cursor: pointer;
      flex-shrink: 0;
    }

    .main-layout-search-suggestions {
      width: 100%;
      max-width: 800px;
      display: grid;
      grid-template-columns: 1fr 1fr;
      gap: 80px;
    }

    .main-layout-search-suggestions h4 {
      font-size: 16px;
      font-weight: 800;
      margin-bottom: 25px;
      color: var(--ml-fg);
      letter-spacing: 0.05em;
    }

    .main-layout-search-suggestions p {
      font-size: 14px;
      color: var(--ml-muted);
    }

    .main-layout-search-suggestions ol {
      font-weight: 700;
      line-height: 2.5;
      font-size: 15px;
      color: var(--ml-fg);
    }

    /* [2026-08-10] 최근/인기 검색어를 실제 <a> 링크로 전환하며 기본 파란 밑줄 링크
       스타일이 그대로 노출되지 않도록 텍스트와 동일하게 리셋. */
    .main-layout-search-suggestions ol a {
      color: inherit;
      text-decoration: none;
    }

    .main-layout-search-suggestions ol a:hover {
      text-decoration: underline;
    }

    /* Mega Menu Layer */
    #main-layout-mega-root {
      position: absolute;
      top: 100%;
      left: 0;
      width: 100%;
      background: #fff;
      border-bottom: 1px solid var(--ml-border);
      z-index: 999;
      visibility: hidden;
      opacity: 0;
      transform: translateY(-10px);
      transition: all 0.4s cubic-bezier(0.165, 0.84, 0.44, 1);
      padding: 60px 0;
      box-shadow: 0 30px 60px rgba(0, 0, 0, 0.08);
    }

    #main-layout-mega-root.is-active {
      visibility: visible;
      opacity: 1;
      transform: translateY(0);
    }

    /* [2026-08-10] "이달의 신제품이 덩그러니 하단에 자기혼자" — 이 grid는 SOYONE(3개
       nav 컬럼+배너=4개 아이템, 4열 그리드에 정확히 맞물림)에서 그대로 가져온 값인데,
       SoyTwo는 nav 컬럼이 4개(브랜드/스토어/갤러리/커뮤니티)라 배너까지 합치면 5개
       아이템이 된다 — 4열 grid에 5번째 아이템이 auto-flow로 다음 줄 1번째 칸에 혼자
       떨어져 나머지 3칸이 빈 채로 보였던 게 근본원인. 5열로 늘리고 배너를 명시적으로
       5번째 칸에 고정 배치해 한 줄에 나란히 놓이게 한다. */
    .main-layout-mega-container {
      max-width: var(--ml-content-width);
      margin: 0 auto;
      padding: 0 20px;
      display: grid;
      grid-template-columns: 1fr 1.5fr 1fr 1fr 1.6fr;
      gap: 60px;
    }

    .main-layout-mega-banner {
      grid-column: 5;
      grid-row: 1;
    }

    .main-layout-mega-col h4 {
      font-size: 16px;
      font-weight: 800;
      margin-bottom: 24px;
    }

    .main-layout-mega-list li {
      font-size: 14px;
      color: #666;
      margin-bottom: 14px;
      cursor: pointer;
      transition: 0.2s;
    }

    .main-layout-mega-list li:hover {
      color: #000;
      font-weight: 700;
      transform: translateX(5px);
    }

    .main-layout-mega-banner {
      background: var(--ml-accent);
      color: #fff;
      padding: 50px;
      text-align: center;
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
    }

    /* [2026-08-10] 5열 그리드(nav 4개+배너)라 SOYONE(4열, nav 3개+배너) 대비 이 칸이
       더 좁다 — 원본 padding/font-size 그대로면 "이달의 신제품" 제목이 3줄로 쪼개져
       보였다. 칸 폭에 맞춰 여백·글자크기만 축소(SOYONE 파일은 별도 CSS라 무영향). */
    .main-layout-mega-banner {
      padding: 32px 20px;
    }

    .main-layout-mega-banner h2 {
      font-size: 24px;
    }

    .main-layout-mega-banner .badge {
      background: #fff;
      color: #000;
      padding: 4px 15px;
      border-radius: 20px;
      font-size: 12px;
      font-weight: 800;
      margin-bottom: 20px;
    }

    .main-layout-mega-banner h2 {
      font-size: 32px;
      font-weight: 900;
      margin-bottom: 10px;
    }

    /* --- [COMPONENT] 2. Hero Carousel (mc-) --- */
    #od-main-carousel {
      position: relative;
      width: 100%;
      height: 85vh;
      min-height: 700px;
      overflow: hidden;
      background: #f9f9f9;
    }

    .mc-track {
      display: flex;
      width: 100%;
      height: 100%;
      transition: transform 0.8s cubic-bezier(0.65, 0, 0.35, 1);
    }

    .mc-item {
      flex: 0 0 100%;
      height: 100%;
      position: relative;
      overflow: hidden;
    }

    .mc-media {
      position: absolute;
      inset: 0;
      z-index: 1;
    }

    .mc-media img,
    .mc-media video,
    .mc-media iframe {
      width: 100%;
      height: 100%;
      object-fit: cover;
      border: none;
    }

    .mc-overlay {
      position: absolute;
      inset: 0;
      background: rgba(0, 0, 0, 0.15);
      z-index: 2;
    }

    .mc-content {
      position: relative;
      z-index: 3;
      height: 100%;
      display: flex;
      align-items: center;
    }

    .mc-text-box {
      max-width: 700px;
      color: #fff;
      opacity: 0;
      transform: translateY(50px);
      transition: all 0.8s cubic-bezier(0.16, 1, 0.3, 1);
    }

    .mc-item.is-active .mc-text-box {
      opacity: 1;
      transform: translateY(0);
    }

    .mc-title {
      font-size: clamp(48px, 7vw, 90px);
      font-weight: 900;
      line-height: 1.05;
      margin-bottom: 24px;
      text-transform: uppercase;
    }

    .mc-btn {
      display: inline-block;
      padding: 18px 50px;
      border: 1px solid #fff;
      color: #fff;
      font-weight: 800;
      font-size: 14px;
    }

    /* [2026-08-11, 전달.md] "배너... 모바일에서 기본 마우스 오버상태 해제" — 아래 화살표/
       페이지네이션/버튼이 전부 순수 :hover로만 노출·색반전됐는데, 모바일은 탭해도 hover가
       안 풀려(sticky hover) 눌렀다 하면 흰 배경으로 뒤집힌 채 고정되던 원인이었다.
       css/home-sections.css의 .st-slide-arrow에 이미 쓰인 패턴(hover 가능한 포인터
       환경에서만 opacity:0→hover 시 노출로 전환, 터치 기기는 항상 노출)을 그대로 적용한다. */
    @media (hover: hover) and (pointer: fine) {
      .mc-btn:hover {
        background: #fff;
        color: #000;
      }
    }

    .mc-arrow {
      position: absolute;
      top: 50%;
      transform: translateY(-50%);
      width: 70px;
      height: 70px;
      background: rgba(255, 255, 255, 0.1);
      backdrop-filter: blur(10px);
      color: #fff;
      display: flex;
      align-items: center;
      justify-content: center;
      cursor: pointer;
      z-index: 10;
      opacity: 0.7;
      transition: 0.4s;
      border: none;
    }

    .mc-arrow--prev {
      left: 0;
    }

    .mc-arrow--next {
      right: 0;
    }

    .mc-pagination {
      position: absolute;
      bottom: 60px;
      right: 50px;
      z-index: 10;
      display: flex;
      align-items: center;
      gap: 30px;
      color: #fff;
      opacity: 1;
      transition: 0.4s;
    }

    @media (hover: hover) and (pointer: fine) {
      .mc-arrow {
        opacity: 0;
      }

      #od-main-carousel:hover .mc-arrow {
        opacity: 1;
      }

      .mc-arrow:hover {
        background: #fff;
        color: #000;
      }

      #od-main-carousel:hover .mc-arrow--prev {
        left: 40px;
      }

      #od-main-carousel:hover .mc-arrow--next {
        right: 40px;
      }

      .mc-pagination {
        opacity: 0;
      }

      #od-main-carousel:hover .mc-pagination {
        opacity: 1;
      }
    }

    .mc-counter {
      font-size: 14px;
      font-weight: 800;
      display: flex;
      align-items: center;
      gap: 10px;
    }

    .mc-counter .current {
      font-size: 28px;
    }

    .mc-progress {
      width: 150px;
      height: 2px;
      background: rgba(255, 255, 255, 0.2);
      position: relative;
    }

    .mc-progress-bar {
      position: absolute;
      left: 0;
      top: 0;
      height: 100%;
      background: #fff;
      width: 0%;
    }

    .mc-play-toggle {
      background: none;
      border: none;
      color: #fff;
      cursor: pointer;
      display: flex;
      align-items: center;
    }

    /* --- [COMPONENT] 3. Quick Icons (qi-) --- */
    #od-quick-icons {
      padding: 80px 0 60px;
      background: #fff;
    }

    .qi-list {
      display: grid;
      grid-template-columns: repeat(8, 1fr);
      gap: 15px;
      text-align: center;
    }

    .qi-item {
      display: flex;
      flex-direction: column;
      align-items: center;
      gap: 12px;
      cursor: pointer;
      transition: 0.3s;
    }

    .qi-item:hover {
      transform: translateY(-5px);
    }

    .qi-icon {
      width: 85px;
      height: 85px;
      border-radius: 50%;
      background: #f8f9fa;
      display: flex;
      align-items: center;
      justify-content: center;
      overflow: hidden;
      transition: 0.3s;
    }

    .qi-icon img {
      width: 50px;
      height: 50px;
      object-fit: contain;
    }

    .qi-label {
      font-size: 13px;
      font-weight: 700;
      color: var(--ml-fg);
    }

    /* --- [COMPONENT] 10. Product Review (pr-) --- */
    #od-product-review {
      padding: 100px 0;
      background: #f5f5f5;
      overflow: hidden;
    }

    .pr-title-area {
      margin-bottom: 50px;
      text-align: center;
    }

    .pr-title-area h2 {
      font-size: 32px;
      font-weight: 900;
      letter-spacing: -0.02em;
    }

    .pr-viewport-container {
      position: relative;
      max-width: 1200px;
      margin: 0 auto;
      padding: 0 20px;
    }

    .pr-swiper {
      padding-bottom: 50px;
    }

    .pr-swiper .swiper-slide {
      width: calc(25% - 15px);
    }

    .pr-item {
      display: flex;
      flex-direction: column;
      background: #fff;
      border-radius: 12px;
      overflow: hidden;
      height: 100%;
      transition: transform 0.3s;
      box-shadow: 0 4px 15px rgba(0, 0, 0, 0.03);
    }

    .pr-item:hover {
      transform: translateY(-8px);
      box-shadow: 0 8px 25px rgba(0, 0, 0, 0.06);
    }

    .pr-img-wrap {
      position: relative;
      width: 100%;
      aspect-ratio: 1/1.2;
      background-size: cover;
      background-position: center;
      overflow: hidden;
    }

    .pr-img-wrap::before {
      content: '';
      position: absolute;
      inset: 0;
      background: rgba(0, 0, 0, 0.02);
      transition: 0.3s;
    }

    .pr-item:hover .pr-img-wrap::before {
      background: rgba(0, 0, 0, 0);
    }

    .pr-prd-thumb {
      position: absolute;
      bottom: 15px;
      right: 15px;
      width: 64px;
      height: 64px;
      background: #fff;
      border-radius: 8px;
      padding: 4px;
      border: 1px solid var(--ml-border);
      z-index: 2;
      overflow: hidden;
    }

    .pr-prd-thumb img {
      width: 100%;
      height: 100%;
      object-fit: contain;
    }

    .pr-info {
      padding: 25px 20px;
      flex-grow: 1;
      display: flex;
      flex-direction: column;
    }

    .pr-title {
      font-size: 16px;
      font-weight: 800;
      color: #111;
      margin-bottom: 10px;
      display: block;
      white-space: nowrap;
      overflow: hidden;
      text-overflow: ellipsis;
    }

    .pr-content {
      font-size: 14px;
      color: #555;
      line-height: 1.5;
      margin-bottom: 20px;
      height: 42px;
      overflow: hidden;
      display: -webkit-box;
      -webkit-line-clamp: 2;
      -webkit-box-orient: vertical;
      flex-grow: 1;
    }

    .pr-meta {
      display: flex;
      align-items: center;
      justify-content: space-between;
      font-size: 13px;
      border-top: 1px solid var(--ml-border);
      padding-top: 15px;
    }

    .pr-author {
      font-weight: 600;
      color: #333;
    }

    .pr-grade {
      color: var(--ml-accent);
      font-weight: 800;
      font-size: 14px;
      letter-spacing: 2px;
    }

    .pr-btn-wrap {
      text-align: center;
      margin-top: 20px;
    }

    .pr-btn-more {
      display: inline-flex;
      align-items: center;
      justify-content: center;
      height: 44px;
      padding: 0 30px;
      border: 1px solid var(--ml-border);
      background: #fff;
      border-radius: 22px;
      font-size: 14px;
      font-weight: 700;
      color: #111;
      transition: 0.3s;
    }

    .pr-btn-more:hover {
      background: #111;
      color: #fff;
      border-color: #111;
    }

    .pr-scrollbar {
      position: absolute;
      bottom: 0;
      left: 50%;
      transform: translateX(-50%);
      width: 200px;
      height: 4px;
      background: #e0e0e0;
      border-radius: 2px;
      z-index: 10;
    }

    .pr-swiper .swiper-scrollbar-drag {
      background: #111;
      border-radius: 2px;
    }

    .pr-arrow-wrapper {
      position: absolute;
      top: 50%;
      left: 20px;
      right: 20px;
      transform: translateY(-50%);
      display: flex;
      justify-content: space-between;
      pointer-events: none;
      z-index: 10;
    }

    .pr-arrow {
      width: 50px;
      height: 50px;
      background: #fff;
      border: 1px solid var(--ml-border);
      border-radius: 50%;
      display: flex;
      align-items: center;
      justify-content: center;
      cursor: pointer;
      pointer-events: auto;
      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06);
      transition: 0.3s;
      opacity: 0;
    }

    #od-product-review:hover .pr-arrow {
      opacity: 1;
    }

    .pr-arrow:hover {
      background: #111;
      color: #fff;
      border-color: #111;
    }

    @media (max-width: 1024px) {
      .pr-swiper .swiper-slide {
        width: calc(50% - 10px);
      }

      .pr-arrow-wrapper {
        display: flex;
      }
    }

    @media (max-width: 768px) {
      .pr-swiper .swiper-slide {
        width: calc(100% - 20px);
      }
    }

    /* --- [LAYOUT] Footer & Quick (Refined) --- */
    #main-layout-quick-root {
      position: fixed;
      right: 24px;
      bottom: 24px;
      top: auto;
      transform: none;
      /* [2026-07-29] 메인 팝업(z-index:9999, css/main-popup.css)이 열려있는 동안
         퀵메뉴가 그 밑에 깔려 클릭 자체가 안 먹었다(실측: 사용자 지적 "즐겨찾기/
         맨아래로가기 링크... 안되"). 팝업보다 위로 올려 팝업이 떠 있어도 항상
         눌리게 한다. */
      z-index: 10000;
      display: flex;
      flex-direction: column;
      /* [2026-08-05] gap(컨테이너가 모든 형제 사이에 균일 삽입)이었던 걸 아이템별
         margin-bottom으로 바꿨다 — DOWN이 사라질 때 그 자리의 gap까지 개별적으로
         0으로 접어야 TOP이 그 공백 없이 위로 붙는데, gap은 특정 아이템 하나만
         상쇄할 수 없기 때문(아래 .down-btn.is-hidden 참고). */
    }

    .main-layout-quick-item {
      width: 56px;
      height: 56px;
      margin-bottom: 10px;
      /* [2026-08-09] 원형 → 사각형(사용자 지시). RECENT/TALK/문의 삭제로 DOWN/TOP
         화살표 2개만 남아 완전한 정사각형 대신 살짝 둥근 모서리로 처리. */
      border-radius: 8px;
      background: #fff;
      border: 1px solid var(--ml-border);
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      cursor: pointer;
      font-size: 9px;
      font-weight: 800;
      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);
      transition: 0.2s;
    }

    .main-layout-quick-item:hover {
      transform: translateY(-2px);
    }

    .main-layout-quick-item svg {
      width: 20px;
      height: 20px;
      margin-bottom: 3px;
    }

    .main-layout-quick-item.scroll-btn {
      background: rgba(255, 255, 255, 0.85);
      backdrop-filter: blur(4px);
      color: #333;
      border-color: rgba(0, 0, 0, 0.06);
    }

    /* [2026-08-05→2026-08-09, 여러 차례 재지시 끝에 최종 확정] TOP/DOWN 각각 별도 버튼 2개
       (히스토리는 layout.html 주석 참고). 마지막 재지시: "최상단엔 상단 화살표, 최하단엔 하단
       화살표가 안 보여야지" — 이동할 곳이 없는 극단에서만 해당 버튼을 숨긴다(js/layout.js의
       updateScrollButtonVisibility가 .is-hidden을 토글). */
    .main-layout-quick-item.top-btn,
    .main-layout-quick-item.down-btn {
      opacity: 1;
      pointer-events: auto;
      transition: opacity 0.25s ease, transform 0.25s ease;
    }
    .main-layout-quick-item.top-btn.is-hidden,
    .main-layout-quick-item.down-btn.is-hidden {
      opacity: 0;
      pointer-events: none;
      transform: translateY(8px);
    }

    @media (max-width: 1024px) {
      #main-layout-quick-root {
        right: 14px;
        bottom: 16px;
      }

      .main-layout-quick-item {
        width: 46px;
        height: 46px;
      }
    }

    /* [2026-08-09, 전달.md] "하단 푸터 soyone거 그대로 적용해" — 2026-08-07 시각
       리디자인(2열+SNS 아이콘)을 되돌리고 SOYONE(skins/01) 원본 3열 구조를 그대로 이식.
       클래스명은 동일(footer__col-left/right, footer__sns 등)만 사라지고 footer__company가
       다시 top-inner의 3번째 그리드 아이템으로 복귀. */
    #footer,
    #main-layout-footer-root {
      border-top: 1px solid var(--ml-border);
      padding: 100px 0 60px;
      background: #fff;
      color: #151515;
    }

    .footer__top-inner {
      display: grid;
      grid-template-columns: 1.5fr 1.2fr 1fr;
      gap: 60px;
      padding-bottom: 80px;
      border-bottom: 1px solid var(--ml-border);
    }

    .footer__title {
      font-size: 16px;
      font-weight: 800;
      margin-bottom: 25px;
      letter-spacing: 0.05em;
      text-transform: uppercase;
    }

    .footer__cs-tel {
      font-size: 34px;
      font-weight: 900;
      color: #000;
      display: block;
      margin-bottom: 15px;
      letter-spacing: -0.02em;
    }

    .footer__cs-time {
      font-size: 14px;
      color: var(--ml-muted);
      line-height: 1.8;
      display: block;
    }

    .footer__cs-payment {
      display: inline-block;
      margin-top: 20px;
      font-size: 13px;
      color: var(--ml-muted);
      cursor: pointer;
      border: 1px solid var(--ml-border);
      padding: 8px 16px;
      border-radius: 20px;
      transition: 0.3s;
    }

    .footer__cs-payment:hover {
      background: #f9f9f9;
      color: #000;
    }

    .footer__legal {
      display: flex;
      flex-direction: column;
      gap: 14px;
    }

    .footer__legal-link {
      font-size: 14px;
      color: #666;
      transition: 0.3s;
    }

    .footer__legal-link:hover {
      color: #000;
      transform: translateX(5px);
    }

    .footer__legal-link--privacy {
      font-weight: 800;
      color: #000;
    }

    .footer__company {
      text-align: left;
    }

    .footer__logo {
      margin-bottom: 35px;
    }

    .footer__logo-item {
      font-size: 32px;
      font-weight: 900;
      letter-spacing: 0.3em;
      color: #000;
    }

    .footer__info-wrap {
      font-size: 13px;
      color: var(--ml-muted);
      line-height: 2;
      display: flex;
      flex-direction: column;
      gap: 8px;
    }

    .footer__info {
      display: flex;
      justify-content: flex-start;
      flex-wrap: wrap;
      gap: 15px;
    }

    .footer__info a {
      color: inherit;
    }

    .footer__info a:hover {
      color: #000;
      text-decoration: underline;
    }

    .footer__bottom-inner {
      padding-top: 40px;
      display: flex;
      justify-content: space-between;
      align-items: center;
    }

    .footer__copyright {
      font-size: 13px;
      color: #999;
    }

    .footer__copyright-name {
      color: #666;
      font-weight: 700;
    }

    .footer__support {
      display: flex;
      align-items: center;
      gap: 8px;
    }

    .footer__badge {
      display: inline-flex;
      align-items: center;
      justify-content: center;
      height: 28px;
      padding: 0 16px;
      border-radius: 999px;
      background: #eeeeee;
      color: #888;
      font-size: 11px;
      font-weight: 700;
      letter-spacing: 0.02em;
      white-space: nowrap;
      transition: 0.2s;
    }

    .footer__badge:hover {
      background: #111;
      color: #fff;
    }

    @media (max-width: 1024px) {
      .footer__top-inner {
        grid-template-columns: 1fr 1fr;
      }

      .footer__company {
        grid-column: span 2;
        text-align: left;
      }

      .footer__info {
        justify-content: flex-start;
      }
    }

    @media (max-width: 768px) {
      .footer__top-inner {
        grid-template-columns: 1fr;
        gap: 40px;
      }

      .footer__company {
        grid-column: span 1;
      }

      .footer__bottom-inner {
        flex-direction: column;
        align-items: flex-start;
        gap: 20px;
      }
    }


    /* --- [COMPONENT] 9. Division Banner (dv-) --- */
    #od-div-banner {
      position: relative;
      width: 100%;
      height: 350px;
      background-image: url('/images/2ee864ca5bc7cca6102abddeaad8690d.jpg');
      background-size: cover;
      background-position: center;
      background-attachment: fixed;
      display: flex;
      align-items: center;
      justify-content: center;
      text-align: center;
    }

    .dv-overlay {
      position: absolute;
      inset: 0;
      background: rgba(0, 0, 0, 0.2);
      z-index: 1;
    }

    .dv-content {
      position: relative;
      z-index: 2;
      color: #fff;
    }

    .dv-gap {
      display: flex;
      flex-direction: column;
      gap: 25px;
      align-items: center;
    }

    .dv-text-main {
      font-size: 56px;
      font-weight: 800;
      letter-spacing: -0.03em;
      line-height: 1.1;
    }

    .dv-text-sub {
      font-size: 18px;
      font-weight: 500;
      line-height: 1.6;
      opacity: 0.9;
    }

    .dv-btn {
      display: inline-flex;
      align-items: center;
      justify-content: center;
      padding: 20px 60px;
      border: 1px solid #fff;
      color: #fff;
      font-size: 14px;
      font-weight: 800;
      text-transform: uppercase;
      transition: 0.3s;
      margin-top: 15px;
    }

    .dv-btn:hover {
      background: #fff;
      color: #000;
    }

    /* --- [COMPONENT] 10. Additional Category (ac-) --- */
    #od-add-category {
      padding: 100px 0;
      background: #fff;
      border-top: 1px solid var(--ml-border);
    }

    .ac-title-area {
      text-align: center;
      margin-bottom: 60px;
    }

    .ac-title-area h2 {
      font-size: 32px;
      font-weight: 900;
      color: #111;
      margin-bottom: 10px;
      line-height: 1.2;
    }

    .ac-title-area p {
      font-size: 15px;
      color: var(--ml-muted);
      font-weight: normal;
      margin-top: 5px;
    }

    .ac-viewport-container {
      position: relative;
    }

    .ac-swiper {
      padding-bottom: 60px;
      overflow: hidden;
    }

    .ac-track {
      display: flex;
      transition: transform 0.6s cubic-bezier(0.25, 1, 0.5, 1);
    }

    .ac-slide {
      flex: 0 0 calc(25% - 20px);
      margin: 0 10px;
      box-sizing: border-box;
    }

    .ac-item {
      position: relative;
      cursor: pointer;
      transition: 0.3s;
    }

    .ac-thumb {
      position: relative;
      border-radius: 12px;
      overflow: hidden;
      background: #f8f8f8;
      aspect-ratio: 1 / 1.2;
      margin-bottom: 20px;
    }

    .ac-thumb img {
      width: 100%;
      height: 100%;
      object-fit: cover;
      transition: 0.6s;
    }

    .ac-item:hover .ac-thumb img {
      transform: scale(1.05);
    }

    .ac-thumb .img-hover {
      position: absolute;
      inset: 0;
      opacity: 0;
      transition: 0.4s;
    }

    .ac-item:hover .ac-thumb .img-hover {
      opacity: 1;
    }

    .ac-actions {
      position: absolute;
      bottom: -85px;
      left: 0;
      right: 0;
      display: flex;
      justify-content: center;
      gap: 10px;
      padding: 20px;
      background: linear-gradient(to top, rgba(0, 0, 0, 0.4), transparent);
      z-index: 10;
      transition: bottom 0.3s;
    }

    .ac-item:hover .ac-actions {
      bottom: 0;
    }

    .ac-action-btn {
      width: 44px;
      height: 44px;
      background: #fff;
      border-radius: 50%;
      display: flex;
      align-items: center;
      justify-content: center;
      cursor: pointer;
      transition: 0.2s;
      box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
      border: none;
    }

    .ac-action-btn:hover {
      background: #111;
      color: #fff;
      transform: translateY(-3px);
    }

    .ac-action-btn svg {
      width: 22px;
      height: 22px;
      stroke: #111;
      stroke-width: 1.5;
      fill: none;
      transition: 0.2s;
    }

    .ac-action-btn:hover svg {
      stroke: #fff;
    }

    .ac-info {
      text-align: left;
    }

    .ac-colorchips {
      display: flex;
      gap: 4px;
      margin-bottom: 12px;
    }

    .ac-colorchip {
      width: 14px;
      height: 14px;
      border-radius: 50%;
      border: 1px solid rgba(0, 0, 0, 0.05);
    }

    .ac-name {
      font-size: 16px;
      font-weight: 700;
      margin-bottom: 8px;
      color: #111;
      display: block;
    }

    .ac-summary {
      font-size: 13px;
      color: var(--ml-muted);
      margin-bottom: 12px;
    }

    .ac-price-wrap {
      display: flex;
      align-items: baseline;
      gap: 8px;
      margin-bottom: 6px;
    }

    .ac-price-sale {
      font-size: 18px;
      font-weight: 800;
      color: #111;
    }

    .ac-price-original {
      font-size: 13px;
      color: #aaa;
      text-decoration: line-through;
    }

    .ac-discount {
      font-size: 18px;
      font-weight: 800;
      color: var(--ml-accent);
    }

    .ac-review {
      font-size: 12px;
      color: #999;
      font-weight: 500;
    }

    .ac-pagination {
      display: flex;
      justify-content: center;
      gap: 8px;
      margin-top: 20px;
    }

    .ac-dot {
      width: 8px;
      height: 8px;
      border-radius: 50%;
      background: #ddd;
      transition: 0.3s;
      cursor: pointer;
    }

    .ac-dot.is-active {
      width: 24px;
      background: var(--ml-accent);
      border-radius: 4px;
    }

    /* --- [COMPONENT] 11. Monthly Benefits (mb-) --- */
    #od-monthly-benefits {
      padding: 100px 0;
      background: #fff;
      border-top: 1px solid var(--ml-border);
      overflow: hidden;
    }

    .mb-title-area {
      text-align: center;
      margin-bottom: 60px;
    }

    .mb-title-area h3 {
      font-size: 32px;
      font-weight: 900;
      color: #111;
      margin-bottom: 12px;
      letter-spacing: -0.02em;
    }

    .mb-title-area p {
      font-size: 15px;
      color: var(--ml-muted);
    }

    .mb-viewport-container {
      position: relative;
      width: 100%;
      max-width: 1600px;
      margin: 0 auto;
    }

    .mb-swiper {
      overflow: visible !important;
    }

    .mb-slide {
      width: 55%;
      /* 너비를 55%로 조정하여 양옆 배너가 더 많이 보이도록 설정 (3열 강조) */
      margin: 0 10px;
      box-sizing: border-box;
      opacity: 0.2;
      /* 비활성 배너 투명도 강화 */
      transform: scale(0.85);
      /* 비활성 배너 크기 축소 강화 */
      transition: all 0.7s cubic-bezier(0.4, 0, 0.2, 1);
      filter: blur(5px);
      will-change: transform, opacity, filter;
    }

    .mb-slide.swiper-slide-active {
      opacity: 1;
      transform: scale(1);
      filter: blur(0);
      z-index: 10;
    }

    .mb-item {
      position: relative;
      border-radius: 30px;
      overflow: hidden;
      aspect-ratio: 16 / 8;
      cursor: pointer;
      background: #f9f9f9;
      box-shadow: 0 20px 40px rgba(0, 0, 0, 0.08);
    }

    .mb-item img {
      width: 100%;
      height: 100%;
      object-fit: cover;
      transition: 0.8s cubic-bezier(0.165, 0.84, 0.44, 1);
    }

    .mb-item:hover img {
      transform: scale(1.05);
    }

    .mb-info {
      position: absolute;
      inset: 0;
      padding: 50px;
      display: flex;
      flex-direction: column;
      justify-content: flex-end;
      background: linear-gradient(to top, rgba(0, 0, 0, 0.7), transparent 70%);
      color: #fff;
      transition: 0.4s;
      opacity: 0;
      transform: translateY(20px);
    }

    .mb-slide.swiper-slide-active .mb-info {
      opacity: 1;
      transform: translateY(0);
    }

    .mb-info h4 {
      font-size: 36px;
      font-weight: 900;
      margin-bottom: 12px;
      letter-spacing: -0.04em;
    }

    .mb-info em {
      font-style: normal;
      font-size: 16px;
      font-weight: 500;
      opacity: 0.9;
    }

    .mb-arrow-wrapper {
      position: absolute;
      top: 50%;
      left: 0;
      right: 0;
      transform: translateY(-50%);
      display: flex;
      justify-content: space-between;
      pointer-events: none;
      z-index: 100;
      margin: 0 5%;
    }

    .mb-arrow {
      width: 60px;
      height: 60px;
      background: rgba(255, 255, 255, 0.95);
      backdrop-filter: blur(10px);
      box-shadow: 0 10px 30px rgba(0, 0, 0, 0.15);
      border-radius: 50%;
      display: flex;
      align-items: center;
      justify-content: center;
      cursor: pointer;
      pointer-events: auto;
      opacity: 0;
      transition: 0.3s;
      border: 1px solid rgba(0, 0, 0, 0.05);
    }

    #od-monthly-benefits:hover .mb-arrow {
      opacity: 1;
    }

    .mb-arrow:hover {
      background: #fff;
      color: var(--ml-accent);
      transform: scale(1.1);
    }

    .mb-arrow svg {
      width: 32px;
      height: 32px;
    }

    .mb-pagination {
      display: flex;
      justify-content: center;
      gap: 10px;
      margin-top: 50px;
    }

    .mb-dot {
      width: 10px;
      height: 10px;
      border-radius: 50%;
      background: #ddd;
      transition: 0.4s;
      cursor: pointer;
      border: none;
      display: inline-block;
    }

    .swiper-pagination-bullet-active.mb-dot {
      width: 32px;
      background: var(--ml-accent);
      border-radius: 5px;
    }

    @media (max-width: 1024px) {
      /* [2026-08-08] --hd-h를 여기서 재정의하면 #container의 padding-top과
         .ss-container의 상쇄 마진(둘 다 var(--hd-h) 참조, css/layout.css·
         scroll-snap.css)이 모바일 헤더 높이에 맞춰 자동으로 같이 줄어든다. */
      :root {
        --hd-h: 70px;
      }

      /* [2026-08-08] 실측 발견: 알림 캡슐이 top:0에 폭 350px로 화면 중앙에 뜨면
         좁은 모바일 화면에서 좌측 햄버거 버튼과 겹쳐 클릭을 가로막는다(실측:
         Playwright 클릭 타임아웃). 모바일에서는 헤더 행 아래로 내려 겹치지 않게 한다. */
      .main-layout-topbanner {
        top: 70px;
        max-width: calc(100vw - 24px);
        font-size: 12px;
      }

      /* [2026-08-07] 시각 리디자인으로 데스크톱 기본값이 grid → flex로 바뀌면서,
         모바일 전용이던 이 grid-column 기반 배치(햄버거/로고/검색)를 그대로 쓰려면
         이 미디어쿼리 안에서 display:grid를 다시 명시해야 한다(이전엔 베이스가
         이미 grid라 생략 가능했음) — 로직 자체는 변경 없음. */
      .main-layout-header-container {
        display: grid;
        grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
        padding: 0 15px;
      }

      .main-layout-logo a {
        font-size: 24px;
        letter-spacing: 0.15em;
      }

      /* brand-group(로고+GNB)도 header-left와 동일한 이유로 display:contents로
         풀어 자식(logo)이 header-container의 직계 grid 아이템처럼 동작하게 한다. */
      .main-layout-brand-group,
      .main-layout-header-left {
        display: contents !important;
      }

      .main-layout-logo {
        grid-column: 2;
        grid-row: 1;
        display: flex;
        justify-content: center;
      }

      .main-layout-gnb-nav,
      .main-layout-toolbar {
        display: none !important;
      }

      #main-layout-mega-root,
      .main-layout-search-rolling {
        display: none;
      }

      .main-layout-hamburger {
        grid-column: 1;
        grid-row: 1;
        display: flex !important;
        justify-self: start;
        align-self: center;
      }

      .main-layout-search-trigger {
        grid-column: 3;
        grid-row: 1;
        display: flex !important;
        justify-self: end;
        align-self: center;
      }

      .qi-list {
        display: flex;
        overflow-x: auto;
        white-space: nowrap;
        gap: 20px;
        margin: 0 -20px;
        padding: 0 20px 10px;
        scrollbar-width: none;
        -ms-overflow-style: none;
        scroll-snap-type: x mandatory;
        -webkit-overflow-scrolling: touch;
      }

      .qi-list::-webkit-scrollbar {
        display: none;
      }

      .qi-item {
        flex: 0 0 auto;
        width: 75px;
        scroll-snap-align: start;
      }

      .ps-slide {
        flex: 0 0 calc(100% - 20px);
      }

      .bi-slide {
        flex: 0 0 calc(50% - 20px);
      }

      .nc-grid {
        grid-template-columns: 1fr;
        gap: 60px;
      }

      .gb-wrapper {
        grid-template-columns: 1fr;
      }

      /* 검색 레이어 모바일 폭 초과 방지 (input 32px 폰트가 flex 최소폭을
         못 줄여 뷰포트 밖으로 넘치던 것 - min-width:0으로도 고쳤지만
         모바일에서 보기 편하게 폰트/그리드도 같이 축소).
         [2026-08-11, 전달.md] "검색창 좌우 여백 추가" — 셀렉터가 클래스
         `.main-layout-search-root`였는데 실제 마크업(header.html)엔 그 클래스가 없고
         id만 있어(#main-layout-search-root) 이 규칙 자체가 한 번도 매칭된 적 없는 죽은
         코드였다. 좌우 패딩이 0으로 남아 입력창·최근/인기 검색어가 화면 가장자리에 붙어있던
         원인 — id 셀렉터로 정정. */
      #main-layout-search-root {
        padding: 64px 20px 0;
      }

      /* [2026-08-11] "검색 x랑 돋보기랑 곂치잖아" — 닫기(×)가 top:40/right:40/font-size:40의
         데스크톱 값을 그대로 썼다. 데스크톱은 폼이 max-width:800으로 가운데 정렬돼 안 부딪히지만,
         모바일은 폼이 뷰포트 거의 전체 폭을 차지해 오른쪽 끝 검색(돋보기) 버튼과 같은 자리에서
         겹쳤다. 닫기를 작게·더 안쪽 모서리로 옮기고, 위 root padding-top도 64px로 늘려 폼 자체를
         닫기 버튼 아래로 내려 세로로도 겹치지 않게 분리한다. */
      .main-layout-search-close {
        top: 16px;
        right: 16px;
        font-size: 24px;
      }

      .main-layout-search-form input {
        font-size: 20px;
      }

      .main-layout-search-suggestions {
        grid-template-columns: 1fr;
        gap: 32px;
      }

      /* Monthly Benefits Mobile Optimization */
      .mb-swiper {
        overflow: hidden !important;
      }

      .mb-slide {
        width: 100% !important;
        margin: 0 !important;
        opacity: 0 !important;
        transform: scale(1) !important;
        filter: blur(0) !important;
      }

      .mb-slide.swiper-slide-active {
        opacity: 1 !important;
      }

      .mb-item {
        border-radius: 15px !important;
        aspect-ratio: 16 / 10 !important;
      }

      .mb-info {
        padding: 25px !important;
      }

      .mb-info h4 {
        font-size: 24px !important;
      }

      .mb-info em {
        font-size: 14px !important;
      }

      #od-quick-icons,
      #od-promo-slider,
      #od-best-items,
      #od-notice-community,
      #od-new-items,
      #od-time-sale,
      #od-div-banner,
      #od-add-category,
      #od-monthly-benefits,
      #od-product-review,
      #od-instagram-section,
      .gb-section,
      #footer,
      #main-layout-footer-root {
        padding-top: 50px !important;
        padding-bottom: 50px !important;
      }
    }

    /* [LAYOUT] Mobile Drawer Isolation - Refined */
    #main-layout-drawer-root {
      position: fixed;
      inset: 0;
      z-index: 5000;
      visibility: hidden;
      pointer-events: none;
      transition: 0.4s;
    }

    #main-layout-drawer-root.is-active {
      visibility: visible;
      pointer-events: auto;
    }

    #main-layout-drawer-overlay {
      position: absolute;
      inset: 0;
      background: rgba(0, 0, 0, 0.6);
      backdrop-filter: blur(4px);
      -webkit-backdrop-filter: blur(4px);
      opacity: 0;
      transition: 0.4s;
    }

    #main-layout-drawer-root.is-active #main-layout-drawer-overlay {
      opacity: 1;
    }

    #main-layout-drawer-content {
      position: absolute;
      top: 0;
      left: 0;
      width: 85%;
      max-width: 340px;
      height: 100%;
      background: #fff;
      transform: translateX(-100%);
      transition: 0.5s cubic-bezier(0.16, 1, 0.3, 1);
      display: flex;
      flex-direction: column;
      box-shadow: 20px 0 60px rgba(0, 0, 0, 0.15);
    }

    #main-layout-drawer-root.is-active #main-layout-drawer-content {
      transform: translateX(0);
    }

    .main-layout-drawer-user {
      padding: 40px 24px 30px;
      background: #fcfcfc;
      border-bottom: 1px solid var(--ml-border);
    }

    .main-layout-drawer-user-title {
      font-size: 20px;
      font-weight: 800;
      margin-bottom: 20px;
      color: var(--ml-fg);
    }

    .main-layout-drawer-user-btns {
      display: flex;
      gap: 8px;
    }

    .main-layout-drawer-user-btn {
      flex: 1;
      height: 40px;
      display: flex;
      align-items: center;
      justify-content: center;
      font-size: 13px;
      font-weight: 700;
      border: 1px solid var(--ml-border);
      border-radius: 4px;
      background: #fff;
    }

    .main-layout-drawer-user-btn.primary {
      background: var(--ml-fg);
      color: #fff;
      border-color: var(--ml-fg);
    }

    .main-layout-drawer-cart-btn {
      flex: 0 0 40px;
      height: 40px;
      display: flex;
      align-items: center;
      justify-content: center;
      position: relative;
      border: 1px solid var(--ml-border);
      border-radius: 4px;
      background: #fff;
    }

    .main-layout-drawer-cart-btn svg {
      width: 20px;
      height: 20px;
      color: var(--ml-fg);
    }

    .main-layout-drawer-close {
      position: absolute;
      top: 20px;
      right: 20px;
      width: 40px;
      height: 40px;
      display: flex;
      align-items: center;
      justify-content: center;
      font-size: 28px;
      font-weight: 200;
      cursor: pointer;
      color: var(--ml-fg);
    }

    .main-layout-drawer-body {
      flex: 1;
      overflow-y: auto;
      padding: 30px 0;
    }

    .main-layout-drawer-list {
      display: flex;
      flex-direction: column;
    }

    .main-layout-drawer-list li {
      padding: 0 24px;
      height: 56px;
      display: flex;
      align-items: center;
      justify-content: space-between;
      font-size: 16px;
      font-weight: 700;
      cursor: pointer;
      transition: 0.2s;
      color: var(--ml-fg);
      border-bottom: 1px solid #f9f9f9;
    }

    .main-layout-drawer-list li::after {
      content: '›';
      font-size: 20px;
      color: #ccc;
      font-weight: 400;
    }

    .main-layout-drawer-list li:hover {
      background: #f9f9f9;
      color: var(--ml-accent);
    }

    /* 2차 메뉴 아코디언 (PC 메가메뉴와 동일한 카테고리를 모바일 드로어에서도 확장) */
    .main-layout-drawer-list li.has-sub {
      height: auto;
      flex-direction: column;
      align-items: stretch;
      padding: 0;
      cursor: default;
    }

    .main-layout-drawer-list li.has-sub::after {
      content: none;
    }

    .drawer-cat-toggle {
      width: 100%;
      background: none;
      border: none;
      padding: 0 24px;
      height: 56px;
      display: flex;
      align-items: center;
      justify-content: space-between;
      font-size: 16px;
      font-weight: 700;
      font-family: inherit;
      color: var(--ml-fg);
      cursor: pointer;
      text-align: left;
    }

    .drawer-cat-toggle::after {
      content: '›';
      font-size: 20px;
      color: #ccc;
      font-weight: 400;
      transform: rotate(90deg);
      transition: transform 0.25s;
    }

    .drawer-cat-toggle:hover {
      color: var(--ml-accent);
    }

    .drawer-cat-toggle[aria-expanded="true"]::after {
      transform: rotate(-90deg);
    }

    .main-layout-drawer-sublist {
      max-height: 0;
      overflow: hidden;
      transition: max-height 0.3s ease;
      background: #fafafa;
    }

    .drawer-cat-toggle[aria-expanded="true"] + .main-layout-drawer-sublist {
      max-height: 260px;
    }

    .main-layout-drawer-sublist li {
      height: 44px;
      padding: 0 24px 0 40px;
      font-size: 14px;
      font-weight: 500;
      color: var(--ml-muted);
      border-bottom: none;
    }

    .main-layout-drawer-sublist li::after {
      content: none;
    }

    .main-layout-drawer-sublist li:hover {
      background: transparent;
      color: var(--ml-accent);
    }

    .main-layout-drawer-footer {
      padding: 24px;
      border-top: 1px solid var(--ml-border);
      background: #fff;
    }

    .main-layout-drawer-quick {
      display: grid;
      grid-template-columns: repeat(3, 1fr);
      gap: 10px;
      margin-bottom: 20px;
    }

    .main-layout-drawer-quick-item {
      display: flex;
      flex-direction: column;
      align-items: center;
      gap: 8px;
      font-size: 11px;
      font-weight: 600;
      color: #666;
    }

    .main-layout-drawer-quick-item svg {
      width: 24px;
      height: 24px;
      color: var(--ml-fg);
    }

    .main-layout-drawer-info {
      display: flex;
      justify-content: center;
      gap: 15px;
      font-size: 12px;
      color: #999;
      font-weight: 500;
    }

    
      /* --- [COMPONENT] New Items (ni-) --- */
      #od-new-items {
        padding: 100px 0;
        background: #fff;
        border-top: 1px solid var(--ml-border);
      }

      .ni-title-area {
        margin-bottom: 50px;
        text-align: center;
      }

      .ni-title-area h2 {
        font-size: 32px;
        font-weight: 900;
        color: #111;
        margin-bottom: 10px;
        display: flex;
        align-items: center;
        justify-content: center;
        gap: 15px;
      }

      .ni-title-area p {
        font-size: 15px;
        color: var(--ml-muted);
        font-weight: normal;
        margin-top: 5px;
      }

      .ni-grid {
        display: grid;
        grid-template-columns: repeat(4, 1fr);
        gap: 20px;
      }

      .ni-item {
        position: relative;
        cursor: pointer;
      }

      .ni-thumb {
        position: relative;
        border-radius: 15px;
        overflow: hidden;
        aspect-ratio: 1/1.2;
        background: #f4f4f4;
        margin-bottom: 20px;
      }

      .ni-thumb img {
        width: 100%;
        height: 100%;
        object-fit: cover;
        transition: transform 0.4s;
      }

      .ni-thumb .img-hover {
        position: absolute;
        inset: 0;
        opacity: 0;
      }

      .ni-item:hover .ni-thumb img {
        transform: scale(1.05);
      }

      .ni-item:hover .ni-thumb .img-hover {
        opacity: 1;
      }

      .ni-badge {
        position: absolute;
        top: 15px;
        left: 15px;
        background: #B9C69B;
        color: #fff;
        font-size: 11px;
        font-weight: 800;
        padding: 4px 10px;
        border-radius: 4px;
        z-index: 5;
        text-transform: uppercase;
      }

      .ni-actions {
        position: absolute;
        bottom: -85px;
        left: 0;
        right: 0;
        display: flex;
        justify-content: center;
        gap: 10px;
        padding: 20px;
        background: linear-gradient(to top, rgba(0, 0, 0, 0.6), transparent);
        z-index: 10;
        transition: bottom 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
      }

      .ni-item:hover .ni-actions {
        bottom: 0;
      }

      .ni-action-btn {
        width: 44px;
        height: 44px;
        background: #fff;
        border-radius: 50%;
        display: flex;
        align-items: center;
        justify-content: center;
        cursor: pointer;
        transition: 0.2s;
        box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
      }

      .ni-action-btn:hover {
        background: #111;
        color: #fff;
        transform: translateY(-3px);
      }

      .ni-action-btn svg {
        width: 22px;
        height: 22px;
        stroke: #111;
        stroke-width: 1.5;
        fill: none;
        transition: 0.2s;
      }

      .ni-action-btn:hover svg {
        stroke: #fff;
      }

      .ni-info {
        text-align: left;
        padding: 0 5px;
      }

      .ni-colorchips {
        display: flex;
        gap: 4px;
        margin-bottom: 12px;
      }

      .ni-colorchip {
        width: 14px;
        height: 14px;
        border-radius: 50%;
        border: 1px solid rgba(0, 0, 0, 0.05);
      }

      .ni-name {
        font-size: 16px;
        font-weight: 700;
        margin-bottom: 8px;
        color: #111;
        display: block;
      }

      .ni-summary {
        font-size: 13px;
        color: var(--ml-muted);
        margin-bottom: 12px;
      }

      .ni-price-wrap {
        display: flex;
        align-items: baseline;
        gap: 8px;
        margin-bottom: 6px;
      }

      .ni-price-sale {
        font-size: 18px;
        font-weight: 800;
        color: #111;
      }

      .ni-price-original {
        font-size: 13px;
        color: #aaa;
        text-decoration: line-through;
      }

      .ni-discount {
        font-size: 18px;
        font-weight: 800;
        color: var(--ml-accent);
      }

      .ni-review {
        font-size: 12px;
        color: #999;
        font-weight: 500;
        display: flex;
        align-items: center;
        gap: 4px;
      }

      .ni-review svg {
        width: 12px;
        height: 12px;
        fill: #ccc;
      }

      .ni-bottom-banner {
        position: relative;
        margin-top: 60px;
        height: 160px;
        background: #f8f9fa;
        border-radius: 20px;
        overflow: hidden;
        display: flex;
        align-items: center;
        justify-content: space-between;
        padding: 0 60px;
        cursor: pointer;
        transition: transform 0.4s;
      }

      .ni-bottom-banner:hover {
        transform: translateY(-5px);
        box-shadow: 0 15px 35px rgba(0, 0, 0, 0.06);
      }

      .ni-bottom-banner::before {
        content: '';
        position: absolute;
        right: -50px;
        top: -50px;
        width: 250px;
        height: 250px;
        background: rgba(255, 255, 255, 0.6);
        border-radius: 50%;
        z-index: 1;
      }

      .ni-banner-rolling {
        position: relative;
        height: 70px;
        overflow: hidden;
        z-index: 2;
        flex: 1;
      }

      .ni-banner-track {
        transition: transform 0.6s cubic-bezier(0.65, 0, 0.35, 1);
      }

      .ni-banner-item {
        height: 70px;
        display: flex;
        flex-direction: column;
        justify-content: center;
      }

      .ni-banner-item .sub {
        display: block;
        font-size: 14px;
        font-weight: 600;
        color: #888;
        margin-bottom: 6px;
        letter-spacing: -0.02em;
      }

      .ni-banner-item .title {
        display: block;
        font-size: 26px;
        font-weight: 800;
        color: #111;
        letter-spacing: -0.04em;
      }

      .ni-banner-dots {
        display: flex;
        flex-direction: column;
        gap: 8px;
        position: relative;
        z-index: 2;
        margin-left: 20px;
      }

      .ni-banner-dot {
        width: 6px;
        height: 6px;
        border-radius: 50%;
        background: #ddd;
        transition: 0.3s;
        cursor: pointer;
        position: relative;
      }

      .ni-banner-dot::after {
        content: '';
        position: absolute;
        top: -10px;
        left: -10px;
        right: -10px;
        bottom: -10px;
      }

      .ni-banner-dot.is-active {
        height: 18px;
        background: var(--ml-accent);
        border-radius: 4px;
      }

      @media (max-width: 1024px) {
        .ni-grid {
          grid-template-columns: repeat(2, 1fr);
          gap: 15px;
        }

        .ni-bottom-banner {
          padding: 0 30px;
          height: 140px;
          margin-top: 40px;
        }
      }
    
    
      #od-instagram-section {
        position: relative;
        padding: 100px 0;
        background: #fff;
        border-top: 1px solid var(--ml-border);
        overflow: hidden;
      }

      .in-wrap {
        position: relative;
        padding: 0 15% 0 45%;
        max-width: var(--ml-max-width);
        margin: 0 auto;
        box-sizing: border-box;
      }

      .in-title-area {
        position: absolute;
        top: 50%;
        left: 12%;
        transform: translateY(-50%);
        z-index: 10;
      }

      .in-title-area h2 {
        font-size: 64px;
        font-weight: 700;
        color: #000;
        letter-spacing: 0;
        line-height: 1.1;
        margin: 0;
      }

      .in-subtitle {
        padding-top: 10px;
        font-size: 28px;
        font-weight: 300;
        color: #222;
      }

      .in-subtitle a {
        transition: 0.3s;
      }

      .in-subtitle a:hover {
        color: var(--ml-accent);
      }

      .in-widget-inner {
        position: relative;
        max-width: 1000px;
        margin: 0 auto;
      }

      .in-grid {
        display: grid;
        grid-template-columns: repeat(3, 1fr);
        gap: 15px;
      }

      .in-item {
        position: relative;
        aspect-ratio: 1/1;
        overflow: hidden;
        border-radius: 8px;
        background: #f8f8f8;
      }

      .in-item img {
        width: 100%;
        height: 100%;
        object-fit: cover;
        transition: transform 0.6s cubic-bezier(0.165, 0.84, 0.44, 1);
      }

      .in-item:hover img {
        transform: scale(1.1);
      }

      .in-dummy-link {
        position: absolute;
        inset: 0;
        z-index: 5;
        cursor: pointer;
      }

      @media (max-width: 1200px) {
        .in-wrap {
          padding: 0 5% 0 35%;
        }

        .in-title-area {
          left: 5%;
        }

        .in-title-area h2 {
          font-size: 48px;
        }

        .in-subtitle {
          font-size: 20px;
        }
      }

      @media (max-width: 768px) {
        #od-instagram-section {
          padding: 50px 0 !important;
        }

        .in-wrap {
          padding: 0 20px;
          display: flex;
          flex-direction: column;
        }

        .in-title-area {
          position: relative;
          top: auto;
          left: auto;
          transform: none;
          text-align: center;
          margin-bottom: 40px;
        }

        .in-title-area h2 {
          font-size: 36px;
        }

        .in-subtitle {
          font-size: 16px;
          padding-top: 8px;
        }

        .in-grid {
          grid-template-columns: repeat(2, 1fr);
          gap: 10px;
        }
      }

/* [2026-07-29] G22 재발 발견: 카페24 네이티브 모바일 하단 탭바(.bottom-nav, footer.html의
   ez-module="bottom-navigation" 스텁) 숨김 규칙이 layout.html이 실제로 로드하는 이 파일이
   아니라 main.html/main_supply.html 전용인 layout/basic/css/layout.css(동명이인, 홈페이지와
   무관)에 잘못 들어가 있었다 — 그래서 데스크톱에서도 "네비게이션/검색/홈/Cart/마이쇼핑"이
   스타일 없이 그대로 노출되고 있었다(실측: 사용자 지적). 데스크톱 기본 숨김은 우리가 추가,
   모바일 전용 표시/위치 규칙은 레퍼런스(skin1) 원본 그대로 이식.
   [2026-08-04 G48] 위 "모바일 전용 표시" 결정이 실제로는 잘못됐음을 실측 확인 — 이
   `.bottom-nav`는 `position:fixed; bottom:0; z-index:901`로 모바일 화면 하단 52px에
   항상 떠 있어 캐러셀/퀵메뉴/푸터 등 그 아래 모든 콘텐츠 위에 흰 띠로 겹쳐 보였다(사용자
   제보: "하단에 메뉴가 중복해 보여", "동영상 하단에 공백 있어" — 둘 다 이 흰 바가
   원인, 별개 버그가 아니었음). 게다가 내부 버튼(`.btnNav.eNavFold` 등)에 `onclick`
   자체가 없어(`getEventListeners` 실측 null) 클릭해도 완전히 무반응 — skin1의 순수
   마크업 스텁일 뿐 우리 커스텀 JS와 연결된 적이 없다. 이 바가 제공하는 5개 기능
   (네비게이션/검색/홈/Cart/마이쇼핑) 전부 이미 우리 커스텀 헤더(햄버거 드로어 열면
   Cart·마이쇼핑 링크 노출, 검색 아이콘 별도 존재, 로고가 홈 링크)로 100% 중복
   제공되고 있음을 실측 확인 — 잃는 기능 없이 완전히 숨겨도 안전. 모바일 전용 표시
   규칙을 제거하고 모든 화면 크기에서 `display:none`으로 통일. */
.bottom-nav { display: none !important; }
@media (max-width: 1024px) {
  .bottom-nav--hide { transform: translate3d(0, 60px, 0); }
  .bottom-nav__tabBar { display: flex; justify-content: space-between; height: 52px; padding: 14px 26px 0; box-sizing: border-box; background: #fff; transform: translate3d(0, 0, 0); transition: transform 0.3s linear, padding-bottom 0.3s linear; }
  .bottom-nav__tabBar li a, .bottom-nav__tabBar li button { position: relative; display: block; white-space: nowrap; width: 24px; height: 24px; font-size: 1px; line-height: 1px; color: transparent; text-indent: 150%; vertical-align: top; background: none; }
  .bottom-nav__tabBar li button:focus { outline: 0; }
  .bottom-nav__tabBar .count { display: block; position: absolute; top: 12px; right: -5px; width: 16px; height: 16px; font-size: 11px; color: #fff; text-align: center; text-indent: 0; line-height: 15px; border-radius: 50%; background: #000; }
  .bottom-nav__top { opacity: 0; visibility: hidden; position: absolute; top: -72px; right: 16px; padding: 0; box-sizing: border-box; text-align: center; text-transform: uppercase; transition: 0.5s; }
  .bottom-nav__top a { background-color: #fff; border: 1px solid #dadada; box-sizing: border-box; border-radius: 50%; width: 40px; height: 40px; display: flex; justify-content: center; align-items: center; margin-top: 5px; }
  .bottom-nav__top a.quick_search svg { width: 20px; }
  .bottom-nav__top--show { opacity: 1; visibility: visible; }
  .bottom-nav__top span { display: block; margin: 4px 0 0; }
  .button--fixed .bottom-nav__tabBar { display: none; }
}


/* ---- css/grid-sections.css ---- */
/* SoyTwo 메인 상품 그리드/카드 스타일 — 벤치마크(COS) section4/5 정밀 실측 기반(11_템플릿/SoyTwo.md §1-2).
   COS는 Swiper 캐러셀이지만 최초 1차 범위는 "그리드"라 CSS Grid로 구현했다("캐러셀화는 후속 과제"로
   미뤄뒀던 부분). 2026-08-09: MD CHOICE(section3)는 후속 과제가 실행돼 캐러셀로 전환됨
   (css/md-choice-carousel.css) — section5(.st-grid-4, 탭 4열 그리드)는 이번 범위 밖이라 CSS Grid 그대로. */

/* ---------- 와이어프레임 이미지 자리(placeholder) — 전 섹션 공용 ----------
   사용자 지시(2026-08-07): "완성도 높은 소스 말고 자리를 만들라고" — 실제 사진을 채우지 않고
   이미지가 들어갈 위치·비율만 명확히 표시한다. 레이아웃 치수(aspect-ratio 등)는 실제 이미지가
   들어갔을 때와 동일하게 유지해, 나중에 real src만 꽂으면 되는 구조로 남긴다. */
.st-img-placeholder {
  width: 100%;
  height: 100%;
  min-height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  flex-direction: column;
  background: repeating-linear-gradient(45deg, #e9e9e9, #e9e9e9 12px, #f4f4f4 12px, #f4f4f4 24px);
  border: 1px dashed #bbb;
  color: #999;
  font-size: 12px;
  text-align: center;
  box-sizing: border-box;
}

.st-img-placeholder svg { width: 28px; height: 28px; opacity: 0.5; }

/* 풀블리드 배경 자리(히어로/MD추천/타임세일/회사소개/더블배너/유튜브) — 어두운 오버레이 대신
   중립 회색 해치 패턴만 깔아 "이미지가 여기 들어갈 자리"임을 명확히 한다. */
.st-bg-placeholder {
  background: repeating-linear-gradient(45deg, #3a3a3a, #3a3a3a 14px, #2c2c2c 14px, #2c2c2c 28px) !important;
  border-top: 1px dashed #666;
  border-bottom: 1px dashed #666;
}

.st-bg-placeholder-label {
  position: absolute;
  top: 16px;
  left: 16px;
  z-index: 2;
  font-size: 11px;
  letter-spacing: 0.04em;
  color: rgba(255, 255, 255, 0.55);
  border: 1px dashed rgba(255, 255, 255, 0.4);
  padding: 4px 10px;
  border-radius: 999px;
}

/* ---------- 공통 상품 카드 ---------- */
.st-card {
  display: block;
  text-decoration: none;
  color: inherit;
}

.st-card-thumb {
  position: relative;
  aspect-ratio: 1 / 1;
  overflow: hidden;
  background: #f4f2ef;
  border-radius: 4px;
  display: flex;
  align-items: center;
  justify-content: center;
}

/* [2026-08-09] 사용자 지시: 이미지 최대 사이즈를 제한 — object-fit:cover로 카드를 꽉 채워
   원본 비율이 제각각인 상품 사진(세로로 긴 튜브/가로로 넓은 팔레트 등)을 전부 동일하게
   "꽉 찬 정사각형"으로 잘라내다 보니 실제 제품 크기감이 사라지고 카드마다 똑같은 느낌으로
   보였다. contain + 비율 상한(max-width/height)으로 제품 실루엣이 잘리지 않게 바꾼다. */
.st-card-thumb img {
  max-width: 74%;
  max-height: 74%;
  width: auto;
  height: auto;
  object-fit: contain;
  display: block;
}

/* [2026-08-09] 사용자 지시: "좌우 양옆에 동일하게 나오지 않게" — 같은 행의 카드들이 이미지
   크기까지 판박이로 보이지 않도록 짝/홀 카드마다 살짝 다른 크기를 준다(그리드 자체(정사각형
   셀)는 그대로 유지, 셀 안 이미지 크기만 리듬을 준다).
   🔴→✅ [2026-08-09 정정] 처음엔 짝수 카드에 align-items:flex-end(하단 정렬)도 같이 줬는데,
   실제 화면에서 이미지 위로 빈 여백이 크게 남아 "치우쳐 보인다"는 사용자 지적(전달.md)을
   받아 정렬은 중앙(.st-card-thumb 기본값)으로 되돌리고 크기 차이만 남긴다.
   [2026-08-09] MD CHOICE가 캐러셀로 바뀌며 .st-grid-2는 더 이상 안 쓰여 이 선택자에서 제거
   (.st-grid-4=section5 탭 그리드는 그대로 유지). */
.st-grid-4 li:nth-child(even) .st-card-thumb img {
  max-width: 60%;
  max-height: 60%;
}

.st-card-name {
  margin-top: 14px;
  font-size: 15px;
  font-weight: 600;
  color: var(--ml-fg, #151515);
}

.st-card-desc {
  margin-top: 4px;
  font-size: 12px;
  color: var(--ml-muted, #888888);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.st-card-price {
  margin-top: 8px;
  font-size: 15px;
  font-weight: 700;
  color: var(--ml-fg, #151515);
}

.st-card-badges {
  margin-top: 6px;
  display: flex;
  gap: 6px;
}

.st-badge {
  display: inline-block;
  padding: 2px 8px;
  font-size: 11px;
  font-weight: 600;
  border-radius: 2px;
  letter-spacing: 0.02em;
}

.st-badge--new { background: #eef6ff; color: #0b6bcb; }
.st-badge--best { background: #fff2e8; color: #c2540a; }
.st-badge--sale { background: #ffecec; color: #d02020; }

/* [2026-09-06] G98 후속: {$new_badge_display} 등 엔진 전용 가짜 변수는 라이브에서
   숨김조건 없이 항상 노출되는 버그였다(템플릿_가이드 §4). 실제 카페24 변수
   {$new_icon}/{$recommend_icon}(product_listmain이 상품별 신상품/추천 플래그가
   꺼지면 빈 문자열, 켜지면 <img> 태그 반환)를 배지 안에 심어 img 유무로
   :has() 표시여부를 판정 — 텍스트 배지 디자인은 유지하면서 실제 플래그와 연동된다. */
.st-badge--new img, .st-badge--best img { display: none; }
.st-badge--new:not(:has(img)), .st-badge--best:not(:has(img)) { display: none; }

/* ---------- section1 히어로 — 실제 배경 영상(2026-08-08, sorce/동영상/soytwo_hero_combined_10s.mp4) ----------
   .st-split-banner와 동일하게 어두운 그라디언트 오버레이로 흰 텍스트 가독성을 확보한다. 텍스트 위치·
   위계(제목→설명→해시태그→버튼)는 기존 와이어프레임 그대로 유지, 배경만 해치 placeholder에서 실제
   <video>로 교체했다. */
.st-hero-video { overflow: hidden; color: #fff; }

/* [2026-09-06] 자체 호스팅 <video>(mp4 업로드 UPLOAD_002 거부)에서 유튜브 iframe 임베드로
   교체하며 fit 방식도 변경. iframe엔 브라우저가 object-fit을 적용해주지 않아 100%/100%로는
   유튜브 플레이어가 내부적으로 16:9 레터박스를 넣어버린다(SOYONE 히어로 캐러셀 G47/
   [[캐러셀]] §4와 동일 함정). 뷰포트 비율과 무관하게 항상 정확한 16:9 박스로 컨테이너를
   뒤덮은 뒤(vw/vh 쌍) scale(1.6)을 더해 하단 채널명 바(고정 픽셀 높이)를 클리핑 영역
   (.st-hero-video의 overflow:hidden) 밖으로 밀어낸다. */
.st-hero-video-el {
  position: absolute;
  top: 50%;
  left: 50%;
  width: 100vw;
  height: 56.25vw; /* 100 * 9/16 */
  min-width: 177.78vh; /* 100 * 16/9 */
  min-height: 100vh;
  transform: translate(-50%, -50%) scale(1.6);
  border: none;
  z-index: 0;
  pointer-events: none;
}

.st-hero-video::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  background: linear-gradient(180deg, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0.45));
}

.st-hero-mute-btn {
  position: absolute;
  right: 24px;
  bottom: 40px;
  z-index: 2;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  border: 1px solid rgba(255, 255, 255, 0.5);
  background: rgba(0, 0, 0, 0.25);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  padding: 0;
}

.st-hero-mute-btn .icon-unmuted { display: none; }
.st-hero-mute-btn.is-unmuted .icon-muted { display: none; }
.st-hero-mute-btn.is-unmuted .icon-unmuted { display: block; }

/* [2026-08-09 재조정, 전달.md] "가장 큰 텍스트 40px로 변경하고 나머지도 그거에 맞춰" — 히어로
   30px·프로모 34px·MD CHOICE 36px로 섹션마다 흩어져 있던 고유값을 없애고 .st-split-title
   기본값(아래, 40px/700) 하나로 통일했다. 이름표/설명은 이미 .st-scale-eyebrow·.st-scale-desc
   공용 클래스로 통일돼 있었다(css/home-sections.css) — MD CHOICE에도 이번에 동일하게 적용.
   좌측 여백(150px)도 아래 .st-split-banner-inner 기본값으로 승격했다(§ 아래 참고). */

/* [2026-08-09] 순차 등장 애니메이션은 css/home-sections.css의 범용 .st-reveal로 통합됨(과거엔
   여기 히어로 전용으로 따로 있었고 §28에서 MD CHOICE에도 거의 동일한 블록을 또 만들었었다) —
   index.html의 .st-split-banner-inner가 .st-reveal 클래스를 갖고, js/section-reveal.js
   (IntersectionObserver)가 트리거를 담당한다. 히어로는 기존 js/hero-video.js의 1회성
   .is-loaded 트리거를 제거하고 이 범용 시스템으로 흡수됨(재진입 시에도 재생되도록 통일). */

/* ---------- 섹션 A: MD CHOICE(좌 캐러셀 + 우 배너). 2026-08-09 이전엔 "이달의 베스트"(COS
   section4) 대응이던 정적 2열 그리드였으나, section4 삭제 후 이 레이아웃(.st-split 등)만 MD CHOICE가
   이어받았다. 캐러셀 자체 스타일은 css/md-choice-carousel.css 참고. ---------- */
.st-split {
  display: grid;
  grid-template-columns: 1fr 1fr;
  min-height: 100vh;
}

/* [2026-08-09, 전달.md] 좌측 padding을 0으로 비움 — 가로 위치는 이제 .st-split-banner-inner
   자신의 padding-left(150px, 히어로 기준 통일값)로만 결정된다. 상/하/우 60px는 유지. */
.st-split-banner {
  position: relative;
  background-size: cover;
  background-position: center;
  display: flex;
  align-items: center;
  padding: 60px 60px 60px 0;
  color: #fff;
}

.st-split-banner::before {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0.45));
}

/* [2026-08-09, 전달.md] "타이포 div자체를 하나의 서식으로 통일" — 히어로(동영상 섹션) 기준
   max-width 420→500px, 좌측 150px 여백을 여기 기본값으로 승격해 히어로/프로모/MD CHOICE
   세 섹션이 전부 이 하나의 규칙만 공유한다(과거엔 섹션마다 #id로 값이 흩어져 있었음). */
.st-split-banner-inner { position: relative; z-index: 1; max-width: 500px; padding-left: 150px; }
.st-split-eyebrow { font-size: 13px; letter-spacing: 0.08em; opacity: 0.85; }
/* [2026-08-09 재조정, 전달.md] "가장 큰 텍스트 40px로 변경하고 나머지도 그거에 맞춰" — 히어로
   30px·프로모 34px·MD CHOICE 36px 세 갈래였던 걸 이 기본값 하나로 통일(더 이상 #id 오버라이드 없음). */
.st-split-title { margin: 12px 0; font-size: 40px; font-weight: 700; letter-spacing: normal; line-height: 1.25; }
.st-split-desc { font-size: 15px; opacity: 0.9; }

/* [2026-09-06, 전달.md] "흔적까지 로 줄바꿈 안되게 텍스트 크기 줄여" — css/grid-sections.css와
   동일 이유로 동일 수정(그 파일이 이 파일보다 나중에 로드되어 캐스케이드에서 이기므로 여기도
   같이 고쳐야 함, 히어로 유튜브 수정과 동일 패턴). */
.st-split-title--tight { font-size: 32px; }

/* [2026-08-09] MD CHOICE 이름표/설명도 이제 다른 섹션과 동일하게 .st-scale-eyebrow·.st-scale-desc
   공용 클래스를 index.html에서 직접 붙여 통일한다(css/home-sections.css) — 여기 전용 #id 규칙은
   제거. max-width 640px 확장(82px 타이틀 대응용)도 40px로 통일되며 더 이상 필요 없어 제거. */

/* [2026-08-09] 텍스트 입장 애니메이션은 css/home-sections.css의 범용 .st-reveal로 통합됨(과거엔
   여기 전용으로 있었다) — index.html의 .st-split-banner-inner가 .st-reveal 클래스를 갖고,
   js/section-reveal.js(IntersectionObserver, 전 섹션 공용)가 트리거를 담당한다. */

.st-split-products {
  padding: 60px;
  display: flex;
  flex-direction: column;
  justify-content: center;
  /* [2026-08-09] MD CHOICE 캐러셀 도입 후 발견: 이 요소가 .st-split(display:grid)의 그리드 아이템
     본인이라, 자동 트랙 최소너비가 이 요소의 min-content(내부 캐러셀의 카드 6장 분, 넓음)를 그대로
     반영해 트랙 자체가 늘어나며 모바일에서 섹션이 가로로 넘쳤다(자식인 .pl-module-wrap에 min-width:0을
     줘도 무효 — 그리드 자동 최소크기는 그리드 아이템 "본인"만 본다). 그리드 아이템 자체에 걸어야 한다. */
  min-width: 0;
}

.st-split-heading { font-size: 26px; font-weight: 700; margin-bottom: 32px; }

/* ---------- 섹션 B: 프로덕트(탭 + 4열 그리드, COS section5 대응) ---------- */
.st-tabbed {
  min-height: 100vh;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  padding: 60px 40px;
  max-width: var(--ml-max-width, 1440px);
  margin: 0 auto;
  width: 100%;
}

/* [2026-08-09] 폰트 크기/굵기/자간은 .st-scale-section-title 공용 클래스(css/home-sections.css,
   상품후기·이벤트뉴스와 완전히 같은 31px/300 값)로 이동, 레이아웃 속성만 여기 유지. */
.st-tabbed-heading { margin-bottom: 24px; text-align: center; }

.st-tabs {
  display: flex;
  gap: 8px;
  margin-bottom: 40px;
}

.st-tab-btn {
  padding: 10px 24px;
  border-radius: 999px;
  border: 1px solid var(--ml-border, #eeeeee);
  background: #fff;
  font-size: 14px;
  font-weight: 600;
  color: var(--ml-muted, #888888);
  cursor: pointer;
}

.st-tab-btn.is-active {
  background: var(--ml-fg, #151515);
  border-color: var(--ml-fg, #151515);
  color: #fff;
}

/* [2026-08-09] "신상품/베스트/세일 이동 시 페이드 효과" — 탭 전환을 순간 전환 대신
   페이드아웃→전환→페이드인으로, 전환 타이밍은 js/grid-tabs.js가 담당. */
.st-tab-panel { display: none; width: 100%; opacity: 1; transition: opacity 0.25s ease; }
.st-tab-panel.is-active { display: block; }

.st-grid-4 {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 24px;
}

.st-tabbed-more {
  margin-top: 40px;
  padding: 12px 32px;
  border-radius: 999px;
  border: 1px solid var(--ml-fg, #151515);
  background: transparent;
  font-size: 14px;
  font-weight: 600;
  text-decoration: none;
  color: var(--ml-fg, #151515);
  transition: background-color 0.2s ease, color 0.2s ease;
}
/* [2026-08-09] "more랑 모두보기" 지시에 맞춘 대응 hover — 이 버튼은 흰 배경 위에 이미
   어두운 테두리/텍스트라 그대로 흰 배경으로 채우면 변화가 안 보인다. .st-btn-outline(어두운
   배경 위 흰 텍스트→흰 배경/검은 텍스트)과 대칭이 되도록 반대로 채워 hover가 뚜렷이 보이게 한다. */
.st-tabbed-more:hover {
  background-color: var(--ml-fg, #151515);
  color: #fff;
  text-decoration: none;
}

@media (max-width: 1023px) {
  .st-grid-4 { grid-template-columns: repeat(3, 1fr); }
}

@media (max-width: 767px) {
  /* [2026-08-09, 전달.md] 좌측 150px 여백도 모바일에선 이 20px 하나로 통일 — 히어로/프로모/
     MD CHOICE 세 섹션이 전부 공유(과거엔 #st-hero 전용이었음). */
  .st-split-banner-inner { padding-left: 20px; }
  .st-split { grid-template-columns: 1fr; min-height: 0; }
  .st-split-banner { padding: 32px 20px 32px 0; min-height: 60vh; }
  .st-split-products { padding: 32px 20px; min-height: 60vh; }
  /* [2026-08-09, 전달.md] 타이틀 모바일 크기도 .st-scale-display 모바일값(28px)과 맞춰 하나로
     통일 — 히어로22/프로모20/MD CHOICE24로 흩어져 있던 #id 오버라이드 제거. */
  .st-split-title { font-size: 28px; }
  .st-grid-4 { grid-template-columns: repeat(2, 1fr); gap: 16px; }
  .st-tabbed { min-height: 0; padding: 40px 20px; }
  .st-card-name { font-size: 13px; }
  .st-card-price { font-size: 13px; }
}

/* ---- css/home-sections.css ---- */
/* SoyTwo 홈 나머지 섹션(2/3/6/7/8/9/10/11/12) — 벤치마크(COS) §1-1 구조 실측 기반, 자체완결 .st- 네임스페이스.
   그리드 섹션(grid-sections.css)과 동일한 스크롤스냅 틀(.ss-section) 안에서 쓰인다. */

.st-section-inner {
  width: 100%;
  max-width: var(--ml-max-width, 1440px);
  margin: 0 auto;
  padding: 60px 40px;
}

.st-eyebrow { font-size: 13px; letter-spacing: 0.08em; color: var(--ml-muted, #888888); }
.st-heading { font-size: 26px; font-weight: 700; margin: 10px 0 8px; }
.st-subtext { font-size: 15px; color: var(--ml-muted, #888888); }

/* ---------- 공용 타이포 스케일(2026-08-09 리팩터) ----------
   사용자 지적: "같은 타이포는 하나의 서식으로 잡아야 나중에 수정이 쉽지" — §33에서 벤치마크
   실측치를 섹션마다 #id 스코프로 따로따로 박아뒀던 걸(특히 값이 실제로 겹치거나 1~2px 오차
   범위인 것들), 하나의 공용 클래스로 묶어 나중엔 여기 한 곳만 고치면 되게 정리했다. 값이
   뚜렷이 다른 것(MD CHOICE 82px, 프로모 72px/400굵기, 히어로 56px)까지 억지로 합치진
   않는다 — "실측상 사실상 같은 값"만 통합 대상. 적용은 index.html에서 기존
   .st-heading/.st-eyebrow/.st-subtext에 이 클래스를 추가로 붙이는 방식(HTML의 의미 클래스는
   유지, 크기만 이 스케일이 오버라이드). */
/* [2026-08-09 재조정] "텍스트 더 줄여, 큰 타이포가 40이 되게" — 벤치마크 실측 스케일(§33)이
   전반적으로 너무 크다는 지적으로 전체 스케일을 축소, 최대값(.st-scale-display)을 40px로 캡.
   공용 클래스 리팩터(§35) 덕분에 여기 숫자만 고치면 전 섹션에 일괄 반영된다. */
.st-scale-display { font-size: 40px; font-weight: 700; letter-spacing: normal; line-height: 1.25; }
.st-scale-title-lg { font-size: 32px; font-weight: 700; letter-spacing: normal; }
.st-scale-section-title { font-size: 22px; font-weight: 300; letter-spacing: 0.05em; }
.st-scale-eyebrow { font-size: 14px; font-weight: 300; letter-spacing: 0.02em; opacity: 1; }
.st-scale-desc { font-size: 16px; font-weight: 300; letter-spacing: 0.02em; line-height: 1.6; opacity: 1; }

/* ---------- 섹션 입장/이탈 애니메이션(범용, 2026-08-09) ----------
   전달.md: "이 섹션(MD CHOICE) 말고 전체 섹션들 타이포와 애니메이션 적용, 벤치사이트 확인해서
   적용해" — §28~30에서 MD CHOICE 하나에만 만들었던 순차 fade-up 패턴(히어로 .st-hero-video와도
   중복 구현돼 있었음)을 .st-reveal 하나로 통합해 전 섹션이 공유한다. js/section-reveal.js가
   IntersectionObserver로 .st-reveal 요소가 화면에 50% 이상 보일 때 .is-active를 붙이고, 벗어나면
   뗀다(스크롤스냅으로 반복 진입해도 매번 리셋·재생) — section2(프로모 슬라이더)만 예외로
   js/promo-slider.js가 슬라이드 전환 시점에 직접 토글한다(이미 화면에 계속 보이는 상태라
   IntersectionObserver로는 전환을 감지할 수 없기 때문). */
.st-reveal > * {
  opacity: 0;
  transform: translateY(30px);
  transition: opacity 0.7s cubic-bezier(0.16, 1, 0.3, 1), transform 0.7s cubic-bezier(0.16, 1, 0.3, 1);
}
.st-reveal > *:nth-child(1) { transition-delay: 0.1s; }
.st-reveal > *:nth-child(2) { transition-delay: 0.25s; }
.st-reveal > *:nth-child(3) { transition-delay: 0.4s; }
.st-reveal > *:nth-child(4) { transition-delay: 0.55s; }
.st-reveal > *:nth-child(5) { transition-delay: 0.7s; }
.st-reveal.is-active > * {
  opacity: 1;
  transform: translateY(0);
}

/* ---------- section2: 풀블리드 페이드 슬라이더(5장) — 2026-08-08 재실측(swiper-container-fade),
   2026-08-09 와이어프레임(.st-bg-placeholder) 해치 대신 실제 이미지(SD 생성, "신상품 시즌 아이템")로
   교체하며 5장으로 확장. background-size/position과 어두운 그라디언트 오버레이(흰 텍스트 가독성용,
   .st-split-banner::before와 동일한 패턴)를 이때 함께 추가했다 — 이전엔 .st-bg-placeholder의 해치
   패턴이 어두운 배경 역할까지 겸했어서 별도 오버레이가 없어도 텍스트가 보였다. ---------- */
/* [2026-08-09] min-height:100vh 추가 — 실제 배경이미지 도입 전엔 안 드러났던 잠재 버그를 발견:
   .st-slide는 전부 position:absolute(내용 없이 인셋만)라 .st-slider 자신의 auto-height 계산에
   전혀 기여하지 못하고, 유일하게 높이를 만들던 건 .is-active가 position:relative로 바뀌며 참여하던
   "텍스트 콘텐츠 자체의 높이"(패딩+글자, 배경이미지는 박스 크기에 영향 없음)뿐이었다 — 와이어프레임
   해치 시절엔 그 좁은 밴드가 크게 티 안 났지만, 실사진을 넣자 위아래 여백과 함께 사진이 잘려 보이는
   문제로 명확히 드러났다. 컨테이너에 명시적 높이를 줘 근본 해결. */
.st-slider { position: relative; overflow: hidden; min-height: 100vh; }

/* [2026-08-09, 전달.md] 좌측 padding을 0으로 비움 — 가로 위치는 .st-split-banner-inner 자신의
   padding-left(150px, 히어로 기준 통일값, css/grid-sections.css)로만 결정된다. */
.st-slide {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  padding: 60px 60px 60px 0;
  color: #fff;
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.5s ease;
  background-size: cover;
  background-position: center;
}

.st-slide::before {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(90deg, rgba(0, 0, 0, 0.55) 0%, rgba(0, 0, 0, 0.25) 45%, rgba(0, 0, 0, 0) 70%);
}

.st-slide.is-active { opacity: 1; pointer-events: auto; }

/* [2026-08-09, 전달.md] "타이포 div자체를 하나의 서식으로 통일" — 벤치마크 실측 고유값(타이틀
   34px/400, 설명 17px)을 버리고 .st-split-title 기본값(40px/700, css/grid-sections.css)과
   .st-scale-desc(css/home-sections.css 상단) 공용 클래스로 히어로·MD CHOICE와 통일한다.
   이름표/설명은 index.html에서 .st-scale-eyebrow/.st-scale-desc 클래스를 직접 붙여 처리. */

/* [2026-08-09, 전달.md] "화살표는 이 모양에 투명50% 적용하고 그라데이션 적용해서 좌우 버튼으로
   넣어" — 원형+텍스트문자(‹›) 대신 참조 이미지와 동일한 둥근 사각형+SVG 셰브런 아이콘으로 교체,
   배경은 그라데이션에 50% 불투명도. "지금 좌우 화살표 마우스 오버에만 나오게" — 호버 가능한
   포인터 환경(hover:hover, 데스크톱)에서만 기본 숨김 처리하고 .st-slider:hover 시에만 노출한다
   (터치 기기는 hover 자체가 없어 그 매체쿼리 밖에 있으므로 원래대로 항상 보임 — 안 그러면 모바일
   에서 화살표를 아예 못 쓰게 됨). */
.st-slide-arrow {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  z-index: 3;
  width: 44px;
  height: 44px;
  border-radius: 10px;
  border: none;
  background: linear-gradient(135deg, rgba(20, 20, 20, 0.85), rgba(20, 20, 20, 0.35));
  opacity: 0.5;
  color: #fff;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: opacity 0.2s ease;
}

.st-slide-arrow:hover { opacity: 0.85; }
.st-slide-arrow svg { width: 20px; height: 20px; }

/* [2026-08-09] "화살표를 좀더 안쪽으로" — 가장자리(24px)에서 더 안쪽(64px)으로 이동. */
.st-slide-prev { left: 64px; }
.st-slide-prev svg { transform: rotate(-90deg); }
.st-slide-next { right: 64px; }
.st-slide-next svg { transform: rotate(90deg); }

@media (hover: hover) and (pointer: fine) {
  .st-slide-arrow { opacity: 0; }
  .st-slider:hover .st-slide-arrow { opacity: 0.5; }
  .st-slider:hover .st-slide-arrow:hover { opacity: 0.85; }
}

/* [2026-08-09, 전달.md] "섹션2 캐러셀은 이런 형태로 만들어 도트 말고" — 참조 이미지(1/5 ‹ ❚❚ ›)
   대로 점 대신 카운터+미니 컨트롤(이전/일시정지·재생/다음)로 교체. */
.st-slide-controls {
  position: absolute;
  bottom: 24px;
  left: 50%;
  transform: translateX(-50%);
  z-index: 3;
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 6px 14px;
  border-radius: 999px;
  background: rgba(0, 0, 0, 0.25);
  color: #fff;
  font-size: 13px;
  letter-spacing: 0.02em;
}

.st-slide-counter { font-variant-numeric: tabular-nums; opacity: 0.9; }

.st-slide-ctrl {
  border: none;
  background: none;
  padding: 0;
  color: #fff;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 16px;
  line-height: 1;
  opacity: 0.85;
}

.st-slide-ctrl:hover { opacity: 1; }
.st-slide-ctrl-toggle { font-size: 10px; }

/* ---------- section3: MD추천(이미지 + 해시태그 캡션) ---------- */
.st-md-choice {
  position: relative;
  min-height: 100vh;
  display: flex;
  align-items: flex-end;
  padding: 60px;
  color: #fff;
  background-size: cover;
  background-position: center;
}

.st-md-choice::before {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(0deg, rgba(0, 0, 0, 0.55), rgba(0, 0, 0, 0.05) 60%);
}

.st-md-choice-inner { position: relative; z-index: 1; }
.st-md-choice .st-eyebrow { color: rgba(255, 255, 255, 0.85); }
.st-md-choice .st-heading { color: #fff; }

/* [2026-08-09] section6·7 제목 타이포는 .st-scale-section-title 공용 클래스(위)로 이동 —
   product-tabs(§below)와 완전히 같은 31px/300 값이라 index.html에서 클래스만 추가. */

/* ---------- section6: 상품후기(4카드) / section7: 이벤트뉴스(3카드) 공용 카드형 그리드 ---------- */
.st-feature-grid { margin-top: 32px; display: grid; gap: 24px; }
.st-feature-grid--4 { grid-template-columns: repeat(4, 1fr); }
.st-feature-grid--3 { grid-template-columns: repeat(3, 1fr); }

.st-feature-card { display: block; text-decoration: none; color: inherit; }
.st-feature-thumb { aspect-ratio: 4 / 3; border-radius: 6px; overflow: hidden; background: #f4f2ef; }
.st-feature-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.st-feature-title { margin-top: 14px; font-size: 15px; font-weight: 600; }
.st-feature-desc { margin-top: 4px; font-size: 13px; color: var(--ml-muted, #888888); }
.st-feature-stars { margin-top: 8px; color: #e8a33d; font-size: 13px; letter-spacing: 1px; }
.st-feature-stars img { height: 13px; width: auto; }
/* section6(상품후기) board_list_4 위젯 전용 — 썸네일 래퍼 없이 이미지 자체에 비율을 주고,
   제목은 이미지 아래 별도 텍스트로 노출한다(2026-08-12 재실측: div+data-ez-role 조합이
   문제였고 순수 span은 정상 치환됨, [[카페24-프레임워크]] G70 정정 예정). */
/* [2026-09-06] 실측 발견(대표님 지적 "상품후기부터 이벤트 쪽까지 풀프레임 안돼") —
   히어로/프로모/MD초이스/탭/타임세일/더블배너는 각자 min-height:100vh 규칙이 있는데
   상품후기(#st-reviews)·이벤트뉴스(#st-event-news)·인스타그램(#st-instagram) 3곳만
   그 규칙 자체가 애초에 없어서 콘텐츠 높이만큼만 나오고 있었다(라이브 skin1 대조:
   9섹션 전부 900px 동일). 나머지 6개와 동일하게 맞춘다. */
#st-reviews, #st-event-news, #st-instagram { min-height: 100vh; }
/* [2026-09-06] 실측 발견(대표님 지적 "인스타 뒷 배경색") — .main_map(그릇 네이티브 클래스)의
   기본 background-color:#7f7f7f(회색, 105행)가 그대로 남아 "인스타그램" 텍스트가 거의 안
   보일 만큼 대비가 낮았다. 라이브 대표 스킨(skin1) 대조 결과 이 섹션은 배경이 투명(흰 바탕
   그대로)이어야 한다. */
#st-instagram { background-color: transparent; }
/* [2026-09-06] 실측 발견(대표님 지적 "풀프레임 적용하라고 왜 로컬이랑 다른데") — 데스크톱
   (add_layout.css `@media min-width:1024px` 안의 `#contents > .section{width:100%}`)만
   고치고 모바일은 놓쳤다. 진짜 근본원인은 `.main_product_list`/`.main_text`(그릇 네이티브
   클래스, 각각 18행·42행)가 **미디어쿼리 없이 항상** `width:92%`를 갖고 있는 것 —
   `.main_video`/`.main_map`은 이미 `width:100% !important`라 문제 없었지만, product_list/
   text 타입을 쓰는 md-choice·product-tabs·reviews·event-news·timesale 5곳만 전 뷰포트에서
   359px(390px 모바일 기준 좌우 16px 인셋)로 좁아져 있었다(라이브 skin1은 모바일도 5곳 전부
   390px). ID 지정으로 뷰포트 무관하게 100% 강제. */
#st-md-choice, #st-product-tabs, #st-reviews, #st-event-news, #st-timesale { width: 100% !important; max-width: 100% !important; margin-left: 0; margin-right: 0; }
#st-reviews .st-feature-card { display: block; }
#st-reviews .st-feature-card img { width: 100%; aspect-ratio: 4 / 3; border-radius: 6px; object-fit: cover; display: block; background: #f4f2ef; }
#st-reviews .st-feature-title { display: block; margin-top: 14px; font-size: 15px; font-weight: 600; }

/* ---------- section8: 인스타그램(2x3 그리드 + 좌측 텍스트) ---------- */
.st-insta {
  display: grid;
  grid-template-columns: 1fr 1.3fr;
  gap: 40px;
  align-items: center;
}

.st-insta-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; }
.st-insta-grid a { display: block; aspect-ratio: 1 / 1; overflow: hidden; border-radius: 4px; }
.st-insta-grid img { width: 100%; height: 100%; object-fit: cover; display: block; }
/* [2026-08-09] "인스타그램" 제목은 .st-scale-title-lg 공용 클래스(위, 더블배너와 공유 —
   실측 64px/66px가 2px 오차라 65px 하나로 통합)로 이동. @handle은 색상이 브랜드 포인트컬러라
   고유 역할이라 여기 유지, 크기만 실측(28px/300, 기존 16px/600보다 훨씬 컸다)으로 갱신. */
.st-insta-handle { margin-top: 10px; font-size: 18px; font-weight: 300; color: var(--ml-accent, #b63535); }

/* ---------- section9: 타임세일 카운트다운 ---------- */
/* [2026-08-09, 전달.md] 실사진 배경(index.html 인라인 style) 적용 — 어두운 그라디언트는
   이미지 로드 실패 시 폴백 색상으로 유지. .st-hero-video/.st-split-banner와 동일하게
   ::before 다크 오버레이로 흰 텍스트 가독성을 보강한다. */
.st-timesale {
  position: relative;
  min-height: 100vh;
  display: flex;
  align-items: center;
  padding: 60px;
  color: #fff;
  background-color: #2a2a2a;
  background-size: cover;
  background-position: center;
}

.st-timesale::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  background: linear-gradient(90deg, rgba(0, 0, 0, 0.55) 0%, rgba(0, 0, 0, 0.25) 45%, rgba(0, 0, 0, 0) 75%);
}

.st-timesale .st-section-inner { position: relative; z-index: 1; }

.st-timesale-countdown { font-size: 40px; font-weight: 700; margin: 14px 0; font-variant-numeric: tabular-nums; }
/* [2026-08-09] 이름표는 .st-scale-eyebrow 공용 클래스로 이동(18px, 다른 섹션들과 완전히 동일).
   설명(25px)은 다른 섹션들의 desc(30px)보다 뚜렷이 작아 — 어두운 카운트다운 배경의 좁은 여백에
   맞춘 의도적 축소로 보고 통합하지 않음, 고유값 유지. */
#st-timesale .st-subtext { font-size: 15px; font-weight: 300; line-height: 1.6; }

/* ---------- section10: 회사소개(단일 배너) ---------- */
.st-company-banner {
  min-height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  color: #fff;
  background: linear-gradient(135deg, #3d3d3d, #1a1a1a);
  padding: 60px;
}
/* [2026-08-09] 제목/이름표/설명 전부 .st-scale-display·.st-scale-eyebrow·.st-scale-desc 공용
   클래스로 이동(유튜브 배너와 완전히 같은 값 — 90/19≈18/30). */

/* ---------- section11: 더블배너(문의/생산, 좌우 반반) ---------- */
.st-double-banner { display: grid; grid-template-columns: 1fr 1fr; min-height: 100vh; }
.st-double-banner-half {
  display: flex;
  align-items: flex-end;
  padding: 56px;
  color: #fff;
  background-size: cover;
  background-position: center;
  position: relative;
}
.st-double-banner-half::before { content: ""; position: absolute; inset: 0; background: rgba(0, 0, 0, 0.35); }
.st-double-banner-half > * { position: relative; z-index: 1; }
/* [2026-08-09] 제목/이름표/설명 전부 공용 클래스로 이동(제목=.st-scale-title-lg, 인스타와 공유
   /이름표=.st-scale-eyebrow, 17px 실측이었으나 1px 오차라 통합/설명=.st-scale-desc, 29px 실측이나
   1px 오차라 통합). */

/* ---------- section12: 유튜브 배너 ---------- */
.st-youtube-banner {
  min-height: 100vh;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 20px;
  color: #fff;
  background: linear-gradient(135deg, #24312b, #4c6357);
  text-align: center;
  padding: 60px;
}
/* [2026-08-09] 제목/이름표/설명 전부 공용 클래스로 이동(회사소개와 완전히 같은 값). */

.st-play-btn {
  width: 64px;
  height: 64px;
  border-radius: 50%;
  background: #fff;
  color: #111;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 22px;
  text-decoration: none;
}

.st-btn-outline {
  display: inline-block;
  margin-top: 20px;
  padding: 12px 32px;
  border-radius: 999px;
  border: 1px solid currentColor;
  text-decoration: none;
  color: inherit;
  font-size: 14px;
  font-weight: 600;
  transition: background-color 0.2s ease, color 0.2s ease;
}
/* [2026-08-09] "more랑 모두보기를 마우스오버하면 텍스트에만 롤오버(공용 a:hover 밑줄, common.css)
   걸리는데 박스 배경이 흰색으로, MORE가 검은색 텍스트로 변경되게해" — 대부분 인스턴스가
   `style="color:#fff"` 인라인을 갖고 있어(index.html) hover 색상 변경이 특이도에서 밀리므로
   !important로 확실히 이긴다. */
/* [2026-08-11, 전달.md] "배너... 모바일에서 기본 마우스 오버상태 해제" — 모바일 탭 시
   hover가 안 풀려 흰 배경/검정 글자로 뒤집힌 채 고정되던 문제, hover 가능한 환경으로 한정. */
@media (hover: hover) and (pointer: fine) {
  .st-btn-outline:hover {
    background-color: #fff !important;
    color: #151515 !important;
    text-decoration: none;
  }
}

@media (max-width: 1023px) {
  .st-feature-grid--4 { grid-template-columns: repeat(2, 1fr); }
  .st-insta { grid-template-columns: 1fr; }
}

@media (max-width: 767px) {
  .st-section-inner { padding: 32px 20px; }
  .st-slider { min-height: 70vh; }
  .st-slide { padding: 32px 20px 32px 0; }
  .st-slide-arrow { width: 36px; height: 36px; }
  .st-feature-grid--4 { grid-template-columns: repeat(2, 1fr); gap: 14px; }
  .st-feature-grid--3 { grid-template-columns: 1fr; gap: 14px; }
  .st-insta-grid { grid-template-columns: repeat(3, 1fr); }
  .st-double-banner { grid-template-columns: 1fr; min-height: 0; }
  .st-double-banner-half { min-height: 60vh; padding: 32px 20px; }
  .st-md-choice, .st-timesale, .st-company-banner, .st-youtube-banner { min-height: 0; padding: 48px 20px; }
  .st-timesale-countdown { font-size: 28px; }

  /* [2026-08-09] 데스크톱 실측 타이포(위 공용 스케일 클래스 + 섹션별 고유값)를 모바일에도
     그대로 두면 390px 폭에서 줄바꿈이 심하게 깨진다 — MD CHOICE(§30, 82px→45px, 약 55% 축소)에서
     검증된 비율을 동일하게 적용(개별 벤치마크 모바일 재실측은 비용 대비 이득이 낮다고 판단).
     공용 스케일 클래스는 여기 한 번만 축소하면 그 클래스를 쓰는 모든 섹션에 일괄 반영된다. */
  .st-scale-display { font-size: 28px; }
  .st-scale-title-lg { font-size: 24px; }
  .st-scale-section-title { font-size: 18px; }
  .st-scale-eyebrow { font-size: 12px; }
  .st-scale-desc { font-size: 14px; }

  /* [2026-08-09, 전달.md] 히어로/프로모 타이틀은 이제 .st-split-title 공용 모바일값(28px,
     css/grid-sections.css)으로 통일 — #id 개별 축소 불필요. */
  .st-insta-handle { font-size: 14px; }
  #st-timesale .st-subtext { font-size: 13px; }
}

/* ---- css/md-choice-carousel.css ---- */
/* SoyTwo section3 "MD CHOICE" 캐러셀 — 벤치마크(COS PTMD539896) MONTH BEST 실측 이식.
   2026-08-09, 전달.md 지시: "MONTH BEST 삭제 + 그 캐러셀·마우스오버 이벤트를 MD CHOICE로" 처리.
   Playwright로 뽑은 실제 규칙(.ec-base-product .prdList .thumbnail .icon{opacity:0;bottom:-10px;
   transition:.5s} → :hover{opacity:1;bottom:10px})을 우리 카드(.st-card) 구조에 맞게 이식했다.
   모든 규칙을 #st-md-choice로 스코프해 section5(.st-grid-4) 등 다른 카드에는 영향을 주지 않는다. */

/* [2026-08-09] .st-split-products는 display:flex;flex-direction:column(그리드-섹션.css)이라
   .pl-module-wrap(캐러셀을 감싸는 block 자식)이 그 열 방향 flex item이 된다 — 기본 자동 최소너비가
   내부 캐러셀의 min-content(카드 6장분, ~1150px)를 그대로 반영해버려 모바일에서 섹션 전체가
   가로로 넘쳤다(overflow:hidden인 .st-mdc-viewport로도 못 막음 — 조상의 자동 최소크기 계산은
   overflow와 무관하게 먼저 일어남). min-width:0으로 그 전파를 끊는다. */
#st-md-choice .pl-module-wrap {
  min-width: 0;
}

#st-md-choice .st-mdc-carousel {
  position: relative;
  display: flex;
  align-items: center;
  gap: 12px;
}

#st-md-choice .st-mdc-viewport {
  overflow: hidden;
  flex: 1;
  min-width: 0;
}

#st-md-choice .st-mdc-track {
  position: relative; /* 자식 li의 offsetLeft를 track 기준으로 재도록(js/md-choice-carousel.js) */
  display: flex;
  gap: 28px;
  transition: transform 0.45s ease;
}

#st-md-choice .st-mdc-slide {
  flex: 0 0 calc((100% - 28px) / 2);
  min-width: 0;
}

#st-md-choice .st-mdc-arrow {
  flex: 0 0 auto;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  border: 1px solid var(--ml-border, #eeeeee);
  background: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--ml-fg, #151515);
  cursor: pointer;
}
#st-md-choice .st-mdc-arrow svg { width: 18px; height: 18px; }

#st-md-choice .st-mdc-dots {
  margin-top: 24px;
  display: flex;
  gap: 8px;
}

#st-md-choice .st-mdc-dot {
  width: 8px;
  height: 8px;
  border-radius: 999px;
  border: none;
  padding: 0;
  background: var(--ml-border, #e0ddd8);
  cursor: pointer;
  transition: width 0.3s ease, background 0.3s ease;
}
#st-md-choice .st-mdc-dot.is-active {
  width: 22px;
  background: var(--ml-fg, #151515);
}

/* ---------- 마우스오버 이벤트(벤치마크 실측 이식: 이미지 확대 + 하트 아이콘 등장) ---------- */
#st-md-choice .st-card-thumb img {
  transition: transform 0.4s ease;
}
/* [2026-08-11, 전달.md] "상품들 모바일에서 기본 마우스 오버상태 해제" — 모바일 탭 시
   hover가 안 풀려 이미지가 확대된 채 고정되던 문제, hover 가능한 환경으로 한정. */
@media (hover: hover) and (pointer: fine) {
  #st-md-choice .st-card:hover .st-card-thumb img {
    transform: scale(1.05);
  }
}

#st-md-choice .st-card-like {
  position: absolute;
  right: 10px;
  bottom: -10px;
  width: 32px;
  height: 32px;
  border-radius: 50%;
  background: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--ml-fg, #151515);
  opacity: 0;
  transition: 0.5s;
  cursor: pointer;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);
}
#st-md-choice .st-card-like svg { width: 16px; height: 16px; }
#st-md-choice .st-card:hover .st-card-like { opacity: 1; bottom: 10px; }
#st-md-choice .st-card-like[data-liked="true"] { color: #d02020; }
#st-md-choice .st-card-like[data-liked="true"] svg { fill: currentColor; }

/* [2026-08-11, 전달.md] "좋아요 위 장바구니 담기 추가" — 찜 아이콘과 동일 구조, 42px(아이콘
   32px+여백 10px) 위에 쌓는다. */
#st-md-choice .st-card-cart {
  position: absolute;
  right: 10px;
  bottom: 32px;
  width: 32px;
  height: 32px;
  border-radius: 50%;
  background: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--ml-fg, #151515);
  opacity: 0;
  transition: 0.5s;
  cursor: pointer;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);
}
#st-md-choice .st-card-cart svg { width: 16px; height: 16px; }
#st-md-choice .st-card:hover .st-card-cart { opacity: 1; bottom: 52px; }
#st-md-choice .st-card-cart[data-added="true"] { background: #151515; color: #fff; }

/* [2026-08-11, 전달.md] "MD초이스는 모바일에서 좋아요랑 찜 나오는게 디폴트야? 소이원처럼
   한번 클릭하면 나오게 하라니까" — 위에서 상시 노출시켰던 걸 되돌린다. 소이원(skin01)의
   실제 카페24 순정 상품목록(`.thumbnail .icon`, Tier C 무변형)과 동일하게 `:hover`를
   그대로 두면, 모바일 브라우저 기본 동작(링크를 첫 탭하면 :hover만 걸리고 바로 이동하지
   않음 — 두 번째 탭이나 아이콘 자체를 탭해야 실제 동작)에 의해 자연히 "한 번 탭하면
   나온다"가 된다. 별도 JS 없이 강제 노출 미디어쿼리만 제거하면 됨 — 이미지 확대(§60-②)처럼
   가려야 하는 부작용이 아니라 여기선 그 네이티브 동작 자체가 원하는 결과다. */
@media (max-width: 767px) {
  #st-md-choice .st-mdc-slide { flex: 0 0 calc((100% - 16px) / 2); }
  #st-md-choice .st-mdc-track { gap: 16px; }
  #st-md-choice .st-mdc-arrow { width: 32px; height: 32px; }
}

/* 2026-09-05: index.html 인라인 <style> 태그가 EZ 섹션 파싱 오류("알 수 없는 오류가
   발생했어요")를 유발할 수 있어 이 파일로 이전(라이브 실측 조사 중, 인과관계 확정 전
   예방적 조치). 스크롤스냅+.ss-section 세로중앙정렬. */
html{scroll-snap-type:y mandatory;}
#contents > section{scroll-snap-align:start;}
.ss-section{position:relative;display:flex;flex-direction:column;justify-content:center;}
/* [2026-09-06] 실측 발견(대표님 지적 "캐러셀과 밑에 섹션 사이의 의미없는 공백") — 그릇으로
   재활용한 카페24 순정 위젯 클래스(.main_product_list/.main_video/.main_text/.main_map)가
   원래 "베이스 뷰티" 템플릿의 기본 스택형(스크롤스냅 아닌) 레이아웃용으로 갖고 있던
   `margin:0 auto 120px`을 그대로 물려받아, 100vh 풀스크린 스크롤스냅 섹션 사이에 불필요한
   120px 공백을 만들고 있었다(hero/md-choice/product-tabs/reviews/event-news/instagram/
   timesale 7곳, image-gallery로 새로 만든 promo/double-banner는 이 클래스가 없어 멀쩡했음).
   라이브 대표 스킨(skin1) 실측 대조 결과 9섹션 전부 margin-bottom:0으로 완전히 맞닿아 있어
   그대로 일치시킨다. */
#contents > section.ss-section{margin-bottom:0;}
/* [2026-09-06] 실측 발견(대표님 지적, G100 재조사) — 1차 진단 정정: 처음엔 이 상쇄마진
   자체가 원인/불필요하다고 판단해 제거했었는데, 그러면 #container{padding-top:96px}에
   밀려 히어로가 뷰포트 맨 위(0)가 아니라 96px 아래서 시작해 헤더 뒤로 이어지지 않는
   흰 여백이 새로 생겼다(재확인으로 발견, 되돌림). 라이브 대표 스킨(skin_code=skin1)을
   DOM 계층까지 대조한 결과, 거기도 정확히 이만큼의 오프셋을 갖고 있었다 — 다만
   섹션 각각이 아니라 전체를 감싸는 `#ss-container{margin-top:-96px}` 래퍼(2026-09-05
   G94가 EZ 그릇 인식을 깨서 우리 스킨에서는 제거한 그 래퍼)가 한 번에 상쇄하고 있었다.
   그 래퍼를 다시 들이는 건 G94 회귀 위험이 크므로, 대신 우리 쪽은 히어로 섹션 하나에만
   동일한 상쇄값을 되돌려 같은 시각 결과를 낸다. **진짜 버그는 상쇄마진이 아니라
   애초에 히어로에 min-height:100vh가 없던 것**(.st-slider가 이미 겪고 고친 것과 동일
   계열, 3669행 주석 참고) — 그것만 추가하고 상쇄마진은 원래대로 유지한다. */
#st-hero{margin-top:calc(var(--hd-h) * -1);}
.st-hero-video{min-height:100vh;}
/* [2026-09-06] 실측 발견(대표님 재지적 "섹션별 고정도 안되고 메뉴랑 캐러셀 사이 떨어져 있어") —
   G100과 동일한 파일(`layout/basic/css/layout.css` 272행, "우리가 직접 @css() 안 하지만 다른
   순정 템플릿 파일이 참조해 번들엔 들어오는" 그 파일)의 세 번째 캐스케이드 충돌.
   `#wrap{overflow:hidden}`(구버전 2단 레이아웃 클리어픽스 잔재)이 `html{scroll-snap-type:y
   mandatory}`와 스냅 대상 섹션(`#contents > section`) 사이 조상에 끼어 있으면, 크로미움이
   scroll-snap-align 계산 자체를 무효화해 스냅이 전혀 동작하지 않는다(휠/PageDown 모두 스냅
   경계로 안착 안 하고 원시 델타만큼 이동 — 최소재현 HTML로 overflow:hidden↔visible 전환만
   바꿔 실측 확정, #wrap 자신은 높이가 콘텐츠에 맞춰 자동 확장돼 실제 클리핑은 안 일어나는데도
   스냅만 깨짐). 스냅이 깨지면 사용자의 실제 스크롤이 0/900/1800... 경계가 아닌 임의의
   중간값(예: 240px)에서 멈추고, 그 지점에선 `#st-hero{margin-top:-96px}` 상쇄마진이 더 이상
   고정헤더와 안 맞아떨어져 헤더와 히어로 사이에 흰 여백이 노출된다 — "메뉴랑 캐러셀 사이
   떨어져 있어" 제보는 스냅 버그의 증상이지 별개 버그가 아니었다. */
#wrap{overflow:visible !important;}

/* [2026-09-06, "조사해" 후속] 위 스냅 수정 후에도 첫 스크롤 시 #container 높이가
   8100→8572px(+472)로 한 번 튀는 리플로우가 남아있어 재조사. CDP DOMDebugger로
   `#contents`의 style 속성이 바뀌는 순간의 콜스택을 직접 잡아 `layout/basic/js/layout.js`의
   `fixedHeader()`가 범인임을 확정 — 이 함수는 2026-08-09에 이미 "우리 헤더는 항상 fixed라
   marginTop 보정이 불필요"로 판단해 marginTop 대입 코드를 지웠는데(파일 자체를 직접 열면
   실제로 지워져 있음), layout.html 경유로만 참조되는 파일이라 **라이브 JS 번들에는 그 수정
   이전의 옛 코드가 캐시돼 있었다**(`optimizer_user.php` 번들 원문에서 직접 확인:
   `fixed_margin.style.marginTop = header.scrollHeight+'px'`). index.html에 이 파일 직접
   `@js()` 참조를 추가해 페이지 자체 번들 재계산을 유도했으나(G95/G99/G100과 동일 처방)
   번들의 `k=` 해시는 바뀌었는데도 해당 함수 내용 자체는 여전히 stale — 즉 카페24가 개별
   소스파일 단위로도 별도 캐시를 갖고 있어 "페이지 직접 참조" 처방이 이번엔 안 먹혔다.
   원인 파일의 캐시를 쫓는 대신(G99가 이미 "새 파일 대신 안정적으로 번들되는 기존 파일에
   병기" 처방을 확정한 것과 동일 원리), 이미 안정적으로 라이브에 반영되는 이 파일(main.css)에
   `!important` 오버라이드로 그 부작용만 무력화한다 — 인라인 스타일이라도 스타일시트의
   `!important` 선언이 우선한다(CSS cascade importance tier가 inline보다 위). */
#contents{margin-top:0 !important;}

/* [2026-09-06, 전달.md] "서브페이지 좌우 마진 실서버 보고 적용해" — 카페24 네이티브 Tier B/C
   위젯(.ec-base-product 등, product/list.html 등)이 순정 좌우 여백(43px/PC, 12px/모바일)만
   가진 채로 렌더돼 홈 콘텐츠 폭(--ml-content-width:1115px, .container 클래스가 헤더에서 쓰는
   기준과 동일)보다 훨씬 좁게(거의 풀블리드) 보이는 문제. 홈은 파일 최상단의 전역 규칙
   `#contents{width:100% !important;max-width:100% !important;}`(풀블리드 스크롤스냅 섹션에
   필수)을 그대로 둬야 하므로 그 규칙 자체는 건드리지 않고, 서브페이지에서만 더 구체적인
   셀렉터+!important로 덮어써 가운데 정렬한다. 히어로(#st-hero)를 가진 홈은 `:not(:has())`로
   자동 제외 — #45px 패딩 규칙(§ 위 SoyThree 사례)과 동일한 셀렉터 패턴. */
#container #contents:not(:has(#st-hero)) {
  max-width: var(--ml-content-width) !important;
  margin-left: auto !important;
  margin-right: auto !important;
}


/* [2026-09-06, G103] product/list.html·product/search.html·supply/index.html이 각자
   <!--@css(/css/best-items.css)-->·<!--@css(/css/module/product/listnormal.css)-->로
   참조하지만, 라이브 카페24 optimizer_user.php 번들에는 두 파일의 클래스(.pl-info/
   .bi-price/.pl-thumb 등)가 전혀 포함되지 않음을 curl로 확인(G95/G99/G100과 동일 계열
   결함 — layout.html 경유가 아니라 이번엔 파일 자체 @css() 참조인데도 누락, 카페24
   옵티마이저가 특정 신규 파일을 통째로 빠뜨리는 사례가 반복됨). 그 결과 listnormal.css
   자체 주석에 이미 기록된 스톡 ec-base-product.css의 '.prdList{font-size:0;line-height:0}'
   상속 버그가 라이브에서 그대로 재현되어 상품명/가격 줄 높이가 0으로 찌그러져 서로
   겹쳐 보였다(대표님 스크린샷으로 재발견, cate_no=24 실측). G95/G99와 동일 처방 —
   이미 안정적으로 번들되는 이 파일(main.css)에 두 파일 전체를 병합한다.
   원본 파일은 로컬 렌더링·문서 목적으로 그대로 유지. */
    /* --- [COMPONENT] 5. Best Items (bi-) --- */
    #od-best-items {
      padding: 60px 0;
      background: #fff;
    }

    .bi-title-area {
      text-align: center;
      margin-bottom: 60px;
    }

    .bi-title-area h2 {
      font-size: 32px;
      font-weight: 900;
      letter-spacing: 0.1em;
      text-transform: uppercase;
      margin-bottom: 12px;
    }

    .bi-title-area p {
      font-size: 15px;
      color: var(--ml-muted);
    }

    .bi-viewport-container {
      position: relative;
    }

    .bi-viewport {
      overflow: hidden;
      margin: 0 -10px;
      padding: 0 10px;
    }

    .bi-track {
      display: flex;
      counter-reset: bi-rank;
      transition: transform 0.6s cubic-bezier(0.25, 1, 0.5, 1);
    }

    .bi-slide {
      flex: 0 0 calc(25% - 20px);
      /* [텍스트 오버플로우 방지] flex 아이템은 기본 min-width:auto 라, 안에
         공백 없는 긴 텍스트가 있으면 그 콘텐츠 최소폭만큼 트랙 자체가
         calc(25%-20px)를 무시하고 늘어난다(-webkit-line-clamp/overflow-wrap은
         이 트랙 확장 자체는 막지 못함, 줄바꿈에만 관여). min-width:0으로
         강제 축소를 허용해야 카드 폭이 실제로 25%(모바일은 50%)로 고정된다. */
      min-width: 0;
      margin: 0 10px;
      box-sizing: border-box;
      counter-increment: bi-rank;
    }

    .bi-item {
      cursor: pointer;
      position: relative;
      height: 100%;
      transition: 0.3s;
    }

    .bi-thumb {
      position: relative;
      border-radius: 12px;
      overflow: hidden;
      background: #f8f8f8;
      aspect-ratio: 1 / 1.3;
      margin-bottom: 20px;
      /* [2026-08-03 정정] 박스 크기는 기존 반응형(aspect-ratio) 그대로 유지하고,
         안의 이미지만 180x205를 넘지 않도록 제한 + 박스 안에서 가운데 정렬
         (박스를 고정폭으로 줄였던 이전 시도는 사용자 의도와 달라 되돌림). */
      display: flex;
      align-items: center;
      justify-content: center;
    }

    .bi-thumb img {
      max-width: 180px;
      max-height: 205px;
      width: auto;
      height: auto;
      object-fit: contain;
      transition: 0.6s cubic-bezier(0.165, 0.84, 0.44, 1);
    }

    .bi-item:hover .bi-thumb img {
      transform: scale(1.08);
    }

    .bi-rank {
      position: absolute;
      top: 15px;
      left: 15px;
      width: 34px;
      height: 34px;
      background: #000;
      color: #fff;
      border-radius: 50%;
      display: flex;
      align-items: center;
      justify-content: center;
      font-size: 14px;
      font-weight: 800;
      z-index: 5;
    }

    /* 순번은 카페24가 지원하지 않는 {$count} 변수 대신 CSS 카운터로 표시(실제 카페24 방식과
       정합 — 템플릿_가이드.md §13 참고, 실서버에 리터럴 노출되는 문제 원천 차단). */
    .bi-rank::before {
      content: counter(bi-rank);
    }

    .bi-rank.top {
      background: var(--ml-accent);
    }

    .bi-actions {
      position: absolute;
      bottom: 0;
      left: 0;
      right: 0;
      padding: 20px;
      display: flex;
      gap: 8px;
      transform: translateY(100%);
      transition: 0.3s cubic-bezier(0.2, 0, 0, 1);
      z-index: 10;
      opacity: 0;
    }

    .bi-item:hover .bi-actions {
      transform: translateY(0);
      opacity: 1;
    }

    .bi-action-btn {
      flex: 1;
      height: 44px;
      background: #fff;
      border-radius: 8px;
      display: flex;
      align-items: center;
      justify-content: center;
      font-size: 13px;
      font-weight: 700;
      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
    }

    .bi-action-btn:hover {
      background: var(--ml-fg);
      color: #fff;
    }

    .bi-action-btn svg {
      width: 18px;
      height: 18px;
      margin-right: 6px;
    }

    .bi-info {
      text-align: left;
    }

    /* [2026-07-28 정정] 2줄 클램프였으나 사용자가 실기기 스크린샷으로 "텍스트가
       두 줄이 되는 걸 안 되게" 명확히 지적 — 카드마다 1줄/2줄로 높이가 달라지는
       것 자체가 원치 않는 결과였다. 한 줄 유지 + 말줄임(...)으로 변경. flex 아이템
       기본 min-width:auto 때문에 트랙이 늘어나는 걸 막으려면 width:100%가
       필요하다(부모인 .bi-slide 쪽 min-width:0 과 세트로 동작). */
    .bi-info .name {
      font-size: 16px;
      font-weight: 600;
      color: #111;
      margin-bottom: 10px;
      display: block;
      white-space: nowrap;
      overflow: hidden;
      text-overflow: ellipsis;
      width: 100%;
    }

    /* [2026-07-28 정정] 라이브 실측 결과 product_ListItem이 상품요약정보+판매가
       2개 필드를 각각 별도 <ul>(형제 요소)로 통째로 복제해 렌더링한다(카페24
       기본 표시설정 ez-product-display-setting.data.json에 둘 다 T로 켜져
       있음, 프레임워크 §5-4 참고) — <li> 하나만 반복되는 게 아니라 <ul> 자체가
       필드 수만큼 나온다. 기존 display:flex(가로배치)는 <ul> 1개만 있다고
       가정한 설계라 두 필드가 옆으로 눌려 붙어 뒤섞였다(사용자가 실기기
       스크린샷으로 지적). 세로 스택으로 변경. */
    .bi-price {
      display: flex;
      flex-direction: column;
      align-items: flex-start;
      gap: 4px;
    }

    /* module="product_ListItem"(실제 카페24 판매가 반복 문법)의 ul/li 기본 스타일 제거 */
    .bi-price ul { list-style: none; margin: 0; padding: 0; width: 100%; }
    .bi-price ul li { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; display: block; }

    .bi-price .sale {
      font-size: 18px;
      font-weight: 900;
      color: var(--ml-fg);
    }

    .bi-price .original {
      font-size: 14px;
      color: #bbb;
      text-decoration: line-through;
    }

    .bi-price .discount {
      font-size: 16px;
      font-weight: 900;
      color: var(--ml-accent);
    }

    .bi-badges {
      display: flex;
      gap: 4px;
      margin-top: 12px;
    }

    .bi-badge {
      font-size: 10px;
      font-weight: 800;
      padding: 2px 6px;
      border-radius: 4px;
      text-transform: uppercase;
    }

    .bi-badge.new {
      background: #e8f5e9;
      color: #2e7d32;
    }

    .bi-badge.best {
      background: #fff3e0;
      color: #ef6c00;
    }

    /* [2026-09-06] G98 후속: {$new_badge_display} 가짜 변수 제거, 실제 {$new_icon}/
       {$recommend_icon} 존재 여부(img 유무)로 표시 판정. */
    .bi-badge.new img, .bi-badge.best img { display: none; }
    .bi-badge.new:not(:has(img)), .bi-badge.best:not(:has(img)) { display: none; }

    /* Best Pagination (Dots) */
    .bi-pagination {
      display: flex;
      justify-content: center;
      gap: 8px;
      margin-top: 45px;
    }

    .bi-dot {
      width: 8px;
      height: 8px;
      border-radius: 50%;
      background: #e0e0e0;
      cursor: pointer;
      transition: 0.3s;
    }

    .bi-dot.is-active {
      width: 24px;
      background: var(--ml-accent);
      border-radius: 4px;
    }

    /* Best Slider Controls */
    .bi-arrow-wrapper {
      position: absolute;
      top: 0;
      left: 0;
      right: 0;
      height: 0;
      padding-top: calc((100% / 4 - 20px) * 1.3 / 2 + 10px);
      display: flex;
      justify-content: space-between;
      pointer-events: none;
      z-index: 10;
      margin: 0 -10px;
    }

    .bi-arrow {
      width: 50px;
      height: 50px;
      background: rgba(255, 255, 255, 0.8);
      backdrop-filter: blur(4px);
      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
      border: 1px solid rgba(0, 0, 0, 0.05);
      border-radius: 50%;
      display: flex;
      align-items: center;
      justify-content: center;
      cursor: pointer;
      pointer-events: auto;
      color: #111;
      transition: 0.3s;
      opacity: 0;
      transform: translateY(-50%);
    }

    #od-best-items:hover .bi-arrow {
      opacity: 1;
    }

    .bi-arrow:hover {
      background: #fff;
      color: var(--ml-accent);
      transform: translateY(-50%) scale(1.1);
      box-shadow: 0 6px 16px rgba(0, 0, 0, 0.15);
    }

    .bi-arrow svg {
      width: 32px;
      height: 32px;
    }

    /* 상품 썸네일 우하단 장바구니/찜 (벤치마크 참고, 호버 시 노출) */
    .pd-thumb-actions {
      position: absolute;
      right: 12px;
      bottom: 12px;
      display: flex;
      flex-direction: column;
      gap: 8px;
      opacity: 0;
      transform: translateY(8px);
      transition: 0.25s;
      z-index: 6;
    }

    .bi-item:hover .pd-thumb-actions {
      opacity: 1;
      transform: translateY(0);
    }

    .pd-action-btn {
      width: 40px;
      height: 40px;
      border-radius: 50%;
      background: #fff;
      display: flex;
      align-items: center;
      justify-content: center;
      box-shadow: 0 4px 10px rgba(0, 0, 0, 0.15);
      border: none;
      cursor: pointer;
      transition: 0.2s;
      flex-shrink: 0;
    }

    .pd-action-btn:hover {
      background: #111;
    }

    .pd-action-btn svg {
      width: 18px;
      height: 18px;
      stroke: #111;
      stroke-width: 1.6;
      fill: none;
      transition: 0.2s;
    }

    .pd-action-btn:hover svg {
      stroke: #fff;
    }


/* ==========================================================================
   [모바일 최적화] 반응형 오버라이드를 이 섹션 파일 안에 직접 둔다.
   layout.css 에도 같은 셀렉터의 모바일 규칙이 있었지만, 섹션 CSS가
   layout.css 보다 문서상 뒤에 로드되어(§2-5 인라인 배치 관례) 같은 명시도의
   무조건부 규칙이 그 모바일 규칙을 항상 이겨버리고 있었다(실측 확인 —
   390px 뷰포트에서 슬라이드가 4개 폭(calc(25%-20px))으로 좁게 나와 텍스트가
   잘림). 로드 순서에 의존하지 않도록 섹션 파일 자체에 오버라이드를 둔다.
   ========================================================================== */
@media (max-width: 1024px) {
  .bi-slide {
    flex: 0 0 calc(50% - 20px);
  }

  /* [2026-07-29] .bi-arrow-wrapper의 padding-top 공식이 PC 4개보기 기준
     (100%/4)으로 고정돼 있어, 실제 카드 폭이 2개보기(100%/2)로 넓어진
     모바일에서는 화살표가 카드 중앙이 아닌 곳에 위치했다(실측: 사용자 지적).
     실제 아이템 폭 비율(1/2)로 다시 계산한다. */
  .bi-arrow-wrapper {
    padding-top: calc((100% / 2 - 20px) * 1.3 / 2 + 10px);
  }
}

/* 상품목록(product/list.html) 브랜드 디자인 재구축(2026-08-06) — 홈페이지 WEEKLY BEST 카드
   (best-items.css의 .bi-item/.bi-thumb/.bi-price/.bi-badge)와 동일한 시각 언어를 재사용하고,
   그 위에 이 페이지 전용 레이아웃(그리드/섹션 헤더/카운트+정렬바)만 얹는다. 벤치마크
   (ecudemo398355.cafe24.com/category/스킨케어/69/, EVERIN)는 카테고리 필터 pill·BEST 캐러셀·
   4단 그리드·할인율+가격 표기 구조를 참고했고, 색/폰트/카드 톤은 SOYONE 자체 것을 그대로 쓴다. */

/* 상품검색(product/search.html) 카드 그리드 재구축(2026-08-06 추가) — 클래스명(.pl-thumb/.pl-info/
   .bi-price/.bi-badge/.prdList.grid4)을 list.html과 동일하게 써서 이 파일을 그대로 재사용한다
   (search_ListItem도 local_server.js 가격서브루프에서 product_ListItem과 동일 처리됨, 데이터 구조
   동일 확인). 검색폼/검색옵션 레이어/검색조건 태그(searchdata.css)는 이번 범위 밖(스톡 유지).

/* 상품상세(.xans-product-detail, G51)와 동일한 좌우 여백 — 게시판(2026-08-06 밤)에 이어
   상품목록도 이 규칙이 없어 콘텐츠가 뷰포트 끝까지 붙어 보이던 것(실측 발견). */
.xans-product-menupackage,
.pl-section,
.xans-product-normalpaging,
.xans-search-paging {
    width: 94%;
    max-width: var(--ml-max-width);
    margin: 0 auto;
}

.pl-title-area { text-align: center; padding: 40px 0 20px; }
.pl-title-area h2 { font-size: 28px; font-weight: 900; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ml-fg); }
/* {$title_text_or_image}가 빈 카테고리(예: cate_no=24)는 <h2></h2>만 남아 패딩(60px)이 텅 빈
   공백으로 보이던 문제(2026-08-18 실측, "상단과 목록 사이 공백은 뭐야?" 지적) — 제목이 없으면
   이 영역 자체를 접는다. */
.pl-title-area:has(h2:empty) { display: none; }

.pl-section { padding: 30px 0; }
.pl-section-head { margin-bottom: 24px; }
.pl-section-head h3 { font-size: 20px; font-weight: 800; color: var(--ml-fg); }

/* 그리드 — 스톡 ec-base-product.css의 `.prdList{font-size:0;line-height:0;min-width:756px;
   margin:-20px 0 0}`가 이 div에도 그대로 걸려 있어, line-height:0이 하위 텍스트에 상속되며
   상품명/가격 줄이 높이 0으로 찌그러져 다음 요소와 겹쳐 보이던 버그(2026-08-06 실측 발견,
   getBoundingClientRect로 height:0 확인) — 전부 명시적으로 재정의해 상속을 끊는다.
   🔴→✅ 2026-08-12 재정정: 아래 두 규칙 다 애초에 "특이도로 이긴다"는 이전 코멘트 자체가
   계산 오류였다 — `.ec-base-product .prdList`(클래스 2개)와 `.prdList.grid4`(클래스 2개)는
   특이도가 정확히 동일(0,2,0)하고, `.ec-base-product ul.grid4 > li`(엘리먼트 2+클래스 2)와
   `ul.prdList.grid4 > li`(엘리먼트 2+클래스 2)도 동일(0,2,2)하다. 카페24 실제 라이브 번들
   (`optimizer_user.php`)을 직접 떠보니 스톡 규칙이 우리 규칙보다 **파일 안에서 더 뒤쪽**에
   위치해(오프셋 실측 확인) 동일 특이도 상황에서 소스 순서로 스톡이 이겨버린다 — 카드가
   컬럼폭의 25%로 찌그러지고 배지 높이가 4px로 뭉개지는 게 라이브에서 실제로 계속 재현됐다
   (2026-08-12, 사용자가 실측 스크린샷으로 재지적). G56과 동일한 근본원인(동일 특이도 + 소스
   순서 통제 불가) — `!important`로 단조 강제한다. */
.prdList.grid4 {
    display: grid !important;
    grid-template-columns: repeat(4, 1fr) !important;
    gap: 32px 20px !important;
    list-style: none;
    width: auto !important;
    min-width: 0 !important;
    margin: 0 !important;
    font-size: 16px !important;
    line-height: normal !important;
}
.prdList.grid4 > li,
ul.prdList.grid4 > li {
    list-style: none; width: auto !important; margin: 0 !important; display: block !important;
    /* 🔴→✅(2026-08-18) 2열 폭이 242px/98.5px처럼 불균등하게 갈라지던 버그. `repeat(2,1fr)`의
       fr 트랙은 기본적으로 `minmax(auto,1fr)`로 계산되는데, `auto` 최소값은 그리드 아이템의
       min-content(내용물이 줄어들 수 있는 최소 너비)를 그대로 반영한다. `.pl-info .name`에
       걸어둔 white-space:nowrap이 제목을 한 줄로 유지하려고 min-content를 "줄바꿈 없는 전체
       글자폭"으로 부풀렸고(예: "GOLD ELEMENTS 인텐시브 클렌징 토너 듀오"), text-overflow:ellipsis는
       화면에 보이는 모양만 잘라줄 뿐 이 min-content 계산엔 전혀 영향을 안 준다 — 그 결과 이
       제목이 있는 열만 트랙이 넓어지고 반대 열이 좁아지는 실측 확인(실기기 380px 스크린샷).
       그리드 아이템에 min-width:0을 명시해 min-content 전파를 끊는다(flex/grid의
       고전적인 "min-width:auto" 함정, 표준 해법). */
    min-width: 0 !important;
}

/* 카드 — .bi-item(best-items.css)과 동일한 톤, 슬라이드 트랙이 아니라 그리드라 폭 계산만 다름 */
.pl-link { display: block; color: inherit; text-decoration: none; }
.pl-thumb {
    position: relative;
    border-radius: 12px;
    overflow: hidden;
    background: #f8f8f8;
    aspect-ratio: 1 / 1.1;
    margin-bottom: 16px;
    display: flex;
    align-items: center;
    justify-content: center;
}
.pl-thumb img { max-width: 78%; max-height: 78%; width: auto; height: auto; object-fit: contain; transition: 0.5s cubic-bezier(0.165, 0.84, 0.44, 1); }
.pl-link:hover .pl-thumb img { transform: scale(1.06); }

.pl-thumb .bi-badge { position: absolute; top: 12px; left: 12px; }
.pl-thumb .bi-badge.new { top: 12px; left: 12px; }
.pl-thumb .bi-badge.best ~ .bi-badge.new { left: auto; top: 12px; right: 12px; }

.pl-info { text-align: left; }
.pl-info .name {
    display: block;
    font-size: 15px;
    line-height: 1.4;
    font-weight: 600;
    color: #111;
    margin-bottom: 8px;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* 판매가/할인율 — 🔴→✅(2026-08-18) 위 코멘트의 "li 1~2개가 ul 하나에 들어간다"는 가정이
   실측과 달랐다: 상품에 "요약설명"(simple_desc)이 등록돼 있으면 카페24가 `.pl-info` 안에
   `<ul class="bi-price">`를 요약설명용 1개 + 가격용 1개(할인 상품은 할인정보+할인가까지 더해
   총 4개)로 따로 내려준다. 게다가 **할인 상품은 `<a class="pl-link">`이 이름+요약설명+정가
   ul까지만 감싸고 중간에 닫힌 뒤 할인정보/할인가 ul이 `.pl-info`의 직속 형제로 남는 깨진 중첩
   구조**라, `.pl-info > ul:first-of-type` 같은 순수 CSS 선택자로는 요약설명 ul의 중첩 깊이가
   상품마다 달라 안정적으로 못 잡는다 — 요약설명 숨김은 `list.html`의 인라인 스크립트(JS)로
   처리한다("원" 문자가 없는 첫 `.bi-price`를 숨김, 할인정보 안내 ul은 이미 원래 UI라 그대로 둠). */
.bi-price { display: flex; flex-direction: column; align-items: flex-start; gap: 2px; font-size: 16px; line-height: 1.4; }
.bi-price li { list-style: none; }
.bi-price li:only-child { font-size: 17px; font-weight: 900; color: var(--ml-fg); }
.bi-price li:first-child:not(:only-child) { font-size: 13px; font-weight: 800; color: var(--ml-accent); }
.bi-price li:last-child:not(:only-child) { font-size: 17px; font-weight: 900; color: var(--ml-fg); }

/* 카운트 + 정렬 바 */
.xans-product-normalmenu .function {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 16px 0;
    margin-bottom: 24px;
    border-top: 1px solid var(--ml-border);
    border-bottom: 1px solid var(--ml-border);
}
.xans-product-normalmenu .prdCount { font-size: 13px; color: var(--ml-muted); white-space: nowrap; flex-shrink: 0; }
.xans-product-normalmenu .prdCount strong { color: var(--ml-fg); font-weight: 800; }

/* 정렬 토글(2026-08-18) — 링크 6개를 한 줄에 늘어놓던 것을 버튼+드롭다운 패널로 전환.
   ul#type 내부(li/a)는 카페24 product_Orderby 모듈이 실제 정렬 옵션 개수만큼 채우는
   영역이라 그대로 두고, 바깥에 토글 버튼과 포지셔닝 래퍼만 추가한다. */
.pl-sort { position: relative; flex-shrink: 0; }
.pl-sort-btn {
    display: flex; align-items: center; gap: 6px;
    font-size: 13px; color: var(--ml-fg); background: none; border: 1px solid var(--ml-border);
    border-radius: 999px; padding: 8px 14px; cursor: pointer; white-space: nowrap;
}
.pl-sort-btn svg { transition: transform 0.2s ease; }
.pl-sort.is-open .pl-sort-btn svg { transform: rotate(180deg); }
.xans-product-normalmenu .pl-sort ul#type {
    display: none; flex-direction: column; flex-wrap: nowrap; gap: 0;
    position: absolute; top: calc(100% + 8px); right: 0; z-index: 20;
    min-width: 140px; background: #fff; border: 1px solid var(--ml-border); border-radius: 12px;
    padding: 6px; box-shadow: 0 8px 24px rgba(0,0,0,0.08);
}
.pl-sort.is-open ul#type { display: flex; }
.xans-product-normalmenu ul#type li { list-style: none; }
.xans-product-normalmenu ul#type li a {
    display: block; font-size: 13px; color: var(--ml-muted); text-decoration: none;
    white-space: nowrap; padding: 8px 10px; border-radius: 8px;
}
.xans-product-normalmenu ul#type li a:hover { color: var(--ml-fg); background: var(--ml-bg-soft, #f7f7f7); }

.noData { padding: 80px 0; text-align: center; color: var(--ml-muted); font-size: 14px; }

/* 페이지네이션 아이콘 세로쌓임 수정은 layout/basic/css/ec-base-paginate.css로 이동(2026-08-06,
   product/search.html도 같은 버그를 겪어 이 컴포넌트의 진짜 소유 파일로 옮김 — 이 페이지 전용
   listnormal.css에만 있으면 search.html엔 적용이 안 됨). */

@media (max-width: 768px) {
    /* 2026-08-12 커밋(0265942)이 데스크톱 라이브 번들 특이도 문제를 고치려고 위 기본 규칙에
       !important를 붙이면서, !important는 미디어쿼리 여부와 무관하게 항상 이기기 때문에 이
       모바일 2열 규칙이 무효화되어 모바일에서도 4열이 강제되던 회귀 버그(2026-08-18 실측
       발견 — 카드가 가로로 넘쳐 3번째 카드가 화면 밖으로 잘림). 이 규칙도 !important로
       맞춰야 실제로 적용된다. */
    .prdList.grid4 { grid-template-columns: repeat(2, 1fr) !important; gap: 24px 12px !important; }
    .pl-title-area h2 { font-size: 22px; }
}

/* 🔴→✅(2026-08-18) 1열 전환 브레이크포인트를 560px→360px로 재수정. 사용자 지정으로 560px를
   썼다가 "같은 해상도에서 벤치마크는 2열인데 우리는 1열"이라는 실측 재지적을 받아, 벤치마크
   (ecudemo398355)를 320~600px 전 구간 1px 단위 아닌 20px 간격으로 재실측(Playwright
   getComputedStyle) — 361px까지 2열, 360px에서 1열로 전환되는 걸 재확인(§80 최초 조사와 동일
   결론). 560px는 이 재실측 이전의 눈대중값이었던 것으로 정정, 벤치마크 실측값 360px로 되돌림. */
@media (max-width: 360px) {
    .prdList.grid4 { grid-template-columns: 1fr !important; }
}

/* [2026-09-06, G104] shopinfo/guide.html(이용안내) 등 106개 파일이 쓰는 .ec-base-tab이
   layout.html 경유 참조(layout/basic/css/ec-base-tab.css)라 라이브 번들에서 누락되는
   G95/G99/G100/G103과 동일 계열 결함. product/detail.html은 이 클래스를 쓰지만 자체
   soytwo-detail.css가 !important로 완전히 재정의해 우연히 무영향이었을 뿐, 그런 보강
   커스텀 CSS가 없는 guide.html 등은 .grid7/.gFlex 등 modifier 스타일이 전혀 안 먹혀
   탭 메뉴가 섹션마다 반복되는 카페24 순정 마크업이 스타일 없이 그대로 노출됐다
   (대표님 지적 '이용안내도 개판'). G95/G99/G103과 동일 처방 — 이미 안정적으로
   번들되는 main.css에 병합. 원본 파일은 로컬 렌더링용으로 유지. */

.ec-base-tab { position:relative; }
.ec-base-tab .menu {
    margin:0 0 20px; border:1px solid #cbcdce; border-bottom-color:#202020; border-left:0; background:#f2f2f2;
    box-sizing:border-box; -webkit-box-sizing:border-box; -moz-box-sizing:border-box;
}
.ec-base-tab .menu:after { content:""; display:block; clear:both; }
.ec-base-tab .menu li { float:left; border-left:1px solid #cbcdce; background:#f2f2f2; }
.ec-base-tab .menu li a { display:block; min-width:187px; margin:0 0 0 -1px; padding:12px 5px 11px; border-right:1px solid #cbcdce; color:#707070; text-decoration:none; outline:0; text-align:center; background:#f2f2f2; }
.ec-base-tab .menu li:first-child a { margin-left:0; }
.ec-base-tab .menu li.selected a { position:relative; top:-1px; left:-2px; margin:0 0 -1px; border:1px solid #202020; border-bottom:0; color:#fff; font-weight:bold; background:#4a5164; }
.ec-base-tab .menu li.selected:first-child a { left:-1px; }
.ec-base-tab > .right { position:absolute; top:8px; right:10px; line-height:24px; color:#909090; }
  /* typeLight */
  .ec-base-tab.typeLight .menu li.selected a { margin:0 0 -2px; border-bottom:1px solid #fff; color:#404040; background:#fff; }
  /* grid (2~7) */
  .ec-base-tab[class*="grid"] .menu { display:table; table-layout:fixed; width:100%; }
  .ec-base-tab[class*="grid"] .menu li { float:none; display:table-cell; vertical-align:middle; }
  .ec-base-tab[class*="grid"] .menu li a { display:inline-block; width:100%; min-width:0; margin:0; padding:11px 0; border:0; }
  .ec-base-tab[class*="grid"] .menu li.selected { position:relative; top:0; right:-1px; border:1px solid #292929; border-bottom:0; background:#4a5164; }
  .ec-base-tab[class*="grid"] .menu li:first-child.selected { right:0; }
  .ec-base-tab[class*="grid"] .menu li.selected a { position:static; background:none; }
    .ec-base-tab.grid2 .menu li { width:50.5%; }
    .ec-base-tab.grid3 .menu li { width:34%; }
    .ec-base-tab.grid4 .menu li { width:25.5%; }
    .ec-base-tab.grid5 .menu li { width:20.5%; }
    .ec-base-tab.grid6 .menu li { width:17%; }
    .ec-base-tab.grid7 .menu li { width:14.8%; width:15% \0/; }
    .ec-base-tab.grid7 .menu li:first-child { width:13% \0/; }
  /* gFlex */
  .ec-base-tab.gFlex .menu { display:flex; border-right:0; }
  .ec-base-tab.gFlex .menu:after { display:none; }
  .ec-base-tab.gFlex .menu li { display:flex; align-items: center; float:none; flex:1; position:relative; }  
  .ec-base-tab.gFlex .menu li:last-child { border-right:1px solid #cbcdce; }  
  .ec-base-tab.gFlex .menu li a { width:100%; min-width:0; border-right:0; background:none; word-break:break-all; }
  .ec-base-tab.gFlex .menu li a:after { content:''; width:100%; height:100%; position:absolute; top:0; left:0; }
  .ec-base-tab.gFlex .menu li.selected { border:1px solid #292929; border-bottom:0; background:#4a5164; }
  .ec-base-tab.gFlex .menu li.selected a { left:0; margin:0 0 -1px -1px; background:#4a5164; border:0; position: initial;}