{"id":3,"date":"2026-04-07T19:59:14","date_gmt":"2026-04-07T10:59:14","guid":{"rendered":"https:\/\/salon.angin.cloud\/west-shinjuku-clinic\/booking\/"},"modified":"2026-04-09T12:56:15","modified_gmt":"2026-04-09T03:56:15","slug":"booking","status":"publish","type":"page","link":"https:\/\/salon.angin.cloud\/west-shinjuku-clinic\/","title":{"rendered":"\u4e88\u7d04-\u3075\u308b\u304b\u308f\u30af\u30ea\u30cb\u30c3\u30af"},"content":{"rendered":"      <style>\n      body.angin-mx-mobile-app{\n        background:#f6f1e8;\n      }\n      body.angin-mx-mobile-app #wpadminbar{\n        position:fixed;\n      }\n      body.angin-mx-mobile-app header,\n      body.angin-mx-mobile-app footer,\n      body.angin-mx-mobile-app #masthead,\n      body.angin-mx-mobile-app #colophon,\n      body.angin-mx-mobile-app .site-header,\n      body.angin-mx-mobile-app .site-footer,\n      body.angin-mx-mobile-app .ast-mobile-header-wrap,\n      body.angin-mx-mobile-app .entry-header,\n      body.angin-mx-mobile-app .page-header,\n      body.angin-mx-mobile-app nav[aria-label=\"breadcrumb\"],\n      body.angin-mx-mobile-app nav[aria-label=\"Breadcrumb\"],\n      body.angin-mx-mobile-app .breadcrumbs,\n      body.angin-mx-mobile-app .breadcrumb,\n      body.angin-mx-mobile-app .ast-breadcrumbs-wrapper,\n      body.angin-mx-mobile-app .rank-math-breadcrumb,\n      body.angin-mx-mobile-app .aioseo-breadcrumbs,\n      body.angin-mx-mobile-app .yoast-breadcrumb,\n      body.angin-mx-mobile-app .sidebar,\n      body.angin-mx-mobile-app aside{\n        display:none !important;\n      }\n      body.angin-mx-mobile-app .site,\n      body.angin-mx-mobile-app #page,\n      body.angin-mx-mobile-app #content,\n      body.angin-mx-mobile-app .site-content,\n      body.angin-mx-mobile-app main,\n      body.angin-mx-mobile-app article,\n      body.angin-mx-mobile-app .entry-content{\n        margin:0 !important;\n        padding:0 !important;\n        max-width:none !important;\n      }\n          <\/style>\n        <script>\n      (function(){\n        const pageClass = 'angin-mx-page-booking';\n        const mobileBreakpoint = 768;\n        const viewportContent = 'width=device-width, initial-scale=1, viewport-fit=cover';\n        const debugMode = false;\n        let queuedFrame = 0;\n        let queuedTimer = 0;\n        function syncViewportMetas(content){\n          const head = document.head;\n          if (!head) return false;\n          let changed = false;\n          let metas = Array.prototype.slice.call(document.querySelectorAll('meta[name=\"viewport\"]'));\n          if (!metas.length) {\n            const meta = document.createElement('meta');\n            meta.name = 'viewport';\n            meta.id = 'angin-mx-viewport';\n            head.insertBefore(meta, head.firstChild || null);\n            metas = [meta];\n            changed = true;\n          }\n          metas.forEach(function(meta, index){\n            const current = String(meta.getAttribute('content') || '');\n            if (current !== content) {\n              meta.setAttribute('content', content);\n              changed = true;\n            }\n            if (!meta.id && index === 0) meta.id = 'angin-mx-viewport';\n          });\n          return changed;\n        }\n        function ensureResponsiveViewport(){\n          return syncViewportMetas(viewportContent);\n        }\n        function getViewportWidth(){\n          const widths = [];\n          const docEl = document.documentElement;\n          const body = document.body;\n          const visualViewport = window.visualViewport;\n          const screenObj = window.screen || {};\n          const innerWidth = Number(window.innerWidth || 0);\n          const clientWidth = Number(docEl && docEl.clientWidth || 0);\n          const bodyWidth = Number(body && body.clientWidth || 0);\n          const visualWidth = Number(visualViewport && visualViewport.width || 0);\n          if (innerWidth > 0) widths.push(innerWidth);\n          if (clientWidth > 0) widths.push(clientWidth);\n          if (bodyWidth > 0) widths.push(bodyWidth);\n          if (visualWidth > 0) widths.push(visualWidth);\n          if (!widths.length) {\n            const screenWidth = Number(screenObj.width || 0);\n            const availWidth = Number(screenObj.availWidth || 0);\n            if (screenWidth > 0) widths.push(screenWidth);\n            if (availWidth > 0) widths.push(availWidth);\n          }\n          return widths.length ? Math.min.apply(null, widths) : 0;\n        }\n        function getShortestScreenSide(){\n          const screenObj = window.screen || {};\n          const sides = [Number(screenObj.width || 0), Number(screenObj.height || 0)].filter(function(value){\n            return value > 0;\n          });\n          return sides.length ? Math.min.apply(null, sides) : 0;\n        }\n        function hasMobileUserAgent(){\n          const uaData = navigator.userAgentData;\n          if (uaData && typeof uaData.mobile === 'boolean' && uaData.mobile) return true;\n          const ua = String(navigator.userAgent || '');\n          return \/(android|iphone|ipod|ipad|mobile|windows phone)\/i.test(ua);\n        }\n        function hasCoarsePointer(){\n          if (window.matchMedia && window.matchMedia('(any-pointer: coarse)').matches) return true;\n          return Number(navigator.maxTouchPoints || 0) > 1;\n        }\n        function hasMobileDeviceContext(){\n          const shortestSide = getShortestScreenSide();\n          if (shortestSide > 0 && shortestSide <= 560) return true;\n          if (hasMobileUserAgent() && shortestSide > 0 && shortestSide <= 1280) return true;\n          if (hasCoarsePointer() && shortestSide > 0 && shortestSide <= 1024) return true;\n          return false;\n        }\n        function getViewportMetaContents(){\n          return Array.prototype.slice.call(document.querySelectorAll('meta[name=\"viewport\"]')).map(function(meta, index){\n            const id = meta.id ? ('#' + meta.id) : ('#' + index);\n            return id + ' ' + String(meta.getAttribute('content') || '');\n          });\n        }\n        function buildDebugPayload(extra){\n          const docEl = document.documentElement;\n          const body = document.body;\n          const visualViewport = window.visualViewport;\n          const screenObj = window.screen || {};\n          const payload = {\n            page: pageClass,\n            href: String(location.href || ''),\n            ua: String(navigator.userAgent || ''),\n            uaMobile: hasMobileUserAgent(),\n            anyPointerCoarse: !!(window.matchMedia && window.matchMedia('(any-pointer: coarse)').matches),\n            maxTouchPoints: Number(navigator.maxTouchPoints || 0),\n            innerWidth: Number(window.innerWidth || 0),\n            clientWidth: Number(docEl && docEl.clientWidth || 0),\n            bodyWidth: Number(body && body.clientWidth || 0),\n            visualWidth: Number(visualViewport && visualViewport.width || 0),\n            screenWidth: Number(screenObj.width || 0),\n            screenHeight: Number(screenObj.height || 0),\n            availWidth: Number(screenObj.availWidth || 0),\n            availHeight: Number(screenObj.availHeight || 0),\n            shortestSide: getShortestScreenSide(),\n            viewportWidth: getViewportWidth(),\n            dpr: Number(window.devicePixelRatio || 0),\n            bodyHasMobileClass: !!(body && body.classList.contains('angin-mx-mobile-app')),\n            viewportMetas: getViewportMetaContents(),\n          };\n          return Object.assign(payload, extra || {});\n        }\n        function renderDebugPanel(payload){\n          if (!debugMode) return;\n          const panel = document.getElementById('angin-mx-mobile-debug');\n          if (!panel) return;\n          const body = panel.querySelector('.mxdbg-body') || panel;\n          const lines = [\n            'url: ' + payload.href,\n            'mobile: ' + payload.isMobile + ' | class: ' + payload.bodyHasMobileClass,\n            'reason: media=' + payload.mobileByMedia + ' viewport=' + payload.mobileByViewport + ' device=' + payload.mobileByDevice,\n            'widths: viewport=' + payload.viewportWidth + ' inner=' + payload.innerWidth + ' client=' + payload.clientWidth + ' body=' + payload.bodyWidth + ' visual=' + payload.visualWidth,\n            'screen: ' + payload.screenWidth + 'x' + payload.screenHeight + ' avail=' + payload.availWidth + 'x' + payload.availHeight + ' shortest=' + payload.shortestSide + ' dpr=' + payload.dpr,\n            'input: uaMobile=' + payload.uaMobile + ' coarse=' + payload.anyPointerCoarse + ' touch=' + payload.maxTouchPoints,\n            'viewportChanged: ' + payload.viewportChanged,\n            'metas: ' + (payload.viewportMetas.length ? payload.viewportMetas.join(' || ') : '(none)'),\n            'classes: ' + (document.body ? document.body.className : '(no body)'),\n            'ua: ' + payload.ua\n          ];\n          body.textContent = lines.join('\\n');\n          window.__ANGIN_MX_MOBILE_DEBUG_LAST__ = payload;\n          if (window.console && console.info) console.info('[angin-mx-mobile-debug]', payload);\n        }\n        function calculateMobileDecision(){\n          const mobileByMedia = !!(window.matchMedia && window.matchMedia('(max-width: ' + mobileBreakpoint + 'px)').matches);\n          const viewportWidth = getViewportWidth();\n          const mobileByViewport = viewportWidth > 0 && viewportWidth <= mobileBreakpoint;\n          const mobileByDevice = hasMobileDeviceContext();\n          return {\n            isMobile: mobileByMedia || mobileByViewport || mobileByDevice,\n            mobileByMedia: mobileByMedia,\n            mobileByViewport: mobileByViewport,\n            mobileByDevice: mobileByDevice,\n            viewportWidth: viewportWidth,\n          };\n        }\n        function scheduleMxMobileShell(delay){\n          if (delay > 0) {\n            if (queuedTimer) window.clearTimeout(queuedTimer);\n            queuedTimer = window.setTimeout(function(){\n              queuedTimer = 0;\n              applyMxMobileShell();\n            }, delay);\n            return;\n          }\n          if (queuedFrame && window.cancelAnimationFrame) window.cancelAnimationFrame(queuedFrame);\n          if (window.requestAnimationFrame) {\n            queuedFrame = window.requestAnimationFrame(function(){\n              queuedFrame = 0;\n              applyMxMobileShell();\n            });\n            return;\n          }\n          applyMxMobileShell();\n        }\n        function applyMxMobileShell(){\n          const viewportChanged = ensureResponsiveViewport();\n          const body = document.body;\n          if (!body) return;\n          const wasMobile = body.classList.contains('angin-mx-mobile-app');\n          const decision = calculateMobileDecision();\n          body.classList.add(pageClass);\n          if (decision.isMobile) body.classList.add('angin-mx-mobile-app');\n          else body.classList.remove('angin-mx-mobile-app');\n          const payload = buildDebugPayload({\n            isMobile: decision.isMobile,\n            wasMobile: wasMobile,\n            mobileByMedia: decision.mobileByMedia,\n            mobileByViewport: decision.mobileByViewport,\n            mobileByDevice: decision.mobileByDevice,\n            viewportChanged: viewportChanged,\n          });\n          renderDebugPanel(payload);\n          if (wasMobile !== decision.isMobile && typeof window.dispatchEvent === 'function') {\n            try {\n              window.dispatchEvent(new CustomEvent('angin-mx-mobile-shell-change', {\n                detail: {\n                  isMobile: decision.isMobile,\n                  viewportWidth: decision.viewportWidth,\n                }\n              }));\n            } catch (e) {}\n          }\n          if (viewportChanged) {\n            scheduleMxMobileShell();\n            scheduleMxMobileShell(120);\n          }\n        }\n        applyMxMobileShell();\n        if (document.readyState === 'loading') {\n          document.addEventListener('DOMContentLoaded', applyMxMobileShell, { once:true });\n        }\n        window.addEventListener('load', applyMxMobileShell, { passive:true });\n        window.addEventListener('pageshow', applyMxMobileShell, { passive:true });\n        window.addEventListener('orientationchange', applyMxMobileShell, { passive:true });\n        window.addEventListener('resize', applyMxMobileShell, { passive:true });\n        if (window.visualViewport && typeof window.visualViewport.addEventListener === 'function') {\n          window.visualViewport.addEventListener('resize', applyMxMobileShell, { passive:true });\n        }\n      })();\n    <\/script>\n      <div id=\"mx\" class=\"angin-mx\" data-mx-instance=\"mx_1\">\n    <style>\n      .angin-mx{max-width:960px;margin:16px auto;font-size:16px;--mx-admin-top:0px;--mx-mobile-stepper-h:0px}\n      .angin-mx label{display:block;margin:.6rem 0 .2rem}\n      .angin-mx select,.angin-mx input,.angin_mx textarea,.angin-mx textarea{width:100%;padding:6px;text-align: center;margin-bottom: 10px;border:1px solid #ccc;border-radius:10px;box-sizing:border-box}\n      .row{display:flex;gap:12px;flex-wrap:wrap}.col{flex:1;min-width:240px}\n      .btn{padding:.75rem 1rem;border-radius:12px;border:0;cursor:pointer;transition:transform .04s ease,box-shadow .2s ease,opacity .2s ease}\n      .btn:active{transform:translateY(1px)}\n      .btn-primary{background:#0d63ff;color:#fff;box-shadow:0 6px 16px rgba(13,99,255,.18)}\n      .btn-secondary{background: #eef1f6; font-size: 14px; margin:2px; padding: 6px 16px 6px 16px;color:#414141;top:5px;border: 1px solid #b1b1b1;}\n      .btn-secondary[disabled]{background:#e5e7eb;color:#9ca3af;border-color:#d1d5db;box-shadow:none;}\n      #mx-week-nav .mx-head-buttons{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;width:100%;align-items:stretch}\n      #mx-week-nav .mx-head-buttons .btn{width:100%;margin:0;min-height:42px;padding:8px 10px}\n      .btn-close{background: #fff; font-size: 20px; margin: 4px; padding: 8px;color:#414141;top:5px;left:15px;}\n      .btn[disabled]{opacity:.6;cursor:not-allowed}\n      .note{font-size:.9rem;color:#666}\n      .angin-mx [type=button]:focus,\n      .angin-mx [type=button]:hover,\n      .angin-mx [type=submit]:focus,\n      .angin-mx [type=submit]:hover,\n      .angin-mx button:focus,\n      .angin-mx button:hover{\n        color:#4d4d4d;\n        background-color:#fff;\n        text-decoration:none;\n      }\n\n\/* ===============================\n   \u30d5\u30a9\u30eb\u30c0\u30fc\u578b\u30ab\u30c6\u30b4\u30ea\u30bf\u30d6\uff08\u5b89\u5b9a\u7248\uff09\n================================ *\/\n.cat-tabs{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin:14px 0 16px;isolation:isolate;}\n\n\/* \u7e67\uff7f\u7e5d\u5384\uff7c\u58f9\uff44\u7e67\u221a\uff44\u7e3a\u5436\uff1e\u7e67\uff7b\u7e67\uff70\u7e5d\uff61\u7e5d\uff73\u7e5d\u30fb*\/\n.cat-btn{--cat:#ccc;--cat-txt:#0b1220;appearance:none;border:1px solid #d7dde7;background:#fff;color:#475569;padding:12px 18px;min-height:46px;font-size:14px;font-weight:700;line-height:1.15;border-radius:14px;cursor:pointer;transition:transform .18s ease,box-shadow .18s ease,border-color .18s ease,background .18s ease,color .18s ease;position:relative;z-index:1;box-shadow:0 3px 10px rgba(15,23,42,.05);}\n.cat-btn::before{content:\"\";display:none;width:8px;height:8px;margin-right:8px;border-radius:999px;background:var(--cat);vertical-align:middle;}\n.cat-btn[aria-selected=\"false\"]{background:#fff;color:#475569;border-color:#d7dde7;}\n.cat-btn:hover{transform:translateY(-1px);border-color:#c9d2df;box-shadow:0 10px 18px rgba(15,23,42,.08);}\n.cat-btn[aria-selected=\"true\"]{background:var(--cat);color:var(--cat-txt);border-color:var(--cat);transform:translateY(-2px);z-index:2;box-shadow:0 12px 22px rgba(15,23,42,.14);}\n.cat-btn[aria-selected=\"true\"]::before{display:inline-block;background:var(--cat);box-shadow:0 0 0 3px rgba(255,255,255,.55);}\n.cat-btn[aria-selected=\"true\"]::after{content:\"\";position:absolute;left:12px;right:12px;bottom:6px;height:3px;border-radius:999px;background:rgba(255,255,255,.45);}\n.cat-btn:focus-visible{outline:3px solid rgba(59,130,246,.28);outline-offset:2px;}\n\n\/* \u7e67\uff6b\u7e5d\uff7c\u7e5d\u30fb*\/\n.cards{border:1px solid #e7d8a8;border-radius:20px;padding:16px;background:#ffffff;box-shadow:0 10px 24px rgba(163,121,0,.06);}\n\nbody.angin-mx-mobile-app .cat-tabs{display:flex;justify-content:flex-start;align-items:center;flex-wrap:nowrap;gap:8px;padding-top:0;overflow-x:auto;overflow-y:hidden;scrollbar-width:none;-webkit-overflow-scrolling:touch;}\nbody.angin-mx-mobile-app .cat-tabs::-webkit-scrollbar{display:none;}\nbody.angin-mx-mobile-app .cat-btn{white-space:nowrap;padding:11px 14px;font-size:13px;min-height:42px;flex:0 0 auto;transform:none;box-shadow:0 3px 10px rgba(15,23,42,.06);}\nbody.angin-mx-mobile-app .cat-tabs.mode-open .cat-btn,\nbody.angin-mx-mobile-app .cat-tabs.mode-overlap .cat-btn{margin-left:0;}\nbody.angin-mx-mobile-app .cat-tabs.mode-open .cat-btn:first-child,\nbody.angin-mx-mobile-app .cat-tabs.mode-overlap .cat-btn:first-child{margin-left:0;}\nbody.angin-mx-mobile-app .cat-btn[aria-selected=\"false\"]{transform:none;opacity:1;}\nbody.angin-mx-mobile-app .cat-btn[aria-selected=\"true\"]{transform:none;opacity:1;z-index:2;box-shadow:0 10px 18px rgba(15,23,42,.14);}\n\n      \/* \u30c6\u30fc\u30d6\u30eb *\/\n      table.mx{border-collapse:collapse;min-width:100%;width:100%}\n      table.mx th,table.mx td{border:1px solid #8a7f58;text-align:center;padding:.12rem;position:relative;background:#fff}\n      table.mx th.time{position:sticky;padding: 2px 2px;left:0;background:#efece6;z-index:300}\n      table tbody > tr:nth-child(odd) > td, table tbody > tr:nth-child(odd) > th {background-color: #ffffff;}\n      table.mx th, table.mx td{border: 1px solid #bfb592;padding: 2px;}\n      table th {font-weight: 600;} \n\n      \/* \u571f\u65e5\u30fb\u795d\u8272 *\/\n      .col-sat{background:#edf3f9 !important}\n      .col-sun{background:#ede3e3 !important}\n      .col-hol{background:#f7f0e1 !important}\n      .col-sat:not(.na){background:#edf3f9 !important}\n      .col-sun:not(.na){background:#ede3e3 !important}\n      .col-hol:not(.na){background:#f7f0e1 !important}\n\n      #mx{\n        --mx-ok:#1d3aa4;\n        --mx-one:#0300c7;\n        --mx-full:#8a8a8a;\n        --mx-na-bg:#f2f2f2;\n        --mx-na-tx:#888888;\n        --mx-stick-top:0px; --mx-month-h:28px; --mx-day-h:28px;\n      }\n      td.na{background:var(--mx-na-bg);color:var(--mx-na-tx);cursor:not-allowed;pointer-events:none;user-select:none}\n      td.na.full{background:var(--mx-na-bg)!important;color:var(--mx-na-tx)!important}\n      td.ok{font-size:20px;color:var(--mx-ok);cursor:pointer}\n      td.one{font-size:20px;color:var(--mx-one);cursor:pointer}\n      td.full{color:var(--mx-full)}\n      td.picked{outline:0 solid #ff5e5e; box-shadow:inset 0 0 0 9999px rgba(255,94,94,.08)}\n      td.picked::after{content:'\u2713'; position:absolute; top:50%; left:50%; transform:translate(-50%,-50%); font-size:16px; background:#ff5e5e; color:#fff; width:26px; height:26px; line-height:24px; text-align:center; border-radius:50%}\n\n      \/* \u30ab\u30fc\u30c9 *\/\n      .cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px;margin-top:2px}\n      .card{display:flex;gap:12px;border:1px solid #c5a012;border-radius:16px;padding:12px;background:linear-gradient(180deg,#fff,#e9e9e9); cursor:pointer;align-items:flex-start;transition:box-shadow .2s ease,transform .06s ease; position:relative;}\n      .card:hover{box-shadow:0 10px 24px rgba(22,30,50,.07)}\n\n      \/* \u753b\u50cf\uff0b\u6ce8\u76ee\u30d0\u30c3\u30b8\u7528\u306e\u30e9\u30c3\u30d1 *\/\n      .card-img-wrap{position:relative;width:126px;height:126px;flex-shrink:0;}\n      .card-img-wrap img{width:100%; height:100%;object-fit:cover;border-radius:12px;background:#f4f6fb;border:1px solid #eef1f6;}\n\n      \/* \u753b\u50cf\u306e\u4e0a\u306b\u4e57\u308b\u300c\u6ce8\u76ee\u8868\u8a18\u300d\u30d0\u30c3\u30b8 *\/\n      .card-image-badge{    position: absolute;top: 110px;left: -8px;padding: 2px 4px;border-radius: 0;background: #c5a012;border: 2px solid #fff;color: #fff;font-size: 10px;font-weight: 700;box-shadow: 0 4px 10px rgba(0, 0, 0, .18);z-index: 1;white-space: nowrap;}\n      .card-body{flex:1;min-width:140px}\n      .card-title{font-weight:800;line-height: 1.5;margin:2px 0 6px;font-size:14px;}\n      .card-desc{font-size:12px;color:#525866;line-height:1.4;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}\n      .card-meta{margin-top:8px;font-size:12px;color:#1f2430; display:flex; gap:6px; flex-wrap:wrap}\n      .cards-footer{margin-top:10px;font-size:11px;color:#6b7280;line-height:1.4;text-align:center}\n      .mx-promo-banner-wrap{display:flex;justify-content:center;margin:0 0 18px;}\n      .mx-promo-banner{display:block;width:min(100%,860px);padding:0;border:0;background:transparent;cursor:pointer;transition:transform .12s ease,box-shadow .2s ease;}\n      .mx-promo-banner:hover{transform:translateY(-1px);}\n      .mx-promo-banner img{display:block;width:100%;height:auto;border:1px solid #c5a012;border-radius:20px;background:#fff;box-shadow:0 12px 28px rgba(78,64,34,.08);object-fit:cover;}\n      .mx-promo-banner:focus-visible{outline:2px solid #0d63ff;outline-offset:4px;border-radius:20px;}\n      .card-badge{ display:inline-flex; align-items:center; gap:4px; padding:2px 8px; border-radius:999px; background:#eef1f6; color:#1f2430; border:1px solid #b1b1b1; font-size:11px; font-weight:700; line-height:1.6;}\n      .card.is-unbookable{opacity:.45}\n      \/* \u53d7\u4ed8\u524d\/\u5f8c\u30ea\u30dc\u30f3 *\/\n      .card-ribbon{ position:absolute; top:10px; left:10px; font-size:14px; font-weight: 600; background:#111827; color:#fff; padding:2px 8px; border-radius:999px; z-index:4;}\n      \/* \u30ea\u30dc\u30f3\u8272\u5206\u3051 *\/\n      .card .card-ribbon.before{ background:#0006ff !important; } \/* \u9752 *\/\n      .card .card-ribbon.after { background:#9ca3af !important; } \/* \u30b0\u30ec\u30fc *\/\n\n      .mx-mobile-stepper{display:none}\n      body.angin-mx-mobile-app .angin-mx{\n        max-width:none;\n        margin:0;\n        padding:0 0 24px;\n        background:linear-gradient(180deg,#f6f1e8 0%,#fbf8f2 220px,#fff 221px);\n        min-height:100vh;\n      }\n      body.angin-mx-mobile-app .mx-mobile-stepper{\n        display:block;\n        position:sticky;\n        top:var(--mx-admin-top);\n        z-index:360;\n        padding:calc(14px + env(safe-area-inset-top)) 16px 12px;\n        margin:0 calc(50% - 50vw) 0px;\n        background:rgba(246,241,232,.95);\n        backdrop-filter:blur(10px);\n        border-bottom:1px solid rgba(138,127,88,.12);\n      }\n      body.angin-mx-mobile-app .mx-mobile-stepper-track{\n        position:absolute;\n        left:40px;\n        right:40px;\n        top:32px;\n        height:2px;\n        background:#d6d1c7;\n      }\n      body.angin-mx-mobile-app .mx-mobile-stepper-items{\n        position:relative;\n        display:grid;\n        grid-template-columns:repeat(3,1fr);\n        gap:8px;\n      }\n      body.angin-mx-mobile-app .mx-mobile-step{\n        display:flex;\n        flex-direction:column;\n        align-items:center;\n        gap:8px;\n        text-align:center;\n        color:#9b978f;\n        font-size:12px;\n        position:relative;\n        z-index:1;\n        cursor:pointer;\n      }\n      body.angin-mx-mobile-app .mx-mobile-step-dot{\n        width:40px;\n        height:40px;\n        border-radius:999px;\n        display:inline-flex;\n        align-items:center;\n        justify-content:center;\n        background:#b9b6b1;\n        color:#fff;\n        font-size:24px;\n        font-weight:700;\n        box-shadow:0 8px 18px rgba(0,0,0,.08);\n      }\n      body.angin-mx-mobile-app .mx-mobile-step.is-current{color:#2f2d29}\n      body.angin-mx-mobile-app .mx-mobile-step.is-current .mx-mobile-step-dot,\n      body.angin-mx-mobile-app .mx-mobile-step.is-done .mx-mobile-step-dot{\n        background:#3f3f42;\n      }\n      body.angin-mx-mobile-app .mx-mobile-step-label{\n        line-height:1.3;\n        min-height:2.6em;\n      }\n      body.angin-mx-mobile-app .mx-mobile-step:not(.is-upcoming) .mx-mobile-step-dot{\n        transition:transform .15s ease;\n      }\n      body.angin-mx-mobile-app .mx-mobile-step:not(.is-upcoming):active .mx-mobile-step-dot{\n        transform:scale(.96);\n      }\n      body.angin-mx-mobile-app .mx-mobile-step-current{\n        margin-top:10px;\n        text-align:center;\n        font-size:13px;\n        color:#5b564d;\n      }\n      body.angin-mx-mobile-app .row{\n        padding:0;\n      }\n      body.angin-mx-mobile-app .cards{\n        margin:0px;\n        border-radius:0px;\n        padding:14px;\n        box-shadow:0 10px 30px rgba(78,64,34,.08);\n      }\n      body.angin-mx-mobile-app #mx-week-nav,\n      body.angin-mx-mobile-app #mx-start-row,\n      body.angin-mx-mobile-app #mx-wrap{\n        padding-left:14px;\n        padding-right:14px;\n      }\n\n      th.cal-day.why-before{ outline: 2px dashed rgba(37,99,235,.35); }\n      th.cal-day.why-after { outline: 2px dashed rgba(156,163,175,.35); }\n\n      td.na.full.why-before{ background: rgba(37,99,235,.10) !important; color:#475569 !important; }\n      td.na.full.why-after { background: rgba(156,163,175,.15) !important; color:#4b5563 !important; }\n\n\n      \/* \u5c55\u958b & sticky\u30d8\u30c3\u30c0 *\/\n      .mx-wrap{max-height:0;overflow:hidden;transition:max-height .35s ease}\n      .mx-wrap.is-open{overflow:visible}\n      #mx-week-footer{\n        position:sticky;\n        bottom:0;\n        z-index:350;\n        background:#4d4d4d;\n        color:#fff;\n        padding:8px 12px;\n        padding-bottom:calc(8px + env(safe-area-inset-bottom));\n        margin-top:8px;\n        margin-left:calc(50% - 50vw);\n        margin-right:calc(50% - 50vw);\n        box-sizing:border-box;\n        line-height:1.3;\n        font-size:15px;\n      }\n      #mx-week-footer .mx-wf-close{color: #4d4d4d;position: absolute;top: -40px;right: 0px;border: 6px;font-size: 40px;padding: 4px;background: #ffffff00;z-index: 2;}\n      #mx-week-footer .mx-wf-close:hover{ background:#ffffff00; }\n      #mx-week-footer .mx-wf-line{display:flex;gap:5px;flex-wrap:wrap;align-items:center}\n      #mx-week-footer .mx-wf-item{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}\n      table.mx thead tr.mx-head-month th{ position:sticky; top:var(--mx-stick-top); z-index:200; background:#fff }\n      table.mx thead tr.mx-head-month th.time.cal-month{ z-index:310; background:#efece6 }\n      table.mx thead tr.mx-head-day th{ position:sticky; top:calc(var(--mx-stick-top) + var(--mx-month-h)); z-index:205;line-height:20px;text-align:center;background:#fff }\n\n      \/* \u30e2\u30fc\u30c0\u30eb *\/\n      #mx-detail{ position:fixed !important; inset:0 !important; z-index: 400; !important; display:none; align-items:center; justify-content:center; background:rgba(9,12,18,.45); backdrop-filter:saturate(140%) blur(6px); }\n      #mx-detail .box{ position:relative; width:min(720px,92vw); max-height:min(86vh,760px); border-radius:18px; padding:0; background:#fff; box-shadow:0 24px 60px rgba(0,0,0,.25); overflow:hidden; display:flex; flex-direction:column; }\n      #mx-modal-spinner{ position:absolute; inset:0; background:rgba(255,255,255,.75); display:none; align-items:center; justify-content:center; gap:12px; z-index:3; }\n      #mx-modal-spinner .spin{ width:36px; height:36px; border-radius:50%; border:3px solid #d9dbe3; border-top-color:#404040; animation:mxspin 1s linear infinite; }\n      #mx-modal-spinner .tx{ font-size:14px; color:#1f2430; font-weight:600 }\n      @keyframes mxspin{ to{ transform:rotate(360deg); } }\n      .modal-head{display:flex;align-items:center;justify-content:space-between;padding:0px 14px}\n      .modal-title{margin-top: 12px;margin-bottom:4px;font-size:18px;font-weight:600;color:#0b1220;letter-spacing:.2px}\n      .modal-body{display:grid;grid-template-columns:180px 1fr;gap:14px;padding:8px 8px;overflow-y:auto;min-height:0;}\n      .modal-hero{width:100%;height:140px;object-fit:cover;border-radius:12px;border:1px solid #eef1f6;background:#f4f6fb}\n      .modal-desc{color: #2b2f38; font-size: 14px;overflow-y: auto;white-space:pre-line;}\n      .modal-meta{display:flex;gap:6px;flex-wrap:wrap;padding: 4px 8px;color:#1f2430;font-weight:500}\n      #mx-detail-types.mx-types-slide{\n        flex-wrap:nowrap;\n        overflow-x:auto;\n        overflow-y:hidden;\n        -webkit-overflow-scrolling:touch;\n        scroll-snap-type:x proximity;\n        scrollbar-width:none;\n        -ms-overflow-style:none;\n      }\n      #mx-detail-types.mx-types-slide::-webkit-scrollbar{display:none}\n      #mx-detail-types.mx-types-wrap{\n        flex-wrap:wrap;\n        overflow:visible;\n        scroll-snap-type:none;\n      }\n      .modal-controls{}\n      .mx-staff-single{display:none;margin:2px 0 15px;padding:10px 12px;border:1px solid #d1d5db;border-radius:10px;background:#f9fafb;color:#111827;font-weight:600;line-height:1.45;text-align:left;}\n      .mx-staff-profile{display:none;border:1px solid #e5e7eb;border-radius:10px;padding:10px;margin:0 0 10px;background:#fff;}\n      .mx-staff-profile-inner{display:flex;gap:12px;align-items:flex-start;}\n      .mx-staff-profile-photo{width:85px;height:80px;border-radius:50%;object-fit:cover;border:1px solid #d1d5db;background:#f3f4f6;}\n      .mx-staff-profile-text{min-width:0;flex:1 1 auto;}\n      .mx-staff-profile-name{\n        font-weight:800;\n        font-size:18px;\n        line-height:1.25;\n        margin-bottom:6px;\n        color:#111827;\n      }\n      .mx-staff-profile-career{\n        margin-left:0px;\n        font-weight:600;\n        font-size:12px;\n        color:#4b5563;\n      }\n      .mx-staff-profile-body{\n        font-weight:400;\n        font-size:14px;\n        line-height:1.5;\n        color:#374151;\n        white-space:pre-wrap;\n      }\n      .modal-foot{display:flex;width:100%;padding:14px 16px;border-top:1px solid rgba(0,0,0,.06);justify-content:center;flex-direction:column;background:#ffffff;}\n      .modal-foot-row{display:flex;gap:10px;width:100%;}\n      \/* .modal-foot-row .btn{flex:1 1 0;} *\/\n      .btn-back{background:#9ca3af;color:#fff;border:0;}\n      #mx-wf-open{display:flex;align-items:center;justify-content:center;gap:8px;}\n      #mx-wf-open .mx-btn-spin{\n        display:none;\n        width:1em;\n        height:1em;\n        border:2px solid rgba(255,255,255,.45);\n        border-top-color:#fff;\n        border-radius:50%;\n        animation:mxspin 1s linear infinite;\n      }\n      #mx-wf-open.is-loading .mx-btn-label{display:none;}\n      #mx-wf-open.is-loading .mx-btn-spin{display:inline-block;}\n      .pill{display:inline-flex;align-items:center;gap:6px;background:#eef1f6;color:#1f2430;padding:.28rem .55rem;border-radius:999px;font-size:12px}\n      .pill-types{display:inline-flex;align-items:center;gap:0px;background:#ffcc6b;color:#1f2430;padding:.2rem .3rem;border-radius:999px;font-size:12px;white-space:nowrap;flex:0 0 auto;scroll-snap-align:start}\n      .btn:hover{opacity: 1;color: #000000;}\n      @media (max-width:640px){.modal-body{grid-template-columns:none}.modal-hero{height:120px}}\n\n\nbody.angin-mx-mobile-app #mx-detail { align-items: stretch; justify-content: flex-start;}\nbody.angin-mx-mobile-app #mx-detail .box { width: 100vw; max-width: 100vw; height: 100vh; max-height: 100vh; border-radius: 0; display: flex; flex-direction: column;}\nbody.angin-mx-mobile-app #mx-detail .modal-body { max-height: calc(100vh - 150px); padding-bottom: 90px; overflow-y: auto; min-height: 0;}\nbody.angin-mx-mobile-app .modal-foot{position: fixed; left: 0; right: 0; bottom: 0; display: flex; width: 100%; padding: 14px 16px; border-top: 1px solid rgba(0, 0, 0, .06); justify-content: center; flex-direction: column; z-index: 1000; background: #ffffff;}\nbody.angin-mx-mobile-app .modal-foot-row{display:flex;gap:10px;width:100%;}\n\/* .modal-foot-row .btn{flex:1 1 0;} *\/\n\n\n\/*  #mx-option-boxes { max-height: 180px; overflow-y: auto; padding-right: 4px;}\u3000*\/\n\/*  .mx-option-boxes { max-height: 81px; overflow-y: auto; overflow-x: hidden; border: 1px solid #b7b7b7; padding: 6px; border-radius: 7px; white-space: nowrap;}\u3000*\/\n      label {line-height: 1.4; vertical-align: middle;}\n    <\/style>\n\n    <!-- \u9078\u629e\u30b5\u30fc\u30d3\u30b9\uff08\u975e\u8868\u793a\uff09 -->\n    <select id=\"mx-service\" style=\"display:none\">\n      <option value=\"\">\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044<\/option>\n              <option value=\"\u767d\u7389\u70b9\u6ef4\" data-slug=\"%e7%99%bd%e7%8e%89%e7%82%b9%e6%bb%b4\">\u767d\u7389\u70b9\u6ef4<\/option>\n              <option value=\"\u9ad8\u6fc3\u5ea6\u767d\u7389\u70b9\u6ef4\" data-slug=\"%e9%ab%98%e6%bf%83%e5%ba%a6%e7%99%bd%e7%8e%89%e7%82%b9%e6%bb%b4\">\u9ad8\u6fc3\u5ea6\u767d\u7389\u70b9\u6ef4<\/option>\n              <option value=\"\u30b7\u30f3\u30c7\u30ec\u30e9\u70b9\u6ef4\" data-slug=\"%e3%82%b7%e3%83%b3%e3%83%87%e3%83%ac%e3%83%a9%e7%82%b9%e6%bb%b4\">\u30b7\u30f3\u30c7\u30ec\u30e9\u70b9\u6ef4<\/option>\n              <option value=\"\u5e73\u77f3\u5f0f\u30cb\u30f3\u30cb\u30af\u6ce8\u5c04\" data-slug=\"%e5%b9%b3%e7%9f%b3%e5%bc%8f%e3%83%8b%e3%83%b3%e3%83%8b%e3%82%af%e6%b3%a8%e5%b0%84\">\u5e73\u77f3\u5f0f\u30cb\u30f3\u30cb\u30af\u6ce8\u5c04<\/option>\n              <option value=\"\u5e73\u77f3\u5f0f\u30cf\u30a4\u30d1\u30fc\u30cb\u30f3\u30cb\u30af\u70b9\u6ef4\" data-slug=\"%e5%b9%b3%e7%9f%b3%e5%bc%8f%e3%83%8f%e3%82%a4%e3%83%91%e3%83%bc%e3%83%8b%e3%83%b3%e3%83%8b%e3%82%af%e7%82%b9%e6%bb%b4\">\u5e73\u77f3\u5f0f\u30cf\u30a4\u30d1\u30fc\u30cb\u30f3\u30cb\u30af\u70b9\u6ef4<\/option>\n              <option value=\"\u75b2\u52b4\u56de\u5fa9\u70b9\u6ef4\" data-slug=\"%e7%96%b2%e5%8a%b4%e5%9b%9e%e5%be%a9%e7%82%b9%e6%bb%b4\">\u75b2\u52b4\u56de\u5fa9\u70b9\u6ef4<\/option>\n              <option value=\"\u8d85\u75b2\u52b4\u56de\u5fa9\u70b9\u6ef4\" data-slug=\"%e8%b6%85%e7%96%b2%e5%8a%b4%e5%9b%9e%e5%be%a9%e7%82%b9%e6%bb%b4\">\u8d85\u75b2\u52b4\u56de\u5fa9\u70b9\u6ef4<\/option>\n              <option value=\"\u809d\u81d3\u5f37\u5316\u70b9\u6ef4\" data-slug=\"%e8%82%9d%e8%87%93%e5%bc%b7%e5%8c%96%e7%82%b9%e6%bb%b4\">\u809d\u81d3\u5f37\u5316\u70b9\u6ef4<\/option>\n              <option value=\"\u30cb\u65e5\u9154\u3044\u70b9\u6ef4\" data-slug=\"%e3%83%8b%e6%97%a5%e9%85%94%e3%81%84%e7%82%b9%e6%bb%b4\">\u30cb\u65e5\u9154\u3044\u70b9\u6ef4<\/option>\n              <option value=\"\u8d85\u7d76\u4e8c\u65e5\u9154\u3044\u70b9\u6ef4\" data-slug=\"%e8%b6%85%e7%b5%b6%e4%ba%8c%e6%97%a5%e9%85%94%e3%81%84%e7%82%b9%e6%bb%b4\">\u8d85\u7d76\u4e8c\u65e5\u9154\u3044\u70b9\u6ef4<\/option>\n              <option value=\"\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3C\u6ce8\u5c042,500mg\" data-slug=\"%e9%ab%98%e6%bf%83%e5%ba%a6%e3%83%93%e3%82%bf%e3%83%9f%e3%83%b3c%e6%b3%a8%e5%b0%842500mg\">\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3C\u6ce8\u5c042,500mg<\/option>\n              <option value=\"\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3C\u6ce8\u5c0412,500mg\" data-slug=\"%e9%ab%98%e6%bf%83%e5%ba%a6%e3%83%93%e3%82%bf%e3%83%9f%e3%83%b3c%e6%b3%a8%e5%b0%8412500mg\">\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3C\u6ce8\u5c0412,500mg<\/option>\n              <option value=\"\u30c0\u30a4\u30a8\u30c3\u30c8\u8102\u80aa\u71c3\u713c\u6ce8\u5c04\" data-slug=\"%e3%83%80%e3%82%a4%e3%82%a8%e3%83%83%e3%83%88%e8%84%82%e8%82%aa%e7%87%83%e7%84%bc%e6%b3%a8%e5%b0%84\">\u30c0\u30a4\u30a8\u30c3\u30c8\u8102\u80aa\u71c3\u713c\u6ce8\u5c04<\/option>\n              <option value=\"\u30c0\u30a4\u30a8\u30c3\u30c8\u8102\u80aa\u71c3\u713c\u70b9\u6ef4\" data-slug=\"%e3%83%80%e3%82%a4%e3%82%a8%e3%83%83%e3%83%88%e8%84%82%e8%82%aa%e7%87%83%e7%84%bc%e7%82%b9%e6%bb%b4\">\u30c0\u30a4\u30a8\u30c3\u30c8\u8102\u80aa\u71c3\u713c\u70b9\u6ef4<\/option>\n              <option value=\"NMN\u70b9\u6ef4300mg\" data-slug=\"nmn%e7%82%b9%e6%bb%b4300mg\">NMN\u70b9\u6ef4300mg<\/option>\n              <option value=\"NMN\u70b9\u6ef4500mg\" data-slug=\"nmn%e7%82%b9%e6%bb%b4500mg\">NMN\u70b9\u6ef4500mg<\/option>\n              <option value=\"\u30a8\u30af\u30bd\u30bd\u30fc\u30e0\uff08\u8102\u80aa\u7531\u6765\uff09\" data-slug=\"%e3%82%a8%e3%82%af%e3%82%bd%e3%82%bd%e3%83%bc%e3%83%a0%ef%bc%88%e8%84%82%e8%82%aa%e7%94%b1%e6%9d%a5%ef%bc%89\">\u30a8\u30af\u30bd\u30bd\u30fc\u30e0\uff08\u8102\u80aa\u7531\u6765\uff09<\/option>\n              <option value=\"\u30a8\u30af\u30bd\u30bd\u30fc\u30e0\uff08\u6b6f\u9ac4\u7531\u6765\uff09\" data-slug=\"%e3%82%a8%e3%82%af%e3%82%bd%e3%82%bd%e3%83%bc%e3%83%a0%ef%bc%88%e6%ad%af%e9%ab%84%e7%94%b1%e6%9d%a5%ef%bc%89\">\u30a8\u30af\u30bd\u30bd\u30fc\u30e0\uff08\u6b6f\u9ac4\u7531\u6765\uff09<\/option>\n              <option value=\"\u30a8\u30af\u30bd\u30bd\u30fc\u30e0\uff08\u80f4\u5e2f\u7531\u6765\uff09\" data-slug=\"%e3%82%a8%e3%82%af%e3%82%bd%e3%82%bd%e3%83%bc%e3%83%a0%ef%bc%88%e8%83%b4%e5%b8%af%e7%94%b1%e6%9d%a5%ef%bc%89\">\u30a8\u30af\u30bd\u30bd\u30fc\u30e0\uff08\u80f4\u5e2f\u7531\u6765\uff09<\/option>\n              <option value=\"\u30aa\u30f3\u30e9\u30a4\u30f3\u8a3a\u7642\" data-slug=\"%e3%82%aa%e3%83%b3%e3%83%a9%e3%82%a4%e3%83%b3%e8%a8%ba%e7%99%82\">\u30aa\u30f3\u30e9\u30a4\u30f3\u8a3a\u7642<\/option>\n          <\/select>\n\n    <!-- \u30ab\u30c6\u30b4\u30ea\u30fc\uff1a\u30dc\u30bf\u30f3\u7fa4\uff08TL\u8272\u9023\u52d5\uff09 -->\n        <div class=\"mx-mobile-stepper\" data-current-step=\"1\" aria-label=\"\u4e88\u7d04\u30b9\u30c6\u30c3\u30d7\">\n      <div class=\"mx-mobile-stepper-track\" aria-hidden=\"true\"><\/div>\n      <div class=\"mx-mobile-stepper-items\">\n                  <div class=\"mx-mobile-step is-current\" data-step=\"1\">\n            <span class=\"mx-mobile-step-dot\">1<\/span>\n            <span class=\"mx-mobile-step-label\">\u30e1\u30cb\u30e5\u30fc<\/span>\n          <\/div>\n                  <div class=\"mx-mobile-step is-upcoming\" data-step=\"2\">\n            <span class=\"mx-mobile-step-dot\">2<\/span>\n            <span class=\"mx-mobile-step-label\">\u65e5\u6642<\/span>\n          <\/div>\n                  <div class=\"mx-mobile-step is-upcoming\" data-step=\"3\">\n            <span class=\"mx-mobile-step-dot\">3<\/span>\n            <span class=\"mx-mobile-step-label\">\u4e88\u7d04\u624b\u7d9a<\/span>\n          <\/div>\n              <\/div>\n    <\/div>\n        <div class=\"row\">\n      <div class=\"col\">\n        <label><\/label>\n                <div id=\"mx-category-buttons\"\n             class=\"cat-tabs\"\n             style=\"\"\n             role=\"tablist\"\n             aria-label=\"\u30ab\u30c6\u30b4\u30ea\u30fc\">\n          <button type=\"button\" class=\"cat-btn\" role=\"tab\" aria-selected=\"true\" data-cat=\"category1\" style=\"--cat:#66b3ff;--cat-txt:#0b1220\">\u6765\u9662\u8a3a\u7642<\/button><button type=\"button\" class=\"cat-btn\" role=\"tab\" aria-selected=\"false\" data-cat=\"category2\" style=\"--cat:#9ad07e;--cat-txt:#0b1220\">\u30aa\u30f3\u30e9\u30a4\u30f3\u8a3a\u7642<\/button>        <\/div>\n        <div id=\"mx-cards\" class=\"cards\" aria-live=\"polite\"><\/div>\n        <div class=\"cards-footer\">\uff20\u304b\u308b\u3080\u308b\u4e88\u7d04<\/div>\n      <\/div>\n    <\/div>\n\n    <!-- \u9031\u306e\u8d77\u70b9 -->\n    <div class=\"row\" id=\"mx-start-row\" style=\"margin-top:6px;display:none;\">\n      <div class=\"col\">\n        <label>\u9031\u8868\u793a\u306e\u8d77\u70b9<\/label>\n        <input type=\"date\" id=\"mx-start\" value=\"2026-04-11\" min=\"2026-04-11\" max=\"2026-05-12\">\n      <\/div>\n    <\/div>\n\n    <!-- \u30ca\u30d3 -->\n    <div class=\"mx-head\" id=\"mx-week-nav\" style=\"margin-bottom: 10px;display:none;\">\n      <div class=\"mx-head-buttons\">\n        <button type=\"button\" class=\"btn btn-secondary\" id=\"mx-prev\" aria-label=\"\u524d\u306e\u9031\">< \u524d\u306e\u9031<\/button>\n        <button type=\"button\" class=\"btn btn-secondary\" id=\"mx-today\" aria-label=\"\u4eca\u65e5\u3078\u79fb\u52d5\">\u4eca\u65e5<\/button>\n        <button type=\"button\" class=\"btn btn-secondary\" id=\"mx-next\" aria-label=\"\u6b21\u306e\u9031\">\u6b21\u306e\u9031 ><\/button>\n       <span id=\"mx-range\" class=\"note\" style=\"display:none;\"><\/span> \n    <\/div>\n    <\/div>\n\n    <!-- \u7a7a\u304d\u67a0\u30c6\u30fc\u30d6\u30eb -->\n    <div class=\"mx-wrap\" id=\"mx-wrap\">\n      <div class=\"mx-loading\" id=\"mx-loading\" style=\"display:none\">\u8aad\u307f\u8fbc\u307f\u4e2d\u2026<\/div>\n      <table class=\"mx\" id=\"mx-table\" aria-live=\"polite\"><\/table>\n    <\/div>\n    <div id=\"mx-week-footer\" aria-live=\"polite\" style=\"display:none;\">\n      <button type=\"button\" class=\"mx-wf-close\" id=\"mx-wf-close\" aria-label=\"\u9589\u3058\u308b\">\u00d7<\/button>\n      <div class=\"mx-wf-line\">\n        <span class=\"mx-wf-item\" id=\"mx-wf-course\">\u30b3\u30fc\u30b9: -<\/span>\n        <span class=\"mx-wf-item\" id=\"mx-wf-option\">\u30aa\u30d7\u30b7\u30e7\u30f3: \u306a\u3057<\/span>\n        <span class=\"mx-wf-item\" id=\"mx-wf-staff\" style=\"display:none;\">\u62c5\u5f53: -<\/span>\n        <span class=\"mx-wf-item\" id=\"mx-wf-price\" style=\"\">\u91d1\u984d: -<\/span>\n      <\/div>\n      <div class=\"mx-wf-actions\" style=\"margin-top:8px;\">\n        <button type=\"button\" class=\"btn btn-primary\" id=\"mx-wf-open\" style=\"width:100%;display:none;\">\n          <span class=\"mx-btn-label\">\u65e5\u7a0b\u306e\u8abf\u6574\u3059\u308b<\/span>\n          <span class=\"mx-btn-spin\" aria-hidden=\"true\"><\/span>\n        <\/button>\n      <\/div>\n    <\/div>\n\n    <!-- \u96a0\u3057 -->\n    <input type=\"hidden\" id=\"mx-nonce\" value=\"843545f5f1\">\n    <input type=\"hidden\" id=\"mx-ajax\"  value=\"https:\/\/salon.angin.cloud\/west-shinjuku-clinic\/wp-admin\/admin-ajax.php\">\n    <input type=\"hidden\" id=\"mx-sym-ok\"  value=\"\u3007\">\n    <input type=\"hidden\" id=\"mx-sym-one\" value=\"\u3007\">\n    <input type=\"hidden\" id=\"mx-sym-full\"value=\"-\">\n    <input type=\"hidden\" id=\"mx-min-date\" value=\"2026-04-11\">\n    <input type=\"hidden\" id=\"mx-max-date\" value=\"2026-05-12\">\n    <input type=\"hidden\" id=\"mx-form-url\" value=\"\/west-shinjuku-clinic\/booking-entry\/\">\n<!-- \u30e2\u30fc\u30c0\u30eb -->\n<div id=\"mx-detail\" aria-hidden=\"true\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"mx-detail-title\">\n  <div class=\"box\">\n    <div id=\"mx-modal-spinner\" aria-hidden=\"true\">\n      <div class=\"spin\"><\/div>\n      <div class=\"tx\">\u7a7a\u304d\u67a0\u53d6\u5f97\u4e2d\u2026<\/div>\n    <\/div>\n\n    <div class=\"modal-head\">\n      <!-- \u2605 \u30bf\u30a4\u30c8\u30eb\uff0b\u7a2e\u985e\u3092\u307e\u3068\u3081\u308b\u30b3\u30f3\u30c6\u30ca -->\n      <div class=\"modal-head-main\">\n        <h5 id=\"mx-detail-title\" class=\"modal-title\"><\/h5>\n      <\/div>\n      <button type=\"button\" class=\"btn btn-close mx-detail-close\" id=\"mx-detail-close\" aria-label=\"\u9589\u3058\u308b\">\u2716<\/button>\n    <\/div>\n    <div id=\"mx-detail-types\" class=\"modal-meta mx-types-slide\"><\/div>\n\n    <div class=\"modal-body\">\n      <img id=\"mx-detail-img\" class=\"modal-hero\" alt=\"\">\n      <div>\n        <div id=\"mx-detail-desc\" class=\"modal-desc\"><\/div>\n        <div class=\"modal-meta\">\n          <span id=\"mx-detail-min\" class=\"pill\" style=\"\">\u6240\u8981 - \u5206<\/span>\n          <span id=\"mx-detail-price\" class=\"pill\" style=\"\">\u6599\u91d1 -<\/span>\n        <\/div>\n        <div class=\"modal-controls\">\n          <div>\n            <label id=\"mx-staff-label\">\u30b9\u30bf\u30c3\u30d5\uff08\u4efb\u610f\uff09<\/label>\n            <div id=\"mx-staff-single\" class=\"mx-staff-single\"><\/div>\n            <select id=\"mx-staff-modal\" style=\"margin: 2px 0px 15px 0px\" >\n              <option value=\"\">\u6307\u5b9a\u306a\u3057<\/option>\n            <\/select>\n            <div id=\"mx-staff-profile\" class=\"mx-staff-profile\">\n              <div class=\"mx-staff-profile-inner\">\n                <img id=\"mx-staff-profile-photo\" class=\"mx-staff-profile-photo\" alt=\"\">\n                <div class=\"mx-staff-profile-text\">\n                  <div class=\"mx-staff-profile-name\">\n                    <span id=\"mx-staff-profile-name\"><\/span><span id=\"mx-staff-profile-career\" class=\"mx-staff-profile-career\"><\/span>\n                  <\/div>\n                  <div id=\"mx-staff-profile-body\" class=\"mx-staff-profile-body\"><\/div>\n                <\/div>\n              <\/div>\n            <\/div>\n          <\/div>\n          <div id=\"mx-option-control\">\n            <label>\u30aa\u30d7\u30b7\u30e7\u30f3<\/label>\n            <select id=\"mx-option-modal\">\n              <option value=\"\">\u306a\u3057<\/option>\n            <\/select>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"modal-foot\">\n      <div class=\"modal-foot-row\">\n        <button type=\"button\" class=\"btn btn-back\" id=\"mx-detail-back\" style=\"width: 20%\">\u623b\u308b<\/button>\n        <button type=\"button\" class=\"btn btn-primary\" id=\"mx-detail-goto\" style=\"width: 80%\">\u65e5\u7a0b\u306e\u8abf\u6574\u3092\u3059\u308b<\/button>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n    <script>\n    (function(){\n      const $=(s,c=document)=>c.querySelector(s), $$=(s,c=document)=>Array.from(c.querySelectorAll(s));\n      const MX_INSTANCE = \"mx_1\";\n      let root = document.querySelector('.angin-mx[data-mx-instance=\"'+MX_INSTANCE+'\"]');\n      if (!root || root.dataset.mxInitialized === '1') return;\n      root.dataset.mxInitialized = '1';\n      const META_BY_CAT = {\"category1\":[{\"name\":\"\u767d\u7389\u70b9\u6ef4\",\"minutes\":30,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/\u767d\u7389\u70b9\u6ef4.jpg\",\"desc\":\"\u7f8e\u767d\u30fb\u809d\u6591\u30b1\u30a2\u30fb\u900f\u660e\u611f\u30a2\u30c3\u30d7\u306b\u7279\u5316\u3057\u305f\u9ad8\u914d\u5408\u70b9\u6ef4\u3067\u3059\u3002\",\"price\":\"7700\",\"price_num\":7700,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e7%99%bd%e7%8e%89%e7%82%b9%e6%bb%b4\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u7f8e\u767d\u30fb\u30a8\u30a4\u30b8\u30f3\u30b0\u30b1\u30a2\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u767d\u7389\u7f8e\u767d\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},{\"name\":\"\u9ad8\u6fc3\u5ea6\u767d\u7389\u70b9\u6ef4\",\"minutes\":60,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/\u767d\u7389\u70b9\u6ef4.jpg\",\"desc\":\"\u9ad8\u914d\u5408\u3067\u7f8e\u767d\u30fb\u809d\u6591\u30b1\u30a2\u30fb\u900f\u660e\u611f\u3092\u3057\u3063\u304b\u308a\u30b5\u30dd\u30fc\u30c8\u3059\u308b\u70b9\u6ef4\u3067\u3059\u3002\",\"price\":\"10400\",\"price_num\":10400,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e9%ab%98%e6%bf%83%e5%ba%a6%e7%99%bd%e7%8e%89%e7%82%b9%e6%bb%b4\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u7f8e\u767d\u30fb\u30a8\u30a4\u30b8\u30f3\u30b0\u30b1\u30a2\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u767d\u7389\u7f8e\u767d\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},{\"name\":\"\u30b7\u30f3\u30c7\u30ec\u30e9\u70b9\u6ef4\",\"minutes\":60,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/\u30b7\u30f3\u30c7\u30ec\u30e9\u70b9\u6ef4.jpg\",\"desc\":\"\u6297\u9178\u5316\u30fb\u7f8e\u767d\u30fb\u8102\u80aa\u71c3\u713c\u3092\u307e\u3068\u3081\u3066\u5f37\u5316\u3059\u308b\u9ad8\u914d\u5408\u70b9\u6ef4\u3067\u3059\u3002\",\"price\":\"10400\",\"price_num\":10400,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e3%82%b7%e3%83%b3%e3%83%87%e3%83%ac%e3%83%a9%e7%82%b9%e6%bb%b4\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u6297\u9178\u5316\u30fb\u4ee3\u8b1d\u4fc3\u9032\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u4ee3\u8b1d\u4fc3\u9032\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},{\"name\":\"\u5e73\u77f3\u5f0f\u30cb\u30f3\u30cb\u30af\u6ce8\u5c04\",\"minutes\":110,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/\u306b\u3093\u306b\u304f\u6ce8\u5c04.jpg\",\"desc\":\"\u306b\u3093\u306b\u304f\u3068\u30d3\u30bf\u30df\u30f3C\u3092\u914d\u5408\u3057\u3001\u75b2\u52b4\u56de\u5fa9\u3068\u514d\u75ab\u30ab\u30a2\u30c3\u30d7\u30fb\u7f8e\u808c\u3092\u540c\u6642\u306b\u30b5\u30dd\u30fc\u30c8\u3057\u307e\u3059\u3002\",\"price\":\"4500\",\"price_num\":4500,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e5%b9%b3%e7%9f%b3%e5%bc%8f%e3%83%8b%e3%83%b3%e3%83%8b%e3%82%af%e6%b3%a8%e5%b0%84\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u30d3\u30bf\u30df\u30f3C\u30fb\u75b2\u52b4\u56de\u5fa9\u30fb\u514d\u75ab\u529b\u30a2\u30c3\u30d7\u30fb\u7f8e\u808c\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u75b2\u52b4\u56de\u5fa9\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},{\"name\":\"\u5e73\u77f3\u5f0f\u30cf\u30a4\u30d1\u30fc\u30cb\u30f3\u30cb\u30af\u70b9\u6ef4\",\"minutes\":10,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/\u306b\u3093\u306b\u304f\u6ce8\u5c04.jpg\",\"desc\":\"\u30cb\u30f3\u30cb\u30af\u3068\u9ad8\u6fc3\u5ea6\u306b\u30d3\u30bf\u30df\u30f3C \u3092\u914d\u5408\u3057\u3001\u75b2\u52b4\u56de\u5fa9\u2022\u514d\u75ab\u30ab\u30a2\u30c3\u30d7\u3092\u3055\u3089\u306b\u5b9f\u611f\u3067\u304d\u307e\u3059\u3002\",\"price\":\"8000\",\"price_num\":8000,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e5%b9%b3%e7%9f%b3%e5%bc%8f%e3%83%8f%e3%82%a4%e3%83%91%e3%83%bc%e3%83%8b%e3%83%b3%e3%83%8b%e3%82%af%e7%82%b9%e6%bb%b4\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3C \u30fb\u75b2\u52b4\u56de\u5fa9\u2022\u514d\u75ab\u30ab\u30a2\u30c3\u30d7\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u75b2\u52b4\u56de\u5fa9\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},{\"name\":\"\u75b2\u52b4\u56de\u5fa9\u70b9\u6ef4\",\"minutes\":10,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/\u75b2\u52b4\u56de\u5fa9.jpg\",\"desc\":\"\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3C\u306b\u30cb\u30f3\u30cb\u30af\u3068\u5f37\u30df\u30ce\u3092\u914d\u5408\u3057\u3001\u7f8e\u767d\u30fb\u75b2\u52b4\u56de\u5fa9\u30fb\u809d\u6a5f\u80fd\u30b5\u30dd\u30fc\u30c8\u3092\u540c\u6642\u306b\u30b1\u30a2\u3057\u307e\u3059\u3002\",\"price\":\"7700\",\"price_num\":7700,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e7%96%b2%e5%8a%b4%e5%9b%9e%e5%be%a9%e7%82%b9%e6%bb%b4\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3C\u30fb\u5f37\u30df\u30ce\u7f8e\u767d\u30fb\u75b2\u52b4\u56de\u5fa9\u30fb\u809d\u6a5f\u80fd\u30b5\u30dd\u30fc\u30c8\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u75b2\u52b4\u56de\u5fa9\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},{\"name\":\"\u8d85\u75b2\u52b4\u56de\u5fa9\u70b9\u6ef4\",\"minutes\":10,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/\u75b2\u52b4\u56de\u5fa9.jpg\",\"desc\":\"\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3C\u3092\u9ad8\u914d\u5408\u306b\u3001\u30cb\u30f3\u30cb\u30af\u3068\u5f37\u30df\u30ce\u3092\u5f37\u5316\u3057\u3001\u7f8e\u767d\u30fb\u75b2\u52b4\u56de\u5fa9\u30fb\u809d\u6a5f\u80fd\u30b5\u30dd\u30fc\u30c8\u3092\\r\\n\u3088\u308a\u9ad8\u3081\u305f\u3001\u30b9\u30da\u30b7\u30e3\u30eb\u30b3\u30fc\u30b9\u3067\u3059\u3002\",\"price\":\"10400\",\"price_num\":10400,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e8%b6%85%e7%96%b2%e5%8a%b4%e5%9b%9e%e5%be%a9%e7%82%b9%e6%bb%b4\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3C\u30fb\u5f37\u30df\u30ce\u30fb\u7f8e\u767d\u30fb\u75b2\u52b4\u56de\u5fa9\u30fb\u809d\u6a5f\u80fd\u30b5\u30dd\u30fc\u30c8\u30fb\u30b9\u30da\u30b7\u30e3\u30eb\u30b3\u30fc\u30b9\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u75b2\u52b4\u56de\u5fa9\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},{\"name\":\"\u809d\u81d3\u5f37\u5316\u70b9\u6ef4\",\"minutes\":10,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/kanzou.jpg\",\"desc\":\"\u809d\u6a5f\u80fd\u30b1\u30a2\u3068\u7f8e\u767d\u3092\u540c\u6642\u306b\u30b5\u30dd\u30fc\u30c8\u3057\u307e\u3059\u3002\",\"price\":\"4500\",\"price_num\":4500,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e8%82%9d%e8%87%93%e5%bc%b7%e5%8c%96%e7%82%b9%e6%bb%b4\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u809d\u6a5f\u80fd\u30b1\u30a2\u30fb\u7f8e\u767d\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u809d\u81d3\u5f37\u5316\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},{\"name\":\"\u30cb\u65e5\u9154\u3044\u70b9\u6ef4\",\"minutes\":10,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/kanzou.jpg\",\"desc\":\"\u30c7\u30c8\u30c3\u30af\u30b9\u30fb\u75b2\u52b4\u56de\u5fa9\u30fb\u7f8e\u767d\u3092\u307e\u3068\u3081\u3066\u30b1\u30a2\u3057\u307e\u3059\u3002\",\"price\":\"7700\",\"price_num\":7700,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e3%83%8b%e6%97%a5%e9%85%94%e3%81%84%e7%82%b9%e6%bb%b4\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u30c7\u30c8\u30c3\u30af\u30b9\u30fb\u75b2\u52b4\u56de\u5fa9\u30fb\u7f8e\u767d\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u4e8c\u65e5\u9154\u3044\u9632\u6b62\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},{\"name\":\"\u8d85\u7d76\u4e8c\u65e5\u9154\u3044\u70b9\u6ef4\",\"minutes\":10,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/kanzou.jpg\",\"desc\":\"\u30c7\u30c8\u30c3\u30af\u30b9\u30fb\u75b2\u52b4\u56de\u5fa9\u30fb\u7f8e\u767d\u3092\u307e\u3068\u3081\u3066\u3057\u3063\u304b\u308a\u30b1\u30a2\u3057\u307e\u3059\u3002\",\"price\":\"10400\",\"price_num\":10400,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e8%b6%85%e7%b5%b6%e4%ba%8c%e6%97%a5%e9%85%94%e3%81%84%e7%82%b9%e6%bb%b4\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u30c7\u30c8\u30c3\u30af\u30b9\u30fb\u75b2\u52b4\u56de\u5fa9\u30fb\u7f8e\u767d\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u4e8c\u65e5\u9154\u3044\u9632\u6b62\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},{\"name\":\"\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3C\u6ce8\u5c042,500mg\",\"minutes\":30,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/kounoudo.webp\",\"desc\":\"\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3C\u3067\u3001\u7f8e\u767d\u3068\u30b3\u30f3\u30c7\u30a3\u30b7\u30e7\u30f3\u3092\u6574\u3048\u308b\u4eba\u6c17\u30e1\u30cb\u30e5\u30fc\u3067\u3059\u3002\",\"price\":\"5000\",\"price_num\":5000,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e9%ab%98%e6%bf%83%e5%ba%a6%e3%83%93%e3%82%bf%e3%83%9f%e3%83%b3c%e6%b3%a8%e5%b0%842500mg\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3\\\/\u7f8e\u767d\\\/\u30b3\u30f3\u30c7\u30a3\u30b7\u30e7\u30f3\\\/\u4eba\u6c17\u30e1\u30cb\u30e5\u30fc\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3C\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},{\"name\":\"\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3C\u6ce8\u5c0412,500mg\",\"minutes\":60,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/kounoudo.webp\",\"desc\":\"\u8d85\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3C\u3067\u3001\u7f8e\u767d\u3068\u30a8\u30a4\u30b8\u30f3\u30b0\u30b1\u30a2\u3092\u5f37\u529b\u306b\u30b5\u30dd\u30fc\u30c8\u3057\u307e\u3059\u3002\",\"price\":\"9000\",\"price_num\":9000,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e9%ab%98%e6%bf%83%e5%ba%a6%e3%83%93%e3%82%bf%e3%83%9f%e3%83%b3c%e6%b3%a8%e5%b0%8412500mg\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u8d85\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3C\\\/\u7f8e\u767d\\\/\u30a8\u30a4\u30b8\u30f3\u30b0\u30b1\u30a2\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3C\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},{\"name\":\"\u30c0\u30a4\u30a8\u30c3\u30c8\u8102\u80aa\u71c3\u713c\u6ce8\u5c04\",\"minutes\":30,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/daieto.jpg\",\"desc\":\"\u8102\u80aa\u71c3\u713c\u3068\u6297\u9178\u5316\u3067\u3001\u4ee3\u8b1d\u30a2\u30c3\u30d7\u3068\u7f8e\u808c\u3092\u30b5\u30dd\u30fc\u30c8\u3057\u307e\u3059\u3002\",\"price\":\"3000\",\"price_num\":3000,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e3%83%80%e3%82%a4%e3%82%a8%e3%83%83%e3%83%88%e8%84%82%e8%82%aa%e7%87%83%e7%84%bc%e6%b3%a8%e5%b0%84\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u8102\u80aa\u71c3\u713c\u30fb\u6297\u9178\u5316\u30fb\u4ee3\u8b1d\u30a2\u30c3\u30d7\u30fb\u7f8e\u808c\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u8102\u80aa\u71c3\u713c\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},{\"name\":\"\u30c0\u30a4\u30a8\u30c3\u30c8\u8102\u80aa\u71c3\u713c\u70b9\u6ef4\",\"minutes\":60,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/daieto.jpg\",\"desc\":\"\u9ad8\u914d\u5408\u3067\u8102\u80aa\u71c3\u713c\u3068\u4ee3\u8b1d\u30a2\u30c3\u30d7\u3092\u3057\u3063\u304b\u308a\u30b5\u30dd\u30fc\u30c8\u3059\u308b\u75e9\u8eab\u30e1\u30cb\u30e5\u30fc\u3067\u3059\u3002\",\"price\":\"7700\",\"price_num\":7700,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e3%83%80%e3%82%a4%e3%82%a8%e3%83%83%e3%83%88%e8%84%82%e8%82%aa%e7%87%83%e7%84%bc%e7%82%b9%e6%bb%b4\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u9ad8\u914d\u5408\\\/\u8102\u80aa\u71c3\u713c\\\/\u4ee3\u8b1d\u30a2\u30c3\u30d7\\\/\u75e9\u8eab\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u8102\u80aa\u71c3\u713c\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},{\"name\":\"NMN\u70b9\u6ef4300mg\",\"minutes\":30,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/wakargaeri.jpg\",\"desc\":\"\u7d30\u80de\u30ec\u30d9\u30eb\u3067\u30a8\u30cd\u30eb\u30ae\u30fc\u751f\u7523\u3092\u30b5\u30dd\u30fc\u30c8\u3057\u3066\u3001\u30a8\u30a4\u30b8\u30f3\u30b0\u30b1\u30a2\u3084\u75b2\u52b4\u56de\u5fa9\u3092\u4fc3\u3057\u307e\u3059\u3002\",\"price\":\"35000\",\"price_num\":35000,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"nmn%e7%82%b9%e6%bb%b4300mg\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u30a8\u30cd\u30eb\u30ae\u30fc\u751f\u7523\\\/\u30a8\u30a4\u30b8\u30f3\u30b0\u30b1\u30a2\\\/\u75b2\u52b4\u56de\u5fa9\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u30a2\u30f3\u30c1\u30a8\u30a4\u30b8\u30f3\u30b0\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},{\"name\":\"NMN\u70b9\u6ef4500mg\",\"minutes\":30,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/wakargaeri.jpg\",\"desc\":\"\u9ad8\u6fc3\u5ea6\u3067\u7d30\u80de\u30a8\u30cd\u30eb\u30ae\u30fc\u3092\u3055\u3089\u306b\u9ad8\u3081\u3001\u30a8\u30a4\u30b8\u30f3\u30b0\u30b1\u30a2\u3084\u75b2\u52b4\u56de\u5fa9\u3092\u3088\u308a\u5b9f\u611f\u3057\u3084\u3059\u3044\u30e1\u30cb\u30e5\u30fc\u3067\u3059\u3002\",\"price\":\"39000\",\"price_num\":39000,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"nmn%e7%82%b9%e6%bb%b4500mg\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u9ad8\u6fc3\u5ea6\\\/\u7d30\u80de\u30a8\u30cd\u30eb\u30ae\u30fc\\\/\u30a8\u30a4\u30b8\u30f3\u30b0\u30b1\u30a2\\\/\u75b2\u52b4\u56de\u5fa9\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u30a2\u30f3\u30c1\u30a8\u30a4\u30b8\u30f3\u30b0\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},{\"name\":\"\u30a8\u30af\u30bd\u30bd\u30fc\u30e0\uff08\u8102\u80aa\u7531\u6765\uff09\",\"minutes\":30,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/wakagaeri.jpeg\",\"desc\":\"\u7d44\u7e54\u4fee\u5fa9\u3068\u6297\u708e\u75c7\u4f5c\u7528\u306b\u3088\u308a\u808c\u306e\u30cf\u30ea\u30fb\u30c4\u30e4\u3092\u4fc3\u3059\u3001\u518d\u751f\u30b1\u30a2\u70b9\u6ef4\u3067\u3059\u3002\",\"price\":\"35000\",\"price_num\":35000,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e3%82%a8%e3%82%af%e3%82%bd%e3%82%bd%e3%83%bc%e3%83%a0%ef%bc%88%e8%84%82%e8%82%aa%e7%94%b1%e6%9d%a5%ef%bc%89\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u7d44\u7e54\u4fee\u5fa9\u30fb\u6297\u708e\u75c7\u4f5c\u7528\u306b\u3088\u308a\u808c\u306e\u30cf\u30ea\u30fb\u30c4\u30e4\u3092\u4fc3\u3059\u3001\u518d\u751f\u30b1\u30a2\u70b9\u6ef4\u3067\u3059\u3002\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u30a2\u30f3\u30c1\u30a8\u30a4\u30b8\u30f3\u30b0\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},{\"name\":\"\u30a8\u30af\u30bd\u30bd\u30fc\u30e0\uff08\u6b6f\u9ac4\u7531\u6765\uff09\",\"minutes\":30,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/wakagaeri.jpeg\",\"desc\":\"\u9ad8\u3044\u518d\u751f\u529b\u304c\u671f\u5f85\u3055\u308c\u3001\u795e\u7d4c\u3084\u7d44\u7e54\u306e\u4fee\u5fa9\u3092\u4fc3\u3057\u307e\u3059\u3002\u3088\u308a\u6df1\u3044\u30a8\u30a4\u30b8\u30f3\u30b0\u30b1\u30a2\u30d8\u5c0e\u304f\u3001\\r\\n\u30ef\u30f3\u30e9\u30f3\u30af\u4e0a\u306e\u70b9\u6ef4\u3067\u3059\u3002\",\"price\":\"37000\",\"price_num\":37000,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e3%82%a8%e3%82%af%e3%82%bd%e3%82%bd%e3%83%bc%e3%83%a0%ef%bc%88%e6%ad%af%e9%ab%84%e7%94%b1%e6%9d%a5%ef%bc%89\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u9ad8\u3044\u518d\u751f\u529b\\\/\u795e\u7d4c\u7d44\u7e54\\\/\u4fee\u5fa9\\\/\u30a8\u30a4\u30b8\u30f3\u30b0\u30b1\u30a2\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u30a2\u30f3\u30c1\u30a8\u30a4\u30b8\u30f3\u30b0\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},{\"name\":\"\u30a8\u30af\u30bd\u30bd\u30fc\u30e0\uff08\u80f4\u5e2f\u7531\u6765\uff09\",\"minutes\":30,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/wakagaeri.jpeg\",\"desc\":\"\u5168\u8eab\u30ec\u30d9\u30eb\u3067\u306e\u518d\u751f\u3068\u30a8\u30a4\u30b8\u30f3\u30b0\u30b1\u30a2\u3092\u53f6\u3048\u308b\u6700\u4e0a\u4f4d\u306e\u30d7\u30ec\u30df\u30a2\u70b9\u6ef4\u3067\u3059\u3002\",\"price\":\"39000\",\"price_num\":39000,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e3%82%a8%e3%82%af%e3%82%bd%e3%82%bd%e3%83%bc%e3%83%a0%ef%bc%88%e8%83%b4%e5%b8%af%e7%94%b1%e6%9d%a5%ef%bc%89\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u5168\u8eab\u30ec\u30d9\u30eb\u3067\u306e\u518d\u751f\u30fb\u30a8\u30a4\u30b8\u30f3\u30b0\u30b1\u30a2\u30fb\u6700\u4e0a\u4f4d\u30fb\u30d7\u30ec\u30df\u30a2\u70b9\u6ef4\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u30a2\u30f3\u30c1\u30a8\u30a4\u30b8\u30f3\u30b0\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1}],\"category2\":[{\"name\":\"\u30aa\u30f3\u30e9\u30a4\u30f3\u8a3a\u7642\",\"minutes\":10,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/105_AdobeStock_501287895\u4e2d\u5ddd\u3055\u3093-\u30aa\u30f3\u30e9\u30a4\u30f3\u8a3a\u7642-768x432.jpeg.webp\",\"desc\":\"\u30aa\u30f3\u30e9\u30a4\u30f3\u8a3a\u7642\",\"price\":\"500\",\"price_num\":500,\"staff\":[{\"name\":\"\u85e4\u672c\u7dd1\",\"label\":\"\u85e4\u672c\u7dd1\",\"price_num\":0,\"key\":\"st-%e8%97%a4%e6%9c%ac%e7%b7%91\"},{\"name\":\"\u8c37\u5408\u30ea\u30a8\",\"label\":\"\u8c37\u5408\u30ea\u30a8\",\"price_num\":0,\"key\":\"st-%e8%b0%b7%e5%90%88%e3%83%aa%e3%82%a8\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e3%82%aa%e3%83%b3%e3%83%a9%e3%82%a4%e3%83%b3%e8%a8%ba%e7%99%82\",\"category\":\"category2\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u30aa\u30f3\u30e9\u30a4\u30f3\u8a3a\u7642\",\"line_call_enabled\":true,\"room_pattern_a\":\"B\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"B\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1}],\"category3\":[],\"category4\":[]};\n      const META_ALL    = {\"\u767d\u7389\u70b9\u6ef4\":{\"name\":\"\u767d\u7389\u70b9\u6ef4\",\"minutes\":30,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/\u767d\u7389\u70b9\u6ef4.jpg\",\"desc\":\"\u7f8e\u767d\u30fb\u809d\u6591\u30b1\u30a2\u30fb\u900f\u660e\u611f\u30a2\u30c3\u30d7\u306b\u7279\u5316\u3057\u305f\u9ad8\u914d\u5408\u70b9\u6ef4\u3067\u3059\u3002\",\"price\":\"7700\",\"price_num\":7700,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e7%99%bd%e7%8e%89%e7%82%b9%e6%bb%b4\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u7f8e\u767d\u30fb\u30a8\u30a4\u30b8\u30f3\u30b0\u30b1\u30a2\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u767d\u7389\u7f8e\u767d\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},\"\u9ad8\u6fc3\u5ea6\u767d\u7389\u70b9\u6ef4\":{\"name\":\"\u9ad8\u6fc3\u5ea6\u767d\u7389\u70b9\u6ef4\",\"minutes\":60,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/\u767d\u7389\u70b9\u6ef4.jpg\",\"desc\":\"\u9ad8\u914d\u5408\u3067\u7f8e\u767d\u30fb\u809d\u6591\u30b1\u30a2\u30fb\u900f\u660e\u611f\u3092\u3057\u3063\u304b\u308a\u30b5\u30dd\u30fc\u30c8\u3059\u308b\u70b9\u6ef4\u3067\u3059\u3002\",\"price\":\"10400\",\"price_num\":10400,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e9%ab%98%e6%bf%83%e5%ba%a6%e7%99%bd%e7%8e%89%e7%82%b9%e6%bb%b4\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u7f8e\u767d\u30fb\u30a8\u30a4\u30b8\u30f3\u30b0\u30b1\u30a2\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u767d\u7389\u7f8e\u767d\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},\"\u30b7\u30f3\u30c7\u30ec\u30e9\u70b9\u6ef4\":{\"name\":\"\u30b7\u30f3\u30c7\u30ec\u30e9\u70b9\u6ef4\",\"minutes\":60,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/\u30b7\u30f3\u30c7\u30ec\u30e9\u70b9\u6ef4.jpg\",\"desc\":\"\u6297\u9178\u5316\u30fb\u7f8e\u767d\u30fb\u8102\u80aa\u71c3\u713c\u3092\u307e\u3068\u3081\u3066\u5f37\u5316\u3059\u308b\u9ad8\u914d\u5408\u70b9\u6ef4\u3067\u3059\u3002\",\"price\":\"10400\",\"price_num\":10400,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e3%82%b7%e3%83%b3%e3%83%87%e3%83%ac%e3%83%a9%e7%82%b9%e6%bb%b4\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u6297\u9178\u5316\u30fb\u4ee3\u8b1d\u4fc3\u9032\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u4ee3\u8b1d\u4fc3\u9032\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},\"\u5e73\u77f3\u5f0f\u30cb\u30f3\u30cb\u30af\u6ce8\u5c04\":{\"name\":\"\u5e73\u77f3\u5f0f\u30cb\u30f3\u30cb\u30af\u6ce8\u5c04\",\"minutes\":110,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/\u306b\u3093\u306b\u304f\u6ce8\u5c04.jpg\",\"desc\":\"\u306b\u3093\u306b\u304f\u3068\u30d3\u30bf\u30df\u30f3C\u3092\u914d\u5408\u3057\u3001\u75b2\u52b4\u56de\u5fa9\u3068\u514d\u75ab\u30ab\u30a2\u30c3\u30d7\u30fb\u7f8e\u808c\u3092\u540c\u6642\u306b\u30b5\u30dd\u30fc\u30c8\u3057\u307e\u3059\u3002\",\"price\":\"4500\",\"price_num\":4500,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e5%b9%b3%e7%9f%b3%e5%bc%8f%e3%83%8b%e3%83%b3%e3%83%8b%e3%82%af%e6%b3%a8%e5%b0%84\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u30d3\u30bf\u30df\u30f3C\u30fb\u75b2\u52b4\u56de\u5fa9\u30fb\u514d\u75ab\u529b\u30a2\u30c3\u30d7\u30fb\u7f8e\u808c\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u75b2\u52b4\u56de\u5fa9\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},\"\u5e73\u77f3\u5f0f\u30cf\u30a4\u30d1\u30fc\u30cb\u30f3\u30cb\u30af\u70b9\u6ef4\":{\"name\":\"\u5e73\u77f3\u5f0f\u30cf\u30a4\u30d1\u30fc\u30cb\u30f3\u30cb\u30af\u70b9\u6ef4\",\"minutes\":10,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/\u306b\u3093\u306b\u304f\u6ce8\u5c04.jpg\",\"desc\":\"\u30cb\u30f3\u30cb\u30af\u3068\u9ad8\u6fc3\u5ea6\u306b\u30d3\u30bf\u30df\u30f3C \u3092\u914d\u5408\u3057\u3001\u75b2\u52b4\u56de\u5fa9\u2022\u514d\u75ab\u30ab\u30a2\u30c3\u30d7\u3092\u3055\u3089\u306b\u5b9f\u611f\u3067\u304d\u307e\u3059\u3002\",\"price\":\"8000\",\"price_num\":8000,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e5%b9%b3%e7%9f%b3%e5%bc%8f%e3%83%8f%e3%82%a4%e3%83%91%e3%83%bc%e3%83%8b%e3%83%b3%e3%83%8b%e3%82%af%e7%82%b9%e6%bb%b4\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3C \u30fb\u75b2\u52b4\u56de\u5fa9\u2022\u514d\u75ab\u30ab\u30a2\u30c3\u30d7\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u75b2\u52b4\u56de\u5fa9\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},\"\u75b2\u52b4\u56de\u5fa9\u70b9\u6ef4\":{\"name\":\"\u75b2\u52b4\u56de\u5fa9\u70b9\u6ef4\",\"minutes\":10,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/\u75b2\u52b4\u56de\u5fa9.jpg\",\"desc\":\"\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3C\u306b\u30cb\u30f3\u30cb\u30af\u3068\u5f37\u30df\u30ce\u3092\u914d\u5408\u3057\u3001\u7f8e\u767d\u30fb\u75b2\u52b4\u56de\u5fa9\u30fb\u809d\u6a5f\u80fd\u30b5\u30dd\u30fc\u30c8\u3092\u540c\u6642\u306b\u30b1\u30a2\u3057\u307e\u3059\u3002\",\"price\":\"7700\",\"price_num\":7700,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e7%96%b2%e5%8a%b4%e5%9b%9e%e5%be%a9%e7%82%b9%e6%bb%b4\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3C\u30fb\u5f37\u30df\u30ce\u7f8e\u767d\u30fb\u75b2\u52b4\u56de\u5fa9\u30fb\u809d\u6a5f\u80fd\u30b5\u30dd\u30fc\u30c8\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u75b2\u52b4\u56de\u5fa9\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},\"\u8d85\u75b2\u52b4\u56de\u5fa9\u70b9\u6ef4\":{\"name\":\"\u8d85\u75b2\u52b4\u56de\u5fa9\u70b9\u6ef4\",\"minutes\":10,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/\u75b2\u52b4\u56de\u5fa9.jpg\",\"desc\":\"\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3C\u3092\u9ad8\u914d\u5408\u306b\u3001\u30cb\u30f3\u30cb\u30af\u3068\u5f37\u30df\u30ce\u3092\u5f37\u5316\u3057\u3001\u7f8e\u767d\u30fb\u75b2\u52b4\u56de\u5fa9\u30fb\u809d\u6a5f\u80fd\u30b5\u30dd\u30fc\u30c8\u3092\\r\\n\u3088\u308a\u9ad8\u3081\u305f\u3001\u30b9\u30da\u30b7\u30e3\u30eb\u30b3\u30fc\u30b9\u3067\u3059\u3002\",\"price\":\"10400\",\"price_num\":10400,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e8%b6%85%e7%96%b2%e5%8a%b4%e5%9b%9e%e5%be%a9%e7%82%b9%e6%bb%b4\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3C\u30fb\u5f37\u30df\u30ce\u30fb\u7f8e\u767d\u30fb\u75b2\u52b4\u56de\u5fa9\u30fb\u809d\u6a5f\u80fd\u30b5\u30dd\u30fc\u30c8\u30fb\u30b9\u30da\u30b7\u30e3\u30eb\u30b3\u30fc\u30b9\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u75b2\u52b4\u56de\u5fa9\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},\"\u809d\u81d3\u5f37\u5316\u70b9\u6ef4\":{\"name\":\"\u809d\u81d3\u5f37\u5316\u70b9\u6ef4\",\"minutes\":10,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/kanzou.jpg\",\"desc\":\"\u809d\u6a5f\u80fd\u30b1\u30a2\u3068\u7f8e\u767d\u3092\u540c\u6642\u306b\u30b5\u30dd\u30fc\u30c8\u3057\u307e\u3059\u3002\",\"price\":\"4500\",\"price_num\":4500,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e8%82%9d%e8%87%93%e5%bc%b7%e5%8c%96%e7%82%b9%e6%bb%b4\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u809d\u6a5f\u80fd\u30b1\u30a2\u30fb\u7f8e\u767d\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u809d\u81d3\u5f37\u5316\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},\"\u30cb\u65e5\u9154\u3044\u70b9\u6ef4\":{\"name\":\"\u30cb\u65e5\u9154\u3044\u70b9\u6ef4\",\"minutes\":10,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/kanzou.jpg\",\"desc\":\"\u30c7\u30c8\u30c3\u30af\u30b9\u30fb\u75b2\u52b4\u56de\u5fa9\u30fb\u7f8e\u767d\u3092\u307e\u3068\u3081\u3066\u30b1\u30a2\u3057\u307e\u3059\u3002\",\"price\":\"7700\",\"price_num\":7700,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e3%83%8b%e6%97%a5%e9%85%94%e3%81%84%e7%82%b9%e6%bb%b4\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u30c7\u30c8\u30c3\u30af\u30b9\u30fb\u75b2\u52b4\u56de\u5fa9\u30fb\u7f8e\u767d\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u4e8c\u65e5\u9154\u3044\u9632\u6b62\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},\"\u8d85\u7d76\u4e8c\u65e5\u9154\u3044\u70b9\u6ef4\":{\"name\":\"\u8d85\u7d76\u4e8c\u65e5\u9154\u3044\u70b9\u6ef4\",\"minutes\":10,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/kanzou.jpg\",\"desc\":\"\u30c7\u30c8\u30c3\u30af\u30b9\u30fb\u75b2\u52b4\u56de\u5fa9\u30fb\u7f8e\u767d\u3092\u307e\u3068\u3081\u3066\u3057\u3063\u304b\u308a\u30b1\u30a2\u3057\u307e\u3059\u3002\",\"price\":\"10400\",\"price_num\":10400,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e8%b6%85%e7%b5%b6%e4%ba%8c%e6%97%a5%e9%85%94%e3%81%84%e7%82%b9%e6%bb%b4\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u30c7\u30c8\u30c3\u30af\u30b9\u30fb\u75b2\u52b4\u56de\u5fa9\u30fb\u7f8e\u767d\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u4e8c\u65e5\u9154\u3044\u9632\u6b62\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},\"\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3C\u6ce8\u5c042,500mg\":{\"name\":\"\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3C\u6ce8\u5c042,500mg\",\"minutes\":30,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/kounoudo.webp\",\"desc\":\"\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3C\u3067\u3001\u7f8e\u767d\u3068\u30b3\u30f3\u30c7\u30a3\u30b7\u30e7\u30f3\u3092\u6574\u3048\u308b\u4eba\u6c17\u30e1\u30cb\u30e5\u30fc\u3067\u3059\u3002\",\"price\":\"5000\",\"price_num\":5000,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e9%ab%98%e6%bf%83%e5%ba%a6%e3%83%93%e3%82%bf%e3%83%9f%e3%83%b3c%e6%b3%a8%e5%b0%842500mg\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3\\\/\u7f8e\u767d\\\/\u30b3\u30f3\u30c7\u30a3\u30b7\u30e7\u30f3\\\/\u4eba\u6c17\u30e1\u30cb\u30e5\u30fc\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3C\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},\"\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3C\u6ce8\u5c0412,500mg\":{\"name\":\"\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3C\u6ce8\u5c0412,500mg\",\"minutes\":60,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/kounoudo.webp\",\"desc\":\"\u8d85\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3C\u3067\u3001\u7f8e\u767d\u3068\u30a8\u30a4\u30b8\u30f3\u30b0\u30b1\u30a2\u3092\u5f37\u529b\u306b\u30b5\u30dd\u30fc\u30c8\u3057\u307e\u3059\u3002\",\"price\":\"9000\",\"price_num\":9000,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e9%ab%98%e6%bf%83%e5%ba%a6%e3%83%93%e3%82%bf%e3%83%9f%e3%83%b3c%e6%b3%a8%e5%b0%8412500mg\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u8d85\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3C\\\/\u7f8e\u767d\\\/\u30a8\u30a4\u30b8\u30f3\u30b0\u30b1\u30a2\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3C\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},\"\u30c0\u30a4\u30a8\u30c3\u30c8\u8102\u80aa\u71c3\u713c\u6ce8\u5c04\":{\"name\":\"\u30c0\u30a4\u30a8\u30c3\u30c8\u8102\u80aa\u71c3\u713c\u6ce8\u5c04\",\"minutes\":30,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/daieto.jpg\",\"desc\":\"\u8102\u80aa\u71c3\u713c\u3068\u6297\u9178\u5316\u3067\u3001\u4ee3\u8b1d\u30a2\u30c3\u30d7\u3068\u7f8e\u808c\u3092\u30b5\u30dd\u30fc\u30c8\u3057\u307e\u3059\u3002\",\"price\":\"3000\",\"price_num\":3000,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e3%83%80%e3%82%a4%e3%82%a8%e3%83%83%e3%83%88%e8%84%82%e8%82%aa%e7%87%83%e7%84%bc%e6%b3%a8%e5%b0%84\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u8102\u80aa\u71c3\u713c\u30fb\u6297\u9178\u5316\u30fb\u4ee3\u8b1d\u30a2\u30c3\u30d7\u30fb\u7f8e\u808c\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u8102\u80aa\u71c3\u713c\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},\"\u30c0\u30a4\u30a8\u30c3\u30c8\u8102\u80aa\u71c3\u713c\u70b9\u6ef4\":{\"name\":\"\u30c0\u30a4\u30a8\u30c3\u30c8\u8102\u80aa\u71c3\u713c\u70b9\u6ef4\",\"minutes\":60,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/daieto.jpg\",\"desc\":\"\u9ad8\u914d\u5408\u3067\u8102\u80aa\u71c3\u713c\u3068\u4ee3\u8b1d\u30a2\u30c3\u30d7\u3092\u3057\u3063\u304b\u308a\u30b5\u30dd\u30fc\u30c8\u3059\u308b\u75e9\u8eab\u30e1\u30cb\u30e5\u30fc\u3067\u3059\u3002\",\"price\":\"7700\",\"price_num\":7700,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e3%83%80%e3%82%a4%e3%82%a8%e3%83%83%e3%83%88%e8%84%82%e8%82%aa%e7%87%83%e7%84%bc%e7%82%b9%e6%bb%b4\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u9ad8\u914d\u5408\\\/\u8102\u80aa\u71c3\u713c\\\/\u4ee3\u8b1d\u30a2\u30c3\u30d7\\\/\u75e9\u8eab\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u8102\u80aa\u71c3\u713c\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},\"NMN\u70b9\u6ef4300mg\":{\"name\":\"NMN\u70b9\u6ef4300mg\",\"minutes\":30,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/wakargaeri.jpg\",\"desc\":\"\u7d30\u80de\u30ec\u30d9\u30eb\u3067\u30a8\u30cd\u30eb\u30ae\u30fc\u751f\u7523\u3092\u30b5\u30dd\u30fc\u30c8\u3057\u3066\u3001\u30a8\u30a4\u30b8\u30f3\u30b0\u30b1\u30a2\u3084\u75b2\u52b4\u56de\u5fa9\u3092\u4fc3\u3057\u307e\u3059\u3002\",\"price\":\"35000\",\"price_num\":35000,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"nmn%e7%82%b9%e6%bb%b4300mg\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u30a8\u30cd\u30eb\u30ae\u30fc\u751f\u7523\\\/\u30a8\u30a4\u30b8\u30f3\u30b0\u30b1\u30a2\\\/\u75b2\u52b4\u56de\u5fa9\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u30a2\u30f3\u30c1\u30a8\u30a4\u30b8\u30f3\u30b0\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},\"NMN\u70b9\u6ef4500mg\":{\"name\":\"NMN\u70b9\u6ef4500mg\",\"minutes\":30,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/wakargaeri.jpg\",\"desc\":\"\u9ad8\u6fc3\u5ea6\u3067\u7d30\u80de\u30a8\u30cd\u30eb\u30ae\u30fc\u3092\u3055\u3089\u306b\u9ad8\u3081\u3001\u30a8\u30a4\u30b8\u30f3\u30b0\u30b1\u30a2\u3084\u75b2\u52b4\u56de\u5fa9\u3092\u3088\u308a\u5b9f\u611f\u3057\u3084\u3059\u3044\u30e1\u30cb\u30e5\u30fc\u3067\u3059\u3002\",\"price\":\"39000\",\"price_num\":39000,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"nmn%e7%82%b9%e6%bb%b4500mg\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u9ad8\u6fc3\u5ea6\\\/\u7d30\u80de\u30a8\u30cd\u30eb\u30ae\u30fc\\\/\u30a8\u30a4\u30b8\u30f3\u30b0\u30b1\u30a2\\\/\u75b2\u52b4\u56de\u5fa9\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u30a2\u30f3\u30c1\u30a8\u30a4\u30b8\u30f3\u30b0\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},\"\u30a8\u30af\u30bd\u30bd\u30fc\u30e0\uff08\u8102\u80aa\u7531\u6765\uff09\":{\"name\":\"\u30a8\u30af\u30bd\u30bd\u30fc\u30e0\uff08\u8102\u80aa\u7531\u6765\uff09\",\"minutes\":30,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/wakagaeri.jpeg\",\"desc\":\"\u7d44\u7e54\u4fee\u5fa9\u3068\u6297\u708e\u75c7\u4f5c\u7528\u306b\u3088\u308a\u808c\u306e\u30cf\u30ea\u30fb\u30c4\u30e4\u3092\u4fc3\u3059\u3001\u518d\u751f\u30b1\u30a2\u70b9\u6ef4\u3067\u3059\u3002\",\"price\":\"35000\",\"price_num\":35000,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e3%82%a8%e3%82%af%e3%82%bd%e3%82%bd%e3%83%bc%e3%83%a0%ef%bc%88%e8%84%82%e8%82%aa%e7%94%b1%e6%9d%a5%ef%bc%89\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u7d44\u7e54\u4fee\u5fa9\u30fb\u6297\u708e\u75c7\u4f5c\u7528\u306b\u3088\u308a\u808c\u306e\u30cf\u30ea\u30fb\u30c4\u30e4\u3092\u4fc3\u3059\u3001\u518d\u751f\u30b1\u30a2\u70b9\u6ef4\u3067\u3059\u3002\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u30a2\u30f3\u30c1\u30a8\u30a4\u30b8\u30f3\u30b0\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},\"\u30a8\u30af\u30bd\u30bd\u30fc\u30e0\uff08\u6b6f\u9ac4\u7531\u6765\uff09\":{\"name\":\"\u30a8\u30af\u30bd\u30bd\u30fc\u30e0\uff08\u6b6f\u9ac4\u7531\u6765\uff09\",\"minutes\":30,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/wakagaeri.jpeg\",\"desc\":\"\u9ad8\u3044\u518d\u751f\u529b\u304c\u671f\u5f85\u3055\u308c\u3001\u795e\u7d4c\u3084\u7d44\u7e54\u306e\u4fee\u5fa9\u3092\u4fc3\u3057\u307e\u3059\u3002\u3088\u308a\u6df1\u3044\u30a8\u30a4\u30b8\u30f3\u30b0\u30b1\u30a2\u30d8\u5c0e\u304f\u3001\\r\\n\u30ef\u30f3\u30e9\u30f3\u30af\u4e0a\u306e\u70b9\u6ef4\u3067\u3059\u3002\",\"price\":\"37000\",\"price_num\":37000,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e3%82%a8%e3%82%af%e3%82%bd%e3%82%bd%e3%83%bc%e3%83%a0%ef%bc%88%e6%ad%af%e9%ab%84%e7%94%b1%e6%9d%a5%ef%bc%89\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u9ad8\u3044\u518d\u751f\u529b\\\/\u795e\u7d4c\u7d44\u7e54\\\/\u4fee\u5fa9\\\/\u30a8\u30a4\u30b8\u30f3\u30b0\u30b1\u30a2\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u30a2\u30f3\u30c1\u30a8\u30a4\u30b8\u30f3\u30b0\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},\"\u30a8\u30af\u30bd\u30bd\u30fc\u30e0\uff08\u80f4\u5e2f\u7531\u6765\uff09\":{\"name\":\"\u30a8\u30af\u30bd\u30bd\u30fc\u30e0\uff08\u80f4\u5e2f\u7531\u6765\uff09\",\"minutes\":30,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/wakagaeri.jpeg\",\"desc\":\"\u5168\u8eab\u30ec\u30d9\u30eb\u3067\u306e\u518d\u751f\u3068\u30a8\u30a4\u30b8\u30f3\u30b0\u30b1\u30a2\u3092\u53f6\u3048\u308b\u6700\u4e0a\u4f4d\u306e\u30d7\u30ec\u30df\u30a2\u70b9\u6ef4\u3067\u3059\u3002\",\"price\":\"39000\",\"price_num\":39000,\"staff\":[{\"name\":\"\u79e6\u4fca\u662d\",\"label\":\"\u79e6\u4fca\u662d\",\"price_num\":0,\"key\":\"st-%e7%a7%a6%e4%bf%8a%e6%98%ad\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e3%82%a8%e3%82%af%e3%82%bd%e3%82%bd%e3%83%bc%e3%83%a0%ef%bc%88%e8%83%b4%e5%b8%af%e7%94%b1%e6%9d%a5%ef%bc%89\",\"category\":\"category1\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\u5168\u8eab\u30ec\u30d9\u30eb\u3067\u306e\u518d\u751f\u30fb\u30a8\u30a4\u30b8\u30f3\u30b0\u30b1\u30a2\u30fb\u6700\u4e0a\u4f4d\u30fb\u30d7\u30ec\u30df\u30a2\u70b9\u6ef4\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u30a2\u30f3\u30c1\u30a8\u30a4\u30b8\u30f3\u30b0\",\"line_call_enabled\":false,\"room_pattern_a\":\"A\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"A\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1},\"\u30aa\u30f3\u30e9\u30a4\u30f3\u8a3a\u7642\":{\"name\":\"\u30aa\u30f3\u30e9\u30a4\u30f3\u8a3a\u7642\",\"minutes\":10,\"days\":[0,1,2,3,4,5,6],\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/105_AdobeStock_501287895\u4e2d\u5ddd\u3055\u3093-\u30aa\u30f3\u30e9\u30a4\u30f3\u8a3a\u7642-768x432.jpeg.webp\",\"desc\":\"\u30aa\u30f3\u30e9\u30a4\u30f3\u8a3a\u7642\",\"price\":\"500\",\"price_num\":500,\"staff\":[{\"name\":\"\u85e4\u672c\u7dd1\",\"label\":\"\u85e4\u672c\u7dd1\",\"price_num\":0,\"key\":\"st-%e8%97%a4%e6%9c%ac%e7%b7%91\"},{\"name\":\"\u8c37\u5408\u30ea\u30a8\",\"label\":\"\u8c37\u5408\u30ea\u30a8\",\"price_num\":0,\"key\":\"st-%e8%b0%b7%e5%90%88%e3%83%aa%e3%82%a8\"}],\"options\":[{\"key\":\"\",\"label\":\"\u306a\u3057\",\"extra\":0,\"extra_raw\":\"\",\"minutes\":0,\"price\":0,\"room_model\":\"\"}],\"slug\":\"%e3%82%aa%e3%83%b3%e3%83%a9%e3%82%a4%e3%83%b3%e8%a8%ba%e7%99%82\",\"category\":\"category2\",\"start_date\":null,\"end_date\":null,\"range_ymd\":\"\",\"raw_types\":\"\",\"range_label\":\"\",\"open_hm\":\"\",\"close_hm\":\"\",\"range_info\":{\"type\":\"all\",\"open\":\"\",\"close\":\"\",\"ranges\":[],\"slots\":[]},\"badge\":\"\u30aa\u30f3\u30e9\u30a4\u30f3\u8a3a\u7642\",\"line_call_enabled\":true,\"room_pattern_a\":\"B\",\"room_pattern_b\":\"\",\"room_share_a\":100,\"room_share_b\":0,\"room_patterns\":[{\"rooms\":[\"B\"],\"share\":100}],\"unbookable\":false,\"_win\":{\"start\":\"\",\"end\":\"\"},\"unbookable_reason\":\"ok\",\"unbookable_label\":\"\",\"staff_day_available\":1}};\n      const STAFF_PROFILES = {\"\u79e6 \u4fca\u662d\":{\"name\":\"\u79e6 \u4fca\u662d\",\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/\u79e62.png\",\"career\":\"\u306f\u305f \u3068\u3057\u3042\u304d\",\"profile\":\"\u533b\u5b66\u535a\u58eb\\r\\n\u65e5\u672c\u7523\u5a66\u4eba\u79d1\u5b66\u4f1a\u8a8d\u5b9a\u7523\u5a66\u4eba\u79d1\u5c02\u9580\u533b\\r\\n\u70b9\u6ef4\u7642\u6cd5\u7814\u7a76\u4f1a\u8a8d\u5b9a\u9ad8\u6fc3\u5ea6\u30d3\u30bf\u30df\u30f3\uff23\u70b9\u6ef4\u7642\u6cd5\u8a8d\u5b9a\u533b\\r\\n\u6bcd\u4f53\u4fdd\u8b77\u6cd5\u6307\u5b9a\u533b\"},\"\u85e4\u672c \u7dd1\":{\"name\":\"\u85e4\u672c \u7dd1\",\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/no-image.jpg\",\"career\":\"\u3075\u3058\u3082\u3068 \u307f\u3069\u308a\",\"profile\":\"\"},\"\u8c37\u5408 \u30ea\u30a8\":{\"name\":\"\u8c37\u5408 \u30ea\u30a8\",\"image\":\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-content\\\/uploads\\\/sites\\\/23\\\/2026\\\/04\\\/no-image.jpg\",\"career\":\"\u305f\u306b\u3042\u3044 \u308a\u3048\",\"profile\":\"\"}};\n      const SHOW_STAFF_PROFILE = false;\n      const AUTO_SINGLE_STAFF = true;\n      const SHOW_DURATION = true;\n      const SHOW_PRICE    = true;\n      const LIFF_ID = \"2009749771-o87yKtDL\";\n      const LIFF_SDK_URL = 'https:\/\/static.line-scdn.net\/liff\/edge\/2\/sdk.js';\n      const LINE_ID_TOKEN_CACHE_KEY = 'angin_mx_line_id_token_v1';\n      const LINE_ACCESS_TOKEN_CACHE_KEY = 'angin_mx_line_access_token_v1';\n      const LINE_USER_ID_CACHE_KEY = 'angin_mx_line_user_id_v1';\n      const LINE_STATE_SYNC_KEY = 'angin_mx_line_state_sync_v1';\n      const LINE_STATE_KEY_CACHE_KEY = 'angin_mx_line_state_key_v1';\n      const PRICE_TAX_SUFFIX = \"\uff08\u7a0e\u8fbc\uff09\";\n      const SHOW_CATEGORY_TABS = true;\n      const BOOKING_HISTORY_URL = \"https:\/\/salon.angin.cloud\/west-shinjuku-clinic\/booking-list\/\";\n      const REQUESTED_HISTORY_CONTEXT = (() => {\n        const fallback = { view:'', historyToken:'', lineStateKey:'' };\n        try {\n          const qs = new URLSearchParams(window.location.search || '');\n          const context = { view:'', historyToken:'', lineStateKey:'' };\n          const directView = String(qs.get('mx_history') || '').trim().toLowerCase();\n          if (directView === 'current' || directView === 'past') context.view = directView;\n          context.historyToken = String(qs.get('history_token') || '').trim();\n          context.lineStateKey = String(qs.get('line_state_key') || '').trim();\n\n          const rawState = String(qs.get('liff.state') || qs.get('liff_state') || '').trim();\n          if (!rawState) return context;\n\n          let decoded = rawState;\n          try { decoded = decodeURIComponent(rawState); } catch (_) {}\n\n          let stateQuery = '';\n          try {\n            const stateUrl = new URL(decoded, window.location.origin);\n            stateQuery = String(stateUrl.search || '').replace(\/^\\?\/, '');\n          } catch (_) {}\n          if (!stateQuery) {\n            if (decoded.indexOf('?') >= 0) stateQuery = decoded.slice(decoded.indexOf('?') + 1);\n            else if (decoded.charAt(0) === '?') stateQuery = decoded.slice(1);\n            else if (decoded.indexOf('=') >= 0) stateQuery = decoded.replace(\/^\\\/+\/, '');\n          }\n          if (!stateQuery) return context;\n\n          const stateParams = new URLSearchParams(stateQuery);\n          const stateView = String(stateParams.get('mx_history') || '').trim().toLowerCase();\n          if (!context.view && (stateView === 'current' || stateView === 'past')) context.view = stateView;\n          if (!context.historyToken) context.historyToken = String(stateParams.get('history_token') || '').trim();\n          if (!context.lineStateKey) context.lineStateKey = String(stateParams.get('line_state_key') || '').trim();\n          return context;\n        } catch (_) {\n          return fallback;\n        }\n      })();\n      const REQUESTED_HISTORY_VIEW = REQUESTED_HISTORY_CONTEXT.view;\n      const RESCHEDULE_CONTEXT = (() => {\n        try {\n          const qs = new URLSearchParams(window.location.search || '');\n          return {\n            rescheduleId: String(qs.get('reschedule_id') || '').trim(),\n            historyToken: String(qs.get('history_token') || '').trim(),\n          };\n        } catch (_) {\n          return { rescheduleId:'', historyToken:'' };\n        }\n      })();\n      const stepper = $('.mx-mobile-stepper', root);\n      const ua = String(navigator.userAgent || '');\n      const isLineUA = \/Line\\\/\/i.test(ua);\n      const hasLineStateHint = (() => {\n        try {\n          const qs = new URLSearchParams(window.location.search || '');\n          return !!String(qs.get('line_state_key') || '').trim();\n        } catch (_) {\n          return false;\n        }\n      })();\n      const hasLiffLaunchHint = (() => {\n        try {\n          const qs = new URLSearchParams(window.location.search || '');\n          return !!(\n            (qs.get('liff.state') || '').trim()\n            || (qs.get('liff_state') || '').trim()\n            || (qs.get('access_token') || '').trim()\n            || (qs.get('id_token') || '').trim()\n          );\n        } catch (_) {\n          return false;\n        }\n      })();\n      \/\/ Only load LIFF when opened in LINE, when LINE state already exists, or when this is a LIFF launch.\n      const SHOULD_USE_LIFF = !!LIFF_ID && (isLineUA || hasLineStateHint || hasLiffLaunchHint);\n\n      \/\/ \u53c2\u7167\n      const service = $('#mx-service',root);\n      const start   = $('#mx-start',root);\n      const table   = $('#mx-table',root);\n      const rangeTx = $('#mx-range',root);\n      const formUrl = $('#mx-form-url',root).value || '\/booking-entry\/';\n      const catWrap = $('#mx-category-buttons',root);\n\n      const modal  = $('#mx-detail',root);\n      const mTitle = $('#mx-detail-title',root);\n      const mImg   = $('#mx-detail-img',root);\n      const mTypes = $('#mx-detail-types',root);\n      const mDesc  = $('#mx-detail-desc',root);\n      const mMin   = $('#mx-detail-min',root);\n      const mPrice = $('#mx-detail-price',root);\n      const mStaff = $('#mx-staff-modal',root);\n      const mStaffLabel = $('#mx-staff-label',root);\n      const mStaffSingle = $('#mx-staff-single',root);\n      const mStaffProfile = $('#mx-staff-profile',root);\n      const mStaffProfilePhoto = $('#mx-staff-profile-photo',root);\n      const mStaffProfileName = $('#mx-staff-profile-name',root);\n      const mStaffProfileCareer = $('#mx-staff-profile-career',root);\n      const mStaffProfileBody = $('#mx-staff-profile-body',root);\n      const mOpt   = $('#mx-option-modal',root);\n      const mOptControl = $('#mx-option-control',root);\n      let   mOptBoxes = $('#mx-option-boxes',root);\n      const wfCourse = $('#mx-wf-course',root);\n      const wfOption = $('#mx-wf-option',root);\n      const wfStaff  = $('#mx-wf-staff',root);\n      const wfPrice  = $('#mx-wf-price',root);\n      const wfOpenBtn = $('#mx-wf-open',root);\n      const wfCloseBtn = $('#mx-wf-close',root);\n      const wfFooter = $('#mx-week-footer',root);\n      const startRow = $('#mx-start-row',root);\n      const weekNav  = $('#mx-week-nav',root);\n      const getCheckedOptionBoxes = ()=> (mOptBoxes ? Array.from(mOptBoxes.querySelectorAll('input[type=\"checkbox\"]:checked')) : []);\n      let liffSdkPromise = null;\n      const LINE_EXTERNAL_LOGIN_GUARD_KEY = 'angin_mx_line_external_login_v1';\n      const SHOW_WEEK_MATRIX_BREAK_ROWS = true;\n\n      function ensureLiffSdkLoaded(){\n        if (!SHOULD_USE_LIFF) return Promise.resolve(null);\n        if (window.liff && typeof window.liff.init === 'function') return Promise.resolve(window.liff);\n        if (liffSdkPromise) return liffSdkPromise;\n\n        liffSdkPromise = new Promise((resolve) => {\n          let settled = false;\n          const finish = () => {\n            if (settled) return;\n            settled = true;\n            resolve(window.liff && typeof window.liff.init === 'function' ? window.liff : null);\n          };\n\n          const existing = document.querySelector('script[data-angin-liff-sdk=\"1\"]');\n          if (existing) {\n            existing.addEventListener('load', finish, { once:true });\n            existing.addEventListener('error', finish, { once:true });\n            setTimeout(finish, 4000);\n            return;\n          }\n\n          const script = document.createElement('script');\n          script.src = LIFF_SDK_URL;\n          script.async = true;\n          script.defer = true;\n          script.dataset.anginLiffSdk = '1';\n          script.addEventListener('load', finish, { once:true });\n          script.addEventListener('error', finish, { once:true });\n          document.head.appendChild(script);\n          setTimeout(finish, 4000);\n        });\n\n        return liffSdkPromise;\n      }\n\n      async function persistLineIdentityOnServer(idToken, lineUserId='', accessToken=''){\n        const token = String(idToken || '').trim();\n        const userId = String(lineUserId || '').trim();\n        const access = String(accessToken || '').trim();\n        if (!token && !userId && !access) return '';\n        try {\n          const syncedToken = sessionStorage.getItem(LINE_STATE_SYNC_KEY) || localStorage.getItem(LINE_STATE_SYNC_KEY) || '';\n          const syncedUserId = sessionStorage.getItem(LINE_USER_ID_CACHE_KEY) || localStorage.getItem(LINE_USER_ID_CACHE_KEY) || '';\n          const stateKey = sessionStorage.getItem(LINE_STATE_KEY_CACHE_KEY) || localStorage.getItem(LINE_STATE_KEY_CACHE_KEY) || '';\n          if (stateKey && ((token && syncedToken === token) || (access && syncedToken === access) || (!token && !access && userId && syncedUserId === userId))) return stateKey;\n          if (!token && !access) return '';\n        } catch (_) {}\n        try {\n          const fd = new FormData();\n          fd.append('action', 'angin_mx_line_state');\n          fd.append('nonce', \"843545f5f1\");\n          if (token) fd.append('line_id_token', token);\n          if (access) fd.append('line_access_token', access);\n          const res = await fetch(\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-admin\\\/admin-ajax.php\", {\n            method:'POST',\n            body:fd,\n            credentials:'same-origin',\n          });\n          const json = await res.json().catch(()=>null);\n          if (json && json.ok) {\n            const stateKey = String(json.state_key || '').trim();\n            if (token || access) {\n              try { sessionStorage.setItem(LINE_STATE_SYNC_KEY, token || access); } catch (_) {}\n              try { localStorage.setItem(LINE_STATE_SYNC_KEY, token || access); } catch (_) {}\n            }\n            if (access) {\n              try { sessionStorage.setItem(LINE_ACCESS_TOKEN_CACHE_KEY, access); } catch (_) {}\n              try { localStorage.setItem(LINE_ACCESS_TOKEN_CACHE_KEY, access); } catch (_) {}\n            }\n            if (userId) {\n              try { sessionStorage.setItem(LINE_USER_ID_CACHE_KEY, userId); } catch (_) {}\n              try { localStorage.setItem(LINE_USER_ID_CACHE_KEY, userId); } catch (_) {}\n            }\n            if (stateKey) {\n              try { sessionStorage.setItem(LINE_STATE_KEY_CACHE_KEY, stateKey); } catch (_) {}\n              try { localStorage.setItem(LINE_STATE_KEY_CACHE_KEY, stateKey); } catch (_) {}\n            }\n            return stateKey;\n          }\n        } catch (err) {\n          console.warn('LINE state sync skipped:', err);\n        }\n        return '';\n      }\n      async function sendLineClientDiag(diag={}){\n        try {\n          const fd = new FormData();\n          fd.append('action', 'angin_mx_line_client_diag');\n          fd.append('nonce', \"843545f5f1\");\n          Object.entries(diag || {}).forEach(([key, value]) => {\n            if (value === undefined || value === null) return;\n            fd.append(key, String(value));\n          });\n          await fetch(\"https:\\\/\\\/salon.angin.cloud\\\/west-shinjuku-clinic\\\/wp-admin\\\/admin-ajax.php\", {\n            method:'POST',\n            body:fd,\n            credentials:'same-origin',\n          });\n        } catch (_) {}\n      }\n      async function ensureLineConsentOnBooking(liffSdk){\n        try {\n          if (!liffSdk || !liffSdk.permission || typeof liffSdk.permission.query !== 'function' || typeof liffSdk.permission.requestAll !== 'function') return;\n          const scopes = ['openid', 'profile'];\n          let shouldRequest = false;\n          for (const scope of scopes) {\n            const perm = await liffSdk.permission.query(scope).catch(() => null);\n            const state = perm && typeof perm === 'object' ? String(perm.state || '').trim().toLowerCase() : '';\n            if (state === 'prompt') {\n              shouldRequest = true;\n              break;\n            }\n          }\n          if (shouldRequest) await liffSdk.permission.requestAll().catch(() => null);\n        } catch (_) {}\n      }\n      async function getLineUserIdFromLiff(){\n        try {\n          if (window.liff && typeof window.liff.getDecodedIDToken === 'function') {\n            const decoded = window.liff.getDecodedIDToken();\n            const sub = decoded && typeof decoded === 'object' ? String(decoded.sub || '').trim() : '';\n            if (\/^U[0-9A-Za-z_-]{10,}$\/.test(sub)) return sub;\n          }\n        } catch (_) {}\n        try {\n          if (window.liff && typeof window.liff.getContext === 'function') {\n            const context = window.liff.getContext();\n            const userId = context && typeof context === 'object' ? String(context.userId || '').trim() : '';\n            if (\/^U[0-9A-Za-z_-]{10,}$\/.test(userId)) return userId;\n          }\n        } catch (_) {}\n        await ensureLineConsentOnBooking(window.liff || null);\n        try {\n          if (window.liff && typeof window.liff.getProfile === 'function') {\n            const profile = await window.liff.getProfile();\n            const userId = profile && typeof profile === 'object' ? String(profile.userId || '').trim() : '';\n            if (\/^U[0-9A-Za-z_-]{10,}$\/.test(userId)) return userId;\n          }\n        } catch (_) {}\n        return '';\n      }\n      let lineIdentityBookingPromise = null;\n      async function ensureLineIdentityOnBooking(){\n        if (lineIdentityBookingPromise) return lineIdentityBookingPromise;\n        lineIdentityBookingPromise = (async ()=>{\n          const liffSdk = await ensureLiffSdkLoaded();\n          if (!LIFF_ID || !SHOULD_USE_LIFF || !liffSdk || typeof liffSdk.init !== 'function') {\n            await sendLineClientDiag({ context:'booking', error: !LIFF_ID ? 'liff-id-empty' : (!SHOULD_USE_LIFF ? 'liff-skipped-browser' : 'sdk-missing') });\n            return '';\n          }\n          try {\n            sessionStorage.removeItem(LINE_ID_TOKEN_CACHE_KEY);\n            sessionStorage.removeItem(LINE_ACCESS_TOKEN_CACHE_KEY);\n            sessionStorage.removeItem(LINE_USER_ID_CACHE_KEY);\n            sessionStorage.removeItem(LINE_STATE_SYNC_KEY);\n            sessionStorage.removeItem(LINE_STATE_KEY_CACHE_KEY);\n            localStorage.removeItem(LINE_ID_TOKEN_CACHE_KEY);\n            localStorage.removeItem(LINE_ACCESS_TOKEN_CACHE_KEY);\n            localStorage.removeItem(LINE_USER_ID_CACHE_KEY);\n            localStorage.removeItem(LINE_STATE_SYNC_KEY);\n            localStorage.removeItem(LINE_STATE_KEY_CACHE_KEY);\n          } catch (_) {}\n          try {\n            await liffSdk.init({ liffId: LIFF_ID, withLoginOnExternalBrowser: false });\n            const diag = {\n              context: 'booking',\n              init_ok: 1,\n              in_client: (typeof liffSdk.isInClient === 'function' && liffSdk.isInClient()) ? 'yes' : 'no',\n              logged_in: (typeof liffSdk.isLoggedIn === 'function' && liffSdk.isLoggedIn()) ? 'yes' : 'no',\n              has_id_token: 'no',\n              has_access_token: 'no',\n              has_user_id: 'no',\n              user_id_source: '',\n              openid_state: '',\n              profile_state: '',\n              granted_scopes: '',\n              context_type: '',\n              error: '',\n            };\n            try {\n              if (typeof liffSdk.getContext === 'function') {\n                const context = liffSdk.getContext();\n                diag.context_type = context && typeof context === 'object' ? String(context.type || '').trim() : '';\n              }\n            } catch (_) {}\n            if (diag.logged_in === 'yes') {\n              try {\n                sessionStorage.removeItem(LINE_EXTERNAL_LOGIN_GUARD_KEY);\n              } catch (_) {}\n            } else if (diag.in_client !== 'yes') {\n              try {\n                sessionStorage.removeItem(LINE_EXTERNAL_LOGIN_GUARD_KEY);\n              } catch (_) {}\n            }\n            try {\n              if (liffSdk.permission && typeof liffSdk.permission.query === 'function') {\n                const openid = await liffSdk.permission.query('openid').catch(() => null);\n                const profile = await liffSdk.permission.query('profile').catch(() => null);\n                diag.openid_state = openid && typeof openid === 'object' ? String(openid.state || '').trim() : '';\n                diag.profile_state = profile && typeof profile === 'object' ? String(profile.state || '').trim() : '';\n                if ((diag.openid_state || '').toLowerCase() === 'prompt' || (diag.profile_state || '').toLowerCase() === 'prompt') {\n                  await ensureLineConsentOnBooking(liffSdk);\n                  const openid2 = await liffSdk.permission.query('openid').catch(() => null);\n                  const profile2 = await liffSdk.permission.query('profile').catch(() => null);\n                  diag.openid_state = openid2 && typeof openid2 === 'object' ? String(openid2.state || '').trim() : diag.openid_state;\n                  diag.profile_state = profile2 && typeof profile2 === 'object' ? String(profile2.state || '').trim() : diag.profile_state;\n                }\n              }\n            } catch (_) {}\n            try {\n              if (liffSdk.permission && typeof liffSdk.permission.getGrantedAll === 'function') {\n                const granted = await liffSdk.permission.getGrantedAll().catch(() => []);\n                diag.granted_scopes = Array.isArray(granted) ? granted.map(v => String(v || '').trim()).filter(Boolean).join(', ') : '';\n              }\n            } catch (_) {}\n            const idToken = (typeof liffSdk.getIDToken === 'function')\n              ? String(liffSdk.getIDToken() || '').trim()\n              : '';\n            const accessToken = (typeof liffSdk.getAccessToken === 'function')\n              ? String(liffSdk.getAccessToken() || '').trim()\n              : '';\n            const decodedSub = (() => {\n              try {\n                if (typeof liffSdk.getDecodedIDToken === 'function') {\n                  const decoded = liffSdk.getDecodedIDToken();\n                  const sub = decoded && typeof decoded === 'object' ? String(decoded.sub || '').trim() : '';\n                  return \/^U[0-9A-Za-z_-]{10,}$\/.test(sub) ? sub : '';\n                }\n              } catch (_) {}\n              return '';\n            })();\n            const contextUserId = (() => {\n              try {\n                if (typeof liffSdk.getContext === 'function') {\n                  const context = liffSdk.getContext();\n                  const userId = context && typeof context === 'object' ? String(context.userId || '').trim() : '';\n                  return \/^U[0-9A-Za-z_-]{10,}$\/.test(userId) ? userId : '';\n                }\n              } catch (_) {}\n              return '';\n            })();\n            let lineUserId = decodedSub || contextUserId;\n            if (!lineUserId) {\n              lineUserId = await getLineUserIdFromLiff();\n            }\n            if (decodedSub) diag.user_id_source = 'decoded';\n            else if (contextUserId) diag.user_id_source = 'context';\n            else if (lineUserId) diag.user_id_source = 'profile';\n            diag.has_id_token = idToken ? 'yes' : 'no';\n            diag.has_access_token = accessToken ? 'yes' : 'no';\n            diag.has_user_id = lineUserId ? 'yes' : 'no';\n            if (diag.logged_in !== 'yes' && !idToken && !lineUserId) {\n              diag.error = 'not-logged-in';\n            } else if (!lineUserId) {\n              diag.error = 'user-id-empty';\n            }\n            if (idToken) {\n              try { sessionStorage.setItem(LINE_ID_TOKEN_CACHE_KEY, idToken); } catch (_) {}\n              try { localStorage.setItem(LINE_ID_TOKEN_CACHE_KEY, idToken); } catch (_) {}\n            }\n            if (accessToken) {\n              try { sessionStorage.setItem(LINE_ACCESS_TOKEN_CACHE_KEY, accessToken); } catch (_) {}\n              try { localStorage.setItem(LINE_ACCESS_TOKEN_CACHE_KEY, accessToken); } catch (_) {}\n            }\n            if (lineUserId) {\n              try { sessionStorage.setItem(LINE_USER_ID_CACHE_KEY, lineUserId); } catch (_) {}\n              try { localStorage.setItem(LINE_USER_ID_CACHE_KEY, lineUserId); } catch (_) {}\n            }\n            await sendLineClientDiag(diag);\n            if (idToken || accessToken || lineUserId) {\n              return await persistLineIdentityOnServer(idToken, lineUserId, accessToken);\n            }\n            return '';\n          } catch (err) {\n            console.warn('LIFF init skipped on booking page:', err);\n            await sendLineClientDiag({ context:'booking', error: err && err.message ? err.message : 'liff-init-error' });\n            return '';\n          }\n        })();\n        return lineIdentityBookingPromise;\n      }\n      const lineIdentityBookingReady = SHOULD_USE_LIFF ? ensureLineIdentityOnBooking() : Promise.resolve('');\n      async function handoffToBookingHistoryIfRequested(){\n        if (!REQUESTED_HISTORY_VIEW) return;\n        const historyToken = String(REQUESTED_HISTORY_CONTEXT.historyToken || '').trim();\n        let stateKey = String(REQUESTED_HISTORY_CONTEXT.lineStateKey || '').trim();\n        if (!stateKey) {\n          try {\n            stateKey = String(await lineIdentityBookingReady || '').trim();\n          } catch (_) {}\n        }\n        try {\n          if (!stateKey) stateKey = sessionStorage.getItem(LINE_STATE_KEY_CACHE_KEY) || localStorage.getItem(LINE_STATE_KEY_CACHE_KEY) || '';\n        } catch (_) {}\n        if (!stateKey && !historyToken) return;\n        const target = new URL(String(BOOKING_HISTORY_URL || '\/booking-list\/'), window.location.origin);\n        target.searchParams.set('mx_history', REQUESTED_HISTORY_VIEW);\n        if (historyToken) target.searchParams.set('history_token', historyToken);\n        if (stateKey) target.searchParams.set('line_state_key', stateKey);\n        window.location.replace(target.toString());\n      }\n      if (REQUESTED_HISTORY_VIEW) {\n        lineIdentityBookingReady.then(handoffToBookingHistoryIfRequested).catch(function(){ });\n      }\n\n\/* ===============================\n   \u30bf\u30d6\u81ea\u52d5\u30ec\u30a4\u30a2\u30a6\u30c8\u8abf\u6574\n================================ *\/\nfunction adjustTabs(){\n  const container = $('.cat-tabs', root);\n  if(!container) return;\n\n  const tabs = container.querySelectorAll('.cat-btn');\n\n  let totalWidth = 0;\n\n  tabs.forEach(tab=>{\n    const style = getComputedStyle(tab);\n\n    totalWidth +=\n      tab.offsetWidth +\n      parseFloat(style.marginLeft) +\n      parseFloat(style.marginRight);\n  });\n\n  const containerWidth = container.offsetWidth;\n\n  container.classList.remove('mode-open','mode-overlap');\n\n  if(totalWidth > containerWidth){\n    container.classList.add('mode-overlap');\n  }else{\n    container.classList.add('mode-open');\n  }\n}\n\n\/* \u2190 \u3053\u3053\u306b\u8ffd\u52a0 *\/\nwindow.addEventListener('load', adjustTabs);\nwindow.addEventListener('resize', adjustTabs);\n\nfunction mxNormalizeStaffKey(v){\n  return String(v || '')\n    .normalize('NFKC')\n    .replace(\/[\uff08(][^\uff09)]*[\uff09)]\/g, '')\n    .replace(\/\\s+\/g, '')\n    .toLowerCase()\n    .trim();\n}\n\nfunction mxStaffBaseName(v){\n  return String(v || '')\n    .normalize('NFKC')\n    .replace(\/[\uff08(][^\uff09)]*[\uff09)]\/g, '')\n    .replace(\/\\s+\/g, ' ')\n    .trim();\n}\n\nconst STAFF_PROFILE_ENTRIES = Object.entries(STAFF_PROFILES || {});\nconst STAFF_PROFILE_INDEX = (() => {\n  const map = Object.create(null);\n  for (const [k, v] of STAFF_PROFILE_ENTRIES) {\n    const kk = mxNormalizeStaffKey(k);\n    const vn = mxNormalizeStaffKey(v?.name || '');\n    if (kk && !map[kk]) map[kk] = v;\n    if (vn && !map[vn]) map[vn] = v;\n  }\n  return map;\n})();\nconst STAFF_PROFILE_RESOLVE_CACHE = Object.create(null);\n\nfunction mxLookupStaffProfile(rawName){\n  const nm = mxStaffBaseName(rawName);\n  if (!nm) return null;\n  const cacheKey = mxNormalizeStaffKey(nm);\n  if (cacheKey && Object.prototype.hasOwnProperty.call(STAFF_PROFILE_RESOLVE_CACHE, cacheKey)) {\n    return STAFF_PROFILE_RESOLVE_CACHE[cacheKey];\n  }\n  if (STAFF_PROFILES && STAFF_PROFILES[nm]) {\n    if (cacheKey) STAFF_PROFILE_RESOLVE_CACHE[cacheKey] = STAFF_PROFILES[nm];\n    return STAFF_PROFILES[nm];\n  }\n  if (cacheKey && STAFF_PROFILE_INDEX[cacheKey]) {\n    STAFF_PROFILE_RESOLVE_CACHE[cacheKey] = STAFF_PROFILE_INDEX[cacheKey];\n    return STAFF_PROFILE_INDEX[cacheKey];\n  }\n  const nKey = mxNormalizeStaffKey(nm);\n  for (const [k, v] of STAFF_PROFILE_ENTRIES) {\n    if (mxNormalizeStaffKey(k) === nKey) return v;\n    if (mxNormalizeStaffKey(v?.name || '') === nKey) return v;\n  }\n  for (const [k, v] of STAFF_PROFILE_ENTRIES) {\n    const kk = mxNormalizeStaffKey(k);\n    const vn = mxNormalizeStaffKey(v?.name || '');\n    if ((kk && (kk.includes(nKey) || nKey.includes(kk))) ||\n        (vn && (vn.includes(nKey) || nKey.includes(vn)))) {\n      if (cacheKey) STAFF_PROFILE_RESOLVE_CACHE[cacheKey] = v;\n      return v;\n    }\n  }\n  if (cacheKey) STAFF_PROFILE_RESOLVE_CACHE[cacheKey] = null;\n  return null;\n}\n\nfunction renderSelectedStaffProfile(){\n  if (!mStaffProfile) return;\n  const selectedOpt = mStaff?.selectedOptions?.[0] || null;\n  const rawVal = mxStaffBaseName(selectedOpt?.value || '');\n  const rawText = mxStaffBaseName(selectedOpt?.textContent || '');\n  const rawTextName = rawText;\n  const dsProfile = selectedOpt ? {\n    name: String(selectedOpt.dataset.profName || '').trim(),\n    career: String(selectedOpt.dataset.profCareer || '').trim(),\n    image: String(selectedOpt.dataset.profImg || '').trim(),\n    profile: String(selectedOpt.dataset.profBody || '').trim()\n  } : null;\n  const hasDs = !!(dsProfile && (dsProfile.name || dsProfile.career || dsProfile.image || dsProfile.profile));\n  const profile = hasDs ? dsProfile : (mxLookupStaffProfile(rawVal) || mxLookupStaffProfile(rawTextName));\n  if (!profile) {\n    mStaffProfile.style.display = 'none';\n    return;\n  }\n  const profName = String(profile.name || rawTextName || rawVal || '').trim();\n  const profCareer = String((profile && profile.career) || '').trim();\n  const profBody = String((profile && profile.profile) || '').trim();\n  const profImg = String((profile && profile.image) || '').trim();\n  if (!profName && !profCareer && !profBody && !profImg) {\n    mStaffProfile.style.display = 'none';\n    return;\n  }\n  if (mStaffProfileName) {\n    mStaffProfileName.textContent = profName || '\u30b9\u30bf\u30c3\u30d5';\n  }\n  if (mStaffProfileCareer) {\n    const careerText = profCareer ? (\/\u6b74\/u.test(profCareer) ? profCareer : ('' + profCareer)) : '';\n    mStaffProfileCareer.textContent = careerText ? '\uff08' + careerText + '\uff09' : '';\n  }\n  if (mStaffProfileBody) mStaffProfileBody.textContent = profBody || '';\n  if (mStaffProfilePhoto) {\n    if (profImg) {\n      mStaffProfilePhoto.src = profImg;\n      mStaffProfilePhoto.style.display = 'block';\n    } else {\n      mStaffProfilePhoto.removeAttribute('src');\n      mStaffProfilePhoto.style.display = 'none';\n    }\n  }\n  mStaffProfile.style.display = 'block';\n}\n\nfunction updateStaffLabel(realOptions = []){\n  if (!mStaffLabel) return;\n  const count = Array.isArray(realOptions) ? realOptions.length : 0;\n  const optional = !false && count !== 1;\n  mStaffLabel.textContent = optional ? '\u30b9\u30bf\u30c3\u30d5\uff08\u4efb\u610f\uff09' : '\u30b9\u30bf\u30c3\u30d5';\n}\nfunction syncStaffControl(presetStaff = ''){\n  if (!mStaff) return;\n  const realOptions = Array.from(mStaff.options || []).filter(opt => String(opt.value || '').trim() !== '');\n  const currentValue = String(mStaff.value || '').trim();\n  updateStaffLabel(realOptions);\n\n  if (AUTO_SINGLE_STAFF && realOptions.length === 1) {\n    const only = realOptions[0];\n    mStaff.value = String(only.value || '').trim();\n    mStaff.style.display = 'none';\n    mStaff.setAttribute('aria-hidden', 'true');\n    if (mStaffSingle) {\n      mStaffSingle.textContent = String(only.textContent || only.value || '').trim();\n      mStaffSingle.style.display = 'block';\n    }\n  } else {\n    mStaff.style.removeProperty('display');\n    mStaff.removeAttribute('aria-hidden');\n    if (mStaffSingle) {\n      mStaffSingle.textContent = '';\n      mStaffSingle.style.display = 'none';\n    }\n    if (presetStaff) {\n      const matched = realOptions.find(opt => String(opt.value || '').trim() === presetStaff);\n      if (matched) {\n        mStaff.value = matched.value;\n      } else if (!realOptions.some(opt => String(opt.value || '').trim() === currentValue)) {\n        mStaff.value = '';\n      }\n    } else if (!realOptions.some(opt => String(opt.value || '').trim() === currentValue)) {\n      mStaff.value = '';\n    }\n  }\n\n  renderSelectedStaffProfile();\n}\nfunction fillStaffSelect(item){\n  \/\/ item.staff \u2026 \u65e7\u5f62\u5f0f\u306e\u30c6\u30ad\u30b9\u30c8\u300cAYAKO\uff083000\uff09\u3001MIKA\u300d\u306a\u3069\n  const raw = item.staff || '';\n  mStaff.innerHTML = '';\n  const require = false;\n\n  const firstOpt = document.createElement('option');\n  firstOpt.value = '';\n  firstOpt.textContent = require ? '\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044' : '\u6307\u5b9a\u306a\u3057';\n  mStaff.appendChild(firstOpt);\n\n  if (!raw) return;\n\n  const parts = (window.angin_mx_split_multi\n    ? window.angin_mx_split_multi(raw)\n    : raw.split(\/[\u3001,\uff0c\\s]+\/));\n\n  parts.forEach(function(p){\n    p = (p || '').trim();\n    if (!p) return;\n\n    let label = p;\n    let priceNum = 0;\n\n    if (typeof window.angin_mx_parse_option_inline === 'function') {\n      const parsed = window.angin_mx_parse_option_inline(p);\n      if (parsed && parsed.base) {\n        label = parsed.base;\n      }\n      if (parsed && parsed.price_raw) {\n        const digits = parsed.price_raw.replace(\/[^\\d]\/g,'');\n        if (digits) priceNum = parseInt(digits,10) || 0;\n      }\n    }\n\n    let text = label;\n    if (priceNum > 0) {\n      text += '\uff08' + new Intl.NumberFormat('ja-JP',{style:'currency',currency:'JPY',maximumFractionDigits:0}).format(priceNum) + '\uff09';\n    }\n\n    const opt = document.createElement('option');\n    opt.value = label;\n    opt.textContent = text;\n    mStaff.appendChild(opt);\n  });\n}\n\n\n\/\/ \u30c1\u30a7\u30c3\u30af\u30dc\u30c3\u30af\u30b9\u3092\u8868\u793a\u3059\u308b\u30b3\u30f3\u30c6\u30ca\u304c\u7121\u3051\u308c\u3070<select>\u306e\u5f8c\u308d\u306b\u4f5c\u308b\nif (!mOptBoxes && mOpt && mOpt.parentElement) {\n  mOptBoxes = document.createElement('div');\n  mOptBoxes.id = 'mx-option-boxes';\n  mOptBoxes.className = 'mx-option-boxes';\n\n  \/\/ mOpt\uff08select\uff09\u306e\u884c\u306e\u9ad8\u3055\u3092\u53d6\u5f97\n  const cs = window.getComputedStyle(mOpt);\n  const lineH = parseFloat(cs.lineHeight);\n  const fontSize = parseFloat(cs.fontSize);\n\n  \/\/ line-height \u304c 'normal' \u306e\u5834\u5408\u306f font-size * 1.2 \u7a0b\u5ea6\u3068\u3057\u3066\u6271\u3046\n  const realLineH = isNaN(lineH) ? fontSize * 1.2 : lineH;\n\n  \/\/ 3.5\u884c\u5206\u306e\u9ad8\u3055\u306b\u8a2d\u5b9a\n  \/\/ mOptBoxes.style.maxHeight = `${realLineH * 3.5}px`;\n\n  \/\/ \u30b9\u30af\u30ed\u30fc\u30eb\u8a2d\u5b9a\n  \/\/  mOptBoxes.style.overflowY = 'auto';\n  \/\/ mOptBoxes.style.paddingRight = '4px';\n\n  \/\/ \u633f\u5165\n  mOpt.parentElement.appendChild(mOptBoxes);\n}\n\n\/\/ \u30d7\u30eb\u30c0\u30a6\u30f3\u306f\u8868\u793a\u3060\u3051\u6d88\u3059\uff08\u4e2d\u8eab\u306f\u4e92\u63db\u7528\u306b\u6b8b\u3059\uff09\nif (mOpt) {\n  mOpt.style.display = 'none';\n}\n\n      const mBack  = $('#mx-detail-back',root);\n      const mGoto  = $('#mx-detail-goto',root);\n      const mSpin  = $('#mx-modal-spinner',root);\n\n      const MIN_DATE = $('#mx-min-date',root).value;\n      const MAX_DATE = $('#mx-max-date',root).value;\n\n      const wrap    = $('#mx-wrap',root);\n      const loading = $('#mx-loading',root);\n      let hasOpened = false;\n\n      const ALLOWED_CATS = [\"category1\",\"category2\"];\n      const sanitizeCat = (c)=> (c && ALLOWED_CATS.includes(c)) ? c : '';\n\n      let currentItem = null;\n      let currentCat = (function(){\n        const u=new URL(location.href), p=u.searchParams;\n        const raw = p.get('mx_cat') || p.get('cat') || '';\n        const ok  = sanitizeCat(raw);\n        return ok || 'category1';\n      })();\n\n      \/* sticky top *\/\n      function syncStickyOffsets(){\n        const bar = document.getElementById('wpadminbar');\n        const adminTop = (bar ? bar.offsetHeight : 0) || 0;\n        const isMobileShell = !!(document.body && document.body.classList.contains('angin-mx-mobile-app'));\n        const mobileStepperHeight = (isMobileShell && stepper)\n          ? Math.ceil(stepper.getBoundingClientRect().height || stepper.offsetHeight || 0)\n          : 0;\n        root.style.setProperty('--mx-admin-top', adminTop + 'px');\n        root.style.setProperty('--mx-mobile-stepper-h', mobileStepperHeight + 'px');\n        root.style.setProperty('--mx-stick-top', (adminTop + mobileStepperHeight) + 'px');\n      }\n      syncStickyOffsets();\n      window.addEventListener('resize', syncStickyOffsets, { passive:true });\n      window.addEventListener('angin-mx-mobile-shell-change', syncStickyOffsets);\n\n      \/* \u30e2\u30fc\u30c0\u30eb\u3092 body \u76f4\u4e0b\u3078 *\/\n      (function(){ if (modal && modal.parentElement !== document.body) document.body.appendChild(modal); })();\n\n      function syncWeekNavButtons(){\n        const prevBtn = $('#mx-prev',root);\n        const min = mxNormalizeYmd(MIN_DATE || '');\n        const current = mxNormalizeYmd((start && start.value) ? start.value : min);\n        const disablePrev = !min || !current || current <= min;\n        if (prevBtn) {\n          prevBtn.disabled = disablePrev;\n          prevBtn.setAttribute('aria-disabled', disablePrev ? 'true' : 'false');\n        }\n      }\n\n      function expandWrap(){\n        return new Promise(resolve=>{\n          syncWeekNavButtons();\n          if (startRow) startRow.style.display = 'flex';\n          if (weekNav)  weekNav.style.display  = 'block';\n          wrap.classList.add('is-open');\n          wrap.style.maxHeight = (table.scrollHeight + 24) + 'px';\n          requestAnimationFrame(syncStickyOffsets);\n          const done=()=>{ wrap.removeEventListener('transitionend',done); resolve(); };\n          wrap.addEventListener('transitionend',done);\n          setTimeout(resolve, 450);\n        });\n      }\n      function scrollWeekMatrixIntoView(){\n        syncStickyOffsets();\n        const isMobileShell = !!(document.body && document.body.classList.contains('angin-mx-mobile-app'));\n        const stickyTop = Math.max(0, Math.ceil(parseFloat(getComputedStyle(root).getPropertyValue('--mx-stick-top')) || 0));\n        const target = isMobileShell ? (weekNav || table || wrap) : (wrap || table || weekNav);\n        if (!target || typeof target.getBoundingClientRect !== 'function') return;\n        const margin = isMobileShell ? 8 : 12;\n        const top = window.pageYOffset + target.getBoundingClientRect().top - stickyTop - margin;\n        window.scrollTo({ top: Math.max(0, top), behavior: 'smooth' });\n      }\n      function ensureOpenThenScroll(){\n        return new Promise(async (resolve)=>{\n          if(!hasOpened){ await expandWrap(); hasOpened = true; }\n          else{ wrap.style.maxHeight = (table.scrollHeight + 24) + 'px'; }\n          requestAnimationFrame(()=>{\n            scrollWeekMatrixIntoView();\n            resolve();\n          });\n        });\n      }\n\n      \/* URL\u540c\u671f *\/\n      function mxReadURL(){ const u=new URL(location.href), p=u.searchParams; return { cat:p.get('mx_cat')||p.get('cat')||'', svc:p.get('svc')||'', ymd:p.get('ymd')||p.get('date')||'', reschedule_id:p.get('reschedule_id')||'', history_token:p.get('history_token')||'' }; }\n      function mxUpdateURL(partial={}, mode='push'){\n        const u=new URL(location.href), p=u.searchParams, cur=mxReadURL();\n        const next={...cur, ...partial};\n        for(const k of ['cat','svc','ymd','reschedule_id','history_token']){\n          const urlKey = (k === 'cat') ? 'mx_cat' : k;\n          next[k] ? p.set(urlKey,next[k]) : p.delete(urlKey);\n          if (k === 'cat') p.delete('cat');\n        }\n        u.search=p.toString();\n        (mode==='replace' ? history.replaceState : history.pushState).call(history, {mx:next}, '', u);\n      }\n\n      \/* \u9078\u629e\u4e2d\u30ab\u30fc\u30c9\u8d64\u67a0 *\/\n      function setPickedCard(name){\n        const cards = $$('#mx-cards .card',root);\n        cards.forEach(c => c.classList.toggle('is-picked', (c.dataset.name||'') === (name||'')));\n      }\n      function scrollToMenuCard(name){\n        if (!name) return;\n        const cards = $$('#mx-cards .card',root);\n        const target = cards.find(c => (c.dataset.name || '') === (name || ''));\n        if (!target) return;\n        target.scrollIntoView({ behavior:'smooth', block:'start' });\n      }\n\n      function mxNormalizeYmd(s){ if(!s) return ''; s=(s+'').trim().replace(\/[\uff0e\u3002\\\/\uff0f]\/g,'-'); if(\/^\\d{8}$\/.test(s)) s=s.slice(0,4)+'-'+s.slice(4,6)+'-'+s.slice(6,8); const d=new Date(s+'T00:00:00'); if(Number.isNaN(d.getTime())) return ''; const y=d.getFullYear(),m=('0'+(d.getMonth()+1)).slice(-2),da=('0'+d.getDate()).slice(-2); return `${y}-${m}-${da}`; }\n      function mxPickWindowFromItem(item){ const src=(item&&item.meta)?item.meta:(item||{}); const ks=['\u30e1\u30cb\u30e5\u30fc\u306e\u958b\u59cb\u65e5','\u958b\u59cb\u65e5','start_date','menu_start','start']; const ke=['\u30e1\u30cb\u30e5\u30fc\u306e\u7d42\u4e86\u65e5','\u7d42\u4e86\u65e5','end_date','menu_end','end']; let rs='',re=''; for(const k of ks){ if(src[k]!=null && src[k]!==''){ rs=src[k]; break; } } for(const k of ke){ if(src[k]!=null && src[k]!==''){ re=src[k]; break; } } const s=mxNormalizeYmd(rs), e=mxNormalizeYmd(re); let ss=s,ee=e; if(ss && ee && ee<ss){ const t=ss; ss=ee; ee=t; } return {start:ss,end:ee}; }\n\n      \/\/ \u9031\u8868\u30ec\u30b9\u30dd\u30f3\u30b9\u306b\u671f\u9593\u30de\u30b9\u30af\uff06\u7406\u7531\u3092\u4e57\u305b\u308b\n      function mxOverlayMenuWindow(j,svcItem){\n        const w = mxPickWindowFromItem(svcItem||{});\n        const closed = [], why = [];\n        (j.days||[]).forEach(d=>{\n          const y = d.ymd;\n          let r = 'ok';\n          if (w.start && y <  w.start) r='before';\n          else if (w.end && y >  w.end) r='after';\n          closed.push(r!=='ok'); why.push(r);\n        });\n        if (Array.isArray(j.gridRemain)){\n          for (let r=0; r<j.gridRemain.length; r++){\n            for (let c=0; c<closed.length; c++){\n              if (closed[c]) j.gridRemain[r][c]=0;\n            }\n          }\n        }\n        j._closedMask = closed;\n        j._closedWhy  = why;\n        j._win        = w;\n      }\n\n      function addDays(ymd, days){ const d=new Date(ymd+'T00:00:00'); d.setDate(d.getDate()+days); const y=d.getFullYear(),m=('0'+(d.getMonth()+1)).slice(-2),da=('0'+d.getDate()).slice(-2); return `${y}-${m}-${da}`; }\n      function fmtJPY(n){ try{ return new Intl.NumberFormat('ja-JP',{style:'currency',currency:'JPY',maximumFractionDigits:0}).format(parseInt(n||0,10)||0); }catch(e){ return '\u00a5'+String(parseInt(n||0,10)||0); } }\n      function setCurrentStep(step, label){\n        if (!stepper) return;\n        const current = Math.max(1, Math.min(3, parseInt(step || 1, 10) || 1));\n        stepper.dataset.currentStep = String(current);\n        $$('.mx-mobile-step', stepper).forEach((node)=>{\n          const num = parseInt(node.dataset.step || '0', 10) || 0;\n          node.classList.remove('is-done','is-current','is-upcoming');\n          node.classList.add(num < current ? 'is-done' : (num === current ? 'is-current' : 'is-upcoming'));\n        });\n        const currentNode = $('.mx-mobile-step-current strong', stepper);\n        if (currentNode && label) currentNode.textContent = label;\n      }\n      function buildWeekPref(){\n        const checked = getCheckedOptionBoxes();\n        return {\n          staff   : (mStaff && mStaff.value) ? mStaff.value : '',\n          optKey  : checked.map(cb => cb.value).filter(Boolean).join(','),\n          optLabel: checked.map(cb => cb.dataset.label || '').filter(Boolean).join(' \/ '),\n          optExtra: getSelectedOptionNumbers().extMin\n        };\n      }\n      async function reopenWeekStep(){\n        if (!currentItem || !currentItem.name) return;\n                setWfOpenLoading(true);\n        try {\n          service.value = currentItem.name || '';\n          updateWeekFooterSummary();\n          await loadMatrix(buildWeekPref());\n          await ensureOpenThenScroll();\n          setCurrentStep(2, '\u65e5\u6642');\n        } finally {\n          setWfOpenLoading(false);\n        }\n      }\n      function goBackToMenuStep(){\n        const closingSvc = (currentItem && currentItem.name) ? String(currentItem.name) : String(service.value || '');\n        mxUpdateURL({ svc: '' }, 'push');\n        service.value = '';\n        currentItem = null;\n        setPickedCard('');\n        hasOpened = false;\n        wrap.style.maxHeight='0px';\n        wrap.classList.remove('is-open');\n        if (startRow) startRow.style.display = 'none';\n        if (weekNav)  weekNav.style.display  = 'none';\n        if (modal && modal.style.display === 'flex') closeDetail();\n        setCurrentStep(1, '\u30e1\u30cb\u30e5\u30fc');\n        updateWeekFooterSummary();\n        requestAnimationFrame(()=>{ scrollToMenuCard(closingSvc); });\n      }\n      function getSelectedOptionLabel(){\n        return getCheckedOptionBoxes().map(cb => cb.dataset.label || '').filter(Boolean).join(' \/ ') || '\u306a\u3057';\n      }\n      function getFooterTotalJPY(){\n        const svc = service.value || (currentItem && currentItem.name) || '';\n        const item = META_ALL[svc] || currentItem || null;\n        if (!item) return 0;\n        const baseJPY = parseInt(item.price_num || 0, 10) || 0;\n        return Math.max(0, baseJPY + TL_collectOptAddJPY() + getSelectedStaffAddJPY());\n      }\n      function updateWeekFooterSummary(){\n        const svc = service.value || (currentItem && currentItem.name) || '';\n        if (wfFooter) wfFooter.style.display = svc ? '' : 'none';\n        if (wfCourse) wfCourse.textContent = '\u30b3\u30fc\u30b9: ' + (svc || '-');\n        if (wfOption) wfOption.textContent = '\u30aa\u30d7\u30b7\u30e7\u30f3: ' + getSelectedOptionLabel();\n        if (wfStaff) {\n          const staffName = String((mStaff && mStaff.value) ? mStaff.value : '').trim();\n          if (staffName) {\n            wfStaff.textContent = '\u62c5\u5f53: ' + staffName;\n            wfStaff.style.display = '';\n          } else {\n            wfStaff.textContent = '\u62c5\u5f53: -';\n            wfStaff.style.display = 'none';\n          }\n        }\n        const totalJPY = getFooterTotalJPY();\n        if (SHOW_PRICE && wfPrice) wfPrice.textContent = '\u91d1\u984d: ' + (totalJPY > 0 ? (fmtJPY(totalJPY) + PRICE_TAX_SUFFIX) : '-');\n        if (wfOpenBtn) {\n          wfOpenBtn.style.display = svc ? '' : 'none';\n        }\n      }\n      function setWfOpenLoading(on){\n        if (!wfOpenBtn) return;\n        wfOpenBtn.classList.toggle('is-loading', !!on);\n        wfOpenBtn.disabled = !!on;\n        wfOpenBtn.setAttribute('aria-busy', on ? 'true' : 'false');\n      }\n      wfCloseBtn && wfCloseBtn.addEventListener('click', ()=>{\n        goBackToMenuStep();\n      });\n      stepper && stepper.addEventListener('click', async (e)=>{\n        const stepNode = e.target.closest('.mx-mobile-step');\n        if (!stepNode) return;\n        const targetStep = parseInt(stepNode.dataset.step || '0', 10) || 0;\n        const currentStep = parseInt(stepper.dataset.currentStep || '1', 10) || 1;\n        if (!targetStep || targetStep === currentStep) return;\n        if (targetStep === 1) {\n          goBackToMenuStep();\n          return;\n        }\n        if (targetStep === 2 && currentStep >= 2) {\n          await reopenWeekStep();\n        }\n      });\n\n      \/* \u30ab\u30c6\u30b4\u30ea\u30dc\u30bf\u30f3 \u2192 \u30ab\u30fc\u30c9\u63cf\u753b *\/\n      function getActiveCat(){ return currentCat || 'category1'; }\n      function setActiveCat(cat){\n        currentCat = cat;\n        $$('.cat-btn',catWrap).forEach(b => b.setAttribute('aria-selected', b.dataset.cat===cat ? 'true':'false'));\n        mxUpdateURL({cat, svc:''}, 'push');\n      }\n      function findMenuTargetBySlug(slug){\n        const key = String(slug || '').trim();\n        if (!key) return null;\n        for (const cat of Object.keys(META_BY_CAT || {})) {\n          const hit = (META_BY_CAT[cat] || []).find(x => String(x.slug || '') === key);\n          if (hit) return { item: hit, cat };\n        }\n        return null;\n      }\n      function openMenuTarget(target){\n        if (!target || !target.item) return;\n        const targetCat = String(target.cat || '').trim();\n        if (targetCat && ALLOWED_CATS.includes(targetCat) && currentCat !== targetCat) {\n          setActiveCat(targetCat);\n          if (SHOW_CATEGORY_TABS) renderCards();\n        }\n        requestAnimationFrame(() => {\n          openDetail(target.item);\n          setPickedCard(target.item.name || '');\n        });\n      }\n      const promoBanner = $('#mx-promo-banner',root);\n      if (promoBanner) {\n        const promoTarget = findMenuTargetBySlug(promoBanner.dataset.serviceSlug || '');\n        if (!promoTarget) {\n          const promoWrap = promoBanner.closest('.mx-promo-banner-wrap');\n          if (promoWrap) promoWrap.style.display = 'none';\n        } else {\n          promoBanner.addEventListener('click', ()=>{\n            openMenuTarget(promoTarget);\n          });\n        }\n      }\n      if (SHOW_CATEGORY_TABS && catWrap) catWrap.addEventListener('click', (e)=>{\n        const b = e.target.closest('.cat-btn'); if(!b) return;\n        if(b.getAttribute('aria-selected')==='true') return;\n        setActiveCat(b.dataset.cat || 'category1');\n        renderCards();\n      });\n\n      const cards=$('#mx-cards',root);\nfunction renderCards(){\n  const cat  = getActiveCat();\n  const urlCat = sanitizeCat((mxReadURL().cat || '').trim());\n  const list = SHOW_CATEGORY_TABS\n    ? (META_BY_CAT[cat] || [])\n    : (urlCat\n        ? (META_BY_CAT[urlCat] || [])\n        : ALLOWED_CATS.reduce((acc, ck) => acc.concat(META_BY_CAT[ck] || []), []));\n  cards.innerHTML='';\n  let visibleCount = 0;\n\n  list.forEach(it=>{\n    visibleCount++;\n    const el = document.createElement('div');\n    el.className = 'card';\n    el.tabIndex  = 0;\n    el.dataset.name = it.name || '';\n\n    \/\/ \u7406\u7531\u5225\u30af\u30e9\u30b9\uff08\u53d7\u4ed8\u524d\/\u5f8c\uff09\n    const rcls = it.unbookable_reason==='before' ? 'before'\n              : it.unbookable_reason==='after'  ? 'after' : '';\n    const ribbon = it.unbookable\n      ? `<span class=\"card-ribbon ${rcls}\">${it.unbookable_label||'\u53d7\u4ed8\u671f\u9593\u5916'}<\/span>`\n      : '';\n\n    if (it.unbookable) el.classList.add('is-unbookable');\n\n    \/\/ \u2605 \u8a2d\u5b9a\uff08show_win_badge\uff09\u3067\u671f\u9593\u30d0\u30c3\u30b8\u306e ON\/OFF \u3092\u5236\u5fa1\n    const showWinBadge = true;\n\n    \/\/ \u30e1\u30cb\u30e5\u30fc\u5185\u306b\u671f\u9593\u30d0\u30c3\u30b8\u3092\u4ed8\u3051\u308b\u304b\u3069\u3046\u304b\n    const winBadge = (showWinBadge && it._win && (it._win.start || it._win.end))\n      ? `<span class=\"card-badge\">\u671f\u9593 ${(it._win.start || '')}\u301c${(it._win.end || '')}<\/span>`\n      : '';\n\n    \/\/ \u2605 \u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\u300c\u6ce8\u76ee\u8868\u8a18\u300d\u5217 \u2192 \u753b\u50cf\u306e\u4e0a\u30d0\u30c3\u30b8\n    const imageBadge = (it.badge && it.badge !== '')\n      ? `<div class=\"card-image-badge\">${it.badge}<\/div>`\n      : '';\n\n    el.innerHTML = `\n      ${ribbon}\n      <div class=\"card-img-wrap\">\n        ${imageBadge}\n        <img decoding=\"async\" src=\"${it.image || 'https:\/\/angin.cloud\/noimage.jpg'}\" alt=\"\u30e1\u30cb\u30e5\u30fc\u753b\u50cf\"\n             onerror=\"this.onerror=null;this.src='https:\/\/angin.cloud\/noimage.jpg';\">\n      <\/div>\n      <div class=\"card-body\">\n        <div class=\"card-title\">${it.name||''}<\/div>\n        <div class=\"card-desc\">${it.desc||''}<\/div>\n        <div class=\"card-meta\">\n          ${SHOW_DURATION && it.minutes ? `<span class=\"card-badge\">\u6240\u8981 ${it.minutes}\u5206<\/span>` : ''}\n          ${SHOW_PRICE && it.price_num ? `<span class=\"card-badge\">${fmtJPY(it.price_num)}<\/span>` : ''}\n          ${winBadge}\n        <\/div>\n\n      <\/div>`;\n\n    const open = ()=>{ setPickedCard(it.name||''); openDetail(it); };\n    el.addEventListener('click', open);\n    el.addEventListener('keydown', e=>{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); open(); }});\n    cards.appendChild(el);\n  });\n\n  if (!visibleCount) {\n    cards.innerHTML = '<div style=\"padding:18px;text-align:center;color:#6b7280;\">\u9078\u629e\u65e5\u306e\u51fa\u52e4\u6642\u9593\u306b\u8a72\u5f53\u3059\u308b\u30e1\u30cb\u30e5\u30fc\u306f\u3042\u308a\u307e\u305b\u3093\u3002<\/div>';\n  }\n\n  const st=(function(){ const u=new URL(location.href), p=u.searchParams; return {svc:p.get('svc')||''};})();\n  setPickedCard(st.svc && (list.some(x=>x.name===st.svc)) ? st.svc : '');\n  service.value=''; table.innerHTML=''; rangeTx.textContent='';\n  updateWeekFooterSummary();\n  hasOpened = false;\n  wrap.style.maxHeight='0px'; wrap.classList.remove('is-open');\n  if (startRow) startRow.style.display = 'none';\n  if (weekNav)  weekNav.style.display  = 'none';\n  setCurrentStep(1, '\u30e1\u30cb\u30e5\u30fc');\n}\n\n\n\/* \u30b9\u30bf\u30c3\u30d5\u3068\u30aa\u30d7\u30b7\u30e7\u30f3\uff1a\u6240\u8981\/\u91d1\u984d\u52a0\u7b97\u3068\u8868\u793a\u66f4\u65b0 *\/\nfunction getSelectedOptionNumbers(){\n  \/\/ \u30c1\u30a7\u30c3\u30af\u30dc\u30c3\u30af\u30b9\u306f #mx-option-boxes \u914d\u4e0b\u3092\u898b\u308b\n  const boxes = getCheckedOptionBoxes();\n  let extMin = 0;\n  let addJPY = 0;\n\n  boxes.forEach(box => {\n    extMin += parseInt(box.dataset.extra || '0', 10);\n    addJPY += parseInt(box.dataset.pnum  || '0', 10);\n  });\n\n  return { extMin, addJPY };\n}\n\nfunction getSelectedStaffAddJPY(){\n  const sel = mStaff?.selectedOptions?.[0];\n  return sel ? parseInt(sel.dataset.pnum || '0', 10) : 0;\n}\n\n\/* -------------------------------------------------------\n * \u30c1\u30a7\u30c3\u30af\u30dc\u30c3\u30af\u30b9\u304b\u3089\u300c\u5ef6\u9577\u5408\u8a08\u5206\u6570\u300d\u3092\u53d6\u5f97\u3059\u308b\n *  data-extra \u306b\u5ef6\u9577\u5206\u6570\uff08\u6570\u5024\uff09\u3092\u5165\u308c\u3066\u304a\u304f\u524d\u63d0\n * ------------------------------------------------------- *\/\nfunction TL_collectOptExtraMinutes() {\n  const boxes = getCheckedOptionBoxes();\n  let total = 0;\n  boxes.forEach(b => {\n    const m = parseInt(b.dataset.extra || '0', 10);\n    if (Number.isFinite(m)) total += m;\n  });\n  return total;\n}\n\n\/* -------------------------------------------------------\n * \u30c1\u30a7\u30c3\u30af\u30dc\u30c3\u30af\u30b9\u304b\u3089\u300c\u8ffd\u52a0\u6599\u91d1\u306e\u5408\u8a08\u300d\u3092\u53d6\u5f97\u3059\u308b\n *  data-pnum \u306b\u91d1\u984d\uff08\u6570\u5024\uff09\u3092\u5165\u308c\u3066\u304a\u304f\u524d\u63d0\n * ------------------------------------------------------- *\/\nfunction TL_collectOptAddJPY() {\n  const boxes = getCheckedOptionBoxes();\n  let total = 0;\n  boxes.forEach(b => {\n    const n = parseInt(b.dataset.pnum || '0', 10);\n    if (Number.isFinite(n)) total += n;\n  });\n  return total;\n}\n\nfunction recalcModalMinutesAndPrice(){\n  if (!currentItem){\n    if (SHOW_DURATION && mMin) mMin.textContent = '\u6240\u8981 - \u5206';\n    if (SHOW_PRICE && mPrice) mPrice.textContent = '\u6599\u91d1 -';\n    return;\n  }\n\n  \/\/ \u30d9\u30fc\u30b9\u306e\u30e1\u30cb\u30e5\u30fc\u6642\u9593\u30fb\u91d1\u984d\n  const baseMin = parseInt(currentItem.minutes   || 0, 10) || 0;\n  const baseJPY = parseInt(currentItem.price_num || 0, 10) || 0;\n\n  \/\/ \u30c1\u30a7\u30c3\u30af\u30dc\u30c3\u30af\u30b9\u3067\u9078\u3070\u308c\u3066\u3044\u308b\u30aa\u30d7\u30b7\u30e7\u30f3\u306e\n  \/\/   \u30fb\u5ef6\u9577\u5408\u8a08\u5206\u6570\n  \/\/   \u30fb\u8ffd\u52a0\u6599\u91d1\u5408\u8a08\n  const optExtraMin = TL_collectOptExtraMinutes();\n  const optAddJPY   = TL_collectOptAddJPY();\n\n  \/\/ \u30b9\u30bf\u30c3\u30d5\u52a0\u7b97\uff08\u65e2\u5b58\u30ed\u30b8\u30c3\u30af\u305d\u306e\u307e\u307e\u4f7f\u7528\uff09\n  const staffAdd = getSelectedStaffAddJPY();\n\n  \/\/ ==== \u6240\u8981\u6642\u9593\uff1a\u30e1\u30cb\u30e5\u30fc + \u30aa\u30d7\u30b7\u30e7\u30f3\u5ef6\u9577 ==== \n  const totalMinutes = baseMin + optExtraMin;\n  if (SHOW_DURATION && mMin) mMin.textContent = '\u6240\u8981 ' + totalMinutes + '\u5206';\n\n  \/\/ ==== \u5408\u8a08\u91d1\u984d\uff1a\u30e1\u30cb\u30e5\u30fc + \u30aa\u30d7\u30b7\u30e7\u30f3 + \u30b9\u30bf\u30c3\u30d5 ==== \n  const totalJPY = baseJPY + optAddJPY + staffAdd;\n  if (SHOW_PRICE && mPrice) mPrice.textContent = totalJPY > 0 ? ('\u6599\u91d1 ' + fmtJPY(totalJPY) + PRICE_TAX_SUFFIX) : '\u6599\u91d1 -';\n  updateWeekFooterSummary();\n}\n\n\n\/\/ \u30aa\u30d7\u30b7\u30e7\u30f3\uff1a\u30c1\u30a7\u30c3\u30af\u30dc\u30c3\u30af\u30b9\u306e change \u3092\u62fe\u3046\nconst optWrap = mOptBoxes;\nif (optWrap) {\n  optWrap.addEventListener('change', (e) => {\n    if (e.target && e.target.matches('input[type=\"checkbox\"]')) {\n      recalcModalMinutesAndPrice();\n    }\n  });\n}\n\n\/\/ \u30b9\u30bf\u30c3\u30d5\u306f\u4eca\u307e\u3067\u901a\u308a<select>\u306echange\nmStaff?.addEventListener('change', ()=>{\n  recalcModalMinutesAndPrice();\n  renderSelectedStaffProfile();\n});\n\n\nfunction openDetail(item){\n  mxUpdateURL({svc: item?.name || ''}, 'push');\n  currentItem = item;\n  setPickedCard(item?.name||'');\n  setCurrentStep(1, '\u30e1\u30cb\u30e5\u30fc');\n\n  \/\/ \u30bf\u30a4\u30c8\u30eb\n  mTitle.textContent = item.name || '';\n\n  \/\/ \u2605 \u7a2e\u985e\uff08types \/ raw_types \u304b\u3089 pill \u3092\u751f\u6210\uff09\n  if (mTypes) {\n    let types = [];\n\n    if (Array.isArray(item.types) && item.types.length) {\n      types = item.types.slice();\n    } else if (item.raw_types) {\n      \/\/ PHP \u5074\u3067 raw_types \u3092\u5165\u308c\u3066\u3044\u308b\u306e\u3067\u3001JS\u5074\u3067\u3082\u4fdd\u967a\u3067\u5206\u5272\u3057\u3066\u304a\u304f\n      const raw = String(item.raw_types || '').trim();\n      if (raw) {\n        types = raw.split(\/[\u3001\uff0c,\u30fb\uff0f\\\/\\|\\uFF5C\\s]+\/).map(s => s.trim()).filter(Boolean);\n      }\n    }\n\n    if (types.length) {\n      mTypes.innerHTML = types.map(t => `<span class=\"pill-types\">${t}<\/span>`).join(' ');\n      mTypes.style.display = '';\n      if (mTypes.classList.contains('mx-types-slide')) mTypes.scrollLeft = 0;\n    } else {\n      mTypes.innerHTML = '';\n      mTypes.style.display = 'none';\n    }\n  }\n\n  \/\/ \u8aac\u660e\uff08\u7ba1\u7406\u753b\u9762\u7531\u6765\u306e\u6539\u884c\/\u6bb5\u843d\u30bf\u30b0\u3092\u6539\u884c\u3068\u3057\u3066\u8868\u793a\uff09\n  const descRaw = String(item.desc || '');\n  const descDecoded = (() => {\n    \/\/ \u4e00\u90e8\u30c7\u30fc\u30bf\u3067 HTML \u30a8\u30b9\u30b1\u30fc\u30d7\u304c\u4e8c\u91cd\u306b\u306a\u3063\u3066\u3044\u308b\u305f\u3081\u3001\u6700\u59273\u56de\u307e\u3067\u6bb5\u968e\u30c7\u30b3\u30fc\u30c9\u3059\u308b\n    let s = descRaw;\n    for (let i = 0; i < 3; i++) {\n      const ta = document.createElement('textarea');\n      ta.innerHTML = s;\n      const next = ta.value;\n      if (next === s) break;\n      s = next;\n    }\n    return s;\n  })();\n  const descNorm = descDecoded\n    .replace(\/\\\\r\\\\n|\\\\n|\\\\r\/g, '\\n')\n    .replace(\/\\r\\n?|\\u2028|\\u2029\/g, '\\n')\n    .replace(\/<\\\/(p|div|section|article|blockquote|h[1-6]|tr|ul|ol)>\/gi, '\\n')\n    .replace(\/<li[^>]*>\/gi, '\u30fb')\n    .replace(\/<br\\s*\\\/?>\/gi, '\\n')\n    .replace(\/<\\\/p>\\s*<p[^>]*>\/gi, '\\n')\n    .replace(\/<\\\/?p[^>]*>\/gi, '')\n    .replace(\/<[^>]+>\/g, '')\n    .replace(\/[ \\t]+\\n\/g, '\\n')\n    .replace(\/\\n{3,}\/g, '\\n\\n')\n    .trim();\n  mDesc.textContent  = descNorm;\n\n  \/\/ \u753b\u50cf\n  mImg.src = item.image || 'https:\/\/angin.cloud\/noimage.jpg';\n  mImg.style.display = 'block';\n  mImg.onerror = function(){ this.onerror=null; this.src = 'https:\/\/angin.cloud\/noimage.jpg'; };\n\n  \/\/ \u30b9\u30bf\u30c3\u30d5\n  mStaff.innerHTML = '';\n  const staffFrag = document.createDocumentFragment();\n  const defOpt = document.createElement('option');\n  defOpt.value = '';\n  defOpt.textContent = '\u6307\u5b9a\u306a\u3057';\n  defOpt.dataset.pnum = '0';\n  staffFrag.appendChild(defOpt);\n\n  \/\/ item.staff \u306f [{name,label,price_num,key}, ...]\n  (Array.isArray(item.staff) ? item.staff : []).forEach(s => {\n    const o = document.createElement('option');\n    o.value = s.name || '';                \/\/ \u9001\u4fe1\u7528\u306f\u7d20\u306e\u6c0f\u540d\n    o.textContent = s.label || (s.name||'');\n    o.dataset.pnum = String(s.price_num || 0);\n    const prof = mxLookupStaffProfile(s.name || s.label || '');\n    if (prof) {\n      o.dataset.profName = String(prof.name || s.label || s.name || '');\n      o.dataset.profCareer = String(prof.career || '');\n      o.dataset.profImg = String(prof.image || '');\n      o.dataset.profBody = String(prof.profile || '');\n    }\n    staffFrag.appendChild(o);\n  });\n  mStaff.appendChild(staffFrag);\n  mStaff?.parentElement?.style?.removeProperty('display');\n  const detailUrl = new URL(location.href);\n  const presetStaff = (detailUrl.searchParams.get('staff') || '').trim();\n  syncStaffControl(presetStaff);\n\n  \/\/ \u30aa\u30d7\u30b7\u30e7\u30f3\uff08\u30c1\u30a7\u30c3\u30af\u30dc\u30c3\u30af\u30b9\u8907\u6570\u9078\u629e\uff09\n  if (mOptBoxes) {\n    mOptBoxes.innerHTML = '';\n  }\n  if (mOpt) {\n    \/\/ \u4e92\u63db\u7528\u306b <select> \u306b\u306f\u300c\u306a\u3057\u300d\u3060\u3051\u5165\u308c\u3066\u304a\u304f\n    mOpt.innerHTML = '<option value=\"\">\u306a\u3057<\/option>';\n  }\n\n  \/\/ \u30e1\u30cb\u30e5\u30fc\u306b\u7d10\u3065\u304f\u30aa\u30d7\u30b7\u30e7\u30f3\u914d\u5217\n  const opts = (Array.isArray(item.options) && item.options.length)\n    ? item.options\n    : [];\n\n  let hasAnyOpt = false;\n\n  opts.forEach(o => {\n    if (!o || !o.label) return;\n\n    \/\/ \u2605 \u300c\u306a\u3057\u300d\u306f\u30c1\u30a7\u30c3\u30af\u30dc\u30c3\u30af\u30b9\u306b\u51fa\u3055\u306a\u3044\n    const rawLabel = String(o.label || '').trim();\n    if (rawLabel === '\u306a\u3057') return;\n\n    \/\/ \u2605 \u8ffd\u52a0\u6642\u9593\uff08\u5206\uff09\u3068\u8ffd\u52a0\u6599\u91d1\uff08\u5186\uff09\u3092\u53d6\u308a\u51fa\u3059\n    \/\/   minutes \u2192 \u306a\u3051\u308c\u3070 extra \u3092\u898b\u308b\n    let extraMin = parseInt((o.minutes || o.extra || 0), 10) || 0;\n\n    \/\/   price \u2192 \u306a\u3051\u308c\u3070 price_num \u3092\u898b\u308b\n    let pnum = parseInt((o.price || o.price_num || 0), 10) || 0;\n\n    const label = document.createElement('label');\n    label.style.display = 'block';\n    label.style.marginBottom = '4px';\n\n    const cb = document.createElement('input');\n    cb.type = 'checkbox';\n    cb.value = rawLabel;\n    cb.dataset.label = rawLabel;\n    cb.dataset.extra = String(extraMin); \/\/ \u2190 \u5ef6\u9577\u5206\u6570\uff08\u5206\uff09\n    cb.dataset.pnum  = String(pnum);     \/\/ \u2190 \u8ffd\u52a0\u6599\u91d1\uff08\u5186\uff09\n\n    cb.addEventListener('change', recalcModalMinutesAndPrice);\n\n    \/\/ \u2605 \u8868\u793a\u7528\u306e\u300c\uff08+10\u5206 \/ +\u00a5800\uff09\u300d\u3092\u7d44\u307f\u7acb\u3066\u308b\n    const parts = [];\n    if (extraMin > 0) {\n      parts.push('+' + extraMin + '\u5206');\n    }\n    if (pnum > 0) {\n      const jpy = '\u00a5' + pnum.toLocaleString('ja-JP');\n      parts.push(jpy);\n    }\n    const suffix = parts.length ? '\uff08' + parts.join(' \/ ') + '\uff09' : '';\n\n    label.appendChild(cb);\n    label.appendChild(document.createTextNode(' ' + rawLabel + suffix));\n\n    if (mOptBoxes) {\n      mOptBoxes.appendChild(label);\n      hasAnyOpt = true;\n    }\n  });\n\n  if (mOptBoxes && !hasAnyOpt) {\n    mOptBoxes.innerHTML = '';\n  }\n  if (mOptControl) {\n    mOptControl.style.display = hasAnyOpt ? '' : 'none';\n  }\n  const presetOptRaw = (detailUrl.searchParams.get('opt') || '').trim();\n  if (presetOptRaw && mOptBoxes) {\n    const presetOpts = presetOptRaw.split('\/').map(v => v.trim()).filter(Boolean);\n    if (presetOpts.length) {\n      Array.from(mOptBoxes.querySelectorAll('input[type=\"checkbox\"]')).forEach((cb) => {\n        const label = String(cb.dataset.label || cb.value || '').trim();\n        cb.checked = presetOpts.includes(label);\n      });\n    }\n  }\n\n  \/\/ \u5206\u6570\u30fb\u91d1\u984d\u306e\u521d\u671f\u8868\u793a\uff08\u30d9\u30fc\u30b9\u6642\u9593\uff0b\u30aa\u30d7\u30b7\u30e7\u30f3\uff0b\u30b9\u30bf\u30c3\u30d5\uff09\n  recalcModalMinutesAndPrice();\n\n\n  \/\/ \u65e5\u4ed8\/\u6642\u9593\u306e UI \u8a2d\u5b9a\u306a\u3069\u3001\u65e2\u5b58\u51e6\u7406\u306f\u305d\u306e\u307e\u307e\u2026\n  \/\/ \uff08\u3053\u306e\u4e0b\u306f\u5143\u306e openDetail \u306e\u307e\u307e\u6b8b\u3057\u3066\u304f\u3060\u3055\u3044\uff09\n\n  \/\/ \u8868\u793a\n  modal.style.display='flex';\n  modal.setAttribute('aria-hidden','false');\n}\n\n      function closeDetail(){ modal.style.display='none'; modal.setAttribute('aria-hidden','true'); }\n      const mClose = modal ? modal.querySelector('.mx-detail-close') : null;\n      mClose && mClose.addEventListener('click', closeDetail);\n      mBack && mBack.addEventListener('click', closeDetail);\n      modal.addEventListener('click', e=>{\n        if (e.target === modal) { closeDetail(); return; }\n        const closeBtn = e.target.closest('.mx-detail-close');\n        if (closeBtn && modal.contains(closeBtn)) closeDetail();\n      });\n      document.addEventListener('keydown', e=>{\n        if(e.key==='Escape' && modal.style.display==='flex') closeDetail();\n        if(e.key==='Escape' && policyModal && policyModal.classList.contains('is-open')) closePolicyModal();\n      });\n\n      \/* \u9031\u8868\u30ed\u30fc\u30c9 *\/\n      function isHol(d){ return !!d.holiday; }\n      function loadMatrix(pref={}){\n        return new Promise((resolve)=>{\n          const svc = service.value;\n          const base = META_ALL[svc]?.minutes ? parseInt(META_ALL[svc].minutes,10) : 0;\n          const ext  = pref.optExtra ? parseInt(pref.optExtra,10) : 0;\n          const minutes = base + ext;\n          const startYmd = start.value;\n\n          if(!svc || (false && !pref.staff) || !startYmd || minutes<=0){\n            table.innerHTML = '<tbody><tr><td style=\"padding:12px\">\u30e1\u30cb\u30e5\u30fc\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044<\/td><\/tr><\/tbody>';\n            rangeTx.textContent=''; loading.style.display='none'; updateWeekFooterSummary(); resolve(); return;\n          }\n\n          loading.style.display='block';\n          const optReq = (pref.optKey || pref.optLabel || '');\n          const p = new URLSearchParams({action:'angin_mx_get_week', nonce:'843545f5f1', service: svc, minutes: String(minutes), start: startYmd, option: String(optReq), staff: String(pref.staff || '')});\n          fetch('https:\/\/salon.angin.cloud\/west-shinjuku-clinic\/wp-admin\/admin-ajax.php',{method:'POST',headers:{'Content-Type':'application\/x-www-form-urlencoded'},body:p})\n          .then(async r=>{\n            const raw = await r.text();\n            let j = null;\n            try {\n              j = JSON.parse(raw);\n            } catch (e) {\n              const statusText = r.status ? ('HTTP ' + r.status) : '';\n              const bodyText = raw\n                ? raw.replace(\/<[^>]*>\/g, ' ').replace(\/\\s+\/g, ' ').trim().slice(0, 200)\n                : '';\n              throw new Error(bodyText || statusText || '\u901a\u4fe1\u30a8\u30e9\u30fc');\n            }\n            if (!r.ok && (!j || typeof j !== 'object')) {\n              throw new Error('HTTP ' + r.status);\n            }\n            return j;\n          }).then(j=>{\n            if(!j.ok){\n              table.innerHTML='<tbody><tr><td style=\"padding:12px\">'+(j.msg||'\u53d6\u5f97\u5931\u6557 \u30d6\u30e9\u30a6\u30b6\u3092\u66f4\u65b0\u3057\u3066\u4e0b\u3055\u3044')+'<\/td><\/tr><\/tbody>';\n              loading.style.display='none'; resolve(); return;\n            }\n\n            \/\/ \u53d7\u4ed8\u671f\u9593\u5916\u306e\u5217\u3092\u6f70\u3059\uff08\u30b0\u30ea\u30c3\u30c9\u5074\u3067\u3082\u30de\u30b9\u30af + \u7406\u7531\u3092\u4ed8\u4e0e\uff09\n            mxOverlayMenuWindow(j, META_ALL[svc]);\n\n            if(j.days?.length){\n              const a=j.days[0].ymd, b=j.days[j.days.length-1].ymd;\n              rangeTx.textContent = a+' \u301c '+b;\n            }\n\n            const thead=document.createElement('thead'), tbody=document.createElement('tbody');\n            const cap=parseInt(j.cap||1,10);\n\n            \/\/ \u6708\u30d8\u30c3\u30c0\n            const r1=document.createElement('tr'); r1.className='mx-head-month';\n            const th0=document.createElement('th'); th0.className='time cal-month'; th0.rowSpan=2; th0.textContent='\u65e5\u6642'; r1.appendChild(th0);\n            let cur=null,span=0; const push=()=>{ if(span>0&&cur!==null){ const th=document.createElement('th'); th.className='cal-month'; th.colSpan=span; th.textContent=(+cur)+'\u6708'; r1.appendChild(th);} };\n            j.days.forEach(d=>{ const m=d.ymd.slice(5,7); if(cur===null){cur=m;span=1}else if(m===cur){span++}else{push();cur=m;span=1} }); push();\n            thead.appendChild(r1);\n\n            \/\/ \u65e5\u30d8\u30c3\u30c0\uff08\u7406\u7531\u5225\u30c4\u30fc\u30eb\u30c1\u30c3\u30d7\uff09\n            const r2=document.createElement('tr'); r2.className='mx-head-day';\n            j.days.forEach((d,idx)=>{\n              const th=document.createElement('th'); th.className='cal-day';\n              const ymd=d.ymd; const wd=new Date(ymd+'T00:00:00').getDay();\n              const labelDay = String(parseInt(ymd.slice(8),10));\n              const wch = '\u65e5\u6708\u706b\u6c34\u6728\u91d1\u571f'.charAt(wd);\n              th.innerHTML = labelDay + '<br>(' + wch + ')';\n              if (wd === 6) th.classList.add('col-sat');\n              if (isHol(d)) th.classList.add('col-hol'); else if (wd === 0) th.classList.add('col-sun');\n\n              let tip = d.holiday_name ? d.holiday_name : '';\n              if (j._closedMask && j._closedMask[idx]) {\n                const why = (j._closedWhy && j._closedWhy[idx]) || 'after';\n                th.classList.add('why-' + why);\n                const w   = j._win || {};\n                const t2  = (why==='before')\n                  ? (w.start ? `\u53d7\u4ed8\u958b\u59cb\u524d\uff08${w.start}\u301c\uff09` : '\u53d7\u4ed8\u958b\u59cb\u524d')\n                  : (w.end   ? `\u53d7\u4ed8\u7d42\u4e86\uff08\u301c${w.end}\uff09`     : '\u53d7\u4ed8\u7d42\u4e86');\n                tip = tip ? (tip+' \/ '+t2) : t2;\n                th.style.opacity = .45;\n              }\n              if (tip) th.title = tip;\n              r2.appendChild(th);\n            });\n            thead.appendChild(r2);\n\n            \/\/ \u672c\u4f53\n            const visibleRowIndexes = [];\n            if (Array.isArray(j.times) && Array.isArray(j.gridRemain)) {\n              if (SHOW_WEEK_MATRIX_BREAK_ROWS) {\n                let firstAvailableRow = -1;\n                let lastAvailableRow = -1;\n                for (let i = 0; i < j.times.length; i++) {\n                  const rowRemain = Array.isArray(j.gridRemain[i]) ? j.gridRemain[i] : [];\n                  const hasAvailable = rowRemain.some(v => Number(v || 0) > 0);\n                  if (hasAvailable) {\n                    if (firstAvailableRow < 0) firstAvailableRow = i;\n                    lastAvailableRow = i;\n                  }\n                }\n                if (firstAvailableRow >= 0 && lastAvailableRow >= firstAvailableRow) {\n                  for (let i = firstAvailableRow; i <= lastAvailableRow; i++) visibleRowIndexes.push(i);\n                }\n              } else {\n                for (let i = 0; i < j.times.length; i++) {\n                  const rowRemain = Array.isArray(j.gridRemain[i]) ? j.gridRemain[i] : [];\n                  if (rowRemain.some(v => Number(v || 0) > 0)) visibleRowIndexes.push(i);\n                }\n              }\n            }\n            if (!visibleRowIndexes.length) {\n              for (let i = 0; i < (Array.isArray(j.times) ? j.times.length : 0); i++) visibleRowIndexes.push(i);\n            }\n\n            for (const ri of visibleRowIndexes) {\n              const t=j.times[ri], rem=j.gridRemain[ri]||[];\n              const tr=document.createElement('tr');\n              const tht=document.createElement('th'); tht.className='time'; tht.textContent=t; tr.appendChild(tht);\n\n              for(let c=0;c<j.days.length;c++){\n                const day=j.days[c], ymd=day.ymd, wd=new Date(ymd+'T00:00:00').getDay();\n                const remain=rem[c];\n                const td=document.createElement('td'); td.className='cell';\n                if (wd === 6) td.classList.add('col-sat');\n                if (isHol(day)) td.classList.add('col-hol'); else if (wd === 0) td.classList.add('col-sun');\n\n                \/\/ ??????????????????????????????\n                if (j._closedMask && j._closedMask[c]) {\n                  const why = (j._closedWhy && j._closedWhy[c]) || 'after';\n                  td.className = 'cell na full why-' + why;\n                  td.textContent = \"-\";\n                  td.title = (why==='before') ? '\u53d7\u4ed8\u958b\u59cb\u524d' : '\u53d7\u4ed8\u7d42\u4e86\u5f8c';\n                  td.setAttribute('aria-disabled','true');\n                  tr.appendChild(td);\n                  continue;\n                }\n\n\n                let sym='-', cls='na';\n                if(cap===1){ if(remain>0){ sym='\u3007'; cls='ok'; } }\n                else{ if(remain>1){ sym='\u3007'; cls='ok'; } else if(remain===1){ sym='\u3007'; cls='one'; } }\n                td.classList.add(cls);\n                if(cls==='na'&&remain<=0) td.classList.add('full');\n                td.textContent=sym;\n\n                const title=(remain<=0)?'\u6e80\u67a0':(remain===1?'\u6b8b\u308a1\u67a0':`\u6b8b\u308a${remain}\u67a0`);\n                td.title=title; td.setAttribute('aria-label',title);\n                if(remain<=0) td.setAttribute('aria-disabled','true');\n\n                if(remain>0){\n                  const go=async ()=>{\n                    $$('.picked',table).forEach(e=>e.classList.remove('picked'));\n                    td.classList.add('picked'); td.setAttribute('aria-selected','true');\n                    setCurrentStep(2, '\u65e5\u6642');\n                    const q=new URLSearchParams({svc: service.value, date: ymd, time: t});\n                    const stf = (mStaff && mStaff.value) ? mStaff.value : '';\n\n                    \/\/ ?????????????????????????????????????\n                    const checked = getCheckedOptionBoxes();\n                    const optLabel = checked\n                      .map(cb => cb.dataset.label || '')\n                      .filter(Boolean)\n                      .join('\/');\n\n                    if(stf) q.set('staff', stf);\n                    if(optLabel) q.set('opt', optLabel);\n                    if (RESCHEDULE_CONTEXT.rescheduleId) q.set('reschedule_id', RESCHEDULE_CONTEXT.rescheduleId);\n                    if (RESCHEDULE_CONTEXT.historyToken) q.set('history_token', RESCHEDULE_CONTEXT.historyToken);\n\n                    let lineStateKey = '';\n                    let lineUserId = '';\n                    try {\n                      if (SHOULD_USE_LIFF) {\n                        lineStateKey = String(await lineIdentityBookingReady || '').trim();\n                      }\n                    } catch (_) {}\n                    if (lineStateKey) q.set('line_state_key', lineStateKey);\n                    const target=formUrl+(formUrl.includes('?')?'&':'?')+q.toString()+'#hed';\n                    setTimeout(()=>location.href=target, 300);\n                  };\n\n                  td.addEventListener('click',go);\n                  td.tabIndex=0; td.addEventListener('keydown',ev=>{ if(ev.key==='Enter'||ev.key===' '){ev.preventDefault();go();} });\n                }\n                tr.appendChild(td);\n              }\n              tbody.appendChild(tr);\n            }\n\n            table.innerHTML=''; table.appendChild(thead); table.appendChild(tbody);\n            requestAnimationFrame(()=>{\n              const r1 = table.querySelector('thead tr.mx-head-month');\n              const r2 = table.querySelector('thead tr.mx-head-day');\n              if(r1) table.style.setProperty('--mx-month-h', r1.getBoundingClientRect().height + 'px');\n              if(r2) table.style.setProperty('--mx-day-h',   r2.getBoundingClientRect().height + 'px');\n              syncStickyOffsets();\n            });\n\n            loading.style.display='none';\n            updateWeekFooterSummary();\n            resolve();\n          })\n          .catch((err)=>{\n            const message = err && err.message ? err.message : '\u901a\u4fe1\u30a8\u30e9\u30fc';\n            table.innerHTML='<tbody><tr><td style=\"padding:12px\">'+escapeHtml(message)+'<\/td><\/tr><\/tbody>';\n            loading.style.display='none'; updateWeekFooterSummary(); resolve();\n          });\n        });\n      }\n\n      \/\/ \u300c\u65e5\u7a0b\u306e\u8abf\u6574\u3092\u3059\u308b\u300d\u2192 \u9031\u8868\u30ed\u30fc\u30c9\uff08\u30b9\u30d4\u30ca\u30fc\uff09\n      mGoto && mGoto.addEventListener('click', async ()=>{\n        if(!currentItem || mGoto.disabled) return;\n                mSpin.style.display='flex'; mGoto.disabled = true;\n        service.value = currentItem.name||'';\n        updateWeekFooterSummary();\n\n        try{\n          await loadMatrix(buildWeekPref());\n          await ensureOpenThenScroll();\n          setCurrentStep(2, '\u65e5\u6642');\n        } finally {\n          mSpin.style.display='none'; mGoto.disabled = false; closeDetail();\n        }\n      \n});\n\n      \/\/ \u30d5\u30c3\u30bf\u30fc\u4e0b\u30dc\u30bf\u30f3\u304b\u3089\u9031\u30de\u30c8\u30ea\u30af\u30b9\u3092\u958b\u304f\n      wfOpenBtn && wfOpenBtn.addEventListener('click', async ()=>{\n        await reopenWeekStep();\n      });\n\n      \/\/ \u521d\u56de\u30ab\u30fc\u30c9\u63cf\u753b\n      renderCards();\n      updateWeekFooterSummary();\n      mxAutoOpenFromURL();\n\n\n\/\/ ==== \u9031\u30ca\u30d3 & \u518d\u8aad\u8fbc \u8ffd\u8a18\uff08\u3053\u306e\u30d6\u30ed\u30c3\u30af\u3092 renderCards(); \u306e\u5f8c\u306b\u8cbc\u308b\uff09 ====\n(function(){\n  \/\/ \u7bc4\u56f2\u30af\u30e9\u30f3\u30d7\n  function clampYmd(ymd){\n    const min = (typeof MIN_DATE==='string' && MIN_DATE) ? MIN_DATE : ymd;\n    const max = (typeof MAX_DATE==='string' && MAX_DATE) ? MAX_DATE : ymd;\n    if (ymd < min) return min;\n    if (ymd > max) return max;\n    return ymd;\n  }\n\n  \/\/ ymd\u8a2d\u5b9a\uff0bURL\u53cd\u6620\uff0b\u9031\u8868\u30ea\u30ed\u30fc\u30c9\n  function setStartYmd(ymd, mode){\n    const v = clampYmd(mxNormalizeYmd(ymd));\n    if (!v) return;\n    start.value = v;\n    syncWeekNavButtons();\n    if (!service.value) {\n      const u = new URL(location.href);\n      u.searchParams.set('ymd', v);\n      const activeCat = getActiveCat();\n      if (activeCat) u.searchParams.set('mx_cat', activeCat);\n      u.searchParams.delete('cat');\n      window.location.href = u.toString();\n      return;\n    }\n    mxUpdateURL({ ymd: v }, mode || 'push');\n    refreshWeek();\n  }\n\n  \/\/ \u30aa\u30d7\u30b7\u30e7\u30f3\u52a0\u7b97\u5206\uff08\u5206\uff09\u203b\u30c1\u30a7\u30c3\u30af\u30dc\u30c3\u30af\u30b9\u7248\n  function getOptExtraMinutes(){\n    const boxes = getCheckedOptionBoxes();\n    let extMin = 0;\n    boxes.forEach(box => {\n      extMin += parseInt(box.dataset.extra || '0', 10);\n    });\n    return extMin;\n  }\n\n  \/\/ \u9031\u8868\u30ea\u30ed\u30fc\u30c9\uff08\u30b5\u30fc\u30d3\u30b9\u304c\u9078\u3070\u308c\u3066\u3044\u308c\u3070\u63cf\u753b\uff09\n  async function refreshWeek(){\n    if (!service.value) return; \/\/ \u30e1\u30cb\u30e5\u30fc\u672a\u9078\u629e\u306a\u3089\u4f55\u3082\u3057\u306a\u3044\n    const pref = {\n      staff   : (mStaff && mStaff.value) ? mStaff.value : '',\n      optKey  : (mOpt && mOpt.value) ? mOpt.value : '',\n      optLabel: (mOpt && mOpt.selectedOptions[0]) ? (mOpt.selectedOptions[0].textContent||'').trim() : '',\n      optExtra: getOptExtraMinutes()\n    };\n    await loadMatrix(pref);\n    await ensureOpenThenScroll();\n  }\n\n  \/\/ \u30ca\u30d3\u30dc\u30bf\u30f3\u7d10\u3065\u3051\n  const btnPrev  = $('#mx-prev',root);\n  const btnToday = $('#mx-today',root);\n  const btnNext  = $('#mx-next',root);\n\n  syncWeekNavButtons();\n\n  btnPrev && btnPrev.addEventListener('click', ()=> {\n    const y = start.value || MIN_DATE;\n    if (y) setStartYmd(addDays(y, -7), 'push');\n  });\n  btnToday && btnToday.addEventListener('click', ()=> {\n    if (MIN_DATE) setStartYmd(MIN_DATE, 'push');\n  });\n  btnNext && btnNext.addEventListener('click', ()=> {\n    const y = start.value || MIN_DATE;\n    if (y) setStartYmd(addDays(y, +7), 'push');\n  });\n\n  \/\/ \u65e5\u4ed8\u5165\u529b\u306e\u76f4\u63a5\u5909\u66f4\n  start && start.addEventListener('change', ()=>{\n    if (start.value) setStartYmd(start.value, 'push');\n  });\n\n  \/\/ \u623b\u308b\/\u9032\u3080\uff08\u5c65\u6b74\uff09\u5bfe\u5fdc\uff1aURL\u304b\u3089\u518d\u53cd\u6620\n  window.addEventListener('popstate', ()=>{\n    const u=new URL(location.href), p=u.searchParams;\n    const cat=p.get('mx_cat')||p.get('cat')||'', svc=p.get('svc')||'', ymd=p.get('ymd')||p.get('date')||'';\n    if (cat && cat!== (ALLOWED_CATS.includes(cat)?cat:getActiveCat())){ setActiveCat(cat); renderCards(); }\n    if (ymd){ const v=clampYmd(mxNormalizeYmd(ymd)); if(v) start.value=v; }\n    syncWeekNavButtons();\n    refreshWeek();\n  });\n})();\n\n\/* ------------- URL\u3067\u6307\u5b9a\u3055\u308c\u305f\u30e1\u30cb\u30e5\u30fc\u3092\u81ea\u52d5\u3067\u958b\u304f ------------- *\/\nfunction mxAutoOpenFromURL(){\n  const u = new URL(location.href);\n  const svc = u.searchParams.get('svc') || '';\n  const catParam = u.searchParams.get('mx_cat') || u.searchParams.get('cat') || '';\n  const stepParam = u.searchParams.get('mx_step') || '';\n  if (!svc) return;\n\n  \/\/ \u6307\u5b9a\u30ab\u30c6\u30b4\u30ea\u512a\u5148\u3067\u8a72\u5f53\u30e1\u30cb\u30e5\u30fc\u3092\u63a2\u3059\n  const findInCat = c => (META_BY_CAT[c] || []).find(x => (x.name || '') === svc);\n  let target = null, targetCat = null;\n\n  if (catParam && ALLOWED_CATS.includes(catParam)) {\n    target = findInCat(catParam);\n    if (target) targetCat = catParam;\n  }\n  if (!target) {\n    for (const c of ALLOWED_CATS) {\n      const hit = findInCat(c);\n      if (hit) { target = hit; targetCat = c; break; }\n    }\n  }\n  if (!target) return;\n\n  \/\/ \u30ab\u30c6\u30b4\u30ea\u304c\u9055\u3046\u5834\u5408\u306f\u5207\u308a\u66ff\u3048\u3066\u30ab\u30fc\u30c9\u518d\u63cf\u753b\n  if (targetCat && currentCat !== targetCat) {\n    setActiveCat(targetCat);\n    renderCards();\n  }\n\n  \/\/ \u30ab\u30fc\u30c9\u63cf\u753b\u5f8c\u306b\u30e2\u30fc\u30c0\u30eb\u3092\u958b\u304f\n  requestAnimationFrame(() => {\n    openDetail(target);\n    setPickedCard(svc);\n    if (stepParam === '2') {\n      setTimeout(()=>{ reopenWeekStep(); }, 80);\n    }\n  });\n}\n\n    })();\n    <\/script>\n  <\/div>\n  \n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-3","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/salon.angin.cloud\/west-shinjuku-clinic\/wp-json\/wp\/v2\/pages\/3","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/salon.angin.cloud\/west-shinjuku-clinic\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/salon.angin.cloud\/west-shinjuku-clinic\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/salon.angin.cloud\/west-shinjuku-clinic\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/salon.angin.cloud\/west-shinjuku-clinic\/wp-json\/wp\/v2\/comments?post=3"}],"version-history":[{"count":1,"href":"https:\/\/salon.angin.cloud\/west-shinjuku-clinic\/wp-json\/wp\/v2\/pages\/3\/revisions"}],"predecessor-version":[{"id":13,"href":"https:\/\/salon.angin.cloud\/west-shinjuku-clinic\/wp-json\/wp\/v2\/pages\/3\/revisions\/13"}],"wp:attachment":[{"href":"https:\/\/salon.angin.cloud\/west-shinjuku-clinic\/wp-json\/wp\/v2\/media?parent=3"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}