{"product_id":"rilievo-series-a6-textured-notebook","title":"Rilievo Series — A6 Textured Notebook Set","description":"\u003ch2\u003eTexture with a personal touch.\u003c\/h2\u003e\u003cp\u003eA notebook with a little more character. Rilievo Series brings a distinctive textured cover to your everyday notes, sketches and plans.\u003c\/p\u003e\u003ch3\u003eA6 — HK$599\u003c\/h3\u003e\u003cp\u003eYour set includes a notebook cover and three refill notebooks. Personalise the finishing details to make it yours.\u003c\/p\u003e\u003cul\u003e\n\u003cli\u003eSize: A6\u003c\/li\u003e\n\u003cli\u003eIncludes: cover + three refill notebooks\u003c\/li\u003e\n\u003cli\u003eOptional second cord: +HK$40\u003c\/li\u003e\n\u003cli\u003eOptional engraving: +HK$70\u003c\/li\u003e\n\u003c\/ul\u003e\u003ch3\u003e讓紋理，成為日常的一部分。\u003c\/h3\u003e\u003cp\u003eRilievo Series A6 特別紋理系列，為筆記、草圖與日常計劃添上個性。HK$599 包含筆記本封套及三本內芯；第二條 Cord 另加 HK$40，雕刻另加 HK$70。\u003c\/p\u003e\n\u003cstyle id=\"suitisfy-a6-foil-swatch-readability\" data-name=\"SUITISFY foil swatch readability\"\u003e\n\/* SUITISFY foil swatch readability *\/\n:is(optionize-app[product-id=\"15675877130434\"],optionize-app[product-id=\"15675877884098\"]) .oz__option-type-image-swatch:has(button#option-value-1790515071359){--suitisfy-foil-card:140px;}:is(optionize-app[product-id=\"15675877130434\"],optionize-app[product-id=\"15675877884098\"]) .oz__option-type-image-swatch:has(button#option-value-1790515071359)\u003e.oz__option-values{display:grid !important;grid-template-columns:repeat(auto-fit,var(--suitisfy-foil-card)) !important;gap:12px !important;max-width:100% !important;align-items:start;}:is(optionize-app[product-id=\"15675877130434\"],optionize-app[product-id=\"15675877884098\"]) .oz__option-type-image-swatch:has(button#option-value-1790515071359) .oz__option-value-container{width:var(--suitisfy-foil-card) !important;max-width:100% !important;margin:0 !important;}:is(optionize-app[product-id=\"15675877130434\"],optionize-app[product-id=\"15675877884098\"]) .oz__option-type-image-swatch:has(button#option-value-1790515071359) .oz__option-value-container\u003e.oz__option-tooltip{display:block !important;position:relative !important;width:100% !important;}:is(optionize-app[product-id=\"15675877130434\"],optionize-app[product-id=\"15675877884098\"]) .oz__option-type-image-swatch:has(button#option-value-1790515071359) button.oz__option-element-image-swatch{box-sizing:border-box !important;width:var(--suitisfy-foil-card) !important;height:176px !important;padding:140px 4px 6px !important;margin:0 !important;background-image:none !important;background-color:#fff !important;border-radius:4px !important;color:#222 !important;font-size:13px !important;line-height:18px !important;text-indent:0 !important;text-align:center !important;white-space:normal !important;overflow:visible !important;}:is(optionize-app[product-id=\"15675877130434\"],optionize-app[product-id=\"15675877884098\"]) .oz__option-type-image-swatch:has(button#option-value-1790515071359) .oz__option-value-container\u003e.oz__option-tooltip\u003e.oz__option-tooltip-text{display:block !important;visibility:visible !important;opacity:1 !important;position:absolute !important;top:4px !important;bottom:auto !important;left:4px !important;right:4px !important;width:auto !important;height:132px !important;margin:0 !important;padding:0 !important;border:0 !important;border-radius:0 !important;background:transparent !important;box-shadow:none !important;transform:none !important;font-size:0 !important;line-height:0 !important;pointer-events:none !important;z-index:1 !important;}:is(optionize-app[product-id=\"15675877130434\"],optionize-app[product-id=\"15675877884098\"]) .oz__option-type-image-swatch:has(button#option-value-1790515071359) .oz__option-value-container .oz__option-tooltip-text::after,:is(optionize-app[product-id=\"15675877130434\"],optionize-app[product-id=\"15675877884098\"]) .oz__option-type-image-swatch:has(button#option-value-1790515071359) .oz__option-value-container .oz__option-tooltip-text::before{display:none !important;}:is(optionize-app[product-id=\"15675877130434\"],optionize-app[product-id=\"15675877884098\"]) .oz__option-type-image-swatch:has(button#option-value-1790515071359) img.oz__option-tooltip-image{display:block !important;width:100% !important;height:132px !important;max-width:100% !important;max-height:none !important;margin:0 !important;padding:0 !important;object-fit:contain !important;object-position:center !important;}@media (max-width:749px){:is(optionize-app[product-id=\"15675877130434\"],optionize-app[product-id=\"15675877884098\"]) .oz__option-type-image-swatch:has(button#option-value-1790515071359)\u003e.oz__option-values{grid-template-columns:repeat(2,var(--suitisfy-foil-card)) !important;}}\n\u003c\/style\u003e\n\u003cstyle id=\"suitisfy-a6-leather-swatch-consistency\"\u003e\nvariant-picker[data-product-id=\"15675877130434\"] .variant-option__button-label:has(\u003e input[name^=\"Color-\"]) { width:40px; height:40px; min-width:40px; min-height:40px; padding:0; flex:0 0 40px; border-radius:10px; background-size:cover; background-position:center; border:1px solid #a1a18b; overflow:visible; }\nvariant-picker[data-product-id=\"15675877130434\"] .variant-option__button-label:has(\u003e input[name^=\"Color-\"]) \u003e .variant-option__button-label__pill { display:none; }\nvariant-picker[data-product-id=\"15675877130434\"] .variant-option__button-label:has(\u003e input[name^=\"Color-\"]) \u003e .variant-option__button-label__text { position:absolute; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip:rect(0,0,0,0); white-space:nowrap; border:0; }\nvariant-picker[data-product-id=\"15675877130434\"] .variant-option__button-label:has(\u003e input[name^=\"Color-\"]):has(\u003e input:checked) { outline:2px solid #18285c; outline-offset:3px; }\nvariant-picker[data-product-id=\"15675877130434\"] .variant-option__button-label:has(\u003e input[name^=\"Color-\"]):has(\u003e input:focus-visible) { outline:3px solid #18285c; outline-offset:4px; }\nvariant-picker[data-product-id=\"15675877130434\"] .variant-option__button-label:has(\u003e input[name^=\"Color-\"]):has(\u003e input[aria-disabled=\"true\"]) { opacity:.45; }\nvariant-picker[data-product-id=\"15675877130434\"] fieldset:has(input[name^=\"Color-\"]) { gap:12px; }\nvariant-picker[data-product-id=\"15675877130434\"] fieldset:has(input[name^=\"Color-\"]) \u003e legend::after { font-size:14px; font-weight:400; margin-inline-start:8px; }\nvariant-picker[data-product-id=\"15675877130434\"] .variant-option__button-label:has(\u003e input[data-option-value-id=\"15674597146818\"]) { background-image:url(\"https:\/\/cdn.shopify.com\/s\/files\/1\/0519\/0375\/8530\/files\/NaPRBZlbypPIXadA.jpg?v=1794330723\u0026width=80\"); }\nvariant-picker[data-product-id=\"15675877130434\"] fieldset:has(input[data-option-value-id=\"15674597146818\"]:checked) \u003e legend::after { content:\"Deep Green \/ 深綠\"; }\nvariant-picker[data-product-id=\"15675877130434\"] .variant-option__button-label:has(\u003e input[data-option-value-id=\"15674597179586\"]) { background-image:url(\"https:\/\/cdn.shopify.com\/s\/files\/1\/0519\/0375\/8530\/files\/CslEPtEGwppXVdNP.jpg?v=1794330723\u0026width=80\"); }\nvariant-picker[data-product-id=\"15675877130434\"] fieldset:has(input[data-option-value-id=\"15674597179586\"]:checked) \u003e legend::after { content:\"Russet Brown \/ 紅棕\"; }\nvariant-picker[data-product-id=\"15675877130434\"] .variant-option__button-label:has(\u003e input[data-option-value-id=\"15674597212354\"]) { background-image:url(\"https:\/\/cdn.shopify.com\/s\/files\/1\/0519\/0375\/8530\/files\/XoojePaqZTHKJlLL.jpg?v=1794330723\u0026width=80\"); }\nvariant-picker[data-product-id=\"15675877130434\"] fieldset:has(input[data-option-value-id=\"15674597212354\"]:checked) \u003e legend::after { content:\"Red \/ 紅色\"; }\nvariant-picker[data-product-id=\"15675877884098\"] .variant-option__button-label:has(\u003e input[name^=\"Color-\"]) { width:40px; height:40px; min-width:40px; min-height:40px; padding:0; flex:0 0 40px; border-radius:10px; background-size:cover; background-position:center; border:1px solid #a1a18b; overflow:visible; }\nvariant-picker[data-product-id=\"15675877884098\"] .variant-option__button-label:has(\u003e input[name^=\"Color-\"]) \u003e .variant-option__button-label__pill { display:none; }\nvariant-picker[data-product-id=\"15675877884098\"] .variant-option__button-label:has(\u003e input[name^=\"Color-\"]) \u003e .variant-option__button-label__text { position:absolute; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip:rect(0,0,0,0); white-space:nowrap; border:0; }\nvariant-picker[data-product-id=\"15675877884098\"] .variant-option__button-label:has(\u003e input[name^=\"Color-\"]):has(\u003e input:checked) { outline:2px solid #18285c; outline-offset:3px; }\nvariant-picker[data-product-id=\"15675877884098\"] .variant-option__button-label:has(\u003e input[name^=\"Color-\"]):has(\u003e input:focus-visible) { outline:3px solid #18285c; outline-offset:4px; }\nvariant-picker[data-product-id=\"15675877884098\"] .variant-option__button-label:has(\u003e input[name^=\"Color-\"]):has(\u003e input[aria-disabled=\"true\"]) { opacity:.45; }\nvariant-picker[data-product-id=\"15675877884098\"] fieldset:has(input[name^=\"Color-\"]) { gap:12px; }\nvariant-picker[data-product-id=\"15675877884098\"] fieldset:has(input[name^=\"Color-\"]) \u003e legend::after { font-size:14px; font-weight:400; margin-inline-start:8px; }\nvariant-picker[data-product-id=\"15675877884098\"] .variant-option__button-label:has(\u003e input[data-option-value-id=\"15674549960898\"]) { background-image:url(\"https:\/\/cdn.shopify.com\/s\/files\/1\/0519\/0375\/8530\/files\/dADNmpvKULWMiXdr.jpg?v=1794330874\u0026width=80\"); }\nvariant-picker[data-product-id=\"15675877884098\"] fieldset:has(input[data-option-value-id=\"15674549960898\"]:checked) \u003e legend::after { content:\"Brown \/ 啡色\"; }\nvariant-picker[data-product-id=\"15675877884098\"] .variant-option__button-label:has(\u003e input[data-option-value-id=\"15674549993666\"]) { background-image:url(\"https:\/\/cdn.shopify.com\/s\/files\/1\/0519\/0375\/8530\/files\/ksYCNLiWDIMvXebU.jpg?v=1794330874\u0026width=80\"); }\nvariant-picker[data-product-id=\"15675877884098\"] fieldset:has(input[data-option-value-id=\"15674549993666\"]:checked) \u003e legend::after { content:\"Olive Green \/ 橄欖綠\"; }\n\u003c\/style\u003e\n\u003cstyle id=\"suitisfy-purchase-summary-style\"\u003e\n\/* Inline this stylesheet in a description \u003cstyle\u003e; no imports or font requests. *\/\n.suitisfy-purchase-summary[data-suitisfy-summary] {\n  box-sizing: border-box;\n  display: block;\n  width: 100%;\n  margin: 14px 0 18px;\n  padding: 22px 24px 18px;\n  border: 1px solid #C3CCA6;\n  border-radius: 12px;\n  background: #FDF9F0;\n  color: #152868;\n  font: 400 14px\/1.5 \"Instrument Sans\", sans-serif;\n  text-align: left;\n  overflow-wrap: anywhere;\n}\n.suitisfy-purchase-summary[data-suitisfy-summary] * { box-sizing: border-box; }\n.suitisfy-purchase-summary[data-suitisfy-summary] h2 {\n  margin: 0 0 18px;\n  color: #152868;\n  font: 400 28px\/1.12 \"Instrument Serif\", Georgia, serif;\n  letter-spacing: -.02em;\n}\n.suitisfy-purchase-summary[data-suitisfy-summary] small {\n  display: block;\n  margin-top: 3px;\n  color: #152868;\n  font: 400 11px\/1.5 \"Instrument Sans\", sans-serif;\n  letter-spacing: normal;\n  opacity: .8;\n}\n.suitisfy-purchase-summary[data-suitisfy-summary] .suitisfy-summary-row {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) auto;\n  gap: 12px;\n  align-items: start;\n  padding: 7px 0;\n}\n.suitisfy-purchase-summary[data-suitisfy-summary] .suitisfy-summary-row \u003e span {\n  font-variant-numeric: tabular-nums;\n  white-space: nowrap;\n}\n.suitisfy-purchase-summary[data-suitisfy-summary] .suitisfy-summary-total {\n  margin-top: 12px;\n  padding-top: 16px;\n  border-top: 1px solid #C3CCA6;\n  font-size: 18px;\n  font-weight: 600;\n}\n.suitisfy-purchase-summary[data-suitisfy-summary] .suitisfy-summary-note {\n  margin: 12px 0 0;\n  font-size: 12px;\n  line-height: 1.5;\n}\n.suitisfy-purchase-summary[data-suitisfy-summary] .suitisfy-summary-pending {\n  margin: 0;\n  padding: 10px 0;\n  font-size: 16px;\n}\n@media (max-width: 749px) {\n  .suitisfy-purchase-summary[data-suitisfy-summary] { padding: 18px 16px 16px; }\n  .suitisfy-purchase-summary[data-suitisfy-summary] h2 { font-size: 26px; }\n  .suitisfy-purchase-summary[data-suitisfy-summary] .suitisfy-summary-row { gap: 8px; font-size: 13px; }\n  .suitisfy-purchase-summary[data-suitisfy-summary] .suitisfy-summary-total { font-size: 17px; }\n}\n\u003c\/style\u003e\n\u003cscript data-suitisfy-purchase-summary=\"1055\"\u003e\n\/* SUITISFY purchase summary: display only; embed verbatim in a description \u003cscript\u003e. *\/\n(() =\u003e {\n  'use strict';\n  const host = document.currentScript?.closest('.shopify-section');\n  const main = host?.closest('main');\n  if (!main || !\/__main$\/.test(host.id)) return; \/\/ Never cards, quick views, or sticky forms.\n  const key = '__suitisfyPurchaseSummary1055';\n  const instances = window[key] || (window[key] = new Map());\n  if (instances.has(host.id)) { instances.get(host.id)(); return; }\n  const sectionId = host.id;\n  const excluded = 'sticky-add-to-cart, .sticky-add-to-cart, [data-suitisfy-summary]';\n  let root = host, panel, queued = false, last = '', productId;\n  const esc = s =\u003e String(s ?? '').replace(\/[\u0026\u003c\u003e\"']\/g, c =\u003e ({\n    '\u0026': '\u0026amp;', '\u003c': '\u0026lt;', '\u003e': '\u0026gt;', '\"': '\u0026quot;', \"'\": '\u0026#39;'\n  })[c]);\n  const bilingual = (en, zh) =\u003e `\u003cspan lang=\"en\"\u003e${esc(en)}\u003c\/span\u003e\u003csmall lang=\"zh-Hant\"\u003e${esc(zh)}\u003c\/small\u003e`;\n  const finite = v =\u003e v !== null \u0026\u0026 v !== undefined \u0026\u0026 String(v).trim() !== '' \u0026\u0026 Number.isFinite(Number(v));\n  const cents = v =\u003e { if (!finite(v) || Number(v) \u003c 0) throw Error('Invalid amount'); return Math.round(Number(v) * 100); };\n  const json = selector =\u003e {\n    const node = root.querySelector(selector);\n    if (!node) return null;\n    let value = JSON.parse(node.textContent);\n    if (typeof value === 'string') value = JSON.parse(value);\n    return value;\n  };\n  const translated = s =\u003e window.optionizeTranslations?.[s] || s;\n  const zh = {\n    'Double Cord Option': '第二條繩', 'Front Engraving': '正面雕刻',\n    'Extra Refills': '額外內芯', 'Extra Blank Refill': '額外空白內芯',\n    'Extra Calendar Refill': '額外日曆內芯', 'Extra Dot Refill': '額外點陣內芯',\n    'Extra Line Refill': '額外橫線內芯'\n  };\n  function moneyParser(format) {\n    const token = format.match(\/\\{\\{\\s*([a-z_]+)\\s*\\}\\}\/)?.[1];\n    const separators = {\n      amount: [',', '.'], amount_no_decimals: [',', null],\n      amount_with_comma_separator: ['.', ','], amount_no_decimals_with_comma_separator: ['.', null],\n      amount_with_apostrophe_separator: [\"'\", '.'], amount_with_space_separator: [' ', ','],\n      amount_no_decimals_with_space_separator: [' ', null], amount_with_period_and_space_separator: [' ', '.']\n    };\n    if (!separators[token]) throw Error('Unknown money format');\n    const [group, decimal] = separators[token];\n    if (!decimal) throw Error('Rounded markup cannot certify cents');\n    return text =\u003e {\n      const numbers = String(text).replace(\/[\\u00a0\\u202f]\/g, ' ').match(\/[\\d][\\d.,' ]*\/g);\n      if (numbers?.length !== 1 || \/[-−]\/.test(text)) throw Error('Ambiguous price');\n      const normalized = numbers[0].trim().split(group).join('').replace(decimal, '.');\n      if (!\/^\\d+(\\.\\d{1,2})?$\/.test(normalized)) throw Error('Invalid price');\n      return cents(normalized);\n    };\n  }\n  function selectedFees(config, app, prices, presentment, rate, parse) {\n    const fields = [...app.querySelectorAll('.oz__option')];\n    const result = [];\n    for (const option of config.options) {\n      const values = option.values || [];\n      const paid = values.some(v =\u003e v.addOnProductVariant || v.generatedAddOnProductVariant || Number(v.addOnPrice) \u003e 0);\n      if (!paid) continue;\n      const candidates = fields.filter(field =\u003e {\n        const label = field.querySelector('.oz__option-label')?.cloneNode(true);\n        label?.querySelectorAll('.oz__option-price').forEach(n =\u003e n.remove());\n        return label?.textContent.trim() === translated(option.label) \u0026\u0026\n          field.classList.contains(`oz__option-type-${option.type}`);\n      });\n      if (!candidates.length) {\n        if (option.visible \u0026\u0026 !option.enableConditionalLogic) throw Error('App is rerendering');\n        continue;\n      }\n      if (candidates.length !== 1) throw Error('Ambiguous option group');\n      const field = candidates[0];\n      const controls = [...field.querySelectorAll('input, button, select, textarea')];\n      let chosen = [];\n      if (option.multiValueField) {\n        chosen = controls.filter(n =\u003e n.matches('.oz__option-value--selected, input:checked'))\n          .map(n =\u003e n.id);\n        controls.filter(n =\u003e n.tagName === 'SELECT').forEach(n =\u003e chosen.push(n.value));\n        if (chosen.some(id =\u003e !values.some(v =\u003e v.id === id))) throw Error('Unknown selection');\n      } else {\n        if (option.type === 'dimension') throw Error('Unsupported paid dimensions');\n        if (controls.some(n =\u003e n.type === 'checkbox' ? n.checked : n.value?.trim())) chosen = [values[0]?.id];\n      }\n      for (const id of new Set(chosen)) {\n        const v = values.find(value =\u003e value.id === id);\n        const variant = v.addOnProductVariant || v.generatedAddOnProductVariant;\n        let amount;\n        if (v.addOnProductVariant \u0026\u0026 v.addOnPriceMode === 'free') amount = 0;\n        else if (v.addOnProductVariant \u0026\u0026 v.addOnPriceMode === 'fixed') amount = Math.round(cents(v.addOnPrice) * rate);\n        else if (finite(presentment[variant])) amount = Math.round(Number(presentment[variant]));\n        else if (prices[variant] != null) amount = parse(String(prices[variant]));\n        else if (v.generatedAddOnProductVariant \u0026\u0026 finite(v.addOnPrice)) amount = Math.round(cents(v.addOnPrice) * rate);\n        else throw Error('Missing add-on market price');\n        if (!Number.isSafeInteger(amount) || amount \u003c 0) throw Error('Invalid add-on price');\n        if (prices[variant] != null \u0026\u0026 parse(String(prices[variant])) !== amount) throw Error('Price metadata mismatch');\n        if (amount) result.push({ en: `${option.name || option.label} — ${v.label}`, zh: zh[v.label] || zh[option.name] || '付費加購', amount });\n      }\n    }\n    return result;\n  }\n  function readTotal(component) {\n    const id = component.dataset.productId || root.dataset.productId;\n    if (!\/^\\d+$\/.test(id || '') || productId \u0026\u0026 productId !== id) throw Error('Product changed');\n    productId = id;\n    const form = component.querySelector('form.shopify-product-form');\n    if (!form || !\/\\\/cart\\\/add(?:\\?|$)\/.test(form.getAttribute('action'))) throw Error('No main form');\n    const qtyInputs = form.querySelectorAll('input[name=\"quantity\"]');\n    const quantity = Number(qtyInputs[0]?.value);\n    if (qtyInputs.length !== 1 || !Number.isSafeInteger(quantity) || quantity \u003c 1) throw Error('Invalid quantity');\n    const active = window.Shopify?.currency?.active;\n    const meta = window.optionizeMeta || window.Shopify?.optionize?.meta;\n    if (!\/^[A-Z]{3}$\/.test(active || '') || !meta || meta.activeCurrency !== active) throw Error('Currency pending');\n    const rate = Number(meta.currencyRate ?? window.Shopify.currency.rate);\n    if (!Number.isFinite(rate) || rate \u003c= 0) throw Error('Currency rate missing');\n    const parse = moneyParser(meta.moneyFormat || '');\n    const app = root.querySelector(`optionize-app[product-id=\"${id}\"]`);\n    const config = json(`script[id=\"optionize-option-set-${id}\"]`);\n    if (!app?.querySelector('.oz__options') || !Array.isArray(config?.options)) throw Error('Options pending');\n    const prices = json(`script[id=\"optionize-prices-${id}\"]`) || {};\n    const presentment = json(`script[id=\"optionize-prices-cents-${id}\"]`) || {};\n    const picker = root.querySelector(`variant-picker[data-product-id=\"${id}\"][ref=\"mainVariantPicker\"]`);\n    const variant = picker \u0026\u0026 JSON.parse(picker.querySelector('script[type=\"application\/json\"]')?.textContent || 'null');\n    if (!variant || String(variant.id) !== form.querySelector('input[name=\"id\"]')?.value || !finite(variant.price)) throw Error('Variant pending');\n    const priceNodes = [...root.querySelectorAll(`product-price[data-product-id=\"${id}\"] [ref=\"priceContainer\"] .price`)]\n      .filter(n =\u003e !n.closest(excluded) \u0026\u0026 !n.closest('.price__hidden, [hidden]') \u0026\u0026 n.getClientRects().length);\n    if (priceNodes.length !== 1) throw Error('Ambiguous main price');\n    const node = priceNodes[0], original = node.getAttribute('data-original-price');\n    const base = original ? parse(original) : Math.round(Number(variant.price));\n    if (base !== Math.round(Number(variant.price))) throw Error('Variant base pending');\n    const unit = parse(node.textContent);\n    const fees = selectedFees(config, app, prices, presentment, rate, parse);\n    if (base + fees.reduce((sum, fee) =\u003e sum + fee.amount, 0) !== unit) throw Error('Total pending');\n    if (![unit * quantity, base * quantity].every(Number.isSafeInteger)) throw Error('Total too large');\n    return { quantity, base, unit, fees, active };\n  }\n  function refresh() {\n    queued = false;\n    root = document.getElementById(sectionId);\n    if (!root || !main.contains(root)) { panel?.remove(); return; }\n    const components = [...root.querySelectorAll('product-form-component[data-product-id]')].filter(n =\u003e !n.closest(excluded));\n    if (components.length !== 1) { panel?.remove(); return; }\n    const component = components[0];\n    const target = component.closest('.buy-buttons-block') || component;\n    if (target.closest('.shopify-section') !== root || target.closest('form')) return;\n    if (!panel) {\n      panel = document.createElement('aside');\n      panel.className = 'suitisfy-purchase-summary';\n      panel.setAttribute('data-suitisfy-summary', '');\n      panel.setAttribute('aria-label', 'Purchase summary \/ 選購摘要');\n      panel.setAttribute('aria-live', 'polite');\n      panel.setAttribute('aria-atomic', 'true');\n    }\n    if (panel.nextElementSibling !== target) target.before(panel);\n    let content = `\u003ch2\u003e${bilingual('Your notebook, your way', '你的筆記簿，你的風格')}\u003c\/h2\u003e`;\n    try {\n      const t = readTotal(component);\n      const formatter = new Intl.NumberFormat('en', { style: 'currency', currency: t.active, currencyDisplay: 'code', minimumFractionDigits: 2, maximumFractionDigits: 2 });\n      const money = amount =\u003e esc(formatter.format(amount \/ 100));\n      const row = (label, amount, cls = '') =\u003e `\u003cdiv class=\"suitisfy-summary-row ${cls}\"\u003e\u003cdiv\u003e${label}\u003c\/div\u003e\u003cspan\u003e${amount}\u003c\/span\u003e\u003c\/div\u003e`;\n      content += row(bilingual('Quantity', '數量'), esc(t.quantity));\n      content += row(bilingual(`Notebook × ${t.quantity}`, '筆記簿／封套'), money(t.base * t.quantity));\n      content += t.fees.map(f =\u003e row(bilingual(`${f.en} × ${t.quantity}`, f.zh), money(f.amount * t.quantity))).join('');\n      if (!t.fees.length) content += `\u003cp class=\"suitisfy-summary-note\"\u003e${bilingual('No paid add-ons selected', '未選擇付費加購')}\u003c\/p\u003e`;\n      content += row(bilingual('Subtotal', '小計'), money(t.unit * t.quantity), 'suitisfy-summary-total');\n      content += `\u003cp class=\"suitisfy-summary-note\"\u003e${bilingual('Selected add-ons included. Shipping calculated at checkout.', '已包括所選加購；運費於結帳時計算。')}\u003c\/p\u003e`;\n    } catch (_) {\n      content += `\u003cp class=\"suitisfy-summary-pending\"\u003e${bilingual('Updating total…', '正在更新總額…')}\u003c\/p\u003e`;\n    }\n    if (content !== last) { panel.innerHTML = content; last = content; }\n  }\n  function schedule() {\n    if (!queued) { queued = true; setTimeout(refresh, 32); }\n  }\n  instances.set(sectionId, schedule);\n  new MutationObserver(records =\u003e {\n    if (records.some(r =\u003e {\n      const el = r.target.nodeType === 1 ? r.target : r.target.parentElement;\n      if (el?.closest(excluded)) return false;\n      if (r.type === 'childList' \u0026\u0026 [...r.addedNodes, ...r.removedNodes].every(n =\u003e n === panel)) return false;\n      return root?.contains(el) || [...r.addedNodes, ...r.removedNodes].some(n =\u003e n.nodeType === 1 \u0026\u0026 (n.id === sectionId || n.contains(root)));\n    })) schedule();\n  }).observe(main, { subtree: true, childList: true, characterData: true, attributes: true });\n  \/\/ Property-only quantity\/checked updates emit no mutations; read them without app listeners.\n  setInterval(() =\u003e { if (!document.hidden) schedule(); }, 350);\n  refresh();\n})();\n\u003c\/script\u003e","brand":"SUITISFY","offers":[{"title":"A6 \/ Brown \/ 啡色","offer_id":68955948777666,"sku":"STF-RIL-A6-BR","price":599.0,"currency_code":"HKD","in_stock":true},{"title":"A6 \/ Olive Green \/ 橄欖綠","offer_id":68958376755394,"sku":"STF-RIL-A6-OG","price":599.0,"currency_code":"HKD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0519\/0375\/8530\/files\/TnhGRQeZydeWJAWE.jpg?v=1794330874","url":"https:\/\/suitisfy.com\/products\/rilievo-series-a6-textured-notebook","provider":"SUITISFY","version":"1.0","type":"link"}