{
  "version": 3,
  "sources": ["/cdn/shop/t/38/assets/cfg3d.js?cfgv=1792756635"],
  "sourcesContent": ["// ======================================================\n// cfg3d.js (Shopify theme asset) - FULL\n// ------------------------------------------------------\n// \u2714 Steps: case / pcba / switch / keycap / option / summary\n// \u2714 Size toggle: 60% / 80% tag filtering (supports 60% and 60\uFF05)\n// \u2714 Option step: only products tagged \"\u30AA\u30D7\u30B7\u30E7\u30F3\"\n// \u2714 Per-step single selection (None supported)\n// \u2714 Total = sum of selected step prices (Shopify cents)\n// \u2714 Money format: JPY-safe\n// \u2714 three.js GLB loader (optional)\n// \u2714 Guide button + modal: step-specific label + content\n// \u2714 Guide hidden on option + summary\n// \u2714 Search filter UI per step (AND with size)\n// \u2714 Summary renders breakdown + subtotal\n// \u2714 Add selected variants to cart (skip None) via /cart/add.js\n// \u2714 [PATCH] \u5206\u5272\u30B9\u30DA\u30FC\u30B9\u975E\u5BFE\u5FDC\u30B1\u30FC\u30B9(Zoom64\u7B49)\u3067\u306F\u5206\u5272\u30B9\u30DA\u30FC\u30B9PCBA\u3092\u96A0\u3059\n// ======================================================\n\nconst THREE_CDN = 'https://cdn.jsdelivr.net/npm/three@0.160.0/build/three.module.js';\nconst ORBIT_CDN = 'https://cdn.jsdelivr.net/npm/three@0.160.0/examples/jsm/controls/OrbitControls.js';\nconst GLTF_CDN  = 'https://cdn.jsdelivr.net/npm/three@0.160.0/examples/jsm/loaders/GLTFLoader.js';\nconst DRACO_CDN = 'https://cdn.jsdelivr.net/npm/three@0.160.0/examples/jsm/loaders/DRACOLoader.js';\nconst RGBE_CDN = 'https://cdn.jsdelivr.net/npm/three@0.160.0/examples/jsm/loaders/RGBELoader.js';\n// \u30B7\u30A7\u30A2\u7528\u30B5\u30FC\u30D3\u30B9\uFF08Cloud Run\u30FBservices/build_share\uFF09\u3002\u753B\u50CF\u3068\u30E1\u30BF\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3092\u4F5C\u308A hypeshop.jp/pages/build/<ID> \u3092\u8FD4\u3059\uFF08EC-527\uFF09\nconst SHARE_SERVICE_URL = 'https://build-share-1034503685653.asia-northeast1.run.app/share';\n\n// EC-522: \u62BC\u4E0B\u5727\u8868\u793A\u3092 gf \u306B\u7D71\u4E00\uFF08\u30E1\u30BF\u30D5\u30A3\u30FC\u30EB\u30C9\u5024\u306F\u66F8\u304D\u63DB\u3048\u306A\u3044\uFF09\nfunction formatActuationForceToGf(raw) {\n  if (raw == null) return '';\n  let s = String(raw).trim();\n  if (!s) return '';\n  // \u6570\u5B57\u306E\u76F4\u5F8C\u306E cN \u306E\u307F\uFF08\u5358\u8A9E\u4E2D\u306E cN \u306F\u89E6\u3089\u306A\u3044\uFF09\n  s = s.replace(/(\\d+[\u2013\u2014-]\\d+(?:\\.\\d+)?)\\s*cN(?!\\w)/gi, '$1gf');\n  s = s.replace(/(\\d+(?:\\.\\d+)?(?:\u00B1\\d+(?:\\.\\d+)?)?)\\s*cN(?!\\w)/gi, '$1gf');\n  s = s.replace(/(\\d+(?:\\.\\d+)?)\\s*cN(?!\\w)/gi, '$1gf');\n  // \u6570\u5B57\u3068 g \u306E\u9593\u306B\u30B9\u30DA\u30FC\u30B9\u304C\u3042\u3063\u3066\u3082 gf \u306B\uFF08\u65E2\u306B gf \u306E\u3068\u304D\u306F\u4E8C\u91CD\u5909\u63DB\u3057\u306A\u3044\uFF09\n  s = s.replace(/(\\d)\\s+g(?!f)/gi, '$1gf');\n  s = s.replace(/(\\d)g(?!f)/gi, '$1gf');\n  return s;\n}\n\nfunction renderSwitchSpecLine(el) {\n  const type = (el.dataset.switchType || '').trim();\n  const force = formatActuationForceToGf(el.dataset.switchForce || '');\n  const stroke = (el.dataset.switchStroke || '').trim();\n  const parts = [type, force, stroke].filter(Boolean);\n  el.textContent = parts.join('\uFF5C');\n}\n\nfunction renderAllSwitchSpecs(scope) {\n  scope.querySelectorAll('[data-switch-spec]').forEach(renderSwitchSpecLine);\n}\n\n\n(async () => {\n  const root = document.querySelector('[data-cfg3d]');\n  if (!root) return;\n\n  renderAllSwitchSpecs(root);\n\n  // --------------------------------------------------\n  // Elements\n  // --------------------------------------------------\n  const stepBtns = [...root.querySelectorAll('.cfg3d__step[data-step]')];\n  const panels   = [...root.querySelectorAll('[data-panel]')];\n\n  const rightTitleEl = root.querySelector('.cfg3d__title');\n\n  const nextBtn = root.querySelector('[data-next]');\n  const prevBtn = root.querySelector('[data-prev]');\n  const totalEl = root.querySelector('[data-total]');\n  const hiddenInputs = [...root.querySelectorAll('[data-selected-variant]')];\n  const shareBtn = root.querySelector('[data-share-build]');\n  const copyBtn = root.querySelector('[data-copy-build-url]');\n\n  // Viewer\n  const canvasHost  = root.querySelector('[data-canvas-host]');\n  const placeholder = root.querySelector('[data-placeholder]');\n  const loadingEl   = root.querySelector('[data-loading]');\n  const viewerTitleEl = root.querySelector('[data-viewer-title]');\n  const viewerSubEl   = root.querySelector('[data-viewer-sub]');\n  const imageModelNoteEl = root.querySelector('[data-image-model-note]');\n\n  // \u30C7\u30D5\u30A9\u30EB\u30C83D\u30E2\u30C7\u30EB\uFF08\u30D0\u30EA\u30A2\u30F3\u30C8\u306B GLB \u304C\u7121\u3044\u3068\u304D\u306E\u4EE3\u308F\u308A\uFF09\u3002\u7A7A\u306E\u5DE5\u7A0B\u306F\u5F93\u6765\u3069\u304A\u308A\n  const DEFAULT_MODELS = {\n    case:   { normal: root.dataset.defaultModelCase || '',   split: '' },\n    pcba:   { normal: root.dataset.defaultModelPcba || '',   split: root.dataset.defaultModelPcbaDiv || '' },\n    switch: { normal: root.dataset.defaultModelSwitch || '', split: root.dataset.defaultModelSwitchDiv || '' },\n    keycap: { normal: root.dataset.defaultModelKeycap || '', split: root.dataset.defaultModelKeycapDiv || '' },\n  };\n  const STEP_LABELS_JA = { case: '\u30B1\u30FC\u30B9', pcba: 'PCBA', switch: '\u30B9\u30A4\u30C3\u30C1', keycap: '\u30AD\u30FC\u30AD\u30E3\u30C3\u30D7' };\n\n  // Guide\n  const guideBtn = root.querySelector('[data-open-guide], [data-guide-open]');\n  const guideModal = root.querySelector('[data-guide-modal]');\n  const guideCloseEls = [...root.querySelectorAll('[data-guide-close]')];\n  const modalTitleEl = guideModal?.querySelector('.cfg3d-modal__title') || null;\n  const modalBodyEl  = guideModal?.querySelector('.cfg3d-modal__body') || null;\n\n  // Filter UI\n  const filterRoot = root.querySelector('[data-filter]');\nconst filterToggleBtns = [...root.querySelectorAll('[data-filter-toggle]')];\nconst filterPanelEl = root.querySelector('[data-filter-panel]');\n  const filterColorEl = root.querySelector('[data-filter-color]');\n  const filterVendorEl = root.querySelector('[data-filter-vendor]');\n  const filterMaterialEl = root.querySelector('[data-filter-material]');\n  const filterMinEl = root.querySelector('[data-filter-min]');\n  const filterMaxEl = root.querySelector('[data-filter-max]');\n\n  // Summary\n  const summaryListEl = root.querySelector('[data-summary-list]');\n  const summarySubtotalEl = root.querySelector('[data-summary-subtotal]');\n\n  // --------------------------------------------------\n  // Constants / State\n  // --------------------------------------------------\n  const NAV_STEPS   = ['case', 'pcba', 'switch', 'keycap', 'option', 'summary'];\n  const PRICE_STEPS = ['case', 'pcba', 'switch', 'keycap', 'option'];\n\n  const ASSEMBLY_FEE_CENTS = 500000; // \u00A55,000\n  const CUSTOM_KEYBOARD_VARIANT_ID = 54520547606601; // \u2190 \u5B9FID\u306B\u5909\u66F4\n\n  const STEP_UI = {\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' },\n    pcba:    { title: 'PCBA',           guideLabel: 'PCBA\u306E\u9078\u3073\u65B9',         modalTitle: 'PCBA\u306E\u9078\u3073\u65B9' },\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' },\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' },\n    option:  { title: '\u30AA\u30D7\u30B7\u30E7\u30F3',       guideLabel: '',                   modalTitle: '' },\n    summary: { title: '\u5408\u8A08',            guideLabel: '',                   modalTitle: '' },\n  };\n\n  // \u30E2\u30FC\u30C0\u30EB\u672C\u6587\u5DEE\u3057\u66FF\u3048\uFF08\u5FC5\u8981\u306A\u3089\uFF09\n  const GUIDE_HTML = {\n    case: null,\n    pcba: null,\n    switch: null,\n    keycap: null,\n    option: null,\n    summary: null,\n  };\n\n  // Tabs in modal (Corsair-like)\n  document.addEventListener('click', (e) => {\n    const tab = e.target.closest('[data-tab]');\n    if (!tab) return;\n    const wrap = tab.closest('[data-cfg3d-tabs]');\n    if (!wrap) return;\n\n    wrap.querySelectorAll('[data-tab]').forEach((b) => {\n      b.classList.remove('is-active');\n      b.setAttribute('aria-selected', 'false');\n    });\n    tab.classList.add('is-active');\n    tab.setAttribute('aria-selected', 'true');\n\n    wrap.querySelectorAll('.cfg3d-panel').forEach((p) => p.classList.remove('is-active'));\n    const panel = wrap.querySelector(`#${CSS.escape(tab.dataset.target)}`);\n    if (panel) panel.classList.add('is-active');\n  });\n\n  const state = {\n    currentStep: 'case',\n    size: '60', // '60' | '80'\n    selections: { case: null, pcba: null, switch: null, keycap: null, option: null },\n    filters: {\n      case:   { color:'', vendor:'', material:'', minYen:'', maxYen:'' },\n      pcba:   { color:'', vendor:'', material:'', minYen:'', maxYen:'' },\n      switch: { color:'', vendor:'', material:'', minYen:'', maxYen:'' },\n      keycap: { color:'', vendor:'', material:'', minYen:'', maxYen:'' },\n      option: { color:'', vendor:'', material:'', minYen:'', maxYen:'' },\n    },\n    cachedCaseModalHtml: null,\n  };\n\n  // --------------------------------------------------\n  // Money (JPY-safe)\n  // --------------------------------------------------\n  function formatMoneyJPYFromCents(cents) {\n    const yen = Math.round((Number(cents) || 0) / 100);\n    return `\u00A5${yen.toLocaleString('ja-JP')}`;\n  }\n\n  function calcSubtotalCents() {\n    return PRICE_STEPS.reduce((acc, step) => {\n      const s = state.selections[step];\n      return acc + (s ? (Number(s.priceCents) || 0) : 0);\n    }, ASSEMBLY_FEE_CENTS);\n  }\n\n  function updateTotal() {\n    const sumCents = calcSubtotalCents();\n    if (totalEl) totalEl.textContent = `+${formatMoneyJPYFromCents(sumCents)}`;\n  }\n\n  // --------------------------------------------------\n  // Helpers\n  // --------------------------------------------------\n    function hasBuildParamsInUrl() {\n  const params = new URLSearchParams(window.location.search);\n  return ['c', 'p', 'sw', 'k', 'o'].some(key => params.has(key));\n}\n\n  function restoreSelectionsFromUrl() {\n  const params = new URLSearchParams(window.location.search);\n\n  const keyMap = {\n    case: 'c',\n    pcba: 'p',\n    switch: 'sw',\n    keycap: 'k',\n    option: 'o'\n  };\n\n  PRICE_STEPS.forEach(step => {\n    const id = params.get(keyMap[step]);\n    if (!id) return;\n\n    const btn = optionButtons(step).find(b => b.dataset.variantId === id);\n    if (btn) {\n      selectOption(step, btn);\n    }\n  });\n}\n\n  function stepPanelEl(step) {\n    return root.querySelector(`[data-panel=\"${step}\"]`);\n  }\n\n  function optionButtons(step) {\n    return [...root.querySelectorAll(`[data-option][data-step=\"${step}\"]`)];\n  }\n\n  function hiddenInput(step) {\n    return hiddenInputs.find(i => i.dataset.selectedVariant === step) || null;\n  }\n\n  function isNone(btn) {\n    return btn.dataset.none === 'true';\n  }\n\n  function priceCents(btn) {\n    const n = Number(btn.dataset.price || 0);\n    return Number.isFinite(n) ? n : 0;\n  }\n\nfunction escapeHtml(str) {\n  return String(str)\n    .replace(/&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;')\n    .replace(/\"/g, '&quot;')\n    .replace(/'/g, '&#39;');\n}\n\n// ============================\n// \uD83D\uDD3D \u5DE6\u30DF\u30CB\u30B5\u30DE\u30EA\u30FC\u7528\n// ============================\n\nfunction getMiniSummaryStepLabel(step) {\n  const map = {\n    case: '\u30AD\u30FC\u30DC\u30FC\u30C9\u30B1\u30FC\u30B9',\n    pcba: 'PCBA',\n    switch: '\u30AD\u30FC\u30B9\u30A4\u30C3\u30C1',\n    keycap: '\u30AD\u30FC\u30AD\u30E3\u30C3\u30D7',\n    option: '\u30AA\u30D7\u30B7\u30E7\u30F3'\n  };\n  return map[step] || step;\n}\n\nfunction getSelectedProductAndVariant(step) {\n  const s = state.selections?.[step];\n  if (!s || !s.variantId) return null;\n\n  const productTitle = String(s.productTitle || '').trim();\n  const variantTitle = String(s.title || '').trim();\n\n  if (!productTitle) return null;\n  if (!variantTitle || variantTitle.toLowerCase() === 'none') return null;\n\n  return {\n    step,\n    stepLabel: getMiniSummaryStepLabel(step),\n    productTitle,\n    variantTitle\n  };\n}\nconst buildMini = root.querySelector('[data-build-mini]');\n\n// \u30B9\u30DE\u30DB\u3067\u306F\u958B\u304F\u3068\u5168\u753B\u9762\u306E\u30B7\u30FC\u30C8\u306B\u306A\u308B\u3002\u9589\u3058\u308B\u306E\u306F \u00D7 \u3060\u3051\uFF08\u4E2D\u8EAB\u306E\u30BF\u30C3\u30D7\u3067\u306F\u9589\u3058\u306A\u3044\uFF09\n// 3D\u30D3\u30E5\u30FC\u306E\u4E2D\u306E\u307E\u307E\u3060\u3068\u5DE5\u7A0B\u30BF\u30D6\u30FB\u5408\u8A08\u30D0\u30FC\u304C\u624B\u524D\u306B\u6765\u3066 \u00D7 \u304C\u62BC\u305B\u306A\u3044\u306E\u3067\u3001\u958B\u3044\u3066\u3044\u308B\u9593\u3060\u3051 body \u76F4\u4E0B\u3078\u79FB\u3059\nconst buildMiniHome = document.createComment('cfg3d-build-mini');\nfunction setBuildMiniOpen(open) {\n  if (!buildMini) return;\n  const sheet = open && window.matchMedia('(max-width: 980px)').matches;\n  if (sheet && buildMini.parentNode !== document.body) {\n    buildMini.replaceWith(buildMiniHome);\n    document.body.appendChild(buildMini);\n  } else if (!sheet && buildMiniHome.parentNode) {\n    buildMiniHome.replaceWith(buildMini);\n  }\n  buildMini.classList.toggle('is-open', open);\n  document.documentElement.classList.toggle('cfg3d-buildmini-open', open);\n  if (!open) buildMini.scrollTop = 0;\n}\n\n// \u4E2D\u3092\u30B9\u30AF\u30ED\u30FC\u30EB\u3057\u305F\u307E\u307E\u9589\u3058\u308B\u3068\u300CBUILD SUMMARY\u300D\u306E\u6587\u5B57\u304C\u4E0A\u306B\u62BC\u3057\u51FA\u3055\u308C\u3001\u7A7A\u306E\u767D\u3044\u30D0\u30FC\u3060\u3051\u6B8B\u308B\u3002\u9589\u3058\u305F\u3089\u5148\u982D\u306B\u623B\u3059\nbuildMini?.addEventListener('mouseleave', () => {\n  if (!buildMini.classList.contains('is-open')) buildMini.scrollTop = 0;\n});\n\nbuildMini?.addEventListener('click', (e) => {\n  e.stopPropagation();\n  if (e.target.closest('[data-build-mini-close]')) {\n    setBuildMiniOpen(false);\n    return;\n  }\n  if (!buildMini.classList.contains('is-open')) setBuildMiniOpen(true);\n});\n// ============================\n// Build summary outside tap close\n// ============================\n\ndocument.addEventListener('click', (e) => {\n  const buildMini = document.querySelector('[data-build-mini]');\n  if (!buildMini) return;\n\n  const clickedInside = buildMini.contains(e.target);\n\n  // \u5916\u30BF\u30C3\u30D7\u306A\u3089\u9589\u3058\u308B\n  if (!clickedInside && buildMini.classList.contains('is-open')) {\n    setBuildMiniOpen(false);\n  }\n});\nfunction renderBuildMiniSummary() {\n  const wrap = buildMini;\n  const body = buildMini?.querySelector('[data-build-mini-body]');\n  if (!wrap || !body) return;\n\n  const steps = ['case', 'pcba', 'switch', 'keycap', 'option'];\n  const items = steps\n    .map(getSelectedProductAndVariant)\n    .filter(Boolean);\n\n  if (!items.length) {\n    wrap.hidden = true;\n    body.innerHTML = '';\n    return;\n  }\n\n  body.innerHTML = items.map(item => {\n    const showVariant =\n      item.variantTitle &&\n      item.variantTitle !== 'Default Title' &&\n      item.variantTitle !== item.productTitle;\n\n    return `\n      <div class=\"cfg3d__buildMiniItem\">\n        <div class=\"cfg3d__buildMiniLabel\">${escapeHtml(item.stepLabel)}</div>\n        <div class=\"cfg3d__buildMiniProduct\">${escapeHtml(item.productTitle)}</div>\n        ${showVariant ? `<div class=\"cfg3d__buildMiniVariant\">${escapeHtml(item.variantTitle)}</div>` : ''}\n      </div>\n    `;\n  }).join('');\n\n  wrap.hidden = false;\n}\n    function getSelectionLabel(step) {\n    const s = state.selections[step];\n    if (!s) return '\u306A\u3057';\n\n    const raw = s.title || '\u306A\u3057';\n    if (raw === 'Default Title') return '\u9078\u629E\u6E08\u307F';\n    if (raw === 'None') return '\u306A\u3057';\n    return raw;\n  }\n\n  function getSelectionDisplay(step) {\n  const s = state.selections[step];\n  if (!s) return '\u306A\u3057';\n\n  if (!s.variantId) return '\u306A\u3057';\n\n  const productTitle = (s.productTitle || '').trim();\n  const variantTitle = (s.title || '').trim();\n\n  if (!variantTitle || variantTitle === 'None') return '\u306A\u3057';\n  if (variantTitle === 'Default Title') {\n    return productTitle || '\u9078\u629E\u6E08\u307F';\n  }\n\n  if (productTitle && productTitle !== variantTitle) {\n    return `${productTitle} - ${variantTitle}`;\n  }\n\n  return variantTitle || productTitle || '\u9078\u629E\u6E08\u307F';\n}\n\nfunction getProductName(step) {\n  const s = state.selections[step];\n  if (!s) return 'None';\n\n  return s.productTitle || s.title || 'None';\n}\n\nfunction buildShareText() {\n  const lines = [\n    'HYPE CUSTOM BUILD PREVIEW',\n    '',\n    `Case\uFF1A${getProductName('case')}`,\n    `PCBA\uFF1A${getProductName('pcba')}`,\n    `Switch\uFF1A${getProductName('switch')}`,\n    `Keycap\uFF1A${getProductName('keycap')}`,\n    '',\n    '#HYPESHOP'\n  ];\n\n  return lines.join('\\n');\n}\n\n// \u30B7\u30A7\u30A2\u306E\u30DA\u30FC\u30B8\u306E\u30D7\u30EC\u30D3\u30E5\u30FC\u8AAC\u660E\u6587\uFF08\u300C\u30B1\u30FC\u30B9\uFF1A\u2026\u300D\uFF09\u3002\u91D1\u984D\u306F\u5165\u308C\u306A\u3044\uFF08\u30B7\u30A7\u30A2\u306E\u30DA\u30FC\u30B8\u3067\u958B\u3044\u305F\u6642\u70B9\u306E\u4FA1\u683C\u3092\u51FA\u3059\uFF09\nfunction buildShareSummary() {\n  const lines = [['\u30B1\u30FC\u30B9', 'case'], ['PCBA', 'pcba'], ['\u30B9\u30A4\u30C3\u30C1', 'switch'], ['\u30AD\u30FC\u30AD\u30E3\u30C3\u30D7', 'keycap'], ['\u30AA\u30D7\u30B7\u30E7\u30F3', 'option']]\n    .map(([label, step]) => [label, getSelectionDisplay(step).replace(/\u3010[^\u3011]*\u3011/g, '').trim()])\n    .filter(([, v]) => v && v !== '\u306A\u3057')\n    .map(([label, v]) => `${label}\uFF1A${v}`);\n  return lines.join('\\n');\n}\n\nfunction setShareLoading(on) {\n  if (!shareBtn) return;\n  if (!shareBtn.dataset.defaultHtml) {\n    shareBtn.dataset.defaultHtml = shareBtn.innerHTML || '\u3067\u30B7\u30A7\u30A2';\n  }\n\n  shareBtn.disabled = on;\n  shareBtn.setAttribute('aria-busy', on ? 'true' : 'false');\n  if (on) {\n    shareBtn.textContent = '\u753B\u50CF\u751F\u6210\u4E2D\u2026';\n  } else {\n    shareBtn.innerHTML = shareBtn.dataset.defaultHtml;\n  }\n}\n\n  function buildShareUrl() {\n  const url = new URL(window.location.href);\n\n  url.search = '';\n\n  const keyMap = {\n    case: 'c',\n    pcba: 'p',\n    switch: 'sw',\n    keycap: 'k',\n    option: 'o'\n  };\n\n  ['case', 'pcba', 'switch', 'keycap', 'option'].forEach(step => {\n    const s = state.selections[step];\n    if (s?.variantId) {\n      url.searchParams.set(keyMap[step], s.variantId);\n    }\n  });\n\n  return url.toString();\n}\n\n  function publishEvent(name, data) {\n    try { window.Shopify?.analytics?.publish?.(name, data || {}); } catch (_) {}\n  }\n\n  function showSharePopupBlockedNotice(xIntentUrl) {\n    const host = root.querySelector('[data-panel=\"summary\"]') || root;\n    let box = root.querySelector('[data-share-popup-notice]');\n    if (!box) {\n      box = document.createElement('div');\n      box.className = 'cfg3d-share-popup-notice';\n      box.dataset.sharePopupNotice = '';\n      box.setAttribute('role', 'status');\n      host.appendChild(box);\n    }\n    const safeUrl = String(xIntentUrl).replace(/\"/g, '&quot;');\n    box.innerHTML = `\n      <p style=\"margin:0 0 10px;line-height:1.6\">\u30DD\u30C3\u30D7\u30A2\u30C3\u30D7\u304C\u30D6\u30ED\u30C3\u30AF\u3055\u308C\u307E\u3057\u305F\u3002\u30D6\u30E9\u30A6\u30B6\u3067\u30DD\u30C3\u30D7\u30A2\u30C3\u30D7\u3092\u8A31\u53EF\u3057\u3066\u304B\u3089\u3001\u4E0B\u306E\u30EA\u30F3\u30AF\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066 X \u3067\u30B7\u30A7\u30A2\u3057\u3066\u304F\u3060\u3055\u3044\u3002</p>\n      <a style=\"display:inline-block;font-weight:700;color:#5b2dff;text-decoration:underline\" href=\"${safeUrl}\" target=\"_blank\" rel=\"noopener noreferrer\">X \u3067\u30B7\u30A7\u30A2\u3059\u308B</a>\n    `;\n    box.style.cssText = 'margin-top:14px;padding:14px 16px;border-radius:10px;background:#fff8e8;border:1px solid #f0d9a8;font-size:14px';\n    box.hidden = false;\n    box.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n  }\n\n  async function shareBuild() {\n    const startedAt = Date.now();\n    const text = buildShareText();\n    const restoreUrl = new URL(buildShareUrl());\n    const query = {};\n    restoreUrl.searchParams.forEach((v, k) => { if (/^(c|p|sw|k|o)$/.test(k)) query[k] = v; });\n\n    root.querySelector('[data-share-popup-notice]')?.setAttribute('hidden', 'hidden');\n\n    // \u62BC\u3057\u305F\u77AC\u9593\u306B\u30BF\u30D6\u3092\u958B\u3044\u3066\u304A\u304F\uFF08\u753B\u50CF\u3092\u4F5C\u3063\u3066\u304B\u3089\u958B\u304F\u3068\u30DD\u30C3\u30D7\u30A2\u30C3\u30D7\u30D6\u30ED\u30C3\u30AF\u3055\u308C\u308B\u305F\u3081\uFF09\n    const win = window.open('', '_blank');\n    if (win) {\n      try {\n        win.opener = null;\n        win.document.title = '\u30B7\u30A7\u30A2\u753B\u50CF\u3092\u4F5C\u6210\u4E2D\u2026';\n        win.document.body.innerHTML = '<p style=\"font:15px/1.8 sans-serif;padding:24px;color:#333\">\u30B7\u30A7\u30A2\u753B\u50CF\u3092\u4F5C\u6210\u4E2D\u3067\u3059\u2026</p>';\n      } catch (_) {}\n    }\n\n    let shareUrl = restoreUrl.toString();\n    let shareResult = 'fallback';\n    setShareLoading(true);\n    try {\n      const image = await buildShareImage();\n      if (image && Object.keys(query).length) {\n        const res = await fetch(SHARE_SERVICE_URL, {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify({ image, query, summary: buildShareSummary() })\n        });\n        if (res.ok) {\n          const data = await res.json().catch(() => null);\n          if (data?.shareUrl) { shareUrl = data.shareUrl; shareResult = 'ok'; }\n        } else {\n          console.warn('[CFG3D] share service', res.status);\n        }\n      }\n    } catch (e) {\n      console.warn('[CFG3D] share image failed', e);\n    } finally {\n      setShareLoading(false);\n    }\n    publishEvent('hype_custom_share', { result: shareResult, ms: Date.now() - startedAt, parts: Object.keys(query).length });\n\n    const xIntentUrl =\n      `https://twitter.com/intent/tweet?text=${encodeURIComponent(text)}&url=${encodeURIComponent(shareUrl)}`;\n    if (win && !win.closed) {\n      try { win.location.href = xIntentUrl; } catch (_) { showSharePopupBlockedNotice(xIntentUrl); }\n    } else {\n      showSharePopupBlockedNotice(xIntentUrl);\n    }\n  }\n\n    async function copyBuildUrl() {\n    const url = buildShareUrl();\n\n    try {\n      await navigator.clipboard.writeText(url);\n\n      if (copyBtn) {\n        const originalText = copyBtn.textContent;\n        copyBtn.textContent = '\u30B3\u30D4\u30FC\u3057\u307E\u3057\u305F\uFF01';\n\n        setTimeout(() => {\n          copyBtn.textContent = originalText;\n        }, 1600);\n      }\n    } catch (e) {\n      console.warn('[CFG3D] copy url failed', e);\n      alert('URL\u306E\u30B3\u30D4\u30FC\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002');\n    }\n  }\n\n  // tag normalize: \"60\uFF05\" => \"60%\"\n  function norm(s) {\n    return String(s || '')\n      .replace(/\uFF05/g, '%')   // \u5168\u89D2\uFF05\n      .replace(/\\s+/g, ' ')     // \u9023\u7D9A\u7A7A\u767D\n      .trim()\n      .toLowerCase();\n  }\n\n  function tagsOf(btn) {\n    return norm(btn.dataset.tags || '');\n  }\n\n  function sizeTagToken() {\n    return state.size === '80' ? '80%' : '60%';\n  }\n\n  function hasTagToken(btn, token) {\n  if (!token) return true;\n  const t = norm(token);\n  return tagsOf(btn).includes(t);\n}\n\n/* GLB\u767B\u9332\u6E08\u307F\u304B */\nfunction hasDefaultModel(step) {\n  return !!(DEFAULT_MODELS[step] && DEFAULT_MODELS[step].normal);\n}\n\n// 3D\u7528\u306E\u30BF\u30B0\u304C\u305D\u308D\u3063\u3066\u3044\u308B\u304B\uFF08\u305D\u308D\u3063\u3066\u3044\u306A\u3044\u5546\u54C1\u306F\u30C7\u30D5\u30A9\u30EB\u30C8\u3067\u51FA\u3059\u3068\u30D3\u30EB\u30C0\u30FC\u306E\u7D5E\u308A\u8FBC\u307F\u304C\u5D29\u308C\u308B\uFF09\n// \u30B1\u30FC\u30B9: 60%\uFF0FPCBA: 60%\uFF0B\u901A\u5E38\u304B\u5206\u5272\u304B\u5206\u304B\u308B\uFF08\u30BF\u30B0 or \u30D0\u30EA\u30A8\u30FC\u30B7\u30E7\u30F3\u540D\uFF09\uFF0F\u30B9\u30A4\u30C3\u30C1\u30FB\u30AD\u30FC\u30AD\u30E3\u30C3\u30D7: 60%\uFF0B\u901A\u5E38\u30B9\u30DA\u30FC\u30B9 or \u5206\u5272\u30B9\u30DA\u30FC\u30B9\nfunction has3dTags(step, btn) {\n  if (!hasTagToken(btn, '60%')) return false;\n  if (step === 'pcba') return isSplitSpaceButton(btn) || isNormalSpaceButton(btn);\n  if (step === 'switch' || step === 'keycap') return hasExactTag(btn, '\u901A\u5E38\u30B9\u30DA\u30FC\u30B9') || hasExactTag(btn, '\u5206\u5272\u30B9\u30DA\u30FC\u30B9');\n  return step === 'case';\n}\n\n// \u30C7\u30D5\u30A9\u30EB\u30C8\u306E\u30E2\u30C7\u30EB\u3068\u5F62\u304C\u5927\u304D\u304F\u9055\u3046\u3082\u306E\u306F\u9664\u5916\u3059\u308B\u3002GLB \u304C\u5165\u308B\u307E\u3067\u96A0\u308C\u308B\n// \u5546\u54C1\u3054\u3068\uFF1A\u30BF\u30B0\u300C3D\u30C7\u30D5\u30A9\u30EB\u30C8\u4E0D\u53EF\u300D\uFF0F\u4E00\u90E8\u306E\u30D0\u30EA\u30A8\u30FC\u30B7\u30E7\u30F3\u3060\u3051\uFF08Zoom64 \u306E 64key \u306A\u3069\uFF09\uFF1A\u30D0\u30EA\u30A8\u30FC\u30B7\u30E7\u30F3\u306E\u30E1\u30BF\u30D5\u30A3\u30FC\u30EB\u30C9 cfg3d.no_default\nconst NO_DEFAULT_MODEL_TAG = '3D\u30C7\u30D5\u30A9\u30EB\u30C8\u4E0D\u53EF';\n\nfunction isDefaultModelBlocked(btn) {\n  return String(btn.dataset.tags || '').includes(NO_DEFAULT_MODEL_TAG) || btn.dataset.noDefaultModel === 'true';\n}\n\n// GLB \u304C\u7121\u304F\u3066\u3082\u30C7\u30D5\u30A9\u30EB\u30C83D\u3067\u51FA\u3057\u3066\u3088\u3044\u304B\nfunction canUseDefaultModel(step, btn) {\n  return hasDefaultModel(step) && has3dTags(step, btn) && !isDefaultModelBlocked(btn);\n}\n\nfunction hasModelGlb(btn) {\n  return String(btn.dataset.modelUrl || '').trim() !== '';\n}\n\n  function vendorMatch(btn, vendor) {\n  if (!vendor) return true;\n  return (btn.dataset.vendor || '').trim() === vendor;\n}\n\nfunction colorMatch(btn, color) {\n  if (!color) return true;\n\n  const selected = color.trim().toLowerCase();\n  const colors = String(btn.dataset.baseColor || '')\n    .split(',')\n    .map(v => v.trim().toLowerCase())\n    .filter(Boolean);\n\n  return colors.includes(selected);\n}\n\nfunction materialMatch(btn, material) {\n  if (!material) return true;\n  const m = (btn.dataset.material || '').trim();\n  return m.includes(material);\n}\n\n  function yenToCents(yenStr) {\n    const n = Number(String(yenStr || '').replace(/[^\\d.-]/g, ''));\n    if (!Number.isFinite(n) || n <= 0) return null;\n    return Math.round(n * 100);\n  }\n\n  function priceMatch(btn, minCents, maxCents) {\n    const p = Number(btn.dataset.price || 0);\n    if (!Number.isFinite(p)) return true;\n    if (minCents != null && p < minCents) return false;\n    if (maxCents != null && p > maxCents) return false;\n    return true;\n  }\n\n  function isOptionItem(btn) {\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\n    return hasTagToken(btn, '\u30AA\u30D7\u30B7\u30E7\u30F3');\n  }\n  function hasExactTag(btn, tagName) {\n  const tags = String(btn.dataset.tags || '')\n    .split(',')\n    .map(v => v.trim())\n    .filter(Boolean);\n\n  return tags.includes(tagName);\n}\n\nfunction isSplitSpaceButton(btn) {\n  if (!btn) return false;\n\n  const variantTitle = String(btn.dataset.variantTitle || '').trim();\n  return variantTitle.includes('\u5206\u5272\u30B9\u30DA\u30FC\u30B9') || hasExactTag(btn, '\u5206\u5272\u30B9\u30DA\u30FC\u30B9');\n}\n\nfunction isNormalSpaceButton(btn) {\n  if (!btn) return false;\n\n  const variantTitle = String(btn.dataset.variantTitle || '').trim();\n  return variantTitle.includes('\u901A\u5E38\u30B9\u30DA\u30FC\u30B9') || hasExactTag(btn, '\u901A\u5E38\u30B9\u30DA\u30FC\u30B9');\n}\n\n// [PATCH] \u9078\u629E\u4E2D\u30B1\u30FC\u30B9\u304C\u300C\u5206\u5272\u30B9\u30DA\u30FC\u30B9\u975E\u5BFE\u5FDC\u300D\u30BF\u30B0\u3092\u6301\u3064\u304B\n// \uFF08\u30B1\u30FC\u30B9\u306E data-tags \u306F\u30B9\u30DA\u30FC\u30B9\u533A\u5207\u308A\u306A\u306E\u3067\u90E8\u5206\u4E00\u81F4\u3067\u5224\u5B9A\uFF09\nfunction caseBlocksSplit() {\n  const caseBtn = state.selections.case?.btn;\n  if (!caseBtn) return false;\n  return String(caseBtn.dataset.tags || '').includes('\u5206\u5272\u30B9\u30DA\u30FC\u30B9\u975E\u5BFE\u5FDC');\n}\n\nfunction getPcbaLayoutMode() {\n  const btn = state.selections.pcba?.btn;\n  if (!btn || isNone(btn)) return 'none';\n  if (isSplitSpaceButton(btn)) return 'split';\n  if (isNormalSpaceButton(btn)) return 'normal';\n  return 'none';\n}\n\nfunction isSplitSpacePcbaSelected() {\n  return getPcbaLayoutMode() === 'split';\n}\n\nfunction isNormalSpacePcbaSelected() {\n  return getPcbaLayoutMode() === 'normal';\n}\n\n// \u9078\u3093\u3060\u30D1\u30FC\u30C4\u306E3D\u30E2\u30C7\u30EB\u3002\u81EA\u524D\u306E GLB \u304C\u7121\u3051\u308C\u3070\u5DE5\u7A0B\u306E\u30C7\u30D5\u30A9\u30EB\u30C8\uFF08isDefault=true\uFF09\nfunction resolveModelForSelection(step, btn) {\n  const own = getModelUrlForSelection(step, btn);\n  if (own || !btn || isNone(btn) || !canUseDefaultModel(step, btn)) return { url: own, isDefault: false };\n  const d = DEFAULT_MODELS[step];\n  const url = (getPcbaLayoutMode() === 'split' && d.split) ? d.split : d.normal;\n  return { url, isDefault: !!url };\n}\n\nfunction updateImageModelNote() {\n  if (!imageModelNoteEl) return;\n  const steps = Object.keys(STEP_LABELS_JA).filter(st => state.selections[st]?.isDefaultModel);\n  imageModelNoteEl.hidden = steps.length === 0;\n  imageModelNoteEl.textContent = steps.length\n    ? `${steps.map(st => STEP_LABELS_JA[st]).join('\u30FB')}\u306F\u30A4\u30E1\u30FC\u30B8\u30E2\u30C7\u30EB\u3067\u3059\uFF08\u5B9F\u7269\u3068\u306F\u7570\u306A\u308A\u307E\u3059\uFF09`\n    : '';\n}\n\nfunction getModelUrlForSelection(step, btn) {\n  if (!btn) return '';\n\n  const normalUrl = btn.dataset.modelUrl || '';\n  const divUrl = btn.dataset.divModelUrl || '';\n  const mode = getPcbaLayoutMode();\n\n  // PCBA\u81EA\u8EAB\n  if (step === 'pcba') {\n    if (mode === 'split') {\n      return divUrl || normalUrl;\n    }\n    return normalUrl;\n  }\n\n  // switch / keycap\n  if (step === 'switch' || step === 'keycap') {\n\n    if (mode === 'split' && divUrl) {\n      return divUrl;\n    }\n\n    return normalUrl;\n  }\n\n  return normalUrl;\n}\n\nfunction resetSelectionStep(step) {\n  optionButtons(step).forEach(b => {\n    b.classList.remove('is-selected');\n    b.setAttribute('aria-pressed', 'false');\n  });\n\n  state.selections[step] = null;\n\n  const input = hiddenInput(step);\n  if (input) input.value = '';\n\n  clearModel(step);\n  updateImageModelNote();\n  renderBuildMiniSummary(); // \u5916\u308C\u305F\u30D1\u30FC\u30C4\u304C\u30B5\u30DE\u30EA\u30FC\u306B\u6B8B\u3089\u306A\u3044\u3088\u3046\u306B\n\n  // \u4F55\u3082\u8868\u793A\u30E2\u30C7\u30EB\u304C\u306A\u304F\u306A\u3063\u305F\u3089\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u8868\u793A\n  const any = Object.values(modelsByStep).some(Boolean);\n  if (!any) {\n    if (placeholder) placeholder.style.display = '';\n    if (canvasHost) canvasHost.style.display = 'none';\n  }\n}\n\nfunction resetDependentSelectionsByPcba() {\n  resetSelectionStep('switch');\n  resetSelectionStep('keycap');\n}\n\n  // --------------------------------------------------\n  // Guide modal (open/close + step-specific)\n  // --------------------------------------------------\n  function updateGuideContent(step) {\n  if (!modalBodyEl) return;\n\n  const contents = [...modalBodyEl.querySelectorAll('[data-guide-content]')];\n  if (!contents.length) return;\n\n  contents.forEach(el => {\n    el.hidden = el.dataset.guideContent !== step;\n  });\n\n  const activeContent = modalBodyEl.querySelector(`[data-guide-content=\"${step}\"]`);\n  const firstTab = activeContent?.querySelector('[data-tab]');\n  if (firstTab) firstTab.click();\n}\n  function openGuide() {\n  if (!guideModal) return;\n\n  updateGuideContent(state.currentStep);\n\n  guideModal.hidden = false;\n  document.documentElement.style.overflow = 'hidden';\n\n  const dialog = guideModal.querySelector('.cfg3d-modal__dialog');\n  dialog?.focus?.();\n}\n\n  function closeGuide() {\n    if (!guideModal) return;\n    guideModal.hidden = true;\n    document.documentElement.style.overflow = '';\n    guideBtn?.focus?.();\n  }\n\n  guideBtn?.addEventListener('click', openGuide);\n  guideCloseEls.forEach(el => el.addEventListener('click', closeGuide));\n  document.addEventListener('keydown', (e) => {\n    if (e.key === 'Escape' && guideModal && !guideModal.hidden) closeGuide();\n  });\n\n  function toggleGuideGroups(step) {\n    if (!modalBodyEl) return;\n    const groups = [...modalBodyEl.querySelectorAll('[data-guide-group]')];\n    if (!groups.length) return;\n    groups.forEach(g => g.hidden = (g.dataset.guideGroup !== step));\n  }\n\n  function setGuideForStep(step) {\n    // \u2705 option / summary \u3067\u306F\u30AC\u30A4\u30C9\u81EA\u4F53\u3092\u975E\u8868\u793A\n    const hideGuide = (step === 'summary' || step === 'option' || step === 'switch');\n    if (guideBtn) guideBtn.hidden = hideGuide;\n\n    const ui = STEP_UI[step] || STEP_UI.case;\n\n    if (!hideGuide && guideBtn) {\n      const labelSpan = guideBtn.querySelector('[data-guide-label]') || guideBtn.querySelector('span:last-child');\n      if (labelSpan) labelSpan.textContent = ui.guideLabel;\n      else guideBtn.textContent = ui.guideLabel;\n    }\n\n    if (modalTitleEl) modalTitleEl.textContent = ui.modalTitle || '';\n\n    if (!modalBodyEl) return;\n\nif (!hideGuide) {\n  updateGuideContent(step);\n}\n  }\n\n  // --------------------------------------------------\n  // Summary\n  // --------------------------------------------------\n  function renderSummary() {\n    if (!summaryListEl || !summarySubtotalEl) return;\n\n    const items = PRICE_STEPS\n      .map(step => ({ step, s: state.selections[step] }))\n      .filter(({ s }) => s && s.variantId);\n\n    const assemblyRow = `\n      <div class=\"cfg3d-summary__row\">\n        <div class=\"cfg3d-summary__left\">\n          <div class=\"cfg3d-summary__label\">\u7D44\u307F\u7ACB\u3066\u6599\u91D1</div>\n          <div class=\"cfg3d-summary__value\">\u30AB\u30B9\u30BF\u30E0\u30AD\u30FC\u30DC\u30FC\u30C9\u7D44\u307F\u7ACB\u3066</div>\n        </div>\n        <div class=\"cfg3d-summary__price\">${formatMoneyJPYFromCents(ASSEMBLY_FEE_CENTS)}</div>\n      </div>\n    `;\n\n    if (items.length === 0) {\n      summaryListEl.innerHTML = `\n        ${assemblyRow}\n        <div class=\"cfg3d-summary__empty\">\u30D1\u30FC\u30C4\u306F\u307E\u3060\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002</div>\n      `;\n      summarySubtotalEl.textContent = formatMoneyJPYFromCents(calcSubtotalCents());\n      return;\n    }\n\n    summaryListEl.innerHTML = assemblyRow + items.map(({ step, s }) => {\n  const label = STEP_UI[step]?.title || step;\n  const price = formatMoneyJPYFromCents(Number(s.priceCents) || 0);\n\n  const productTitle = escapeHtml(s.productTitle || '');\n  const variantTitle = escapeHtml(s.title || '\u2014');\n\n  const showVariant =\n    s.title &&\n    s.title !== 'Default Title' &&\n    s.title !== s.productTitle;\n\n  return `\n    <div class=\"cfg3d-summary__row\">\n      <div class=\"cfg3d-summary__left\">\n        <div class=\"cfg3d-summary__label\">${label}</div>\n        <div class=\"cfg3d-summary__product\">${productTitle}</div>\n        ${showVariant ? `<div class=\"cfg3d-summary__variant\">${variantTitle}</div>` : ''}\n      </div>\n      <div class=\"cfg3d-summary__price\">${price}</div>\n    </div>\n  `;\n}).join('');\n\n    summarySubtotalEl.textContent = formatMoneyJPYFromCents(calcSubtotalCents());\n  }\n\n  // --------------------------------------------------\n  // Step handling\n  // --------------------------------------------------\n  function setStep(step) {\n    state.currentStep = step;\n\n    // Clarity \u5DE5\u7A0B\u30BF\u30B0\uFF08\u9332\u753B\u3092 builder_step=option \u7B49\u3067\u62BD\u51FA\u30FBEC-204 Fix3\uFF09\n    window.clarity?.('set', 'builder_step', step);\n\n    stepBtns.forEach(b => {\n      const on = b.dataset.step === step;\n      b.classList.toggle('is-active', on);\n      b.classList.toggle('is-muted', !on);\n      on ? b.setAttribute('aria-current', 'step') : b.removeAttribute('aria-current');\n    });\n\n    panels.forEach(p => { p.hidden = p.dataset.panel !== step; });\n\n    if (rightTitleEl) rightTitleEl.textContent = (STEP_UI[step]?.title) || step;\n\n    // filter\u306Fsummary\u30FBpcba\u3067\u96A0\u3059\uFF08PCBA\u306F\u7D5E\u308A\u8FBC\u307F\u4E0D\u8981\uFF09\n    const hideFilter = (step === 'summary' || step === 'pcba');\n    if (filterRoot) filterRoot.hidden = hideFilter;\n    filterToggleBtns.forEach(btn => {\n  btn.hidden = hideFilter;\n});\n\n    // guide\n    setGuideForStep(step);\n\n    if (shareBtn) shareBtn.hidden = (step !== 'summary');\n    if (copyBtn) copyBtn.hidden = (step !== 'summary');\n    if (prevBtn) prevBtn.disabled = (step === NAV_STEPS[0]);\n    if (nextBtn) nextBtn.disabled = false;\n\n    if (nextBtn) nextBtn.textContent =\n      (step === 'summary') ? '\u30AB\u30FC\u30C8\u306B\u8FFD\u52A0'\n      : (step === 'option') ? '\u6CE8\u6587\u3078'\n      : '\u6B21\u3078';\n\n    if (step !== 'summary') ensureDefaultSelection(step);\n\nif (step !== 'summary') applyFilters(step);\n\nif (step === 'case' || step === 'keycap') {\n  openFirstVisibleAccordion(step);\n}\n\nif (step !== 'summary') {\n  const s = state.selections[step];\n  if (viewerTitleEl) viewerTitleEl.textContent = s?.title || '\u2014';\n  if (viewerSubEl) viewerSubEl.textContent = s?.modelUrl ? '3D\u8868\u793A\u4E2D' : '3D\u30E2\u30C7\u30EB\u672A\u8A2D\u5B9A';\n  if (THREE && s) fireAndForget(loadModelForStep(step, s.modelUrl || ''));\n}\n\n    if (step === 'summary') renderSummary();\n  }\n\n  function goStep(delta) {\n    const idx = NAV_STEPS.indexOf(state.currentStep);\n    const next = Math.max(0, Math.min(NAV_STEPS.length - 1, idx + delta));\n    setStep(NAV_STEPS[next]);\n  }\n\n  // --------------------------------------------------\n  // Selection\n  // --------------------------------------------------\n  function selectOption(step, btn) {\n  const isPcbaChange =\n    step === 'pcba' &&\n    state.selections.pcba?.variantId !== (isNone(btn) ? '' : (btn.dataset.variantId || ''));\n\n  optionButtons(step).forEach(b => {\n    const on = b === btn;\n    b.classList.toggle('is-selected', on);\n    b.setAttribute('aria-pressed', String(on));\n  });\n\n  const resolvedModel = resolveModelForSelection(step, btn);\n\n  const selection = {\n    btn,\n    variantId: isNone(btn) ? '' : (btn.dataset.variantId || ''),\n    productTitle: btn.dataset.productTitle || (isNone(btn) ? 'None' : ''),\n    title: btn.dataset.variantTitle || (isNone(btn) ? 'None' : '\u2014'),\n    priceCents: isNone(btn) ? 0 : priceCents(btn),\n    modelUrl: resolvedModel.url,\n    isDefaultModel: resolvedModel.isDefault\n  };\n\n  state.selections[step] = selection;\n\n  const input = hiddenInput(step);\n  if (input) input.value = selection.variantId;\n\nif (isPcbaChange) {\n  resetDependentSelectionsByPcba();\n  applyFilters('switch');\n  applyFilters('keycap');\n}\n\n  // [PATCH] \u30B1\u30FC\u30B9\u3092\u5909\u3048\u305F\u3089\u3001PCBA\u306E\u5206\u5272\u30B9\u30DA\u30FC\u30B9\u53EF\u5426\u3082\u518D\u8A55\u4FA1\u3059\u308B\n  if (step === 'case') {\n    applyFilters('pcba');\n  }\n\n  updateTotal();\n\n  if (state.currentStep === step) {\n    if (viewerTitleEl) viewerTitleEl.textContent = selection.title || '\u2014';\n    if (viewerSubEl) viewerSubEl.textContent = selection.modelUrl ? '3D\u8868\u793A\u4E2D' : '3D\u30E2\u30C7\u30EB\u672A\u8A2D\u5B9A';\n  }\n\n  if (THREE) fireAndForget(loadModelForStep(step, selection.modelUrl || ''));\n  updateImageModelNote();\n  renderBuildMiniSummary();\n}\n\n  function isSoldOutButton(btn) {\n  return (\n    btn.disabled ||\n    btn.dataset.soldout === 'true' ||\n    btn.getAttribute('aria-disabled') === 'true' ||\n    btn.classList.contains('is-soldout') ||\n    btn.classList.contains('soldout') ||\n    btn.classList.contains('is-disabled')\n  );\n}\n\nfunction getFirstVisibleSelectableOption(step) {\n  return optionButtons(step).find(btn => {\n    if (isNone(btn)) return false;\n    if (btn.hidden) return false;\n    if (isSoldOutButton(btn)) return false;\n    return true;\n  }) || null;\n}\n\nfunction ensureDefaultSelection(step) {\n  if (state.selections[step]) return;\n\n  // case \u3060\u3051\u81EA\u52D5\u9078\u629E\n  if (step === 'case') {\n    const firstVisible = getFirstVisibleSelectableOption(step);\n    if (firstVisible) {\n      selectOption(step, firstVisible);\n      return;\n    }\n  }\n\n  // \u305D\u308C\u4EE5\u5916\u306F None\n  const noneBtn = optionButtons(step).find(b => isNone(b));\n  if (noneBtn) selectOption(step, noneBtn);\n}\n\n  // --------------------------------------------------\n  // Filter UI (+ size)\n  // --------------------------------------------------\n  function toggleFilterPanel(e) {\n  if (e) e.stopPropagation();\n  if (!filterPanelEl) return;\n  filterPanelEl.hidden = !filterPanelEl.hidden;\n}\n\nfilterToggleBtns.forEach(btn => {\n  btn.addEventListener('click', toggleFilterPanel);\n});\n\ndocument.addEventListener('click', (e) => {\n  if (!filterRoot || !filterPanelEl) return;\n  if (!filterRoot.contains(e.target)) {\n    filterPanelEl.hidden = true;\n  }\n});\n\n  function getCurrentFilterState(step) {\n    return state.filters[step] || { color:'', vendor:'', material:'', minYen:'', maxYen:'' };\n  }\n\n  function openFirstVisibleAccordion(step) {\n  const panel = stepPanelEl(step);\n  if (!panel) return;\n\n  const accordions = [...panel.querySelectorAll('.cfg3d-accordion')].filter(el => !el.hidden);\n  if (!accordions.length) return;\n\n  accordions.forEach((el, i) => {\n    el.open = (i === 0);\n  });\n}\n\nfunction rebuildVendorOptions(step) {\n  if (!filterVendorEl) return;\n\n  const fs = getCurrentFilterState(step);\n  const minCents = yenToCents(fs.minYen);\n  const maxCents = yenToCents(fs.maxYen);\n  const sizeToken = sizeTagToken();\n  const layoutMode = getPcbaLayoutMode();\n\n  const vendorSet = new Set();\n\n  const btns = optionButtons(step).filter(btn => {\n    if (isNone(btn)) return false;\n    if (isSoldOutButton(btn)) return false;\n\n    const okSize = (step === 'option') ? true : hasTagToken(btn, sizeToken);\n    const okOption = (step === 'option') ? isOptionItem(btn) : true;\n    const okOnly70 = (step === 'switch')\n      ? String(btn.dataset.variantTitle || '').split('/').pop().trim() === '70'\n      : true;\n\n    const okLayoutTag =\n      (step === 'switch' || step === 'keycap')\n        ? (\n            layoutMode === 'split'\n              ? hasExactTag(btn, '\u5206\u5272\u30B9\u30DA\u30FC\u30B9')\n              : layoutMode === 'normal'\n                ? hasExactTag(btn, '\u901A\u5E38\u30B9\u30DA\u30FC\u30B9')\n                : true\n          )\n        : true;\n\n    // [PATCH] \u5206\u5272\u30B9\u30DA\u30FC\u30B9\u975E\u5BFE\u5FDC\u30B1\u30FC\u30B9\u3067\u306F\u5206\u5272\u30B9\u30DA\u30FC\u30B9PCBA\u3092\u30D9\u30F3\u30C0\u30FC\u5019\u88DC\u304B\u3089\u3082\u9664\u5916\n    const okCaseSplit =\n      step === 'pcba' && isSplitSpaceButton(btn) && caseBlocksSplit()\n        ? false\n        : true;\n\n    // \u3053\u3053\u3067\u306F vendorMatch \u3092\u5165\u308C\u306A\u3044\n    const okOther =\n      colorMatch(btn, fs.color) &&\n      materialMatch(btn, fs.material) &&\n      priceMatch(btn, minCents, maxCents);\n\n    const okModel =\n  hasTagToken(btn, '60%')\n    ? (hasModelGlb(btn) || canUseDefaultModel(step, btn))\n    : true;\n\nreturn okSize && okOption && okOnly70 && okLayoutTag && okOther && okModel && okCaseSplit;\n  });\n\n  btns.forEach(btn => {\n    const vendor = (btn.dataset.vendor || '').trim();\n    if (vendor) vendorSet.add(vendor);\n  });\n\n  const vendors = [...vendorSet].sort((a, b) => a.localeCompare(b, 'ja'));\n  const currentValue = state.filters[step]?.vendor || '';\n\n  filterVendorEl.innerHTML = `\n    <option value=\"\">\u3059\u3079\u3066</option>\n    ${vendors.map(v => `<option value=\"${escapeHtml(v)}\">${escapeHtml(v)}</option>`).join('')}\n  `;\n\n  if (currentValue && vendors.includes(currentValue)) {\n    filterVendorEl.value = currentValue;\n  } else {\n    filterVendorEl.value = '';\n    if (state.filters[step]) state.filters[step].vendor = '';\n  }\n}\n\n  function syncFilterUIFromState(step) {\n    const fs = getCurrentFilterState(step);\n    if (filterColorEl) filterColorEl.value = fs.color || '';\n    if (filterVendorEl) filterVendorEl.value = fs.vendor || '';\n    if (filterMaterialEl) filterMaterialEl.value = fs.material || '';\n    if (filterMinEl) filterMinEl.value = fs.minYen || '';\n    if (filterMaxEl) filterMaxEl.value = fs.maxYen || '';\n  }\n\n  function saveFilterStateFromUI(step) {\n    const fs = getCurrentFilterState(step);\n    fs.color    = (filterColorEl?.value || '').trim();\n    fs.vendor   = (filterVendorEl?.value || '').trim();\n    fs.material = (filterMaterialEl?.value || '').trim();\n    fs.minYen   = (filterMinEl?.value || '').trim();\n    fs.maxYen   = (filterMaxEl?.value || '').trim();\n    state.filters[step] = fs;\n  }\n\n  function applyFilters(step) {\n  const panel = stepPanelEl(step);\n  if (!panel) return;\n\n  syncFilterUIFromState(step);\n\n  const fs = getCurrentFilterState(step);\n  const minCents = yenToCents(fs.minYen);\n  const maxCents = yenToCents(fs.maxYen);\n\n  const sizeToken = sizeTagToken();\n\n    const btns = [...panel.querySelectorAll(`[data-option][data-step=\"${step}\"]`)];\n    btns.forEach(btn => {\n      if (isNone(btn)) {\n        btn.hidden = false;\n        return;\n      }\n\n    const okSize = (step === 'option') ? true : hasTagToken(btn, sizeToken);\nconst okOption = (step === 'option') ? isOptionItem(btn) : true;\nconst okOnly70 = (step === 'switch')\n  ? String(btn.dataset.variantTitle || '').split('/').pop().trim() === '70'\n  : true;\n\nconst layoutMode = getPcbaLayoutMode();\n\nconst okLayoutTag =\n  (step === 'switch' || step === 'keycap')\n    ? (\n        layoutMode === 'split'\n          ? hasExactTag(btn, '\u5206\u5272\u30B9\u30DA\u30FC\u30B9')\n          : layoutMode === 'normal'\n            ? hasExactTag(btn, '\u901A\u5E38\u30B9\u30DA\u30FC\u30B9')\n            : true\n      )\n    : true;\n\nconst okOther =\n  colorMatch(btn, fs.color) &&\n  vendorMatch(btn, fs.vendor) &&\n  materialMatch(btn, fs.material) &&\n  priceMatch(btn, minCents, maxCents);\n\nconst okModel =\n  hasTagToken(btn, '60%')\n    ? (hasModelGlb(btn) || canUseDefaultModel(step, btn))\n    : true;\n\n// [PATCH] Zoom64\u306A\u3069\u300C\u5206\u5272\u30B9\u30DA\u30FC\u30B9\u975E\u5BFE\u5FDC\u300D\u30B1\u30FC\u30B9\u9078\u629E\u6642\u306F\u3001\u5206\u5272\u30B9\u30DA\u30FC\u30B9PCBA\u3092\u96A0\u3059\nconst okCaseSplit =\n  step === 'pcba' && isSplitSpaceButton(btn) && caseBlocksSplit()\n    ? false\n    : true;\n\nconst ok = okSize && okOption && okOnly70 && okLayoutTag && okOther && okModel && okCaseSplit;\nbtn.hidden = !ok;\n    });\n\nrebuildVendorOptions(step);\nsyncFilterUIFromState(step);\n\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\n    const groups = [...panel.querySelectorAll('.cfg3d-group')];\n    groups.forEach(g => {\n      const inGroup = [...g.querySelectorAll(`[data-option][data-step=\"${step}\"]`)]\n        .filter(b => !isNone(b));\n\n      if (inGroup.length === 0) {\n        g.hidden = false;\n        return;\n      }\n\n      const anyVisible = inGroup.some(b => !b.hidden);\n      g.hidden = !anyVisible;\n    });\n\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\nconst currentSel = state.selections[step];\nif (currentSel?.btn && !isNone(currentSel.btn) && currentSel.btn.hidden) {\n  if (step === 'case') {\n    const firstVisible = getFirstVisibleSelectableOption(step);\n    if (firstVisible) {\n      selectOption(step, firstVisible);\n    } else {\n      const noneBtn = optionButtons(step).find(b => isNone(b));\n      if (noneBtn) selectOption(step, noneBtn);\n    }\n  } else {\n    const noneBtn = optionButtons(step).find(b => isNone(b));\n    if (noneBtn) selectOption(step, noneBtn);\n  }\n}\nif (step === 'case' || step === 'keycap') {\n  openFirstVisibleAccordion(step);\n}\n  }\n\n  const filterInputs = [filterColorEl, filterVendorEl, filterMaterialEl, filterMinEl, filterMaxEl].filter(Boolean);\n  filterInputs.forEach(el => {\n    el.addEventListener('change', () => {\n      saveFilterStateFromUI(state.currentStep);\n      applyFilters(state.currentStep);\n    });\n    el.addEventListener('input', () => {\n      if (el === filterMinEl || el === filterMaxEl) {\n        saveFilterStateFromUI(state.currentStep);\n        applyFilters(state.currentStep);\n      }\n    });\n  });\n\n// --------------------------------------------------\n// Add to cart\n// --------------------------------------------------\nasync function addSelectionToCart() {\n  if (!CUSTOM_KEYBOARD_VARIANT_ID || !Number(CUSTOM_KEYBOARD_VARIANT_ID)) {\n    alert('\u30AB\u30B9\u30BF\u30E0\u30AD\u30FC\u30DC\u30FC\u30C9\u5546\u54C1\u306Evariant ID\u304C\u672A\u8A2D\u5B9A\u3067\u3059\u3002');\n    return;\n  }\n\n  const caseSel   = state.selections.case;\n  const pcbaSel   = state.selections.pcba;\n  const switchSel = state.selections.switch;\n  const keycapSel = state.selections.keycap;\n  const optionSel = state.selections.option;\n\n  const cfgGroupId = `cfg_${Date.now()}`;\n\n  // \u89AA\u5546\u54C1\u306B\u6301\u305F\u305B\u308B\u8868\u793A\u7528 properties\n  const parentProperties = {\n  '_cfg_parent_item': 'true',\n  '_cfg_group': cfgGroupId,\n\n  '\u30B1\u30FC\u30B9': getSelectionDisplay('case'),\n  'PCBA': getSelectionDisplay('pcba'),\n  '\u30AD\u30FC\u30B9\u30A4\u30C3\u30C1': getSelectionDisplay('switch'),\n  '\u30AD\u30FC\u30AD\u30E3\u30C3\u30D7': getSelectionDisplay('keycap'),\n  '\u30AA\u30D7\u30B7\u30E7\u30F3': getSelectionDisplay('option'),\n  '\u7D44\u307F\u7ACB\u3066\u6599\u91D1': formatMoneyJPYFromCents(ASSEMBLY_FEE_CENTS),\n  '\u5C0F\u8A08': formatMoneyJPYFromCents(calcSubtotalCents()),\n\n  '_\u30B1\u30FC\u30B9_variant_id': caseSel?.variantId || '',\n  '_PCBA_variant_id': pcbaSel?.variantId || '',\n  '_\u30AD\u30FC\u30B9\u30A4\u30C3\u30C1_variant_id': switchSel?.variantId || '',\n  '_\u30AD\u30FC\u30AD\u30E3\u30C3\u30D7_variant_id': keycapSel?.variantId || '',\n  '_\u30AA\u30D7\u30B7\u30E7\u30F3_variant_id': optionSel?.variantId || '',\n\n  '_\u30B1\u30FC\u30B9_quantity': caseSel?.variantId ? '1' : '0',\n  '_PCBA_quantity': pcbaSel?.variantId ? '1' : '0',\n  '_\u30AD\u30FC\u30B9\u30A4\u30C3\u30C1_quantity': switchSel?.variantId ? '1' : '0',\n  '_\u30AD\u30FC\u30AD\u30E3\u30C3\u30D7_quantity': keycapSel?.variantId ? '1' : '0',\n  '_\u30AA\u30D7\u30B7\u30E7\u30F3_quantity': optionSel?.variantId ? '1' : '0'\n};\n\n  const items = [\n    {\n      id: Number(CUSTOM_KEYBOARD_VARIANT_ID),\n      quantity: 1,\n      properties: parentProperties\n    }\n  ];\n\n  function pushChildItem(selection, quantity, stepName) {\n    if (!selection?.variantId) return;\n\n    items.push({\n      id: Number(selection.variantId),\n      quantity,\n      properties: {\n        '_cfg_child': 'true',\n        '_cfg_parent': 'custom_keyboard',\n        '_cfg_step': stepName,\n        '_cfg_group': cfgGroupId\n      }\n    });\n  }\n\n  pushChildItem(caseSel, 1, 'case');\n  pushChildItem(pcbaSel, 1, 'pcba');\n  pushChildItem(switchSel, 1, 'switch');\n  pushChildItem(keycapSel, 1, 'keycap');\n  pushChildItem(optionSel, 1, 'option');\n\n  if (nextBtn) nextBtn.disabled = true;\n\n  try {\n    const res = await fetch('/cart/add.js', {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        'Accept': 'application/json'\n      },\n      body: JSON.stringify({ items })\n    });\n\n    if (!res.ok) {\n      const data = await res.json().catch(() => null);\n      const reason = data?.description || data?.message || `\u30A8\u30E9\u30FC ${res.status}`;\n      throw new Error(reason);\n    }\n\n    window.location.href = '/cart';\n  } catch (e) {\n    console.error('[CFG3D] add to cart failed', e);\n    alert(`\u30AB\u30FC\u30C8\u306B\u8FFD\u52A0\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\\n\\n${e.message}\\n\\n\uFF08\u5728\u5EAB\u72B6\u6CC1\u304C\u5909\u308F\u3063\u305F\u3001\u307E\u305F\u306F\u65E2\u306B\u30AB\u30FC\u30C8\u306B\u540C\u3058\u30D1\u30FC\u30C4\u304C\u5165\u3063\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\u30AB\u30FC\u30C8\u3092\u78BA\u8A8D\u3059\u308B\u304B\u3001\u30D1\u30FC\u30C4\u3092\u9078\u3073\u76F4\u3057\u3066\u304F\u3060\u3055\u3044\uFF09`);\n    if (nextBtn) nextBtn.disabled = false;\n  }\n}\n\n  // --------------------------------------------------\n  // three.js (optional)\n  // --------------------------------------------------\n  let THREE, OrbitControls, GLTFLoader, DRACOLoader, RGBELoader;\n\ntry {\n  THREE = await import(THREE_CDN);\n  ({ OrbitControls } = await import(ORBIT_CDN));\n  ({ GLTFLoader } = await import(GLTF_CDN));\n  ({ DRACOLoader } = await import(DRACO_CDN));\n  ({ RGBELoader } = await import(RGBE_CDN));\n  console.log('CFG3D three status:', !!THREE, !!OrbitControls, !!GLTFLoader, !!DRACOLoader);\n} catch (e) {\n  console.warn('[CFG3D] three.js import failed', e);\n  THREE = null;\n}\n\n  let renderer, scene, camera, controls, loader, cameraLight;\n  let hasFittedCameraOnce = false;\n\n// \u2705 \u30B9\u30C6\u30C3\u30D7\u5225\u306B\u30E2\u30C7\u30EB\u3092\u4FDD\u6301\uFF08\u91CD\u306D\u8868\u793A\u7528\uFF09\nconst modelsByStep = { case: null, pcba: null, switch: null, keycap: null, option: null };\nconst loadTokenByStep = { case: 0, pcba: 0, switch: 0, keycap: 0, option: 0 };\n\n  function showLoading(on) {\n    if (!loadingEl) return;\n    loadingEl.hidden = !on;\n  }\n\n  function ensureViewer() {\n  if (!THREE || !canvasHost) return;\n\n  if (!scene) {\n  scene = new THREE.Scene();\n\n  // \u5168\u4F53\u3092\u660E\u308B\u304F\u3059\u308B\u74B0\u5883\u5149\n  // \u74B0\u5883\u5149\uFF08\u5F31\u3081\uFF09\nconst hemi = new THREE.HemisphereLight(0xffffff, 0x666666, 0.3);\nscene.add(hemi);\n\n// \u30E1\u30A4\u30F3\u30E9\u30A4\u30C8\u3060\u3051\u6B8B\u3059\nconst keyLight = new THREE.DirectionalLight(0xffffff, 0.3);\nkeyLight.position.set(3, 5, 6);\nscene.add(keyLight);\n\n// cameraLight\u306F\u5F31\u3081\u306B\ncameraLight = new THREE.DirectionalLight(0xffffff, 0.2);\nscene.add(cameraLight);\n}\n\n\n  if (!renderer) {\n    const r = canvasHost.getBoundingClientRect();\n\n    camera = new THREE.PerspectiveCamera(35, r.width / Math.max(r.height, 1), 0.1, 2000);\n    camera.position.set(0, 30, 120);\n\n    renderer = new THREE.WebGLRenderer({\n  antialias: true,\n  alpha: true\n});\n// =====================\n// HDRI \u74B0\u5883\u5149\n// =====================\nconst pmremGenerator = new THREE.PMREMGenerator(renderer);\npmremGenerator.compileEquirectangularShader();\n\nnew RGBELoader()\n  .load('https://dl.polyhaven.org/file/ph-assets/HDRIs/hdr/1k/studio_small_03_1k.hdr', (texture) => {\n    const envMap = pmremGenerator.fromEquirectangular(texture).texture;\n\n    scene.environment = envMap; // \u2190 \u53CD\u5C04\u306B\u52B9\u304F\n    scene.background = null;    // \u2190 \u80CC\u666F\u306F\u900F\u660E\u306E\u307E\u307E\n\n    texture.dispose();\n    pmremGenerator.dispose();\n  });\nrenderer.toneMapping = THREE.ACESFilmicToneMapping;\nrenderer.outputColorSpace = THREE.SRGBColorSpace;\nrenderer.toneMappingExposure = 1.1;\nrenderer.setClearColor(0x000000, 0);\n    renderer.setPixelRatio(Math.min(window.devicePixelRatio || 1, 2));\n    renderer.setSize(r.width, r.height);\n\n    canvasHost.appendChild(renderer.domElement);\n\n    renderer.domElement.style.position = 'absolute';\n    renderer.domElement.style.inset = '0';\n    renderer.domElement.style.width = '100%';\n    renderer.domElement.style.height = '100%';\n    renderer.domElement.style.pointerEvents = 'auto';\n\ncontrols = new OrbitControls(camera, renderer.domElement);\n\ncontrols.enableDamping = true;\n\n// \u2190 \u6A2A\u79FB\u52D5\u7981\u6B62\ncontrols.enablePan = false;\n\n// \u2190 \u30BA\u30FC\u30E0\u611F\u5EA6\u3092\u5F31\u3081\u308B\ncontrols.enableZoom = false;\n\n// 360\u5EA6\u56DE\u8EE2OK\u30FB\u5E95\u9762\u3082\u898B\u3048\u308B\ncontrols.minPolarAngle = 0;\ncontrols.maxPolarAngle = Math.PI;\ncontrols.minAzimuthAngle = -Infinity;\ncontrols.maxAzimuthAngle = Infinity;\n\ncontrols.target.set(0, 0, 0);\ncontrols.update();\nrenderer.domElement.addEventListener('wheel', (e) => {\n  e.preventDefault();\n\n  if (!camera || !controls) return;\n\n  const currentDistance = camera.position.distanceTo(controls.target);\n  if (targetCameraDistance == null) targetCameraDistance = currentDistance;\n\n  const direction = Math.sign(e.deltaY);\nconst zoomAmount = currentDistance * 0.04 * direction;\ntargetCameraDistance += zoomAmount;\n\n  targetCameraDistance = Math.max(\n    controls.minDistance || 1,\n    Math.min(controls.maxDistance || 9999, targetCameraDistance)\n  );\n\n}, { passive: false });\n\nlet lastTouchDistance = null;\n\nrenderer.domElement.addEventListener('touchstart', (e) => {\n  if (e.touches.length === 2) {\n    e.preventDefault();\n\n    const dx = e.touches[0].clientX - e.touches[1].clientX;\n    const dy = e.touches[0].clientY - e.touches[1].clientY;\n    lastTouchDistance = Math.sqrt(dx * dx + dy * dy);\n\n    targetCameraDistance = camera.position.distanceTo(controls.target);\n  }\n}, { passive: false });\n\nrenderer.domElement.addEventListener('touchmove', (e) => {\n  if (e.touches.length !== 2 || lastTouchDistance == null) return;\n\n  e.preventDefault();\n\n  const dx = e.touches[0].clientX - e.touches[1].clientX;\n  const dy = e.touches[0].clientY - e.touches[1].clientY;\n  const newTouchDistance = Math.sqrt(dx * dx + dy * dy);\n\n  const diff = lastTouchDistance - newTouchDistance;\n  targetCameraDistance += diff * 0.02;\n\n  targetCameraDistance = Math.max(\n    controls.minDistance || 1,\n    Math.min(controls.maxDistance || 9999, targetCameraDistance)\n  );\n\n  lastTouchDistance = newTouchDistance;\n}, { passive: false });\n\nrenderer.domElement.addEventListener('touchend', () => {\n  lastTouchDistance = null;\n}, { passive: true });\n\nrenderer.domElement.addEventListener('dblclick', () => {\n  camera.position.set(0, 30, 120);\n  controls.target.set(0, 0, 0);\n  controls.update();\n});\n\n    new ResizeObserver(() => {\n      const rr = canvasHost.getBoundingClientRect();\n      renderer.setSize(rr.width, rr.height);\n      camera.aspect = rr.width / Math.max(rr.height, 1);\n      camera.updateProjectionMatrix();\n    }).observe(canvasHost);\n\n    (function tick() {\n  requestAnimationFrame(tick);\n  cameraLight.position.copy(camera.position);\n\n  if (targetCameraDistance != null) {\n    const dir = camera.position.clone().sub(controls.target).normalize();\n    const currentDistance = camera.position.distanceTo(controls.target);\n    const nextDistance = currentDistance + (targetCameraDistance - currentDistance) * 0.08;\n\n    camera.position.copy(controls.target).add(dir.multiplyScalar(nextDistance));\n  }\n\n  controls.update();\n  renderer.render(scene, camera);\n})();\n  }\n\n  if (!loader) {\n    loader = new GLTFLoader();\n  }\n  console.log('[CFG3D] ensureViewer done', {\n    hasScene: !!scene,\n    hasRenderer: !!renderer,\n    hasLoader: !!loader\n  });\n  console.log('[CFG3D] canvasHost rect:', canvasHost.getBoundingClientRect());\nconsole.log('[CFG3D] renderer canvas:', renderer?.domElement);\n}\n\n  function clearModel(step) {\n  const m = modelsByStep[step];\n  if (!m || !scene) return;\n\n  scene.remove(m);\n\n  try {\n    m.traverse(o => {\n      if (o.isMesh) {\n        o.geometry?.dispose?.();\n        if (o.material) {\n          const mats = Array.isArray(o.material) ? o.material : [o.material];\n          mats.forEach(mat => {\n            mat.map?.dispose?.();\n            mat.dispose?.();\n          });\n        }\n      }\n    });\n  } catch (_) {}\n\n  modelsByStep[step] = null;\n}\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 ---\nfunction rotateAroundCenter(obj, axis /* 'x'|'y'|'z' */, rad) {\n  const box = new THREE.Box3().setFromObject(obj);\n  const center = box.getCenter(new THREE.Vector3());\n\n  obj.position.sub(center);\n  obj.rotation[axis] += rad;\n  obj.position.add(center);\n}\nlet defaultCameraPosition = null;\nlet defaultControlsTarget = null;\nlet zoomResetTimer = null;\nlet targetCameraDistance = null;\n\nfunction rememberDefaultView() {\n  if (!camera || !controls) return;\n  defaultCameraPosition = camera.position.clone();\n  defaultControlsTarget = controls.target.clone();\n}\n\nfunction resetToDefaultView() {\n  if (!camera || !controls || !defaultCameraPosition || !defaultControlsTarget) return;\n\n  camera.position.copy(defaultCameraPosition);\n  controls.target.copy(defaultControlsTarget);\n  controls.update();\n}\n  function fitCameraToObject(object3d) {\n  if (!THREE || !camera || !controls) return;\n\n  const box = new THREE.Box3().setFromObject(object3d);\n  const size = box.getSize(new THREE.Vector3());\n  const center = box.getCenter(new THREE.Vector3());\n\n  const maxDim = Math.max(size.x, size.y, size.z);\n  const fov = (camera.fov * Math.PI) / 180;\n  let dist = Math.abs(maxDim / (2 * Math.tan(fov / 2)));\n  dist *= 0.9;\n\n  camera.position.set(center.x, center.y + maxDim * 0.9, center.z + dist * 1.05);\n\n  camera.near = Math.max(maxDim / 100, 0.01);\n  camera.far = maxDim * 100;\n  camera.updateProjectionMatrix();\n\ncontrols.minDistance = maxDim * 1.2;\ncontrols.maxDistance = maxDim * 6;\ncontrols.enablePan = false;\n\n  controls.target.copy(center);\n  controls.update();\n  rememberDefaultView();\n\n}\n\n  async function loadModelForStep(step, url) {\n  console.log('[CFG3D] trying to load:', step, url);\n  if (viewerSubEl) {\n    viewerSubEl.textContent = url ? `3D URL: ${url}` : '3D URL: (empty)';\n  }\n  if (!THREE) return;\n\n  const myToken = ++loadTokenByStep[step];\n\n  if (!url) {\n    clearModel(step);\n\n    const any = Object.values(modelsByStep).some(Boolean);\n    if (!any) {\n      if (placeholder) placeholder.style.display = '';\n      if (canvasHost) canvasHost.style.display = 'none';\n    }\n    return;\n  }\n\n  ensureViewer();\n\nif (!loader) loader = new GLTFLoader();\nif (!loader || !scene) {\n  console.warn('[CFG3D] loader or scene is not initialized');\n  return;\n}\n\nif (canvasHost) canvasHost.style.display = '';\nif (placeholder) placeholder.style.display = 'none';\n\nshowLoading(true);\nclearModel(step);\n\ntry {\n  const gltf = await new Promise((resolve, reject) => {\n    loader.load(url, resolve, undefined, reject);\n  });\n\n  const model = gltf.scene;\n  model.traverse((obj) => {\n  if (!obj.isMesh || !obj.material) return;\n\n  const mats = Array.isArray(obj.material) ? obj.material : [obj.material];\n\n  mats.forEach((mat) => {\n    mat.envMapIntensity = 0.35;\n    mat.needsUpdate = true;\n  });\n});\n\n  if (myToken !== loadTokenByStep[step]) return;\n\n  model.position.set(0, 0, 0);\n  model.rotation.set(0, 0, 0);\n  model.scale.set(1, 1, 1);\n\n  // \u6A2A\u5411\u304D\n  model.rotation.y = Math.PI;\n\n  // case / pcba / switch / keycap \u306F\u8FFD\u52A0\u3067\u53CD\u8EE2\n  if (step === 'case' || step === 'pcba' || step === 'switch' || step === 'keycap') {\n    model.rotation.y += Math.PI;\n  }\n\n  clearModel(step);\n  scene.add(model);\n  modelsByStep[step] = model;\n\n    // \u521D\u56DE\u3060\u3051\u30AB\u30E1\u30E9\u3092\u81EA\u52D5\u8ABF\u6574\n  if (!hasFittedCameraOnce) {\n    if (modelsByStep.case) {\n      fitCameraToObject(modelsByStep.case);\n    } else {\n      fitCameraToObject(model);\n    }\n    hasFittedCameraOnce = true;\n  } else {\n    controls.update();\n  }\n\n  console.log('[CFG3D] before add', {\n    hasScene: !!scene,\n    hasRenderer: !!renderer,\n    hasCamera: !!camera\n  });\n\n} catch (e) {\n  console.warn('[CFG3D] model load failed', e);\n  if (myToken === loadTokenByStep[step]) {\n    clearModel(step);\n  }\n} finally {\n  if (myToken === loadTokenByStep[step]) {\n    showLoading(false);\n  }\n}\n}\n\n  function fireAndForget(p) {\n    try { if (p?.then) p.catch(() => {}); } catch (_) {}\n  }\n\n  // --------------------------------------------------\n  // \u30B7\u30A7\u30A2\u753B\u50CF\uFF08OGP\u30FB\u8868\u793A 1200x630 \u306E2\u500D\uFF1D2400x1260\uFF09\u3092\u3001\u304A\u5BA2\u3055\u3093\u306E\u30D6\u30E9\u30A6\u30B6\u306E 3D \u304B\u3089\u305D\u306E\u5834\u3067\u4F5C\u308B\n  // --------------------------------------------------\n  const SHARE_IMG_W = 1200;\n  const SHARE_IMG_H = 630;\n  const SHARE_SCALE = 2;      // \u51FA\u529B\u306F2\u500D\uFF082400x1260\uFF09\u3002\u30B9\u30DE\u30DB\u3084\u9AD8\u7CBE\u7D30\u306E\u753B\u9762\u3067\u3082\u307C\u3084\u3051\u306A\u3044\n  const SHARE_SHOT_SCALE = 3; // 3D \u306F3\u500D\u3067\u63CF\u3044\u3066\u304B\u3089\u7E2E\u3081\u308B\uFF08\u7E01\u306E\u30AE\u30B6\u30AE\u30B6\u3092\u6291\u3048\u308B\uFF09\n  // \u30B7\u30A7\u30A2\u753B\u50CF\u306E\u898B\u305F\u76EE\uFF08\u5EA7\u6A19\u306F 1200x630 \u57FA\u6E96\uFF09\n  // \u767D\uFF08\u767D\u2192\u6E29\u304B\u3044\u30B0\u30EC\u30FC\u306E\u30B0\u30E9\u30C7\u30FC\u30B7\u30E7\u30F3\uFF09\u00D7\u30B4\u30FC\u30EB\u30C9\uFF082026-10-08 \u914D\u8272\u78BA\u5B9A\u30FB\u9ED2\uFF0F\u767D\uFF0F\u771F\u3063\u767D\u304B\u3089\u767D\uFF09\n  const SHARE_LOOK = {\n    yaw: 0,            // 3D \u306E\u6A2A\u306E\u89D2\u5EA6\uFF08\u5EA6\u30FB0\uFF1D\u6B63\u9762\u3001\uFF0B\u3067\u53F3\u304B\u3089\uFF09\n    pitch: 55,         // 3D \u306E\u898B\u4E0B\u308D\u3059\u89D2\u5EA6\uFF08\u5EA6\u30FB0\uFF1D\u771F\u6A2A\u300190\uFF1D\u771F\u4E0A\uFF09\n    zoom: 1,           // 3D \u306E\u5927\u304D\u3055\uFF081\uFF1D\u67A0\u3044\u3063\u3071\u3044\uFF09\n    shotW: 730,        // 3D \u3092\u7F6E\u304F\u5DE6\u5074\u306E\u5E45\n    shotX: 0,          // 3D \u306E\u4F4D\u7F6E\uFF08\u6A2A\uFF09\n    shotY: 0,          // 3D \u306E\u4F4D\u7F6E\uFF08\u7E26\uFF09\n    bg1: '#ffffff',    // \u80CC\u666F\uFF083D \u306E\u5F8C\u308D\u306E\u660E\u308B\u3044\u3068\u3053\u308D\uFF09\n    bg2: '#e2e0da',    // \u80CC\u666F\uFF08\u5916\u5074\u306E\u6697\u3044\u3068\u3053\u308D\uFF09\n    bgMid: '#f2f1ed',  // \u80CC\u666F\uFF08\u30B9\u30DD\u30C3\u30C8\u30E9\u30A4\u30C8\u306E\u4E2D\u9593\uFF09\n    shadow: 0.28,      // 3D \u306E\u4E0B\u306E\u5F71\u306E\u6FC3\u3055\uFF080\u301C1\uFF09\n    shadowGap: 4,      // 3D \u306E\u4E0B\u7AEF\u304B\u3089\u5F71\u307E\u3067\u306E\u8DDD\u96E2\uFF08px\u30FB\u30DE\u30A4\u30CA\u30B9\u3067\u91CD\u306A\u308B\uFF09\n    frame: '#cdbd98',  // \u5916\u67A0\u3068\u4ED5\u5207\u308A\u7DDA\u306E\u8272\n    textX: 772,        // \u53F3\u5074\u306E\u6587\u5B57\u306E\u958B\u59CB\u4F4D\u7F6E\uFF08\u6A2A\uFF09\n    textY: 72,         // \u53F3\u5074\u306E\u6587\u5B57\u306E\u958B\u59CB\u4F4D\u7F6E\uFF08\u7E26\uFF09\n    accent: '#947c50', // \u5C0F\u898B\u51FA\u3057\u30FB\u756A\u53F7\u306E\u8272\uFF08\u30B4\u30FC\u30EB\u30C9\uFF09\n    ink: '#16151a',    // \u6587\u5B57\u306E\u8272\n    sub: 'rgba(22,21,26,.5)', // \u30D1\u30FC\u30C4\u540D\u306E\u898B\u51FA\u3057\u306E\u8272\n    topLine: 'rgba(148,124,80,.45)', // \u30D1\u30FC\u30C4\u4E00\u89A7\u306E\u4E0A\u306E\u7DDA\n    rowLine: 'rgba(22,21,26,.09)', // \u30D1\u30FC\u30C4\u306E\u9593\u306E\u7DDA\n    eyebrow: 'MY CUSTOM BUILD',\n    eyebrowSize: 13,\n    title: 'HYPE CUSTOM',\n    titleSize: 40,\n    showParts: true,   // \u30D1\u30FC\u30C4\u540D\u3092\u51FA\u3059\n    partSize: 17,\n    logoW: 105,        // \u53F3\u4E0B\u306E\u30ED\u30B4\u306E\u5E45\uFF080 \u306A\u3089\u51FA\u3055\u306A\u3044\uFF09\n    logoTint: '#16151a', // \u30ED\u30B4\u3092\u5857\u308B\u8272\uFF08\u7A7A\u306A\u3089\u767D\u30ED\u30B4\u306E\u307E\u307E\uFF09\n  };\n  // \u53F3\u4E0B\u306E\u30ED\u30B4\uFF08\u767D\u30FB\u30AD\u30E3\u30C3\u30C1\u30B3\u30D4\u30FC\u5165\u308A\uFF09\u3002\u30B9\u30C8\u30A2\u306E\u30D5\u30A1\u30A4\u30EB\u306A\u306E\u3067\u540C\u3058\u30C9\u30E1\u30A4\u30F3\u304B\u3089\u8AAD\u3081\u308B\uFF08\u753B\u50CF\u304C\u6C5A\u308C\u306A\u3044\uFF09\n  const SHARE_LOGO_URL = '/cdn/shop/files/hype_shop_white.png?width=600';\n  const SHARE_FONT_EN = '\"Neue Haas Grotesk\",\"Noto Sans JP\",\"Hiragino Sans\",sans-serif';\n  const SHARE_FONT_JA = '\"Noto Sans JP\",\"Hiragino Sans\",\"Yu Gothic\",sans-serif';\n\n  // '#rrggbb' \u3092\u900F\u660E\u5EA6\u3064\u304D\u306E rgba \u306B\uFF08\u4ED5\u5207\u308A\u7DDA\u3092\u4E0A\u4E0B\u3067\u6D88\u3059\u305F\u3081\uFF09\n  function hexToRgba(hex, a) {\n    const m = /^#?([0-9a-f]{6})$/i.exec(hex || '');\n    if (!m) return `rgba(0,0,0,${a})`;\n    const n = parseInt(m[1], 16);\n    return `rgba(${n >> 16},${(n >> 8) & 255},${n & 255},${a})`;\n  }\n\n  // \u30ED\u30B4\u30921\u8272\u3067\u5857\u308A\u76F4\u3059\uFF08\u767D\u30ED\u30B4\u3092\u767D\u80CC\u666F\u3067\u4F7F\u3046\u3068\u304D\uFF09\n  function tintImage(img, color) {\n    const t = document.createElement('canvas');\n    t.width = img.naturalWidth;\n    t.height = img.naturalHeight;\n    const tc = t.getContext('2d');\n    tc.drawImage(img, 0, 0);\n    tc.globalCompositeOperation = 'source-in';\n    tc.fillStyle = color;\n    tc.fillRect(0, 0, t.width, t.height);\n    return t;\n  }\n\n  function loadShareImage(src, timeoutMs = 4000) {\n    return new Promise(resolve => {\n      const img = new Image();\n      const timer = setTimeout(() => resolve(null), timeoutMs);\n      img.crossOrigin = 'anonymous';\n      img.onload = () => { clearTimeout(timer); resolve(img); };\n      img.onerror = () => { clearTimeout(timer); resolve(null); };\n      img.src = src;\n    });\n  }\n\n  // \u6587\u5B57\u306E\u9593\u9694\uFF08\u5BFE\u5FDC\u3057\u3066\u3044\u306A\u3044\u30D6\u30E9\u30A6\u30B6\u3067\u306F\u4F55\u3082\u3057\u306A\u3044\uFF09\n  function setLetterSpacing(ctx, px) {\n    if ('letterSpacing' in ctx) ctx.letterSpacing = `${px}px`;\n  }\n\n  function ellipsize(ctx, text, maxW) {\n    if (ctx.measureText(text).width <= maxW) return text;\n    let t = text;\n    while (t.length > 1 && ctx.measureText(t + '\u2026').width > maxW) t = t.slice(0, -1);\n    return t + '\u2026';\n  }\n\n  function renderShareShot(look = SHARE_LOOK) {\n    if (!THREE || !renderer || !scene || !camera) return null;\n    const models = Object.values(modelsByStep).filter(Boolean);\n    if (!models.length) return null;\n\n    const prevSize = renderer.getSize(new THREE.Vector2());\n    const prevRatio = renderer.getPixelRatio();\n    const prevPos = camera.position.clone();\n    const prevTarget = controls ? controls.target.clone() : null;\n    const prevAspect = camera.aspect;\n\n    const box = new THREE.Box3();\n    models.forEach(m => box.expandByObject(m));\n    const size = box.getSize(new THREE.Vector3());\n    const center = box.getCenter(new THREE.Vector3());\n    const maxDim = Math.max(size.x, size.y, size.z);\n\n    // \u6C7A\u307E\u3063\u305F\u89D2\u5EA6\uFF08SHARE_LOOK \u306E yaw/pitch\u30FB\u6BCE\u56DE\u540C\u3058\u69CB\u56F3\u306B\u3059\u308B\uFF09\n    const fov = (camera.fov * Math.PI) / 180;\n    const dist = (maxDim / (2 * Math.tan(fov / 2))) * 1.05 / (Number(look.zoom) || 1);\n    const yaw = (Number(look.yaw) || 0) * Math.PI / 180;\n    const pitch = (Number(look.pitch) || 0) * Math.PI / 180;\n    const dir = new THREE.Vector3(Math.sin(yaw) * Math.cos(pitch), Math.sin(pitch), Math.cos(yaw) * Math.cos(pitch)).normalize();\n    camera.aspect = look.shotW / SHARE_IMG_H;\n    camera.position.copy(center).add(dir.multiplyScalar(dist));\n    camera.lookAt(center);\n    camera.updateProjectionMatrix();\n\n    renderer.setPixelRatio(1);\n    renderer.setSize(Math.round(look.shotW * SHARE_SHOT_SCALE), SHARE_IMG_H * SHARE_SHOT_SCALE, false);\n    if (cameraLight) cameraLight.position.copy(camera.position);\n    renderer.render(scene, camera);\n    // \u63CF\u3044\u305F\u76F4\u5F8C\u306B\u8AAD\u3080\uFF08preserveDrawingBuffer \u306A\u3057\u3067\u3082\u540C\u3058\u30BF\u30B9\u30AF\u5185\u306A\u3089\u8AAD\u3081\u308B\uFF09\n    const shot = document.createElement('canvas');\n    shot.width = renderer.domElement.width;\n    shot.height = renderer.domElement.height;\n    shot.getContext('2d').drawImage(renderer.domElement, 0, 0);\n    // \u5E8A\u306E\u5F71\u3092\u7F6E\u304F\u305F\u3081\u30013D \u306E\u7BB1\u304C\u753B\u9762\u306E\u3069\u3053\u306B\u6620\u3063\u305F\u304B\uFF08\u4E0B\u7AEF\u30FB\u5DE6\u53F3\u306E\u5E45\u30010\u301C1\uFF09\u3092\u6301\u305F\u305B\u308B\n    let minX = 1, maxX = 0, maxY = 0;\n    [box.min.x, box.max.x].forEach(bx => [box.min.y, box.max.y].forEach(by => [box.min.z, box.max.z].forEach(bz => {\n      const v = new THREE.Vector3(bx, by, bz).project(camera);\n      minX = Math.min(minX, (v.x + 1) / 2);\n      maxX = Math.max(maxX, (v.x + 1) / 2);\n      maxY = Math.max(maxY, (1 - v.y) / 2);\n    })));\n    shot.cfgBottom = maxY;\n    shot.cfgCenterX = (minX + maxX) / 2;\n    shot.cfgSpanX = maxX - minX;\n\n    // \u5143\u306B\u623B\u3059\n    renderer.setPixelRatio(prevRatio);\n    renderer.setSize(prevSize.x, prevSize.y, false);\n    camera.aspect = prevAspect;\n    camera.position.copy(prevPos);\n    if (controls && prevTarget) { controls.target.copy(prevTarget); controls.update(); }\n    camera.updateProjectionMatrix();\n    if (cameraLight) cameraLight.position.copy(camera.position);\n    renderer.render(scene, camera);\n    return shot;\n  }\n\n  async function buildShareImage(look = SHARE_LOOK) {\n    const shot = renderShareShot(look);\n    if (!shot) return null;\n    // \u66F8\u4F53\u3068\u30ED\u30B4\u3092\u5148\u306B\u8AAD\u3093\u3067\u304A\u304F\uFF08\u8AAD\u3081\u306A\u304F\u3066\u3082\u4EE3\u308F\u308A\u306E\u66F8\u4F53\u30FB\u6587\u5B57\u3067\u4F5C\u308B\uFF09\n    const [logo] = await Promise.all([\n      Number(look.logoW) > 0 ? loadShareImage(SHARE_LOGO_URL) : Promise.resolve(null),\n      document.fonts ? Promise.all([\n        document.fonts.load(`300 40px \"Neue Haas Grotesk\"`),\n        document.fonts.load(`400 17px \"Noto Sans JP\"`),\n      ]).catch(() => null) : Promise.resolve(null),\n    ]);\n\n    const W = SHARE_IMG_W;\n    const H = SHARE_IMG_H;\n    const S = SHARE_SCALE;\n    const c = document.createElement('canvas');\n    c.width = W * S;\n    c.height = H * S;\n    const ctx = c.getContext('2d');\n    ctx.scale(S, S);\n    ctx.imageSmoothingEnabled = true;\n    ctx.imageSmoothingQuality = 'high';\n    ctx.textBaseline = 'top';\n\n    // \u80CC\u666F\uFF1A\u9ED2\u30023D \u306E\u5F8C\u308D\u3060\u3051\u6955\u5186\u306E\u30B9\u30DD\u30C3\u30C8\u30E9\u30A4\u30C8\u3067\u660E\u308B\u304F\n    const cx = look.shotX + look.shotW / 2;\n    const cy = H * 0.48;\n    ctx.fillStyle = look.bg2;\n    ctx.fillRect(0, 0, W, H);\n    ctx.save();\n    ctx.translate(cx, cy);\n    ctx.scale(1, 420 / 620);\n    const bg = ctx.createRadialGradient(0, 0, 0, 0, 0, 620);\n    bg.addColorStop(0, look.bg1);\n    bg.addColorStop(0.55, look.bgMid || look.bg2);\n    bg.addColorStop(1, look.bg2);\n    ctx.fillStyle = bg;\n    ctx.fillRect(-W * 2, -H * 2, W * 4, H * 4);\n    ctx.restore();\n\n    // 3D \u306E\u8DB3\u5143\u306B\u5E8A\u306E\u5F71\uFF08\u6A2A\u9577\u306E\u6955\u5186\uFF09\u30023D \u306E\u4E0B\u7AEF\u306E\u3059\u3050\u4E0B\u306B\u7F6E\u304D\u3001\u5E45\u3082 3D \u306B\u5408\u308F\u305B\u308B\n    const shadow = Number(look.shadow) || 0;\n    if (shadow > 0) {\n      const sx = shot.cfgCenterX != null ? look.shotX + shot.cfgCenterX * look.shotW : cx;\n      const sy = shot.cfgBottom != null ? look.shotY + shot.cfgBottom * H + (Number(look.shadowGap) || 0) : H * 0.79;\n      const sr = shot.cfgSpanX ? shot.cfgSpanX * look.shotW * 0.5 : 250;\n      ctx.save();\n      ctx.translate(sx, sy);\n      ctx.scale(1, 30 / 250);\n      const sh = ctx.createRadialGradient(0, 0, 0, 0, 0, sr);\n      sh.addColorStop(0, `rgba(0,0,0,${shadow})`);\n      sh.addColorStop(0.7, 'rgba(0,0,0,0)');\n      ctx.fillStyle = sh;\n      ctx.fillRect(-sr, -sr, sr * 2, sr * 2);\n      ctx.restore();\n    }\n    ctx.drawImage(shot, look.shotX, look.shotY, look.shotW, H);\n\n    // \u7D30\u3044\u91D1\u306E\u5916\u67A0\u3068\u30013D \u3068\u6587\u5B57\u306E\u9593\u306E\u7E26\u7DDA\uFF08\u4E0A\u4E0B\u306F\u6D88\u3048\u3066\u3044\u304F\uFF09\n    ctx.strokeStyle = look.frame;\n    ctx.lineWidth = 1;\n    ctx.strokeRect(20.5, 20.5, W - 41, H - 41);\n    const divX = look.shotW + 0.5;\n    const dv = ctx.createLinearGradient(0, 20, 0, H - 20);\n    dv.addColorStop(0, hexToRgba(look.frame, 0));\n    dv.addColorStop(0.5, look.frame);\n    dv.addColorStop(1, hexToRgba(look.frame, 0));\n    ctx.strokeStyle = dv;\n    ctx.beginPath();\n    ctx.moveTo(divX, 20);\n    ctx.lineTo(divX, H - 20);\n    ctx.stroke();\n\n    // \u53F3\u5074\uFF1A\u69CB\u6210\uFF08\u91D1\u984D\u306F\u5165\u308C\u306A\u3044\u3002\u30B7\u30A7\u30A2\u304B\u3089\u6642\u9593\u304C\u305F\u3064\u3068\u4FA1\u683C\u304C\u5909\u308F\u308B\u305F\u3081\uFF09\n    const x = look.textX;\n    const maxW = W - x - 48;\n    let y = look.textY;\n    if (look.eyebrow) {\n      const es = Number(look.eyebrowSize) || 13;\n      ctx.strokeStyle = look.accent;\n      ctx.beginPath();\n      ctx.moveTo(x, y + es * 0.6 + 0.5);\n      ctx.lineTo(x + 28, y + es * 0.6 + 0.5);\n      ctx.stroke();\n      ctx.fillStyle = look.accent;\n      ctx.font = `400 ${es}px ${SHARE_FONT_EN}`;\n      setLetterSpacing(ctx, es * 0.24);\n      ctx.fillText(look.eyebrow, x + 40, y);\n      setLetterSpacing(ctx, 0);\n      y += es * 1.2 + 10;\n    }\n    if (look.title) {\n      ctx.fillStyle = look.ink;\n      ctx.font = `300 ${look.titleSize}px ${SHARE_FONT_EN}`;\n      setLetterSpacing(ctx, look.titleSize * 0.06);\n      ctx.fillText(ellipsize(ctx, look.title, maxW), x, y);\n      setLetterSpacing(ctx, 0);\n      y += look.titleSize * 1.1 + 26;\n    }\n\n    if (look.showParts) {\n      const rows = [['\u30B1\u30FC\u30B9', 'case'], ['PCBA', 'pcba'], ['\u30B9\u30A4\u30C3\u30C1', 'switch'], ['\u30AD\u30FC\u30AD\u30E3\u30C3\u30D7', 'keycap'], ['\u30AA\u30D7\u30B7\u30E7\u30F3', 'option']]\n        .map(([label, step]) => [label, getSelectionDisplay(step).replace(/\u3010[^\u3011]*\u3011/g, '').trim()])\n        .filter(([, v]) => v && v !== '\u306A\u3057');\n      const ps = Number(look.partSize) || 17;\n      const rowH = 9 + 16 + 2 + Math.round(ps * 1.45) + 9;\n      if (rows.length) {\n        ctx.fillStyle = look.topLine;\n        ctx.fillRect(x, y, maxW, 1);\n      }\n      rows.forEach(([label, value], i) => {\n        const top = y + 9;\n        ctx.fillStyle = look.accent;\n        ctx.font = `400 12px ${SHARE_FONT_EN}`;\n        ctx.fillText(String(i + 1).padStart(2, '0'), x, top + 3);\n        ctx.fillStyle = look.sub;\n        ctx.font = `400 11px ${SHARE_FONT_JA}`;\n        setLetterSpacing(ctx, 0.9);\n        ctx.fillText(label, x + 38, top);\n        setLetterSpacing(ctx, 0);\n        ctx.fillStyle = look.ink;\n        ctx.font = `400 ${ps}px ${SHARE_FONT_JA}`;\n        ctx.fillText(ellipsize(ctx, value, maxW - 38), x + 38, top + 18);\n        y += rowH;\n        if (i < rows.length - 1) {\n          ctx.fillStyle = look.rowLine;\n          ctx.fillRect(x, y, maxW, 1);\n        }\n      });\n    }\n\n    // \u53F3\u4E0B\uFF1A\u30ED\u30B4\uFF08\u8AAD\u3081\u306A\u304B\u3063\u305F\u3089\u6587\u5B57\u3067\u4EE3\u308F\u308A\u306B\u51FA\u3059\uFF09\n    const logoW = Number(look.logoW) || 0;\n    if (logoW > 0) {\n      if (logo && logo.naturalWidth) {\n        const logoH = logoW * logo.naturalHeight / logo.naturalWidth;\n        ctx.drawImage(look.logoTint ? tintImage(logo, look.logoTint) : logo, W - 48 - logoW, H - 44 - logoH, logoW, logoH);\n      } else {\n        ctx.fillStyle = look.ink;\n        ctx.font = `700 18px ${SHARE_FONT_EN}`;\n        ctx.textAlign = 'right';\n        ctx.textBaseline = 'alphabetic';\n        ctx.fillText('HYPESHOP', W - 48, H - 44);\n        ctx.textAlign = 'left';\n      }\n    }\n\n    // 2400x1260 \u306E\u307E\u307E JPEG\uFF08\u54C1\u8CEA95\uFF09\u3002Shopify \u3067\u8868\u793A\u7528\u306B\u7E2E\u3081\u308B\n    return c.toDataURL('image/jpeg', 0.95);\n  }\n\n  // --------------------------------------------------\n  // Bind\n  // --------------------------------------------------\n  PRICE_STEPS.forEach(step => {\n    optionButtons(step).forEach(btn => {\n      btn.addEventListener('click', () => selectOption(step, btn));\n    });\n  });\n\n  stepBtns.forEach(b => b.addEventListener('click', () => setStep(b.dataset.step)));\n\n  prevBtn?.addEventListener('click', () => goStep(-1));\n  nextBtn?.addEventListener('click', () => {\n    if (state.currentStep === 'summary') addSelectionToCart();\n    else goStep(1);\n  });\n\n  shareBtn?.addEventListener('click', shareBuild);\n  copyBtn?.addEventListener('click', copyBuildUrl);\n// --------------------------------------------------\n// Init\n// --------------------------------------------------\nstate.size = '60';\n\n// \u5148\u306B\u30D5\u30A3\u30EB\u30BF\u30FC\u9069\u7528\nNAV_STEPS.forEach(s => {\n  if (s !== 'summary') applyFilters(s);\n});\n\n// URL\u304B\u3089\u9078\u629E\u72B6\u614B\u3092\u5FA9\u5143\nrestoreSelectionsFromUrl();\n\n// URL\u306B\u306A\u3044\u3082\u306E\u3060\u3051\u30C7\u30D5\u30A9\u30EB\u30C8\u9078\u629E\nPRICE_STEPS.forEach(step => ensureDefaultSelection(step));\n\nupdateTotal();\nsaveFilterStateFromUI('case');\nrenderBuildMiniSummary();\n\n// \u5171\u6709URL\u306A\u3089summary\u3078\nif (hasBuildParamsInUrl()) {\n  setStep('summary');\n\n  // \u2605 summary\u3067\u3082\u9078\u629E\u6E08\u307F3D\u3092\u518D\u8868\u793A\u3059\u308B\n  PRICE_STEPS.forEach(step => {\n    const s = state.selections[step];\n    if (s?.modelUrl) {\n      fireAndForget(loadModelForStep(step, s.modelUrl));\n    }\n  });\n} else {\n  setStep('case');\n}\n\nrenderBuildMiniSummary();\n})();"],
  "mappings": "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",
  "names": ["buildMini"]
}
