{
  "version": 3,
  "sources": ["/cdn/shop/t/11/assets/cfg3d.js?cfgv=1780474191"],
  "sourcesContent": ["// ======================================================\r\n// cfg3d.js (Shopify theme asset) - FULL\r\n// ------------------------------------------------------\r\n// \u2714 Steps: case / pcba / switch / keycap / option / summary\r\n// \u2714 Size toggle: 60% / 80% tag filtering (supports 60% and 60\uFF05)\r\n// \u2714 Option step: only products tagged \"\u30AA\u30D7\u30B7\u30E7\u30F3\"\r\n// \u2714 Per-step single selection (None supported)\r\n// \u2714 Total = sum of selected step prices (Shopify cents)\r\n// \u2714 Money format: JPY-safe\r\n// \u2714 three.js GLB loader (optional)\r\n// \u2714 Guide button + modal: step-specific label + content\r\n// \u2714 Guide hidden on option + summary\r\n// \u2714 Search filter UI per step (AND with size)\r\n// \u2714 Summary renders breakdown + subtotal\r\n// \u2714 Add selected variants to cart (skip None) via /cart/add.js\r\n// ======================================================\r\n\r\nconst THREE_CDN = 'https://cdn.jsdelivr.net/npm/three@0.160.0/build/three.module.js';\r\nconst ORBIT_CDN = 'https://cdn.jsdelivr.net/npm/three@0.160.0/examples/jsm/controls/OrbitControls.js';\r\nconst GLTF_CDN  = 'https://cdn.jsdelivr.net/npm/three@0.160.0/examples/jsm/loaders/GLTFLoader.js';\r\nconst DRACO_CDN = 'https://cdn.jsdelivr.net/npm/three@0.160.0/examples/jsm/loaders/DRACOLoader.js';\r\nconst RGBE_CDN = 'https://cdn.jsdelivr.net/npm/three@0.160.0/examples/jsm/loaders/RGBELoader.js';\r\n\r\n(async () => {\r\n  const root = document.querySelector('[data-cfg3d]');\r\n  if (!root) return;\r\n\r\n  // --------------------------------------------------\r\n  // Elements\r\n  // --------------------------------------------------\r\n  const stepBtns = [...root.querySelectorAll('.cfg3d__step[data-step]')];\r\n  const panels   = [...root.querySelectorAll('[data-panel]')];\r\n\r\n  const rightTitleEl = root.querySelector('.cfg3d__title');\r\n\r\n  const nextBtn = root.querySelector('[data-next]');\r\n  const prevBtn = root.querySelector('[data-prev]');\r\n  const totalEl = root.querySelector('[data-total]');\r\n  const hiddenInputs = [...root.querySelectorAll('[data-selected-variant]')];\r\n  const shareBtn = root.querySelector('[data-share-build]');\r\n  const copyBtn = root.querySelector('[data-copy-build-url]');\r\n\r\n  // Viewer\r\n  const canvasHost  = root.querySelector('[data-canvas-host]');\r\n  const placeholder = root.querySelector('[data-placeholder]');\r\n  const loadingEl   = root.querySelector('[data-loading]');\r\n  const viewerTitleEl = root.querySelector('[data-viewer-title]');\r\n  const viewerSubEl   = root.querySelector('[data-viewer-sub]');\r\n\r\n  // Guide\r\n  const guideBtn = root.querySelector('[data-open-guide], [data-guide-open]');\r\n  const guideModal = root.querySelector('[data-guide-modal]');\r\n  const guideCloseEls = [...root.querySelectorAll('[data-guide-close]')];\r\n  const modalTitleEl = guideModal?.querySelector('.cfg3d-modal__title') || null;\r\n  const modalBodyEl  = guideModal?.querySelector('.cfg3d-modal__body') || null;\r\n\r\n  // Filter UI\r\n  const filterRoot = root.querySelector('[data-filter]');\r\nconst filterToggleBtns = [...root.querySelectorAll('[data-filter-toggle]')];\r\nconst filterPanelEl = root.querySelector('[data-filter-panel]');\r\n  const filterColorEl = root.querySelector('[data-filter-color]');\r\n  const filterVendorEl = root.querySelector('[data-filter-vendor]');\r\n  const filterMaterialEl = root.querySelector('[data-filter-material]');\r\n  const filterMinEl = root.querySelector('[data-filter-min]');\r\n  const filterMaxEl = root.querySelector('[data-filter-max]');\r\n\r\n  // Summary\r\n  const summaryListEl = root.querySelector('[data-summary-list]');\r\n  const summarySubtotalEl = root.querySelector('[data-summary-subtotal]');\r\n\r\n  // --------------------------------------------------\r\n  // Constants / State\r\n  // --------------------------------------------------\r\n  const NAV_STEPS   = ['case', 'pcba', 'switch', 'keycap', 'option', 'summary'];\r\n  const PRICE_STEPS = ['case', 'pcba', 'switch', 'keycap', 'option'];\r\n\r\n  const ASSEMBLY_FEE_CENTS = 500000; // \u00A55,000\r\n  const CUSTOM_KEYBOARD_VARIANT_ID = 54520547606601; // \u2190 \u5B9FID\u306B\u5909\u66F4\r\n\r\n  const STEP_UI = {\r\n    case:    { title: '\u30AD\u30FC\u30DC\u30FC\u30C9\u30B1\u30FC\u30B9', guideLabel: '\u30B1\u30FC\u30B9\u306E\u9078\u3073\u65B9',       modalTitle: '\u30B1\u30FC\u30B9\u306E\u9078\u3073\u65B9' },\r\n    pcba:    { title: 'PCBA',           guideLabel: 'PCBA\u306E\u9078\u3073\u65B9',         modalTitle: 'PCBA\u306E\u9078\u3073\u65B9' },\r\n    switch:  { title: '\u30AD\u30FC\u30B9\u30A4\u30C3\u30C1',     guideLabel: '\u30B9\u30A4\u30C3\u30C1\u306E\u9078\u3073\u65B9',     modalTitle: '\u30B9\u30A4\u30C3\u30C1\u306E\u9078\u3073\u65B9' },\r\n    keycap:  { title: '\u30AD\u30FC\u30AD\u30E3\u30C3\u30D7',     guideLabel: '\u30AD\u30FC\u30AD\u30E3\u30C3\u30D7\u306E\u9078\u3073\u65B9', modalTitle: '\u30AD\u30FC\u30AD\u30E3\u30C3\u30D7\u306E\u9078\u3073\u65B9' },\r\n    option:  { title: '\u30AA\u30D7\u30B7\u30E7\u30F3',       guideLabel: '',                   modalTitle: '' },\r\n    summary: { title: '\u5408\u8A08',            guideLabel: '',                   modalTitle: '' },\r\n  };\r\n\r\n  // \u30E2\u30FC\u30C0\u30EB\u672C\u6587\u5DEE\u3057\u66FF\u3048\uFF08\u5FC5\u8981\u306A\u3089\uFF09\r\n  const GUIDE_HTML = {\r\n    case: null,\r\n    pcba: null,\r\n    switch: null,\r\n    keycap: null,\r\n    option: null,\r\n    summary: null,\r\n  };\r\n\r\n  // Tabs in modal (Corsair-like)\r\n  document.addEventListener('click', (e) => {\r\n    const tab = e.target.closest('[data-tab]');\r\n    if (!tab) return;\r\n    const wrap = tab.closest('[data-cfg3d-tabs]');\r\n    if (!wrap) return;\r\n\r\n    wrap.querySelectorAll('[data-tab]').forEach((b) => {\r\n      b.classList.remove('is-active');\r\n      b.setAttribute('aria-selected', 'false');\r\n    });\r\n    tab.classList.add('is-active');\r\n    tab.setAttribute('aria-selected', 'true');\r\n\r\n    wrap.querySelectorAll('.cfg3d-panel').forEach((p) => p.classList.remove('is-active'));\r\n    const panel = wrap.querySelector(`#${CSS.escape(tab.dataset.target)}`);\r\n    if (panel) panel.classList.add('is-active');\r\n  });\r\n\r\n  const state = {\r\n    currentStep: 'case',\r\n    size: '60', // '60' | '80'\r\n    selections: { case: null, pcba: null, switch: null, keycap: null, option: null },\r\n    filters: {\r\n      case:   { color:'', vendor:'', material:'', minYen:'', maxYen:'' },\r\n      pcba:   { color:'', vendor:'', material:'', minYen:'', maxYen:'' },\r\n      switch: { color:'', vendor:'', material:'', minYen:'', maxYen:'' },\r\n      keycap: { color:'', vendor:'', material:'', minYen:'', maxYen:'' },\r\n      option: { color:'', vendor:'', material:'', minYen:'', maxYen:'' },\r\n    },\r\n    cachedCaseModalHtml: null,\r\n  };\r\n\r\n  // --------------------------------------------------\r\n  // Money (JPY-safe)\r\n  // --------------------------------------------------\r\n  function formatMoneyJPYFromCents(cents) {\r\n    const yen = Math.round((Number(cents) || 0) / 100);\r\n    return `\u00A5${yen.toLocaleString('ja-JP')}`;\r\n  }\r\n\r\n  function calcSubtotalCents() {\r\n    return PRICE_STEPS.reduce((acc, step) => {\r\n      const s = state.selections[step];\r\n      return acc + (s ? (Number(s.priceCents) || 0) : 0);\r\n    }, ASSEMBLY_FEE_CENTS);\r\n  }\r\n\r\n  function updateTotal() {\r\n    const sumCents = calcSubtotalCents();\r\n    if (totalEl) totalEl.textContent = `+${formatMoneyJPYFromCents(sumCents)}`;\r\n  }\r\n\r\n  // --------------------------------------------------\r\n  // Helpers\r\n  // --------------------------------------------------\r\n    function hasBuildParamsInUrl() {\r\n  const params = new URLSearchParams(window.location.search);\r\n  return ['c', 'p', 's', 'k', 'o'].some(key => params.has(key));\r\n}\r\n\r\n  function restoreSelectionsFromUrl() {\r\n  const params = new URLSearchParams(window.location.search);\r\n\r\n  const keyMap = {\r\n    case: 'c',\r\n    pcba: 'p',\r\n    switch: 's',\r\n    keycap: 'k',\r\n    option: 'o'\r\n  };\r\n\r\n  PRICE_STEPS.forEach(step => {\r\n    const id = params.get(keyMap[step]);\r\n    if (!id) return;\r\n\r\n    const btn = optionButtons(step).find(b => b.dataset.variantId === id);\r\n    if (btn) {\r\n      selectOption(step, btn);\r\n    }\r\n  });\r\n}\r\n\r\n  function stepPanelEl(step) {\r\n    return root.querySelector(`[data-panel=\"${step}\"]`);\r\n  }\r\n\r\n  function optionButtons(step) {\r\n    return [...root.querySelectorAll(`[data-option][data-step=\"${step}\"]`)];\r\n  }\r\n\r\n  function hiddenInput(step) {\r\n    return hiddenInputs.find(i => i.dataset.selectedVariant === step) || null;\r\n  }\r\n\r\n  function isNone(btn) {\r\n    return btn.dataset.none === 'true';\r\n  }\r\n\r\n  function priceCents(btn) {\r\n    const n = Number(btn.dataset.price || 0);\r\n    return Number.isFinite(n) ? n : 0;\r\n  }\r\n\r\nfunction escapeHtml(str) {\r\n  return String(str)\r\n    .replace(/&/g, '&amp;')\r\n    .replace(/</g, '&lt;')\r\n    .replace(/>/g, '&gt;')\r\n    .replace(/\"/g, '&quot;')\r\n    .replace(/'/g, '&#39;');\r\n}\r\n\r\n// ============================\r\n// \uD83D\uDD3D \u5DE6\u30DF\u30CB\u30B5\u30DE\u30EA\u30FC\u7528\r\n// ============================\r\n\r\nfunction getMiniSummaryStepLabel(step) {\r\n  const map = {\r\n    case: '\u30AD\u30FC\u30DC\u30FC\u30C9\u30B1\u30FC\u30B9',\r\n    pcba: 'PCBA',\r\n    switch: '\u30AD\u30FC\u30B9\u30A4\u30C3\u30C1',\r\n    keycap: '\u30AD\u30FC\u30AD\u30E3\u30C3\u30D7',\r\n    option: '\u30AA\u30D7\u30B7\u30E7\u30F3'\r\n  };\r\n  return map[step] || step;\r\n}\r\n\r\nfunction getSelectedProductAndVariant(step) {\r\n  const s = state.selections?.[step];\r\n  if (!s || !s.variantId) return null;\r\n\r\n  const productTitle = String(s.productTitle || '').trim();\r\n  const variantTitle = String(s.title || '').trim();\r\n\r\n  if (!productTitle) return null;\r\n  if (!variantTitle || variantTitle.toLowerCase() === 'none') return null;\r\n\r\n  return {\r\n    step,\r\n    stepLabel: getMiniSummaryStepLabel(step),\r\n    productTitle,\r\n    variantTitle\r\n  };\r\n}\r\nconst buildMini = root.querySelector('[data-build-mini]');\r\n\r\nbuildMini?.addEventListener('click', (e) => {\r\n  e.stopPropagation();\r\n  buildMini.classList.toggle('is-open');\r\n});\r\n// ============================\r\n// Build summary outside tap close\r\n// ============================\r\n\r\ndocument.addEventListener('click', (e) => {\r\n  const buildMini = document.querySelector('[data-build-mini]');\r\n  if (!buildMini) return;\r\n\r\n  const clickedInside = buildMini.contains(e.target);\r\n\r\n  // \u5916\u30BF\u30C3\u30D7\u306A\u3089\u9589\u3058\u308B\r\n  if (!clickedInside) {\r\n    buildMini.classList.remove('is-open');\r\n  }\r\n});\r\nfunction renderBuildMiniSummary() {\r\n  const wrap = root.querySelector('[data-build-mini]');\r\n  const body = root.querySelector('[data-build-mini-body]');\r\n  if (!wrap || !body) return;\r\n\r\n  const steps = ['case', 'pcba', 'switch', 'keycap', 'option'];\r\n  const items = steps\r\n    .map(getSelectedProductAndVariant)\r\n    .filter(Boolean);\r\n\r\n  if (!items.length) {\r\n    wrap.hidden = true;\r\n    body.innerHTML = '';\r\n    return;\r\n  }\r\n\r\n  body.innerHTML = items.map(item => {\r\n    const showVariant =\r\n      item.variantTitle &&\r\n      item.variantTitle !== 'Default Title' &&\r\n      item.variantTitle !== item.productTitle;\r\n\r\n    return `\r\n      <div class=\"cfg3d__buildMiniItem\">\r\n        <div class=\"cfg3d__buildMiniLabel\">${escapeHtml(item.stepLabel)}</div>\r\n        <div class=\"cfg3d__buildMiniProduct\">${escapeHtml(item.productTitle)}</div>\r\n        ${showVariant ? `<div class=\"cfg3d__buildMiniVariant\">${escapeHtml(item.variantTitle)}</div>` : ''}\r\n      </div>\r\n    `;\r\n  }).join('');\r\n\r\n  wrap.hidden = false;\r\n}\r\n    function getSelectionLabel(step) {\r\n    const s = state.selections[step];\r\n    if (!s) return '\u306A\u3057';\r\n\r\n    const raw = s.title || '\u306A\u3057';\r\n    if (raw === 'Default Title') return '\u9078\u629E\u6E08\u307F';\r\n    if (raw === 'None') return '\u306A\u3057';\r\n    return raw;\r\n  }\r\n\r\n  function getSelectionDisplay(step) {\r\n  const s = state.selections[step];\r\n  if (!s) return '\u306A\u3057';\r\n\r\n  if (!s.variantId) return '\u306A\u3057';\r\n\r\n  const productTitle = (s.productTitle || '').trim();\r\n  const variantTitle = (s.title || '').trim();\r\n\r\n  if (!variantTitle || variantTitle === 'None') return '\u306A\u3057';\r\n  if (variantTitle === 'Default Title') {\r\n    return productTitle || '\u9078\u629E\u6E08\u307F';\r\n  }\r\n\r\n  if (productTitle && productTitle !== variantTitle) {\r\n    return `${productTitle} - ${variantTitle}`;\r\n  }\r\n\r\n  return variantTitle || productTitle || '\u9078\u629E\u6E08\u307F';\r\n}\r\n\r\nfunction getProductName(step) {\r\n  const s = state.selections[step];\r\n  if (!s) return 'None';\r\n\r\n  return s.productTitle || s.title || 'None';\r\n}\r\n\r\nfunction buildShareText() {\r\n  const lines = [\r\n    'HYPE CUSTOM BUILD PREVIEW',\r\n    '',\r\n    `Case\uFF1A${getProductName('case')}`,\r\n    `PCBA\uFF1A${getProductName('pcba')}`,\r\n    `Switch\uFF1A${getProductName('switch')}`,\r\n    `Keycap\uFF1A${getProductName('keycap')}`,\r\n    '',\r\n    '#HYPESHOP'\r\n  ];\r\n\r\n  return lines.join('\\n');\r\n}\r\n\r\n  function buildShareUrl() {\r\n  const url = new URL(window.location.href);\r\n\r\n  url.search = '';\r\n\r\n  const keyMap = {\r\n    case: 'c',\r\n    pcba: 'p',\r\n    switch: 's',\r\n    keycap: 'k',\r\n    option: 'o'\r\n  };\r\n\r\n  ['case', 'pcba', 'switch', 'keycap', 'option'].forEach(step => {\r\n    const s = state.selections[step];\r\n    if (s?.variantId) {\r\n      url.searchParams.set(keyMap[step], s.variantId);\r\n    }\r\n  });\r\n\r\n  return url.toString();\r\n}\r\n\r\n  async function shareBuild() {\r\n    const text = buildShareText();\r\n    const url = buildShareUrl();\r\n\r\n    try {\r\n      const xIntentUrl =\r\n        `https://twitter.com/intent/tweet?text=${encodeURIComponent(text)}&url=${encodeURIComponent(url)}`;\r\n\r\n      window.open(xIntentUrl, '_blank', 'noopener,noreferrer');\r\n    } catch (e) {\r\n      console.warn('[CFG3D] share failed', e);\r\n      alert('\u30B7\u30A7\u30A2\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002');\r\n    }\r\n  }\r\n\r\n    async function copyBuildUrl() {\r\n    const url = buildShareUrl();\r\n\r\n    try {\r\n      await navigator.clipboard.writeText(url);\r\n\r\n      if (copyBtn) {\r\n        const originalText = copyBtn.textContent;\r\n        copyBtn.textContent = '\u30B3\u30D4\u30FC\u3057\u307E\u3057\u305F\uFF01';\r\n\r\n        setTimeout(() => {\r\n          copyBtn.textContent = originalText;\r\n        }, 1600);\r\n      }\r\n    } catch (e) {\r\n      console.warn('[CFG3D] copy url failed', e);\r\n      alert('URL\u306E\u30B3\u30D4\u30FC\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002');\r\n    }\r\n  }\r\n\r\n  // tag normalize: \"60\uFF05\" => \"60%\"\r\n  function norm(s) {\r\n    return String(s || '')\r\n      .replace(/\\uFF05/g, '%')   // \u5168\u89D2\uFF05\r\n      .replace(/\\s+/g, ' ')     // \u9023\u7D9A\u7A7A\u767D\r\n      .trim()\r\n      .toLowerCase();\r\n  }\r\n\r\n  function tagsOf(btn) {\r\n    return norm(btn.dataset.tags || '');\r\n  }\r\n\r\n  function sizeTagToken() {\r\n    return state.size === '80' ? '80%' : '60%';\r\n  }\r\n\r\n  function hasTagToken(btn, token) {\r\n  if (!token) return true;\r\n  const t = norm(token);\r\n  return tagsOf(btn).includes(t);\r\n}\r\n\r\n/* GLB\u767B\u9332\u6E08\u307F\u304B */\r\nfunction hasModelGlb(btn) {\r\n  return String(btn.dataset.modelUrl || '').trim() !== '';\r\n}\r\n\r\n  function vendorMatch(btn, vendor) {\r\n  if (!vendor) return true;\r\n  return (btn.dataset.vendor || '').trim() === vendor;\r\n}\r\n\r\nfunction colorMatch(btn, color) {\r\n  if (!color) return true;\r\n\r\n  const selected = color.trim().toLowerCase();\r\n  const colors = String(btn.dataset.baseColor || '')\r\n    .split(',')\r\n    .map(v => v.trim().toLowerCase())\r\n    .filter(Boolean);\r\n\r\n  return colors.includes(selected);\r\n}\r\n\r\nfunction materialMatch(btn, material) {\r\n  if (!material) return true;\r\n  const m = (btn.dataset.material || '').trim();\r\n  return m.includes(material);\r\n}\r\n\r\n  function yenToCents(yenStr) {\r\n    const n = Number(String(yenStr || '').replace(/[^\\d.-]/g, ''));\r\n    if (!Number.isFinite(n) || n <= 0) return null;\r\n    return Math.round(n * 100);\r\n  }\r\n\r\n  function priceMatch(btn, minCents, maxCents) {\r\n    const p = Number(btn.dataset.price || 0);\r\n    if (!Number.isFinite(p)) return true;\r\n    if (minCents != null && p < minCents) return false;\r\n    if (maxCents != null && p > maxCents) return false;\r\n    return true;\r\n  }\r\n\r\n  function isOptionItem(btn) {\r\n    // option step\u3067\u306F\u300C\u30AA\u30D7\u30B7\u30E7\u30F3\u300D\u30BF\u30B0\u5FC5\u9808\uFF08Liquid\u3067\u7D5E\u3063\u3066\u3066\u3082\u4FDD\u967A\u3067\uFF09\r\n    return hasTagToken(btn, '\u30AA\u30D7\u30B7\u30E7\u30F3');\r\n  }\r\n  function hasExactTag(btn, tagName) {\r\n  const tags = String(btn.dataset.tags || '')\r\n    .split(',')\r\n    .map(v => v.trim())\r\n    .filter(Boolean);\r\n\r\n  return tags.includes(tagName);\r\n}\r\n\r\nfunction isSplitSpaceButton(btn) {\r\n  if (!btn) return false;\r\n\r\n  const variantTitle = String(btn.dataset.variantTitle || '').trim();\r\n  return variantTitle.includes('\u5206\u5272\u30B9\u30DA\u30FC\u30B9') || hasExactTag(btn, '\u5206\u5272\u30B9\u30DA\u30FC\u30B9');\r\n}\r\n\r\nfunction isNormalSpaceButton(btn) {\r\n  if (!btn) return false;\r\n\r\n  const variantTitle = String(btn.dataset.variantTitle || '').trim();\r\n  return variantTitle.includes('\u901A\u5E38\u30B9\u30DA\u30FC\u30B9') || hasExactTag(btn, '\u901A\u5E38\u30B9\u30DA\u30FC\u30B9');\r\n}\r\n\r\nfunction getPcbaLayoutMode() {\r\n  const btn = state.selections.pcba?.btn;\r\n  if (!btn || isNone(btn)) return 'none';\r\n  if (isSplitSpaceButton(btn)) return 'split';\r\n  if (isNormalSpaceButton(btn)) return 'normal';\r\n  return 'none';\r\n}\r\n\r\nfunction isSplitSpacePcbaSelected() {\r\n  return getPcbaLayoutMode() === 'split';\r\n}\r\n\r\nfunction isNormalSpacePcbaSelected() {\r\n  return getPcbaLayoutMode() === 'normal';\r\n}\r\n\r\nfunction getModelUrlForSelection(step, btn) {\r\n  if (!btn) return '';\r\n\r\n  const normalUrl = btn.dataset.modelUrl || '';\r\n  const divUrl = btn.dataset.divModelUrl || '';\r\n  const mode = getPcbaLayoutMode();\r\n\r\n  // PCBA\u81EA\u8EAB\r\n  if (step === 'pcba') {\r\n    if (mode === 'split') {\r\n      return divUrl || normalUrl;\r\n    }\r\n    return normalUrl;\r\n  }\r\n\r\n  // switch / keycap\r\n  if (step === 'switch' || step === 'keycap') {\r\n\r\n    if (mode === 'split' && divUrl) {\r\n      return divUrl;\r\n    }\r\n\r\n    return normalUrl;\r\n  }\r\n\r\n  return normalUrl;\r\n}\r\n\r\nfunction resetSelectionStep(step) {\r\n  optionButtons(step).forEach(b => {\r\n    b.classList.remove('is-selected');\r\n    b.setAttribute('aria-pressed', 'false');\r\n  });\r\n\r\n  state.selections[step] = null;\r\n\r\n  const input = hiddenInput(step);\r\n  if (input) input.value = '';\r\n\r\n  clearModel(step);\r\n\r\n  // \u4F55\u3082\u8868\u793A\u30E2\u30C7\u30EB\u304C\u306A\u304F\u306A\u3063\u305F\u3089\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u8868\u793A\r\n  const any = Object.values(modelsByStep).some(Boolean);\r\n  if (!any) {\r\n    if (placeholder) placeholder.style.display = '';\r\n    if (canvasHost) canvasHost.style.display = 'none';\r\n  }\r\n}\r\n\r\nfunction resetDependentSelectionsByPcba() {\r\n  resetSelectionStep('switch');\r\n  resetSelectionStep('keycap');\r\n}\r\n\r\n  // --------------------------------------------------\r\n  // Guide modal (open/close + step-specific)\r\n  // --------------------------------------------------\r\n  function updateGuideContent(step) {\r\n  if (!modalBodyEl) return;\r\n\r\n  const contents = [...modalBodyEl.querySelectorAll('[data-guide-content]')];\r\n  if (!contents.length) return;\r\n\r\n  contents.forEach(el => {\r\n    el.hidden = el.dataset.guideContent !== step;\r\n  });\r\n\r\n  const activeContent = modalBodyEl.querySelector(`[data-guide-content=\"${step}\"]`);\r\n  const firstTab = activeContent?.querySelector('[data-tab]');\r\n  if (firstTab) firstTab.click();\r\n}\r\n  function openGuide() {\r\n  if (!guideModal) return;\r\n\r\n  updateGuideContent(state.currentStep);\r\n\r\n  guideModal.hidden = false;\r\n  document.documentElement.style.overflow = 'hidden';\r\n\r\n  const dialog = guideModal.querySelector('.cfg3d-modal__dialog');\r\n  dialog?.focus?.();\r\n}\r\n\r\n  function closeGuide() {\r\n    if (!guideModal) return;\r\n    guideModal.hidden = true;\r\n    document.documentElement.style.overflow = '';\r\n    guideBtn?.focus?.();\r\n  }\r\n\r\n  guideBtn?.addEventListener('click', openGuide);\r\n  guideCloseEls.forEach(el => el.addEventListener('click', closeGuide));\r\n  document.addEventListener('keydown', (e) => {\r\n    if (e.key === 'Escape' && guideModal && !guideModal.hidden) closeGuide();\r\n  });\r\n\r\n  function toggleGuideGroups(step) {\r\n    if (!modalBodyEl) return;\r\n    const groups = [...modalBodyEl.querySelectorAll('[data-guide-group]')];\r\n    if (!groups.length) return;\r\n    groups.forEach(g => g.hidden = (g.dataset.guideGroup !== step));\r\n  }\r\n\r\n  function setGuideForStep(step) {\r\n    // \u2705 option / summary \u3067\u306F\u30AC\u30A4\u30C9\u81EA\u4F53\u3092\u975E\u8868\u793A\r\n    const hideGuide = (step === 'summary' || step === 'option' || step === 'switch');\r\n    if (guideBtn) guideBtn.hidden = hideGuide;\r\n\r\n    const ui = STEP_UI[step] || STEP_UI.case;\r\n\r\n    if (!hideGuide && guideBtn) {\r\n      const labelSpan = guideBtn.querySelector('[data-guide-label]') || guideBtn.querySelector('span:last-child');\r\n      if (labelSpan) labelSpan.textContent = ui.guideLabel;\r\n      else guideBtn.textContent = ui.guideLabel;\r\n    }\r\n\r\n    if (modalTitleEl) modalTitleEl.textContent = ui.modalTitle || '';\r\n\r\n    if (!modalBodyEl) return;\r\n\r\nif (!hideGuide) {\r\n  updateGuideContent(step);\r\n}\r\n  }\r\n\r\n  // --------------------------------------------------\r\n  // Summary\r\n  // --------------------------------------------------\r\n  function renderSummary() {\r\n    if (!summaryListEl || !summarySubtotalEl) return;\r\n\r\n    const items = PRICE_STEPS\r\n      .map(step => ({ step, s: state.selections[step] }))\r\n      .filter(({ s }) => s && s.variantId);\r\n\r\n    const assemblyRow = `\r\n      <div class=\"cfg3d-summary__row\">\r\n        <div class=\"cfg3d-summary__left\">\r\n          <div class=\"cfg3d-summary__label\">\u7D44\u307F\u7ACB\u3066\u6599\u91D1</div>\r\n          <div class=\"cfg3d-summary__value\">\u30AB\u30B9\u30BF\u30E0\u30AD\u30FC\u30DC\u30FC\u30C9\u7D44\u307F\u7ACB\u3066</div>\r\n        </div>\r\n        <div class=\"cfg3d-summary__price\">${formatMoneyJPYFromCents(ASSEMBLY_FEE_CENTS)}</div>\r\n      </div>\r\n    `;\r\n\r\n    if (items.length === 0) {\r\n      summaryListEl.innerHTML = `\r\n        ${assemblyRow}\r\n        <div class=\"cfg3d-summary__empty\">\u30D1\u30FC\u30C4\u306F\u307E\u3060\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002</div>\r\n      `;\r\n      summarySubtotalEl.textContent = formatMoneyJPYFromCents(calcSubtotalCents());\r\n      return;\r\n    }\r\n\r\n    summaryListEl.innerHTML = assemblyRow + items.map(({ step, s }) => {\r\n  const label = STEP_UI[step]?.title || step;\r\n  const price = formatMoneyJPYFromCents(Number(s.priceCents) || 0);\r\n\r\n  const productTitle = escapeHtml(s.productTitle || '');\r\n  const variantTitle = escapeHtml(s.title || '\u2014');\r\n\r\n  const showVariant =\r\n    s.title &&\r\n    s.title !== 'Default Title' &&\r\n    s.title !== s.productTitle;\r\n\r\n  return `\r\n    <div class=\"cfg3d-summary__row\">\r\n      <div class=\"cfg3d-summary__left\">\r\n        <div class=\"cfg3d-summary__label\">${label}</div>\r\n        <div class=\"cfg3d-summary__product\">${productTitle}</div>\r\n        ${showVariant ? `<div class=\"cfg3d-summary__variant\">${variantTitle}</div>` : ''}\r\n      </div>\r\n      <div class=\"cfg3d-summary__price\">${price}</div>\r\n    </div>\r\n  `;\r\n}).join('');\r\n\r\n    summarySubtotalEl.textContent = formatMoneyJPYFromCents(calcSubtotalCents());\r\n  }\r\n\r\n  // --------------------------------------------------\r\n  // Step handling\r\n  // --------------------------------------------------\r\n  function setStep(step) {\r\n    state.currentStep = step;\r\n\r\n    stepBtns.forEach(b => {\r\n      const on = b.dataset.step === step;\r\n      b.classList.toggle('is-active', on);\r\n      b.classList.toggle('is-muted', !on);\r\n      on ? b.setAttribute('aria-current', 'step') : b.removeAttribute('aria-current');\r\n    });\r\n\r\n    panels.forEach(p => { p.hidden = p.dataset.panel !== step; });\r\n\r\n    if (rightTitleEl) rightTitleEl.textContent = (STEP_UI[step]?.title) || step;\r\n\r\n    // filter\u306Fsummary\u3067\u96A0\u3059\r\n    if (filterRoot) filterRoot.hidden = (step === 'summary');\r\n    filterToggleBtns.forEach(btn => {\r\n  btn.hidden = (step === 'summary');\r\n});\r\n\r\n    // guide\r\n    setGuideForStep(step);\r\n\r\n    if (shareBtn) shareBtn.hidden = (step !== 'summary');\r\n    if (copyBtn) copyBtn.hidden = (step !== 'summary');\r\n    if (prevBtn) prevBtn.disabled = (step === NAV_STEPS[0]);\r\n    if (nextBtn) nextBtn.disabled = false;\r\n\r\n    if (nextBtn) nextBtn.textContent = (step === 'summary') ? '\u30AB\u30FC\u30C8\u306B\u8FFD\u52A0' : '\u6B21\u3078';\r\n\r\n    if (step !== 'summary') ensureDefaultSelection(step);\r\n\r\nif (step !== 'summary') applyFilters(step);\r\n\r\nif (step === 'case' || step === 'keycap') {\r\n  openFirstVisibleAccordion(step);\r\n}\r\n\r\nif (step !== 'summary') {\r\n  const s = state.selections[step];\r\n  if (viewerTitleEl) viewerTitleEl.textContent = s?.title || '\u2014';\r\n  if (viewerSubEl) viewerSubEl.textContent = s?.modelUrl ? '3D\u8868\u793A\u4E2D' : '3D\u30E2\u30C7\u30EB\u672A\u8A2D\u5B9A';\r\n  if (THREE && s) fireAndForget(loadModelForStep(step, s.modelUrl || ''));\r\n}\r\n\r\n    if (step === 'summary') renderSummary();\r\n  }\r\n\r\n  function goStep(delta) {\r\n    const idx = NAV_STEPS.indexOf(state.currentStep);\r\n    const next = Math.max(0, Math.min(NAV_STEPS.length - 1, idx + delta));\r\n    setStep(NAV_STEPS[next]);\r\n  }\r\n\r\n  // --------------------------------------------------\r\n  // Selection\r\n  // --------------------------------------------------\r\n  function selectOption(step, btn) {\r\n  const isPcbaChange =\r\n    step === 'pcba' &&\r\n    state.selections.pcba?.variantId !== (isNone(btn) ? '' : (btn.dataset.variantId || ''));\r\n\r\n  optionButtons(step).forEach(b => {\r\n    const on = b === btn;\r\n    b.classList.toggle('is-selected', on);\r\n    b.setAttribute('aria-pressed', String(on));\r\n  });\r\n\r\n  const resolvedModelUrl = getModelUrlForSelection(step, btn);\r\n\r\n  const selection = {\r\n    btn,\r\n    variantId: isNone(btn) ? '' : (btn.dataset.variantId || ''),\r\n    productTitle: btn.dataset.productTitle || (isNone(btn) ? 'None' : ''),\r\n    title: btn.dataset.variantTitle || (isNone(btn) ? 'None' : '\u2014'),\r\n    priceCents: isNone(btn) ? 0 : priceCents(btn),\r\n    modelUrl: resolvedModelUrl\r\n  };\r\n\r\n  state.selections[step] = selection;\r\n\r\n  const input = hiddenInput(step);\r\n  if (input) input.value = selection.variantId;\r\n\r\nif (isPcbaChange) {\r\n  resetDependentSelectionsByPcba();\r\n  applyFilters('switch');\r\n  applyFilters('keycap');\r\n}\r\n\r\n  updateTotal();\r\n\r\n  if (state.currentStep === step) {\r\n    if (viewerTitleEl) viewerTitleEl.textContent = selection.title || '\u2014';\r\n    if (viewerSubEl) viewerSubEl.textContent = selection.modelUrl ? '3D\u8868\u793A\u4E2D' : '3D\u30E2\u30C7\u30EB\u672A\u8A2D\u5B9A';\r\n  }\r\n\r\n  if (THREE) fireAndForget(loadModelForStep(step, selection.modelUrl || ''));\r\n  renderBuildMiniSummary();\r\n}\r\n\r\n  function isSoldOutButton(btn) {\r\n  return (\r\n    btn.disabled ||\r\n    btn.dataset.soldout === 'true' ||\r\n    btn.getAttribute('aria-disabled') === 'true' ||\r\n    btn.classList.contains('is-soldout') ||\r\n    btn.classList.contains('soldout') ||\r\n    btn.classList.contains('is-disabled')\r\n  );\r\n}\r\n\r\nfunction getFirstVisibleSelectableOption(step) {\r\n  return optionButtons(step).find(btn => {\r\n    if (isNone(btn)) return false;\r\n    if (btn.hidden) return false;\r\n    if (isSoldOutButton(btn)) return false;\r\n    return true;\r\n  }) || null;\r\n}\r\n\r\nfunction ensureDefaultSelection(step) {\r\n  if (state.selections[step]) return;\r\n\r\n  // case \u3060\u3051\u81EA\u52D5\u9078\u629E\r\n  if (step === 'case') {\r\n    const firstVisible = getFirstVisibleSelectableOption(step);\r\n    if (firstVisible) {\r\n      selectOption(step, firstVisible);\r\n      return;\r\n    }\r\n  }\r\n\r\n  // \u305D\u308C\u4EE5\u5916\u306F None\r\n  const noneBtn = optionButtons(step).find(b => isNone(b));\r\n  if (noneBtn) selectOption(step, noneBtn);\r\n}\r\n\r\n  // --------------------------------------------------\r\n  // Filter UI (+ size)\r\n  // --------------------------------------------------\r\n  function toggleFilterPanel(e) {\r\n  if (e) e.stopPropagation();\r\n  if (!filterPanelEl) return;\r\n  filterPanelEl.hidden = !filterPanelEl.hidden;\r\n}\r\n\r\nfilterToggleBtns.forEach(btn => {\r\n  btn.addEventListener('click', toggleFilterPanel);\r\n});\r\n\r\ndocument.addEventListener('click', (e) => {\r\n  if (!filterRoot || !filterPanelEl) return;\r\n  if (!filterRoot.contains(e.target)) {\r\n    filterPanelEl.hidden = true;\r\n  }\r\n});\r\n\r\n  function getCurrentFilterState(step) {\r\n    return state.filters[step] || { color:'', vendor:'', material:'', minYen:'', maxYen:'' };\r\n  }\r\n\r\n  function openFirstVisibleAccordion(step) {\r\n  const panel = stepPanelEl(step);\r\n  if (!panel) return;\r\n\r\n  const accordions = [...panel.querySelectorAll('.cfg3d-accordion')].filter(el => !el.hidden);\r\n  if (!accordions.length) return;\r\n\r\n  accordions.forEach((el, i) => {\r\n    el.open = (i === 0);\r\n  });\r\n}\r\n\r\nfunction rebuildVendorOptions(step) {\r\n  if (!filterVendorEl) return;\r\n\r\n  const fs = getCurrentFilterState(step);\r\n  const minCents = yenToCents(fs.minYen);\r\n  const maxCents = yenToCents(fs.maxYen);\r\n  const sizeToken = sizeTagToken();\r\n  const layoutMode = getPcbaLayoutMode();\r\n\r\n  const vendorSet = new Set();\r\n\r\n  const btns = optionButtons(step).filter(btn => {\r\n    if (isNone(btn)) return false;\r\n    if (isSoldOutButton(btn)) return false;\r\n\r\n    const okSize = (step === 'option') ? true : hasTagToken(btn, sizeToken);\r\n    const okOption = (step === 'option') ? isOptionItem(btn) : true;\r\n    const okOnly70 = (step === 'switch')\r\n      ? String(btn.dataset.variantTitle || '').trim() === '70'\r\n      : true;\r\n\r\n    const okLayoutTag =\r\n      (step === 'switch' || step === 'keycap')\r\n        ? (\r\n            layoutMode === 'split'\r\n              ? hasExactTag(btn, '\u5206\u5272\u30B9\u30DA\u30FC\u30B9')\r\n              : layoutMode === 'normal'\r\n                ? hasExactTag(btn, '\u901A\u5E38\u30B9\u30DA\u30FC\u30B9')\r\n                : true\r\n          )\r\n        : true;\r\n\r\n    // \u3053\u3053\u3067\u306F vendorMatch \u3092\u5165\u308C\u306A\u3044\r\n    const okOther =\r\n      colorMatch(btn, fs.color) &&\r\n      materialMatch(btn, fs.material) &&\r\n      priceMatch(btn, minCents, maxCents);\r\n\r\n    const okModel =\r\n  hasTagToken(btn, '60%')\r\n    ? hasModelGlb(btn)\r\n    : true;\r\n\r\nreturn okSize && okOption && okOnly70 && okLayoutTag && okOther && okModel;\r\n  });\r\n\r\n  btns.forEach(btn => {\r\n    const vendor = (btn.dataset.vendor || '').trim();\r\n    if (vendor) vendorSet.add(vendor);\r\n  });\r\n\r\n  const vendors = [...vendorSet].sort((a, b) => a.localeCompare(b, 'ja'));\r\n  const currentValue = state.filters[step]?.vendor || '';\r\n\r\n  filterVendorEl.innerHTML = `\r\n    <option value=\"\">\u3059\u3079\u3066</option>\r\n    ${vendors.map(v => `<option value=\"${escapeHtml(v)}\">${escapeHtml(v)}</option>`).join('')}\r\n  `;\r\n\r\n  if (currentValue && vendors.includes(currentValue)) {\r\n    filterVendorEl.value = currentValue;\r\n  } else {\r\n    filterVendorEl.value = '';\r\n    if (state.filters[step]) state.filters[step].vendor = '';\r\n  }\r\n}\r\n\r\n  function syncFilterUIFromState(step) {\r\n    const fs = getCurrentFilterState(step);\r\n    if (filterColorEl) filterColorEl.value = fs.color || '';\r\n    if (filterVendorEl) filterVendorEl.value = fs.vendor || '';\r\n    if (filterMaterialEl) filterMaterialEl.value = fs.material || '';\r\n    if (filterMinEl) filterMinEl.value = fs.minYen || '';\r\n    if (filterMaxEl) filterMaxEl.value = fs.maxYen || '';\r\n  }\r\n\r\n  function saveFilterStateFromUI(step) {\r\n    const fs = getCurrentFilterState(step);\r\n    fs.color    = (filterColorEl?.value || '').trim();\r\n    fs.vendor   = (filterVendorEl?.value || '').trim();\r\n    fs.material = (filterMaterialEl?.value || '').trim();\r\n    fs.minYen   = (filterMinEl?.value || '').trim();\r\n    fs.maxYen   = (filterMaxEl?.value || '').trim();\r\n    state.filters[step] = fs;\r\n  }\r\n\r\n  function applyFilters(step) {\r\n  const panel = stepPanelEl(step);\r\n  if (!panel) return;\r\n\r\n  syncFilterUIFromState(step);\r\n\r\n  const fs = getCurrentFilterState(step);\r\n  const minCents = yenToCents(fs.minYen);\r\n  const maxCents = yenToCents(fs.maxYen);\r\n\r\n  const sizeToken = sizeTagToken();\r\n\r\n    const btns = [...panel.querySelectorAll(`[data-option][data-step=\"${step}\"]`)];\r\n    btns.forEach(btn => {\r\n      if (isNone(btn)) {\r\n        btn.hidden = false;\r\n        return;\r\n      }\r\n\r\n    const okSize = (step === 'option') ? true : hasTagToken(btn, sizeToken);\r\nconst okOption = (step === 'option') ? isOptionItem(btn) : true;\r\nconst okOnly70 = (step === 'switch')\r\n  ? String(btn.dataset.variantTitle || '').trim() === '70'\r\n  : true;\r\n\r\nconst layoutMode = getPcbaLayoutMode();\r\n\r\nconst okLayoutTag =\r\n  (step === 'switch' || step === 'keycap')\r\n    ? (\r\n        layoutMode === 'split'\r\n          ? hasExactTag(btn, '\u5206\u5272\u30B9\u30DA\u30FC\u30B9')\r\n          : layoutMode === 'normal'\r\n            ? hasExactTag(btn, '\u901A\u5E38\u30B9\u30DA\u30FC\u30B9')\r\n            : true\r\n      )\r\n    : true;\r\n\r\nconst okOther =\r\n  colorMatch(btn, fs.color) &&\r\n  vendorMatch(btn, fs.vendor) &&\r\n  materialMatch(btn, fs.material) &&\r\n  priceMatch(btn, minCents, maxCents);\r\n\r\nconst okModel =\r\n  hasTagToken(btn, '60%')\r\n    ? hasModelGlb(btn)\r\n    : true;\r\n\r\nconst ok = okSize && okOption && okOnly70 && okLayoutTag && okOther && okModel;\r\nbtn.hidden = !ok;\r\n    });\r\n\r\nrebuildVendorOptions(step);\r\nsyncFilterUIFromState(step);\r\n\r\n    // \u30B0\u30EB\u30FC\u30D7\u5358\u4F4D\u3067\u96A0\u3059\uFF08\u305F\u3060\u3057 None-only \u306E\u30B0\u30EB\u30FC\u30D7\u306F\u6B8B\u3059\uFF09\r\n    const groups = [...panel.querySelectorAll('.cfg3d-group')];\r\n    groups.forEach(g => {\r\n      const inGroup = [...g.querySelectorAll(`[data-option][data-step=\"${step}\"]`)]\r\n        .filter(b => !isNone(b));\r\n\r\n      if (inGroup.length === 0) {\r\n        g.hidden = false;\r\n        return;\r\n      }\r\n\r\n      const anyVisible = inGroup.some(b => !b.hidden);\r\n      g.hidden = !anyVisible;\r\n    });\r\n\r\n    // \u9078\u629E\u4E2D\u304C\u30D5\u30A3\u30EB\u30BF\u3067\u6D88\u3048\u305F\u3089\u3001case \u306F\u5148\u982D\u306E\u8868\u793A\u4E2D\u5546\u54C1\u3078 / \u4ED6\u306F None\r\nconst currentSel = state.selections[step];\r\nif (currentSel?.btn && !isNone(currentSel.btn) && currentSel.btn.hidden) {\r\n  if (step === 'case') {\r\n    const firstVisible = getFirstVisibleSelectableOption(step);\r\n    if (firstVisible) {\r\n      selectOption(step, firstVisible);\r\n    } else {\r\n      const noneBtn = optionButtons(step).find(b => isNone(b));\r\n      if (noneBtn) selectOption(step, noneBtn);\r\n    }\r\n  } else {\r\n    const noneBtn = optionButtons(step).find(b => isNone(b));\r\n    if (noneBtn) selectOption(step, noneBtn);\r\n  }\r\n}\r\nif (step === 'case' || step === 'keycap') {\r\n  openFirstVisibleAccordion(step);\r\n}\r\n  }\r\n\r\n  const filterInputs = [filterColorEl, filterVendorEl, filterMaterialEl, filterMinEl, filterMaxEl].filter(Boolean);\r\n  filterInputs.forEach(el => {\r\n    el.addEventListener('change', () => {\r\n      saveFilterStateFromUI(state.currentStep);\r\n      applyFilters(state.currentStep);\r\n    });\r\n    el.addEventListener('input', () => {\r\n      if (el === filterMinEl || el === filterMaxEl) {\r\n        saveFilterStateFromUI(state.currentStep);\r\n        applyFilters(state.currentStep);\r\n      }\r\n    });\r\n  });\r\n\r\n// --------------------------------------------------\r\n// Add to cart\r\n// --------------------------------------------------\r\nasync function addSelectionToCart() {\r\n  if (!CUSTOM_KEYBOARD_VARIANT_ID || !Number(CUSTOM_KEYBOARD_VARIANT_ID)) {\r\n    alert('\u30AB\u30B9\u30BF\u30E0\u30AD\u30FC\u30DC\u30FC\u30C9\u5546\u54C1\u306Evariant ID\u304C\u672A\u8A2D\u5B9A\u3067\u3059\u3002');\r\n    return;\r\n  }\r\n\r\n  const caseSel   = state.selections.case;\r\n  const pcbaSel   = state.selections.pcba;\r\n  const switchSel = state.selections.switch;\r\n  const keycapSel = state.selections.keycap;\r\n  const optionSel = state.selections.option;\r\n\r\n  const cfgGroupId = `cfg_${Date.now()}`;\r\n\r\n  // \u89AA\u5546\u54C1\u306B\u6301\u305F\u305B\u308B\u8868\u793A\u7528 properties\r\n  const parentProperties = {\r\n  '_cfg_parent_item': 'true',\r\n  '_cfg_group': cfgGroupId,\r\n\r\n  '\u30B1\u30FC\u30B9': getSelectionDisplay('case'),\r\n  'PCBA': getSelectionDisplay('pcba'),\r\n  '\u30AD\u30FC\u30B9\u30A4\u30C3\u30C1': getSelectionDisplay('switch'),\r\n  '\u30AD\u30FC\u30AD\u30E3\u30C3\u30D7': getSelectionDisplay('keycap'),\r\n  '\u30AA\u30D7\u30B7\u30E7\u30F3': getSelectionDisplay('option'),\r\n  '\u7D44\u307F\u7ACB\u3066\u6599\u91D1': formatMoneyJPYFromCents(ASSEMBLY_FEE_CENTS),\r\n  '\u5C0F\u8A08': formatMoneyJPYFromCents(calcSubtotalCents()),\r\n\r\n  '_\u30B1\u30FC\u30B9_variant_id': caseSel?.variantId || '',\r\n  '_PCBA_variant_id': pcbaSel?.variantId || '',\r\n  '_\u30AD\u30FC\u30B9\u30A4\u30C3\u30C1_variant_id': switchSel?.variantId || '',\r\n  '_\u30AD\u30FC\u30AD\u30E3\u30C3\u30D7_variant_id': keycapSel?.variantId || '',\r\n  '_\u30AA\u30D7\u30B7\u30E7\u30F3_variant_id': optionSel?.variantId || '',\r\n\r\n  '_\u30B1\u30FC\u30B9_quantity': caseSel?.variantId ? '1' : '0',\r\n  '_PCBA_quantity': pcbaSel?.variantId ? '1' : '0',\r\n  '_\u30AD\u30FC\u30B9\u30A4\u30C3\u30C1_quantity': switchSel?.variantId ? '1' : '0',\r\n  '_\u30AD\u30FC\u30AD\u30E3\u30C3\u30D7_quantity': keycapSel?.variantId ? '1' : '0',\r\n  '_\u30AA\u30D7\u30B7\u30E7\u30F3_quantity': optionSel?.variantId ? '1' : '0'\r\n};\r\n\r\n  const items = [\r\n    {\r\n      id: Number(CUSTOM_KEYBOARD_VARIANT_ID),\r\n      quantity: 1,\r\n      properties: parentProperties\r\n    }\r\n  ];\r\n\r\n  function pushChildItem(selection, quantity, stepName) {\r\n    if (!selection?.variantId) return;\r\n\r\n    items.push({\r\n      id: Number(selection.variantId),\r\n      quantity,\r\n      properties: {\r\n        '_cfg_child': 'true',\r\n        '_cfg_parent': 'custom_keyboard',\r\n        '_cfg_step': stepName,\r\n        '_cfg_group': cfgGroupId\r\n      }\r\n    });\r\n  }\r\n\r\n  pushChildItem(caseSel, 1, 'case');\r\n  pushChildItem(pcbaSel, 1, 'pcba');\r\n  pushChildItem(switchSel, 1, 'switch');\r\n  pushChildItem(keycapSel, 1, 'keycap');\r\n  pushChildItem(optionSel, 1, 'option');\r\n\r\n  if (nextBtn) nextBtn.disabled = true;\r\n\r\n  try {\r\n    const res = await fetch('/cart/add.js', {\r\n      method: 'POST',\r\n      headers: {\r\n        'Content-Type': 'application/json',\r\n        'Accept': 'application/json'\r\n      },\r\n      body: JSON.stringify({ items })\r\n    });\r\n\r\n    if (!res.ok) {\r\n      const text = await res.text().catch(() => '');\r\n      throw new Error(`add.js failed: ${res.status} ${text}`);\r\n    }\r\n\r\n    window.location.href = '/cart';\r\n  } catch (e) {\r\n    console.error('[CFG3D] add to cart failed', e);\r\n    alert('\u30AB\u30FC\u30C8\u8FFD\u52A0\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u8A2D\u5B9A\u3092\u78BA\u8A8D\u3057\u3066\u306D\u3002');\r\n    if (nextBtn) nextBtn.disabled = false;\r\n  }\r\n}\r\n\r\n  // --------------------------------------------------\r\n  // three.js (optional)\r\n  // --------------------------------------------------\r\n  let THREE, OrbitControls, GLTFLoader, DRACOLoader, RGBELoader;\r\n\r\ntry {\r\n  THREE = await import(THREE_CDN);\r\n  ({ OrbitControls } = await import(ORBIT_CDN));\r\n  ({ GLTFLoader } = await import(GLTF_CDN));\r\n  ({ DRACOLoader } = await import(DRACO_CDN));\r\n  ({ RGBELoader } = await import(RGBE_CDN));\r\n  console.log('CFG3D three status:', !!THREE, !!OrbitControls, !!GLTFLoader, !!DRACOLoader);\r\n} catch (e) {\r\n  console.warn('[CFG3D] three.js import failed', e);\r\n  THREE = null;\r\n}\r\n\r\n  let renderer, scene, camera, controls, loader, cameraLight;\r\n  let hasFittedCameraOnce = false;\r\n\r\n// \u2705 \u30B9\u30C6\u30C3\u30D7\u5225\u306B\u30E2\u30C7\u30EB\u3092\u4FDD\u6301\uFF08\u91CD\u306D\u8868\u793A\u7528\uFF09\r\nconst modelsByStep = { case: null, pcba: null, switch: null, keycap: null, option: null };\r\nconst loadTokenByStep = { case: 0, pcba: 0, switch: 0, keycap: 0, option: 0 };\r\n\r\n  function showLoading(on) {\r\n    if (!loadingEl) return;\r\n    loadingEl.hidden = !on;\r\n  }\r\n\r\n  function ensureViewer() {\r\n  if (!THREE || !canvasHost) return;\r\n\r\n  if (!scene) {\r\n  scene = new THREE.Scene();\r\n\r\n  // \u5168\u4F53\u3092\u660E\u308B\u304F\u3059\u308B\u74B0\u5883\u5149\r\n  // \u74B0\u5883\u5149\uFF08\u5F31\u3081\uFF09\r\nconst hemi = new THREE.HemisphereLight(0xffffff, 0x666666, 0.3);\r\nscene.add(hemi);\r\n\r\n// \u30E1\u30A4\u30F3\u30E9\u30A4\u30C8\u3060\u3051\u6B8B\u3059\r\nconst keyLight = new THREE.DirectionalLight(0xffffff, 0.3);\r\nkeyLight.position.set(3, 5, 6);\r\nscene.add(keyLight);\r\n\r\n// cameraLight\u306F\u5F31\u3081\u306B\r\ncameraLight = new THREE.DirectionalLight(0xffffff, 0.2);\r\nscene.add(cameraLight);\r\n}\r\n\r\n\r\n  if (!renderer) {\r\n    const r = canvasHost.getBoundingClientRect();\r\n\r\n    camera = new THREE.PerspectiveCamera(35, r.width / Math.max(r.height, 1), 0.1, 2000);\r\n    camera.position.set(0, 30, 120);\r\n\r\n    renderer = new THREE.WebGLRenderer({\r\n  antialias: true,\r\n  alpha: true\r\n});\r\n// =====================\r\n// HDRI \u74B0\u5883\u5149\r\n// =====================\r\nconst pmremGenerator = new THREE.PMREMGenerator(renderer);\r\npmremGenerator.compileEquirectangularShader();\r\n\r\nnew RGBELoader()\r\n  .load('https://dl.polyhaven.org/file/ph-assets/HDRIs/hdr/1k/studio_small_03_1k.hdr', (texture) => {\r\n    const envMap = pmremGenerator.fromEquirectangular(texture).texture;\r\n\r\n    scene.environment = envMap; // \u2190 \u53CD\u5C04\u306B\u52B9\u304F\r\n    scene.background = null;    // \u2190 \u80CC\u666F\u306F\u900F\u660E\u306E\u307E\u307E\r\n\r\n    texture.dispose();\r\n    pmremGenerator.dispose();\r\n  });\r\nrenderer.toneMapping = THREE.ACESFilmicToneMapping;\r\nrenderer.outputColorSpace = THREE.SRGBColorSpace;\r\nrenderer.toneMappingExposure = 1.1;\r\nrenderer.setClearColor(0x000000, 0);\r\n    renderer.setPixelRatio(Math.min(window.devicePixelRatio || 1, 2));\r\n    renderer.setSize(r.width, r.height);\r\n\r\n    canvasHost.appendChild(renderer.domElement);\r\n\r\n    renderer.domElement.style.position = 'absolute';\r\n    renderer.domElement.style.inset = '0';\r\n    renderer.domElement.style.width = '100%';\r\n    renderer.domElement.style.height = '100%';\r\n    renderer.domElement.style.pointerEvents = 'auto';\r\n\r\ncontrols = new OrbitControls(camera, renderer.domElement);\r\n\r\ncontrols.enableDamping = true;\r\n\r\n// \u2190 \u6A2A\u79FB\u52D5\u7981\u6B62\r\ncontrols.enablePan = false;\r\n\r\n// \u2190 \u30BA\u30FC\u30E0\u611F\u5EA6\u3092\u5F31\u3081\u308B\r\ncontrols.enableZoom = false;\r\n\r\n// 360\u5EA6\u56DE\u8EE2OK\u30FB\u5E95\u9762\u3082\u898B\u3048\u308B\r\ncontrols.minPolarAngle = 0;\r\ncontrols.maxPolarAngle = Math.PI;\r\ncontrols.minAzimuthAngle = -Infinity;\r\ncontrols.maxAzimuthAngle = Infinity;\r\n\r\ncontrols.target.set(0, 0, 0);\r\ncontrols.update();\r\nrenderer.domElement.addEventListener('wheel', (e) => {\r\n  e.preventDefault();\r\n\r\n  if (!camera || !controls) return;\r\n\r\n  const currentDistance = camera.position.distanceTo(controls.target);\r\n  if (targetCameraDistance == null) targetCameraDistance = currentDistance;\r\n\r\n  const direction = Math.sign(e.deltaY);\r\nconst zoomAmount = currentDistance * 0.04 * direction;\r\ntargetCameraDistance += zoomAmount;\r\n\r\n  targetCameraDistance = Math.max(\r\n    controls.minDistance || 1,\r\n    Math.min(controls.maxDistance || 9999, targetCameraDistance)\r\n  );\r\n\r\n}, { passive: false });\r\n\r\nlet lastTouchDistance = null;\r\n\r\nrenderer.domElement.addEventListener('touchstart', (e) => {\r\n  if (e.touches.length === 2) {\r\n    e.preventDefault();\r\n\r\n    const dx = e.touches[0].clientX - e.touches[1].clientX;\r\n    const dy = e.touches[0].clientY - e.touches[1].clientY;\r\n    lastTouchDistance = Math.sqrt(dx * dx + dy * dy);\r\n\r\n    targetCameraDistance = camera.position.distanceTo(controls.target);\r\n  }\r\n}, { passive: false });\r\n\r\nrenderer.domElement.addEventListener('touchmove', (e) => {\r\n  if (e.touches.length !== 2 || lastTouchDistance == null) return;\r\n\r\n  e.preventDefault();\r\n\r\n  const dx = e.touches[0].clientX - e.touches[1].clientX;\r\n  const dy = e.touches[0].clientY - e.touches[1].clientY;\r\n  const newTouchDistance = Math.sqrt(dx * dx + dy * dy);\r\n\r\n  const diff = lastTouchDistance - newTouchDistance;\r\n  targetCameraDistance += diff * 0.02;\r\n\r\n  targetCameraDistance = Math.max(\r\n    controls.minDistance || 1,\r\n    Math.min(controls.maxDistance || 9999, targetCameraDistance)\r\n  );\r\n\r\n  lastTouchDistance = newTouchDistance;\r\n}, { passive: false });\r\n\r\nrenderer.domElement.addEventListener('touchend', () => {\r\n  lastTouchDistance = null;\r\n}, { passive: true });\r\n\r\nrenderer.domElement.addEventListener('dblclick', () => {\r\n  camera.position.set(0, 30, 120);\r\n  controls.target.set(0, 0, 0);\r\n  controls.update();\r\n});\r\n\r\n    new ResizeObserver(() => {\r\n      const rr = canvasHost.getBoundingClientRect();\r\n      renderer.setSize(rr.width, rr.height);\r\n      camera.aspect = rr.width / Math.max(rr.height, 1);\r\n      camera.updateProjectionMatrix();\r\n    }).observe(canvasHost);\r\n\r\n    (function tick() {\r\n  requestAnimationFrame(tick);\r\n  cameraLight.position.copy(camera.position);\r\n\r\n  if (targetCameraDistance != null) {\r\n    const dir = camera.position.clone().sub(controls.target).normalize();\r\n    const currentDistance = camera.position.distanceTo(controls.target);\r\n    const nextDistance = currentDistance + (targetCameraDistance - currentDistance) * 0.08;\r\n\r\n    camera.position.copy(controls.target).add(dir.multiplyScalar(nextDistance));\r\n  }\r\n\r\n  controls.update();\r\n  renderer.render(scene, camera);\r\n})();\r\n  }\r\n\r\n  if (!loader) {\r\n    loader = new GLTFLoader();\r\n  }\r\n  console.log('[CFG3D] ensureViewer done', {\r\n    hasScene: !!scene,\r\n    hasRenderer: !!renderer,\r\n    hasLoader: !!loader\r\n  });\r\n  console.log('[CFG3D] canvasHost rect:', canvasHost.getBoundingClientRect());\r\nconsole.log('[CFG3D] renderer canvas:', renderer?.domElement);\r\n}\r\n\r\n  function clearModel(step) {\r\n  const m = modelsByStep[step];\r\n  if (!m || !scene) return;\r\n\r\n  scene.remove(m);\r\n\r\n  try {\r\n    m.traverse(o => {\r\n      if (o.isMesh) {\r\n        o.geometry?.dispose?.();\r\n        if (o.material) {\r\n          const mats = Array.isArray(o.material) ? o.material : [o.material];\r\n          mats.forEach(mat => {\r\n            mat.map?.dispose?.();\r\n            mat.dispose?.();\r\n          });\r\n        }\r\n      }\r\n    });\r\n  } catch (_) {}\r\n\r\n  modelsByStep[step] = null;\r\n}\r\n// --- helper: \u30E2\u30C7\u30EB\u306E\u300C\u4E2D\u5FC3\u300D\u3092\u57FA\u6E96\u306B\u56DE\u8EE2\u3055\u305B\u308B\uFF08\u4F4D\u7F6E\u30BA\u30EC\u9632\u6B62\uFF09 ---\r\nfunction rotateAroundCenter(obj, axis /* 'x'|'y'|'z' */, rad) {\r\n  const box = new THREE.Box3().setFromObject(obj);\r\n  const center = box.getCenter(new THREE.Vector3());\r\n\r\n  obj.position.sub(center);\r\n  obj.rotation[axis] += rad;\r\n  obj.position.add(center);\r\n}\r\nlet defaultCameraPosition = null;\r\nlet defaultControlsTarget = null;\r\nlet zoomResetTimer = null;\r\nlet targetCameraDistance = null;\r\n\r\nfunction rememberDefaultView() {\r\n  if (!camera || !controls) return;\r\n  defaultCameraPosition = camera.position.clone();\r\n  defaultControlsTarget = controls.target.clone();\r\n}\r\n\r\nfunction resetToDefaultView() {\r\n  if (!camera || !controls || !defaultCameraPosition || !defaultControlsTarget) return;\r\n\r\n  camera.position.copy(defaultCameraPosition);\r\n  controls.target.copy(defaultControlsTarget);\r\n  controls.update();\r\n}\r\n  function fitCameraToObject(object3d) {\r\n  if (!THREE || !camera || !controls) return;\r\n\r\n  const box = new THREE.Box3().setFromObject(object3d);\r\n  const size = box.getSize(new THREE.Vector3());\r\n  const center = box.getCenter(new THREE.Vector3());\r\n\r\n  const maxDim = Math.max(size.x, size.y, size.z);\r\n  const fov = (camera.fov * Math.PI) / 180;\r\n  let dist = Math.abs(maxDim / (2 * Math.tan(fov / 2)));\r\n  dist *= 0.9;\r\n\r\n  camera.position.set(center.x, center.y + maxDim * 0.9, center.z + dist * 1.05);\r\n\r\n  camera.near = Math.max(maxDim / 100, 0.01);\r\n  camera.far = maxDim * 100;\r\n  camera.updateProjectionMatrix();\r\n\r\ncontrols.minDistance = maxDim * 1.2;\r\ncontrols.maxDistance = maxDim * 6;\r\ncontrols.enablePan = false;\r\n\r\n  controls.target.copy(center);\r\n  controls.update();\r\n  rememberDefaultView();\r\n  \r\n}\r\n\r\n  async function loadModelForStep(step, url) {\r\n  console.log('[CFG3D] trying to load:', step, url);\r\n  if (viewerSubEl) {\r\n    viewerSubEl.textContent = url ? `3D URL: ${url}` : '3D URL: (empty)';\r\n  }\r\n  if (!THREE) return;\r\n\r\n  const myToken = ++loadTokenByStep[step];\r\n\r\n  if (!url) {\r\n    clearModel(step);\r\n\r\n    const any = Object.values(modelsByStep).some(Boolean);\r\n    if (!any) {\r\n      if (placeholder) placeholder.style.display = '';\r\n      if (canvasHost) canvasHost.style.display = 'none';\r\n    }\r\n    return;\r\n  }\r\n\r\n  ensureViewer();\r\n\r\nif (!loader) loader = new GLTFLoader();\r\nif (!loader || !scene) {\r\n  console.warn('[CFG3D] loader or scene is not initialized');\r\n  return;\r\n}\r\n\r\nif (canvasHost) canvasHost.style.display = '';\r\nif (placeholder) placeholder.style.display = 'none';\r\n\r\nshowLoading(true);\r\nclearModel(step);\r\n\r\ntry {\r\n  const gltf = await new Promise((resolve, reject) => {\r\n    loader.load(url, resolve, undefined, reject);\r\n  });\r\n\r\n  const model = gltf.scene;\r\n  model.traverse((obj) => {\r\n  if (!obj.isMesh || !obj.material) return;\r\n\r\n  const mats = Array.isArray(obj.material) ? obj.material : [obj.material];\r\n\r\n  mats.forEach((mat) => {\r\n    mat.envMapIntensity = 0.35;\r\n    mat.needsUpdate = true;\r\n  });\r\n});\r\n\r\n  if (myToken !== loadTokenByStep[step]) return;\r\n\r\n  model.position.set(0, 0, 0);\r\n  model.rotation.set(0, 0, 0);\r\n  model.scale.set(1, 1, 1);\r\n\r\n  // \u6A2A\u5411\u304D\r\n  model.rotation.y = Math.PI;\r\n\r\n  // case / pcba / switch / keycap \u306F\u8FFD\u52A0\u3067\u53CD\u8EE2\r\n  if (step === 'case' || step === 'pcba' || step === 'switch' || step === 'keycap') {\r\n    model.rotation.y += Math.PI;\r\n  }\r\n\r\n  clearModel(step);\r\n  scene.add(model);\r\n  modelsByStep[step] = model;\r\n\r\n    // \u521D\u56DE\u3060\u3051\u30AB\u30E1\u30E9\u3092\u81EA\u52D5\u8ABF\u6574\r\n  if (!hasFittedCameraOnce) {\r\n    if (modelsByStep.case) {\r\n      fitCameraToObject(modelsByStep.case);\r\n    } else {\r\n      fitCameraToObject(model);\r\n    }\r\n    hasFittedCameraOnce = true;\r\n  } else {\r\n    controls.update();\r\n  }\r\n\r\n  console.log('[CFG3D] before add', {\r\n    hasScene: !!scene,\r\n    hasRenderer: !!renderer,\r\n    hasCamera: !!camera\r\n  });\r\n\r\n} catch (e) {\r\n  console.warn('[CFG3D] model load failed', e);\r\n  if (myToken === loadTokenByStep[step]) {\r\n    clearModel(step);\r\n  }\r\n} finally {\r\n  if (myToken === loadTokenByStep[step]) {\r\n    showLoading(false);\r\n  }\r\n}\r\n}\r\n\r\n  function fireAndForget(p) {\r\n    try { if (p?.then) p.catch(() => {}); } catch (_) {}\r\n  }\r\n\r\n  // --------------------------------------------------\r\n  // Bind\r\n  // --------------------------------------------------\r\n  PRICE_STEPS.forEach(step => {\r\n    optionButtons(step).forEach(btn => {\r\n      btn.addEventListener('click', () => selectOption(step, btn));\r\n    });\r\n  });\r\n\r\n  stepBtns.forEach(b => b.addEventListener('click', () => setStep(b.dataset.step)));\r\n\r\n  prevBtn?.addEventListener('click', () => goStep(-1));\r\n  nextBtn?.addEventListener('click', () => {\r\n    if (state.currentStep === 'summary') addSelectionToCart();\r\n    else goStep(1);\r\n  });\r\n\r\n  shareBtn?.addEventListener('click', shareBuild);\r\n  copyBtn?.addEventListener('click', copyBuildUrl);\r\n// --------------------------------------------------\r\n// Init\r\n// --------------------------------------------------\r\nstate.size = '60';\r\n\r\n// \u5148\u306B\u30D5\u30A3\u30EB\u30BF\u30FC\u9069\u7528\r\nNAV_STEPS.forEach(s => {\r\n  if (s !== 'summary') applyFilters(s);\r\n});\r\n\r\n// URL\u304B\u3089\u9078\u629E\u72B6\u614B\u3092\u5FA9\u5143\r\nrestoreSelectionsFromUrl();\r\n\r\n// URL\u306B\u306A\u3044\u3082\u306E\u3060\u3051\u30C7\u30D5\u30A9\u30EB\u30C8\u9078\u629E\r\nPRICE_STEPS.forEach(step => ensureDefaultSelection(step));\r\n\r\nupdateTotal();\r\nsaveFilterStateFromUI('case');\r\nrenderBuildMiniSummary();\r\n\r\n// \u5171\u6709URL\u306A\u3089summary\u3078\r\nif (hasBuildParamsInUrl()) {\r\n  setStep('summary');\r\n\r\n  // \u2605 summary\u3067\u3082\u9078\u629E\u6E08\u307F3D\u3092\u518D\u8868\u793A\u3059\u308B\r\n  PRICE_STEPS.forEach(step => {\r\n    const s = state.selections[step];\r\n    if (s?.modelUrl) {\r\n      fireAndForget(loadModelForStep(step, s.modelUrl));\r\n    }\r\n  });\r\n} else {\r\n  setStep('case');\r\n}\r\n\r\nrenderBuildMiniSummary();\r\n})();"],
  "mappings": "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",
  "names": ["buildMini"]
}
