ログイン
会員登録がお済みのお客様
まだご登録がお済みでないお客様
会員登録をしていただきますと、二度目のお買い物時にとても便利です。
お気に入り商品をご登録いただけるなどお買い物が便利になります。
// Splide共通の矢印パス(シェブロン)
var SPLIDE_ARROW_PATH = 'M29.09 1.82L10.91 20L29.09 38.18';
// 関数定義 - 商品スライダー(SPのみスライダー化。PCはCSSグリッド)
function initItemSlider() {
if (typeof Splide === 'undefined') return;
document.querySelectorAll('.g-column__pickupSlider').forEach(function (el) {
if (el.dataset.pickupSliderInitialized === 'true') return;
el.dataset.pickupSliderInitialized = 'true';
new Splide(el, {
mediaQuery: 'min',
type: 'loop',
autoplay: true,
interval: 4000,
speed: 800,
pauseOnHover: true,
pauseOnFocus: true,
fixedWidth: '37%',
gap: '20px',
padding: { left: '20px', right: 0 },
pagination: false,
arrows: true,
breakpoints: {
768: { destroy: true }
},
arrowPath: SPLIDE_ARROW_PATH,
classes: {
arrow: 'splide__arrow',
prev: 'splide__arrow--prev g-splideArrow g-splideArrow--prev',
next: 'splide__arrow--next g-splideArrow g-splideArrow--next',
}
}).mount();
});
}
// コラム内の itemdock 商品を SP だけ Splide 化
function initColumnPickupWidget() {
document.querySelectorAll('.g-column__pickup > .fs-search-widget').forEach(function (host) {
if (host._columnPickupReady) return;
host._columnPickupReady = true;
host.dataset.columnPickup = 'true';
var grid, sliderElement, splide;
var mq = window.matchMedia('(max-width: 767px)');
function update() {
var root = host.shadowRoot;
if (!root) return;
if (!root.querySelector('link[data-column-pickup-style]')) {
var link = document.createElement('link');
link.rel = 'stylesheet';
link.href = '/asset2026/css/group.css';
link.dataset.columnPickupStyle = 'true';
root.appendChild(link);
}
var nextGrid = root.querySelector('.fs-grid.fs-pickup');
if (!nextGrid) return;
if (grid !== nextGrid) {
if (splide) splide.destroy(true);
splide = null;
grid = nextGrid;
sliderElement = document.createElement('div');
sliderElement.className = 'splide g-column__widgetSlider';
var track = document.createElement('div');
track.className = 'splide__track';
grid.before(sliderElement);
sliderElement.appendChild(track);
track.appendChild(grid);
}
if (!mq.matches && splide) {
splide.destroy(true);
splide = null;
}
if (mq.matches && !splide && typeof Splide !== 'undefined' && grid.children.length > 1) {
grid.classList.add('splide__list');
grid.querySelectorAll(':scope > .fs-pickup-item').forEach(function (item) {
item.classList.add('splide__slide');
});
splide = new Splide(sliderElement, {
type: 'loop', autoplay: true, interval: 4000, speed: 800,
fixedWidth: '37%', gap: '20px', padding: { left: '20px', right: 0 },
arrows: false, pagination: false
}).mount();
}
}
function attach() {
if (!host.isConnected) return;
if (!host.shadowRoot) return window.setTimeout(attach, 200);
update();
new MutationObserver(function () { requestAnimationFrame(update); })
.observe(host.shadowRoot, { childList: true, subtree: true });
mq.addEventListener('change', update);
window.addEventListener('load', update, { once: true });
}
attach();
});
}
// 関数定義 - フッター営業日カレンダー(SPのみSplide)
function initFooterCalendarSlider() {
if (typeof Splide === 'undefined') return;
document.querySelectorAll('.ft-calendar').forEach(function (calendar) {
var hasCurrentTrack = calendar.querySelector(':scope > .splide__track');
if (calendar.dataset.footerCalendarInitialized === 'true' && hasCurrentTrack) return;
if (calendar._footerCalendarSplide) {
calendar._footerCalendarSplide.destroy(true);
calendar._footerCalendarSplide = null;
}
var months = Array.prototype.filter.call(calendar.children, function (child) {
return !child.classList.contains('splide__track');
});
if (months.length < 2) return;
calendar.dataset.footerCalendarInitialized = 'true';
calendar.classList.add('g-footerCalendarSlider', 'splide');
var track = document.createElement('div');
var list = document.createElement('div');
track.className = 'splide__track';
list.className = 'splide__list';
months.forEach(function (month) {
month.classList.add('splide__slide');
list.appendChild(month);
});
track.appendChild(list);
calendar.appendChild(track);
calendar._footerCalendarSplide = new Splide(calendar, {
mediaQuery: 'min',
type: 'slide',
perPage: 1,
perMove: 1,
gap: '20px',
padding: 0,
pagination: false,
arrows: true,
rewind: false,
drag: true,
breakpoints: {
768: { destroy: true }
},
arrowPath: SPLIDE_ARROW_PATH,
classes: {
arrow: 'splide__arrow g-splideArrow g-footerCalendarArrow',
prev: 'splide__arrow--prev g-splideArrow--prev g-footerCalendarArrow--prev',
next: 'splide__arrow--next g-splideArrow--next g-footerCalendarArrow--next'
}
});
calendar._footerCalendarSplide.mount();
});
}
window.initFooterCalendarSlider = initFooterCalendarSlider;
// ユーティリティ - fadeIn
function fadeIn(el, duration, callback) {
el.style.display = 'block';
el.style.opacity = '0';
el.style.transition = 'opacity ' + duration + 'ms';
requestAnimationFrame(function () {
requestAnimationFrame(function () {
el.style.opacity = '1';
if (callback) {
el.addEventListener('transitionend', function handler() {
el.removeEventListener('transitionend', handler);
callback.call(el);
});
}
});
});
}
// ユーティリティ - fadeOut
function fadeOut(el, duration, callback) {
el.style.transition = 'opacity ' + duration + 'ms';
el.style.opacity = '0';
el.addEventListener('transitionend', function handler() {
el.removeEventListener('transitionend', handler);
el.style.display = 'none';
el.style.transition = '';
el.style.opacity = '';
if (callback) callback.call(el);
});
}
// 関数定義 - ハンバーガー
(function (window, document) {
var desktopMedia = window.matchMedia('(min-width: 951px)');
var defaults = {
navSelector: '.fat-nav',
activeClass: 'active',
animationDuration: 200
};
function FatNav(hamburger, options) {
this.settings = Object.assign({}, defaults, options);
this.hamburger = hamburger;
this._isOpen = false;
this.init();
}
FatNav.instances = [];
FatNav.prototype = {
init: function () {
var self = this;
self.navSelector = self.hamburger.dataset.nav || self.settings.navSelector;
self.resolveNav();
self._bodyOverflow = document.body.style.overflow || '';
self.hamburger.addEventListener('click', function (e) {
e.preventDefault();
self.resolveNav();
self.toggleNav();
});
FatNav.instances.push(self);
},
resolveNav: function () {
this.nav = document.querySelector(this.navSelector);
},
toggleNav: function () {
var self = this;
FatNav.instances.forEach(function (instance) {
if (instance !== self && instance._isOpen) {
instance.closeNav();
}
});
if (self._isOpen) {
self.closeNav();
} else {
self.openNav();
}
},
openNav: function () {
var self = this;
if (desktopMedia.matches) {
self.closeNav(true);
return;
}
self.resolveNav();
if (!self.nav) return;
self._isOpen = true;
self.hamburger.classList.add(self.settings.activeClass);
// 開いた位置からウィンドウ下端までの高さを実測してCSSに渡す
// (ヘッダーが途中まで隠れている状態でも下端まで伸ばすため)
self.nav.style.display = 'block';
var navTop = self.nav.getBoundingClientRect().top;
self.nav.style.setProperty('--this-navH', window.innerHeight - navTop + 'px');
// フェードと同時に開かせるため、activeは待たずに付ける
self.nav.classList.add(self.settings.activeClass);
fadeIn(self.nav, self.settings.animationDuration, function () {
if (!self._isOpen || desktopMedia.matches) return;
self.toggleBodyOverflow(true);
});
},
closeNav: function (forceReset) {
var self = this;
self._isOpen = false;
self.hamburger.classList.remove(self.settings.activeClass);
if (self.nav) {
self.nav.classList.remove(self.settings.activeClass);
if (forceReset) {
self.nav.style.display = '';
self.nav.style.opacity = '';
self.nav.style.transition = '';
self.nav.style.removeProperty('--this-navH');
}
self.toggleBodyOverflow(false);
}
},
toggleBodyOverflow: function (isOpening) {
var self = this;
if (isOpening) {
document.body.classList.add('no-scroll');
document.body.style.overflow = 'hidden';
} else {
var anyOpen = FatNav.instances.some(function (instance) {
return instance._isOpen;
});
if (!anyOpen) {
document.body.classList.remove('no-scroll');
document.body.style.overflow = self._bodyOverflow;
}
}
}
};
window.initFatNav = function (selector) {
document.querySelectorAll(selector).forEach(function (el) {
if (el.closest('.fat-nav')) return; // fat-nav内の閉じるボタンはスキップ
if (!el._fatNavInstance) {
el._fatNavInstance = new FatNav(el);
}
});
disableFatNavOnDesktop(desktopMedia);
};
function disableFatNavOnDesktop(mediaQuery) {
if (!mediaQuery.matches) return;
FatNav.instances.forEach(function (instance) {
instance.closeNav(true);
});
}
if (desktopMedia.addEventListener) {
desktopMedia.addEventListener('change', disableFatNavOnDesktop);
} else {
desktopMedia.addListener(disableFatNavOnDesktop);
}
// 外側クリックでナビを閉じる
document.addEventListener('click', function (e) {
var fatNavLink = e.target.closest('.fat-nav a');
if (fatNavLink) {
var accordionHeading = fatNavLink.closest('.spAccordionNav .fs-pt-menu__heading--lv1');
if (accordionHeading) {
var accordionItem = accordionHeading.closest('.fs-pt-menu__item--lv1');
var headingRect = accordionHeading.getBoundingClientRect();
var isAccordionTriggerClick = accordionItem &&
accordionItem.classList.contains('has-submenu') &&
e.clientX >= headingRect.right - 38;
if (isAccordionTriggerClick) return;
}
FatNav.instances.forEach(function (instance) {
if (instance._isOpen) instance.closeNav();
});
return;
}
if (e.target.closest('.hamburger--menu, .hamburger--search, .fat-nav--menu, .fat-nav--search')) {
return;
}
FatNav.instances.forEach(function (instance) {
if (instance._isOpen) {
instance.closeNav();
}
});
});
}(window, document));
// 関数定義 - SPでヘッダー下端だけを残してstickyさせる
function initStickyHeader() {
var header = document.querySelector('.g-header');
if (!header || header.dataset.stickyHeaderInitialized === 'true') return;
header.dataset.stickyHeaderInitialized = 'true';
var STICKY_H = 48; // 固定時に見せる高さ(ヘッダー140pxのときtop:-92px)
var mq = window.matchMedia('(max-width: 950px)');
var offset = 0;
var update = function () {
offset = header.offsetHeight - STICKY_H;
header.style.setProperty('--this-sticky-top', -offset + 'px');
};
var onScroll = function () {
// PCは固定ヘッダーの表示に合わせる(initFixedHeaderが切り替える)
if (!mq.matches) return;
header.classList.toggle('is-stuck', window.pageYOffset >= offset);
};
var refresh = function () {
update();
if (mq.matches) {
onScroll();
} else {
var fixed = document.querySelector('.g-headerFixed');
header.classList.toggle('is-stuck', !!(fixed && fixed.classList.contains('is-show')));
}
};
refresh();
if ('ResizeObserver' in window) new ResizeObserver(refresh).observe(header);
else window.addEventListener('resize', refresh);
if (mq.addEventListener) mq.addEventListener('change', refresh);
else mq.addListener(refresh);
window.addEventListener('scroll', onScroll, { passive: true });
}
// 関数定義 - スクロール後に出現する固定ヘッダー
function initFixedHeader() {
var normal = document.querySelector('.g-headerContent');
var fixed = document.querySelector('.g-headerFixed');
if (!normal || !fixed || fixed.dataset.fixedHeaderInitialized === 'true') return;
fixed.dataset.fixedHeaderInitialized = 'true';
// 通常ヘッダーの下端がウィンドウ上端を越えたら固定ヘッダーを表示する
var header = normal.closest('.g-header') || normal.parentNode;
// IntersectionObserver 非対応ブラウザ向けフォールバック
var mqPc = window.matchMedia('(min-width: 951px)');
// 固定ヘッダーの表示状態をヘッダー側にも持たせる(SPはinitStickyHeaderが付ける)
var syncStuck = function (isPassed) {
if (mqPc.matches) header.classList.toggle('is-stuck', isPassed);
};
var updateFixedState = function () {
if (!mqPc.matches) {
fixed.classList.remove('is-show');
return;
}
var isPassed = header.getBoundingClientRect().bottom < 0;
fixed.classList.toggle('is-show', isPassed);
syncStuck(isPassed);
};
if (mqPc.addEventListener) mqPc.addEventListener('change', updateFixedState);
else mqPc.addListener(updateFixedState);
if (!('IntersectionObserver' in window)) {
window.addEventListener('scroll', updateFixedState, { passive: true });
updateFixedState();
return;
}
var observer = new IntersectionObserver(function (entries) {
entries.forEach(function (entry) {
// ヘッダー全体がウィンドウ上端より上に出た場合だけ表示する
var isPassed = mqPc.matches && !entry.isIntersecting && entry.boundingClientRect.bottom < 0;
fixed.classList.toggle('is-show', isPassed);
syncStuck(isPassed);
});
}, { threshold: 0 });
observer.observe(header);
updateFixedState();
}
// 関数定義 - アンカーズレ防止
function scrollToIdFromUrl() {
const root = document.documentElement;
let stopCurrentCorrection = null;
const getTarget = (id) => {
if (!id) return null;
try {
return document.getElementById(decodeURIComponent(id.replace(/^#/, '')));
} catch (e) {
return document.getElementById(id.replace(/^#/, ''));
}
};
const alignTarget = (target, behavior) => {
const scrollPaddingTop = parseFloat(getComputedStyle(root).scrollPaddingTop) || 0;
const targetTop = target.getBoundingClientRect().top + window.scrollY - scrollPaddingTop;
window.scrollTo({
top: Math.max(0, targetTop),
behavior: behavior
});
};
const keepTargetAligned = (target, behavior) => {
if (stopCurrentCorrection) stopCurrentCorrection();
let active = true;
let onLoad = null;
const cleanup = () => {
if (!active) return;
active = false;
if (onLoad) window.removeEventListener('load', onLoad);
if (stopCurrentCorrection === cleanup) stopCurrentCorrection = null;
};
stopCurrentCorrection = cleanup;
const execute = () => {
const fontsReady = document.fonts ? document.fonts.ready : Promise.resolve();
fontsReady.then(() => {
requestAnimationFrame(() => requestAnimationFrame(() => {
if (!active) return;
if (behavior === 'auto') root.classList.add('no-smooth-scroll');
alignTarget(target, behavior);
if (behavior === 'auto') root.classList.remove('no-smooth-scroll');
cleanup();
}));
});
};
// 読み込み途中ならレイアウト確定を待ち、確定後に一度だけ移動する。
if (document.readyState === 'complete') {
execute();
} else {
onLoad = execute;
window.addEventListener('load', onLoad, { once: true });
}
};
document.addEventListener('click', (event) => {
const link = event.target.closest('a[href*="#"]');
if (!link) return;
const url = new URL(link.href, location.href);
if (url.origin !== location.origin || url.pathname !== location.pathname || !url.hash) return;
const target = getTarget(url.hash);
if (!target) return;
event.preventDefault();
history.pushState(null, '', url.hash);
keepTargetAligned(target, 'smooth');
});
const queryId = new URLSearchParams(location.search).get('id');
const initialTarget = getTarget(queryId || location.hash);
if (initialTarget) keepTargetAligned(initialTarget, 'auto');
}
// 関数定義 - タブ切り替え
function initializeTabs() {
document.querySelectorAll('.tab-btn').forEach(function (btn) {
btn.addEventListener('click', function () {
var tabWrap = btn.closest('.tab-wrap');
if (!tabWrap) return;
var tabNav = tabWrap.querySelector('.tab-nav');
if (!tabNav) return;
var tabBtns = Array.from(tabNav.querySelectorAll('.tab-btn'));
var tabContents = Array.from(tabWrap.children).filter(function (el) {
return el.classList.contains('tab-contents');
});
tabBtns.forEach(function (b) { b.classList.remove('show'); });
btn.classList.add('show');
var elmIndex = tabBtns.indexOf(btn);
tabContents.forEach(function (c) { c.classList.remove('show'); });
if (tabContents[elmIndex]) {
tabContents[elmIndex].classList.add('show');
}
});
});
}
// 関数定義 - スクロール中にclass付与とポップアップ
function initializePopup() {
var isPopupOpen = false;
var scrollPosition = 0;
window.addEventListener('scroll', function () {
if (!isPopupOpen) {
var scrollPos = window.scrollY;
var width = window.innerWidth;
var addClassAt = width > 767 ? 400 : 200;
var removeClassAt = width > 767 ? 250 : 150;
var body = document.body;
if (scrollPos > addClassAt) {
body.classList.add('scroll');
body.classList.remove('returnTop');
} else if (scrollPos < removeClassAt) {
if (body.classList.contains('scroll')) {
body.classList.add('returnTop');
setTimeout(function () {
body.classList.remove('scroll');
body.classList.remove('returnTop');
}, 300);
}
}
}
});
document.querySelectorAll('.openPopup').forEach(function (trigger) {
trigger.addEventListener('click', function () {
// 開いているポップアップを閉じる
document.querySelectorAll('.popup-overlay.fixed').forEach(function (popup) {
fadeOut(popup, 300, function () {
this.classList.remove('fixed');
});
});
document.body.classList.remove('fixed');
document.body.style.top = '0';
window.scrollTo(0, scrollPosition);
scrollPosition = window.scrollY;
document.body.classList.add('fixed');
document.body.style.top = '-' + scrollPosition + 'px';
var targetId = trigger.dataset.popupTarget;
if (targetId) {
var targetPopup = document.querySelector(targetId);
if (targetPopup) {
fadeIn(targetPopup, 300);
targetPopup.classList.add('fixed');
}
}
document.documentElement.style.scrollBehavior = 'auto';
isPopupOpen = true;
// ポップアップ内アンカーリンク
var scrollTarget = trigger.dataset.scrollTarget;
if (scrollTarget && targetId) {
setTimeout(function () {
var targetPopup = document.querySelector(targetId);
if (!targetPopup) return;
var targetElement = targetPopup.querySelector(scrollTarget);
if (targetElement) {
var popupBox = targetPopup.querySelector('.popup-box');
if (popupBox) {
var containerRect = popupBox.getBoundingClientRect();
var elementRect = targetElement.getBoundingClientRect();
var targetPosition = elementRect.top - containerRect.top + popupBox.scrollTop;
popupBox.scrollTo({ top: targetPosition, behavior: 'smooth' });
}
}
}, 300);
}
});
});
document.querySelectorAll('button.closePopup, .popup-overlay').forEach(function (el) {
el.addEventListener('click', function (e) {
if (e.target !== el) return;
var overlay = el.closest('.popup-overlay');
if (overlay) {
fadeOut(overlay, 300, function () {
this.classList.remove('fixed');
});
}
document.body.classList.remove('fixed');
document.body.style.top = '0';
window.scrollTo(0, scrollPosition);
document.documentElement.style.scrollBehavior = 'smooth';
isPopupOpen = false;
});
});
}
// 読み込みコンテンツ用のポップアップ関数
function initializePopupWithoutScroll() {
document.addEventListener('click', function (e) {
// 閉じるボタン
var closeBtn = e.target.closest('button.closePopup');
if (closeBtn) {
var popup = closeBtn.closest('.popup-overlay');
if (popup) {
fadeOut(popup, 300, function () { this.classList.remove('fixed'); });
document.documentElement.style.scrollBehavior = 'smooth';
}
return;
}
// オーバーレイ直接クリック
if (e.target.classList.contains('popup-overlay')) {
fadeOut(e.target, 300, function () { this.classList.remove('fixed'); });
document.documentElement.style.scrollBehavior = 'smooth';
return;
}
// 開くトリガー
var trigger = e.target.closest('.openPopup');
if (trigger) {
var targetId = trigger.dataset.popupTarget;
if (targetId) {
var targetPopup = document.querySelector(targetId);
if (targetPopup) {
fadeIn(targetPopup, 300);
targetPopup.classList.add('fixed');
document.documentElement.style.scrollBehavior = 'auto';
}
}
}
});
}
// 関数定義 - サイドバー・SPメニューのカテゴリーアコーディオン
function initSidebarSearchCategory() {
document.querySelectorAll('.g-sidebarSearchCategory, .spAccordionNavSearch.-category').forEach(function (menu, menuIndex) {
menu.querySelectorAll('.fs-pt-menu__item--lv1').forEach(function (item, itemIndex) {
var heading = Array.prototype.find.call(item.children, function (child) {
return child.classList.contains('fs-pt-menu__heading--lv1');
});
var submenu = Array.prototype.find.call(item.children, function (child) {
return child.classList.contains('fs-pt-menu__submenu');
});
if (!heading || !submenu || heading.dataset.sidebarAccordionReady === 'true') return;
var submenuId = submenu.id || 'sidebar-category-submenu-' + menuIndex + '-' + itemIndex;
var hasCurrentItem = item.classList.contains('is-active') ||
item.classList.contains('is-current') ||
Boolean(submenu.querySelector('.is-active, .is-current, [aria-current="page"]'));
var updateSubmenuHeight = function () {
var styles = window.getComputedStyle(submenu);
var currentPadding = parseFloat(styles.paddingBottom) || 0;
var openPadding = parseFloat(styles.getPropertyValue('--this-open-padding-block-end')) || 0;
var contentHeight = submenu.scrollHeight - currentPadding;
submenu.style.setProperty('--this-submenu-height', contentHeight + openPadding + 'px');
};
submenu.id = submenuId;
submenu.hidden = false;
submenu.setAttribute('aria-hidden', String(!hasCurrentItem));
submenu.toggleAttribute('inert', !hasCurrentItem);
heading.dataset.sidebarAccordionReady = 'true';
heading.setAttribute('aria-controls', submenuId);
heading.setAttribute('aria-expanded', String(hasCurrentItem));
item.classList.add('has-submenu');
item.classList.toggle('is-open', hasCurrentItem);
updateSubmenuHeight();
heading.addEventListener('pointermove', function (e) {
if (e.pointerType === 'touch') return;
var headingRect = heading.getBoundingClientRect();
heading.classList.toggle('is-chevron-hover', e.clientX >= headingRect.right - 38);
});
heading.addEventListener('pointerleave', function () {
heading.classList.remove('is-chevron-hover');
});
heading.addEventListener('click', function (e) {
var headingRect = heading.getBoundingClientRect();
var isChevronClick = e.clientX >= headingRect.right - 38;
if (!isChevronClick) return;
e.preventDefault();
e.stopPropagation();
var willOpen = heading.getAttribute('aria-expanded') !== 'true';
updateSubmenuHeight();
heading.setAttribute('aria-expanded', String(willOpen));
item.classList.toggle('is-open', willOpen);
submenu.setAttribute('aria-hidden', String(!willOpen));
submenu.toggleAttribute('inert', !willOpen);
}, true);
});
});
}
// 商品検索ウィジェットの Shadow DOM に共通商品カードスタイルを適用
function initCategorySearchCardStyles() {
var host = document.querySelector('#fs-search-root');
if (!host) return;
var root = host.shadowRoot;
if (!root) {
if (host.dataset.groupCardStylesWaiting === 'true') return;
host.dataset.groupCardStylesWaiting = 'true';
var attempts = 0;
var timer = window.setInterval(function () {
attempts += 1;
if (host.shadowRoot || attempts >= 50 || !host.isConnected) {
window.clearInterval(timer);
delete host.dataset.groupCardStylesWaiting;
if (host.shadowRoot) initCategorySearchCardStyles();
}
}, 200);
return;
}
function ensureStylesheet() {
if (root.querySelector('link[data-group-card-style]')) return;
var link = document.createElement('link');
link.rel = 'stylesheet';
link.href = '/asset2026/css/group.css';
link.dataset.groupCardStyle = 'true';
root.appendChild(link);
}
ensureStylesheet();
if (!root.groupCardStylesObserver && 'MutationObserver' in window) {
root.groupCardStylesObserver = new MutationObserver(ensureStylesheet);
root.groupCardStylesObserver.observe(root, { childList: true });
}
}
// style.css 内の閲覧履歴ルールだけを Shadow DOM に適用
var historyWidgetCssPromise;
function loadHistoryWidgetCss() {
if (!historyWidgetCssPromise) {
var stylesheet = document.querySelector('link[rel="stylesheet"][href*="asset2026/css/style.css"]');
var href = stylesheet ? stylesheet.href : '/asset2026/css/style.css';
historyWidgetCssPromise = fetch(href).then(function (response) {
if (!response.ok) throw new Error('style.css could not be loaded');
return response.text();
}).then(function (css) {
var start = css.indexOf('/* HISTORY_WIDGET_SHADOW_START');
var firstRule = css.indexOf('*/', start) + 2;
var end = css.indexOf('/* HISTORY_WIDGET_SHADOW_END */', firstRule);
if (start < 0 || firstRule < 2 || end < 0) throw new Error('History widget styles are missing from style.css');
return css.slice(firstRule, end);
});
}
return historyWidgetCssPromise;
}
function initHistoryWidgetStyles() {
document.querySelectorAll('.g-history > .fs-search-widget').forEach(function (host) {
host.toggleAttribute('data-history-nav', Boolean(host.closest('.spAccordionNav')));
var root = host.shadowRoot;
if (!root) {
if (host.dataset.historyStylesWaiting === 'true') return;
host.dataset.historyStylesWaiting = 'true';
var attempts = 0;
var timer = window.setInterval(function () {
attempts += 1;
if (host.shadowRoot || attempts >= 50 || !host.isConnected) {
window.clearInterval(timer);
delete host.dataset.historyStylesWaiting;
if (host.shadowRoot) initHistoryWidgetStyles();
}
}, 200);
return;
}
function ensureStylesheet() {
if (root.querySelector('style[data-history-style]')) return;
loadHistoryWidgetCss().then(function (css) {
if (root.querySelector('style[data-history-style]')) return;
var style = document.createElement('style');
style.dataset.historyStyle = 'true';
style.textContent = css;
root.appendChild(style);
}).catch(function (error) {
console.error('Failed to apply history widget styles:', error);
});
}
ensureStylesheet();
if (!root.historyStylesObserver && 'MutationObserver' in window) {
root.historyStylesObserver = new MutationObserver(ensureStylesheet);
root.historyStylesObserver.observe(root, { childList: true });
}
});
}
// 共通処理の初期化
var commonInitialized = false;
function initializeCommon() {
initCategorySearchCardStyles();
initHistoryWidgetStyles();
initColumnPickupWidget();
if (commonInitialized) {
// 後から追加されたヘッダーやカテゴリーだけを追加初期化する
initFatNav('.hamburger--menu, .hamburger--search');
initStickyHeader();
initFixedHeader();
initSidebarSearchCategory();
initFooterCalendarSlider();
return;
}
commonInitialized = true;
// 発火 - 商品スライダー
initItemSlider();
// 発火 - SPフッター営業日カレンダー
initFooterCalendarSlider();
// 発火 - ハンバーガー
initFatNav('.hamburger--menu, .hamburger--search');
// 発火 - SPのstickyヘッダー
initStickyHeader();
// 発火 - スクロール後に出現する固定ヘッダー
initFixedHeader();
// 発火 - アンカーズレ防止
scrollToIdFromUrl();
// 発火 - タブ切り替え
initializeTabs();
// 発火 - サイドバー・SPメニューのカテゴリーアコーディオン
initSidebarSearchCategory();
// 発火 - スクロール中にclass付与とポップアップ
initializePopup();
// 発火 - PC/SP分岐(プレースホルダー文言など)
checkBreakpoint();
}
// scriptの実行位置に関係なく初期化する
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initializeCommon, { once: true });
} else {
initializeCommon();
}
// ページ側でヘッダーやメニューが後から追加された場合も初期化する
if ('MutationObserver' in window) {
var commonDomObserver = new MutationObserver(function (mutations) {
var hasCommonContent = mutations.some(function (mutation) {
return Array.prototype.some.call(mutation.addedNodes, function (node) {
if (node.nodeType !== 1) return false;
return node.matches('.g-header, .g-headerContent, .g-headerFixed, .hamburger--menu, .hamburger--search, .spAccordionNavSearch.-category, .ft-calendar, .ft-calendar > div, #fs-search-root, .g-history, .g-history > .fs-search-widget, .g-column, .g-column__pickup > .fs-search-widget') ||
Boolean(node.querySelector('.g-header, .g-headerContent, .g-headerFixed, .hamburger--menu, .hamburger--search, .spAccordionNavSearch.-category, .ft-calendar, .ft-calendar > div, #fs-search-root, .g-history, .g-history > .fs-search-widget, .g-column, .g-column__pickup > .fs-search-widget'));
});
});
if (hasCommonContent) initializeCommon();
});
var observeCommonDom = function () {
if (!document.body) return;
commonDomObserver.observe(document.body, { childList: true, subtree: true });
};
if (document.body) {
observeCommonDom();
} else {
document.addEventListener('DOMContentLoaded', observeCommonDom, { once: true });
}
}
// 分岐
window.addEventListener('load', function () {
checkBreakpoint();
initFooterCalendarSlider();
});
window.addEventListener('resize', function () {
checkBreakpoint();
});
function checkBreakpoint() {
if (window.innerWidth < 768) {
// SPのみの処理
setSearchPlaceholder('お探しの商品を入力');
} else {
// PCのみの処理
setSearchPlaceholder('お探しの商品を入力');
}
}
// 関数定義 - 検索フォームのプレースホルダー切り替え(PC/SPで文言が違う)
function setSearchPlaceholder(text) {
document.querySelectorAll('.g-searchForm input[type="text"]').forEach(function (el) {
var placeholder = el.closest('.g-sidebar') ? 'キーワードを入力' : text;
if (el.placeholder !== placeholder) el.placeholder = placeholder;
});
}