/* hanassik-store-skin 2026-11-09.3 — libs/custom-common.js 전체 교체본 (원본: store-skin/mallang-common.js) */ /* 하나씩스토어 공통 스크립트 — {pc|mobile}/libs/custom-common.js 맨 끝에 붙인다. 기존 코드는 건드리지 않는다. */ (function () { var MALLANG = (window.MALLANG = window.MALLANG || {}); // 전시카테고리 번호 — 관리자에서 카테고리를 만든 뒤 번호를 채운다 (null 이면 그 칸은 숨김). MALLANG.categories = { planner: 1290820, // 플래너/다이어리 note: 1290824, // 노트/메모 pen: 1290828, // 필기구/필통 sticker: 1290829, // 스티커/카드 desk: 1290833, // 데스크/집중템 pet: 1290838, // 말랑펫 굿즈 }; MALLANG.appStore = { ios: "https://apps.apple.com/kr/app/id6793124390", android: "https://play.google.com/store/apps/details?id=com.sproutgrowlabs.malangcal", }; // 샵바이 자체 로그인·회원가입·비회원 주문조회 화면은 쓰지 않는다 — 말랑케쥴 로그인(app-login)으로 보낸다. // (관리자에서 쇼핑몰회원·간편가입은 꺼 두었고, 가입·로그인은 말랑케쥴 계정으로만 한다) (function () { var path = location.pathname; var blocked = /^\/pages\/(sign-in|sign-up)\//.test(path) || /^\/pages\/(guest|order\/guest)/.test(path) || /guest-order/.test(path); if (!blocked) return; var next = new URLSearchParams(location.search).get("returnUrl") || "/"; if (!/^\/(?!\/)/.test(next)) next = "/"; location.replace("/pages/app-login/app-login.html?next=" + encodeURIComponent(next)); })(); var ua = navigator.userAgent || ""; // 앱 웹뷰는 UA 에 Mallangchedule/ios|android 를 붙인다 (app-login.html 과 같은 표식). MALLANG.inApp = /Mallangchedule\//.test(ua); if (MALLANG.inApp) document.documentElement.classList.add("is-mallang-app"); function apply() { document.querySelectorAll("[data-mallang-cat]").forEach(function (a) { var no = MALLANG.categories[a.getAttribute("data-mallang-cat")]; var li = a.closest("li"); if (no) { a.href = "/pages/product/product-list.html?categoryNo=" + encodeURIComponent(no); if (li) li.hidden = false; } else if (li) { li.hidden = true; } }); // 상품 상세 안내 중 '비회원 구매' 줄은 숨긴다 (비회원 구매를 열지 않음). document.querySelectorAll("li").forEach(function (li) { if (/^\s*비회원 구매/.test(li.textContent || "")) li.classList.add("mallang-hide-guest"); }); var isAndroid = /Android/i.test(ua); document.querySelectorAll("[data-mallang-app-link]").forEach(function (a) { a.href = isAndroid ? MALLANG.appStore.android : MALLANG.appStore.ios; }); } if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", apply); else apply(); // 스킨이 파셜을 늦게 그리므로 페이지 로드 완료 때 한 번 더. if (window.ShopbySkin && ShopbySkin.EventManager) { ShopbySkin.EventManager.on("PAGE_LOAD_COMPLETED", apply); } })(); // 진열 섹션 제목 — 관리자 진열명(label)을 스토어 표기명으로 바꿔 보여 준다. (진열 코드·관리자 진열명은 그대로) // 관리자 '상품 진열 관리' 수정은 팝업 창이라 이름을 바꾸지 않고 스킨에서 바꾼다. // 모바일 파셜은 .product-section__title, PC 파셜은 .display-product__title. (function () { var TITLES = { "신규상품": "NEW", "인기상품": "BEST", "MD추천": "큐레이션", "HOT": "말랑펫 굿즈", "EVENT": "기획전" }; function rename() { document.querySelectorAll(".product-section__title, .display-product__title").forEach(function (h) { var t = (h.textContent || "").trim(); if (TITLES[t]) h.textContent = TITLES[t]; }); } function start() { rename(); new MutationObserver(rename).observe(document.body, { childList: true, subtree: true }); } if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", start); else start(); })(); /* 2026-11-09.2 추가: 상단 안내 띠(앱 받기). 앱 웹뷰에서는 숨긴다. */ (function () { function strip() { if (document.querySelector(".mallang-topstrip")) return true; if (!document.body) return false; if (window.MALLANG && window.MALLANG.inApp) return true; var a = document.createElement("a"); a.className = "mallang-topstrip"; a.textContent = "말랑케쥴 앱 다운로드 ›"; var cfg = (window.MALLANG && window.MALLANG.appStore) || {}; a.href = /Android/i.test(navigator.userAgent || "") ? cfg.android || "#" : cfg.ios || "#"; document.body.insertBefore(a, document.body.firstChild); return true; } if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", strip); else strip(); })(); /* 2026-11-09.3 추가: 메인 기획전 배너 캐러셀(.mallang-hero) — 이전/다음, 진행바, 카운트 */ (function () { function init() { var h = document.querySelector(".mallang-hero"); if (!h) return false; if (h.__mallangHero) return true; h.__mallangHero = true; var tr = h.querySelector(".mallang-hero__track"); var bar = h.querySelector(".mallang-hero__bar i"); var cnt = h.querySelector(".mallang-hero__count"); var n = tr.children.length; function upd() { var max = tr.scrollWidth - tr.clientWidth; var p = max > 0 ? tr.scrollLeft / max : 0; var w = Math.max(1 / n, tr.clientWidth / tr.scrollWidth); if (bar) { bar.style.width = (w * 100) + "%"; bar.style.left = ((1 - w) * p * 100) + "%"; } if (cnt) cnt.textContent = (Math.round(p * (n - 1)) + 1) + " / " + n; } function step() { return tr.children[0].getBoundingClientRect().width + 18; } tr.addEventListener("scroll", upd, { passive: true }); var pv = h.querySelector(".mallang-hero__prev"); var nx = h.querySelector(".mallang-hero__next"); if (pv) pv.addEventListener("click", function () { tr.scrollBy({ left: -step(), behavior: "smooth" }); }); if (nx) nx.addEventListener("click", function () { tr.scrollBy({ left: step(), behavior: "smooth" }); }); window.addEventListener("resize", upd); upd(); return true; } function boot() { if (init()) return; var c = 0; var t = setInterval(function () { if (init() || ++c > 40) clearInterval(t); }, 250); } if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", boot); else boot(); if (window.ShopbySkin && window.ShopbySkin.EventManager) window.ShopbySkin.EventManager.on("PAGE_LOAD_COMPLETED", init); })();