{
  "version": 3,
  "sources": ["/cdn/shop/t/6/assets/kb-table-designer.js"],
  "sourcesContent": ["(function () {\n\n  \"use strict\";\n\n\n\n  const cfg = window.KB_TABLE_CONFIG || {};\n\n  const root = document.querySelector(\"[data-kb-table-designer]\");\n\n  if (!root || !cfg.saveUrl) return;\n\n\n\n  const form = root.querySelector(\"[data-kb-table-form]\");\n\n  const preview = root.querySelector(\"[data-kb-preview]\");\n\n  const selectionSummary = root.querySelector(\"[data-kb-selection-summary]\");\n\n  const message = root.querySelector(\"[data-kb-message]\");\n\n  const autosaveStatus = root.querySelector(\"[data-kb-autosave-status]\");\n\n  const cartCheck = root.querySelector(\"[data-kb-cart-check]\");\n\n  const addButton = root.querySelector(\"[data-kb-add]\");\n\n  const priceNodes = root.querySelectorAll(\"[data-kb-price], [data-kb-price-mobile]\");\n\n  const alternateShapes = root.querySelector(\"[data-kb-alternate-shapes]\");\n\n  const alternateShapesGrid = root.querySelector(\"[data-kb-alternate-shapes-grid]\");\n\n  const contrastWarning = root.querySelector(\"[data-kb-contrast-warning]\");\n\n  const mobileCheckoutBar = root.querySelector(\"[data-kb-mobile-checkout]\");\n\n  const mobileOpenButton = root.querySelector(\"[data-kb-mobile-open]\");\n\n  const mobileOpenDefaultText = mobileOpenButton ? mobileOpenButton.textContent : \"Personalizuj\";\n\n  const mobileCloseButton = root.querySelector(\"[data-kb-mobile-close]\");\n\n  const dimensionOptions = root.querySelector(\"[data-kb-dimension-options]\");\n\n  const customDimWrap = root.querySelector(\"[data-kb-custom-dim]\");\n\n  const customWidthInput = root.querySelector('[name=\"custom_width\"]');\n\n  const customHeightInput = root.querySelector('[name=\"custom_height\"]');\n\n  let customDimActive = false;\n\n  const selectedDimensionLabel = root.querySelector(\"[data-kb-selected-dimension]\");\n\n  const shapeCurrentLabel = root.querySelector(\"[data-kb-shape-current]\");\n\n  const dogSymbolPicker = root.querySelector(\"[data-kb-dog-symbol-picker]\");\n\n  const dogSymbolSearch = root.querySelector(\"[data-kb-dog-symbol-search]\");\n\n  const dogSymbolGrid = root.querySelector(\"[data-kb-dog-symbol-grid]\");\n\n  const variantInput = document.querySelector('form[action*=\"/cart/add\"] [name=\"id\"], product-form [name=\"id\"]');\n\n  const rootPlaceholder = document.createComment(\"kb-table-designer-anchor\");\n\n  if (root.parentNode) root.parentNode.insertBefore(rootPlaceholder, root);\n\n  const wizardSteps = [\"text\", \"colors\", \"details\"];\n\n  const wizardStepTitles = {\n\n    text: \"Tekst\",\n\n    colors: \"Boje\",\n\n    details: \"Detalji\"\n\n  };\n\n  const wizardStepActions = {\n\n    text: \"Izaberi boje\",\n\n    colors: \"Dodaj detalje\",\n\n    details: \"Dodaj u korpu\"\n\n  };\n\n\n\n  let lastDesign = null;\n\n  let dirty = true;\n\n  let renderTimer = null;\n\n  let alternateRenderTimer = null;\n\n  let alternateRenderSeq = 0;\n\n  let rendererModulePromise = null;\n\n  let dogSymbols = [];\n\n  let dogSmartNames = {};\n\n  let activeTextField = form ? form.querySelector('[name=\"street\"]') : null;\n\n  let dimResizeObserver = null;\n\n  let galleryPreviewActive = false;\n\n  let galleryPreview = null;\n\n  let activeStepLockUntil = 0;\n\n  let contactPhoneTimer = null;\n\n  let lastIdentifiedContactPhone = \"\";\n\n  let phoneIdentifyPromise = null;\n\n  let draftSaveTimer = null;\n\n  let draftAnalyticsTimer = null;\n\n  let autosaveStatusTimer = null;\n\n  let saveToastTimer = null;\n\n  let lastDraftAnalyticsAt = 0;\n\n  let restoringDraft = false;\n\n  let relatedPrefillReported = false;\n\n  // Measurement state is page-local; restored/prefilled text is the baseline.\n  let primaryTextBaseline = null;\n  const primaryTextTouched = { street: false, number: false };\n  let primaryTextEditReported = false;\n  let configuratorOpenedReported = false;\n  let configuratorVisibilityObserver = null;\n  let initialDraftSource = \"default\";\n\n  const transliterationTimers = new WeakMap();\n\n  const LS_ANON_ID = \"gs_anon_id\";\n\n  const LS_LEAD_ID = \"gs_lead_id\";\n\n  const LS_SESSION_ID = \"gs_session_id\";\n\n  const LS_LAST_ACTIVITY = \"gs_last_activity\";\n\n  const LS_META_LEAD_EVENT_PREFIX = \"gs_meta_lead_event_sent:\";\n  const LS_DESIGN_DRAFT_PREFIX = \"kb_table_design_draft:\";\n  const LS_DESIGN_TEXT_PREFIX = \"kb_table_design_last_text:\";\n  const LS_RENDER_ERROR_PREFIX = \"kb_table_render_error:\";\n  const SESSION_TIMEOUT_MS = 30 * 60 * 1000;\n  const DRAFT_SAVE_DELAY_MS = 350;\n\n  const DRAFT_ANALYTICS_DELAY_MS = 12000;\n\n  const DRAFT_ANALYTICS_MIN_INTERVAL_MS = 45000;\n\n  const CRM_EDITOR_BASE_URL = \"https://app.fordservisbeograd.rs/table_designer/studio.php?design_id=\";\n\n  const MAILBOX_MIRROR_PLATE_COLORS = new Set([\"srebrno_ogledalo\", \"zlatno_ogledalo\"]);\n\n  const HOUSE_NUMBER_RE = /^[0-9A-Za-z\u0400-\u04FF]+([ /-][0-9A-Za-z\u0400-\u04FF]+)*$/u;\n\n  const HOUSE_NUMBER_MESSAGE = \"Dozvoljeni su cifre, slova i / - (npr. 15, 15a, 15/1, bb).\";\n\n  const ENGRAVING_TEXT_RE = /^[A-Za-z0-9\\u00C0-\\u024F\\u0400-\\u04FF\\s.,'&/-]+$/u;\n\n\n\n  const swatchFills = {\n\n    crna: \"#030303\",\n\n    plava: \"#002d83\",\n\n    teget: \"#111934\",\n\n    bela: \"linear-gradient(135deg, #ffffff 0%, #f1f1ec 100%)\",\n\n    siva: \"#808080\",\n\n    antracit: \"#383E42\",\n\n    braon: \"#2b1611\",\n\n    srebrno_ogledalo: \"linear-gradient(135deg, #7c8288 0%, #d5dbe0 34%, #f8fbfd 50%, #a1a8ae 68%, #dfe4e8 82%, #91989f 100%)\",\n\n    zlatno_ogledalo: \"linear-gradient(135deg, #9a7638 0%, #ead6a0 36%, #d1ab63 54%, #f3dc96 74%, #b88f49 100%)\",\n\n    srebrna_metalik: \"linear-gradient(135deg, #262626 0%, #555 42%, #1e1e1e 100%)\",\n\n    crvena: \"#951218\",\n\n    srebrna: \"linear-gradient(135deg, #f1f2f4 0%, #aeb4bc 50%, #d6d9dd 100%)\",\n\n    zlatna: \"linear-gradient(135deg, #f6e8b0 0%, #c9a23f 50%, #e7cf86 100%)\",\n\n    srebrna_graverska: \"linear-gradient(135deg, #aeb2b5 0%, #f0f0ef 38%, #c5c8ca 68%, #e2e3e3 100%)\",\n\n    zlatna_graverska: \"linear-gradient(135deg, #f6e8b0 0%, #c9a23f 50%, #e7cf86 100%)\",\n\n    crna_graverska: \"#030303\"\n\n  };\n\n  const comboSolidFills = {\n\n    crna: \"#030303\",\n\n    plava: \"#002d83\",\n\n    teget: \"#111934\",\n\n    bela: \"#f6f6f2\",\n\n    siva: \"#808080\",\n\n    antracit: \"#383E42\",\n\n    braon: \"#2b1611\",\n\n    srebrno_ogledalo: \"#cfd5da\",\n\n    zlatno_ogledalo: \"#d7b15f\",\n\n    srebrna_metalik: \"#555555\",\n\n    crvena: \"#951218\",\n\n    srebrna: \"#c9cfd5\",\n\n    zlatna: \"#d1aa4f\",\n\n    srebrna_graverska: \"#d3d3d3\",\n\n    zlatna_graverska: \"#d1aa4f\",\n\n    crna_graverska: \"#030303\",\n\n  };\n\n\n\n  const shapeLabels = {\n\n    moderni: \"Oblik 1\",\n\n    oblik_2: \"Oblik 2\",\n\n    oblik_3: \"Oblik 3\",\n\n    oblik_4: \"Oblik 4 - Linije\",\n\n    oblik_4_srpski: \"Oblik 4 - Srpski\",\n\n    oblik_4_retro: \"Oblik 4 - Retro\",\n\n    oblik_4_pola_pola: \"Oblik 4 - Pola pola\",\n\n    video_nadzor: \"Video nadzor\",\n\n    zabranjeno_parkiranje: \"Zabranjeno parkiranje\",\n\n    cuvaj_se_psa: \"\u010Cuvaj se psa\",\n\n    postansko_sanduce: \"Po\u0161tansko sandu\u010De\",\n\n    standard: \"Oblik 4\",\n\n    oblik_5: \"Oblik 5\",\n\n    oblik_6: \"Oblik 6\",\n\n    pojedinacni_karakter: \"Pojedina\u010Dni karakteri\",\n\n    stan_plocica: \"Plo\u010Dica\",\n\n    plocica_oblik_1: \"Plo\u010Dica oblik 1\",\n\n    plocica_oblik_2: \"Plo\u010Dica oblik 2\",\n\n    plocica_oblik_4: \"Plo\u010Dica oblik 4\"\n\n  };\n\n  const centerNumberShapes = new Set([\"moderni\", \"standard\"]);\n\n  const houseShapeOptions = [\n\n    { shape: \"moderni\", label: \"Oblik 1\", handlePart: \"1\" },\n\n    { shape: \"oblik_2\", label: \"Oblik 2\", handlePart: \"2\" },\n\n    { shape: \"oblik_3\", label: \"Oblik 3\", handlePart: \"3\" },\n\n    { shape: \"standard\", label: \"Oblik 4\", handlePart: \"4\" },\n\n    { shape: \"oblik_4_pola_pola\", label: \"Oblik 4 - Pola pola\", handlePart: \"4-2-1-pola-pola\" },\n\n    { shape: \"oblik_5\", label: \"Oblik 5\", handlePart: \"5\" },\n\n    { shape: \"oblik_6\", label: \"Oblik 6\", handlePart: \"6\" }\n\n  ];\n\n  const apartmentPlateShapeOptions = [\n\n    { key: \"plocica_oblik_1\", shape: \"plocica_oblik_1\", label: \"Plo\u010Dica 1\", productHandle: \"plocica-1\", width_cm: 12, height_cm: 5 },\n\n    { key: \"plocica_oblik_2\", shape: \"plocica_oblik_2\", label: \"Plo\u010Dica 2\", productHandle: \"plocica-2\", width_cm: 15, height_cm: 4 },\n\n    { key: \"stan_plocica\", shape: \"stan_plocica\", label: \"Plo\u010Dica 3\", productHandle: \"plocica-3\", width_cm: 15, height_cm: 4 },\n\n    { key: \"plocica_oblik_4\", shape: \"plocica_oblik_4\", label: \"Plo\u010Dica 4\", productHandle: \"plocica-4\", width_cm: 15, height_cm: 4 },\n\n    { key: \"stan_plocica_natpis\", shape: \"stan_plocica\", label: \"Plo\u010Dica natpis\", productHandle: \"plocica-natpis\", width_cm: 15, height_cm: 4, natpisOnly: true }\n\n  ];\n\n\n\n  // Na kvadratnim tablama (odnos 1:1) natpis NIJE obavezan - kupac moze da naruci\n  // samo broj. Za razliku od isNumberOnlyShape, polje za natpis ostaje vidljivo i\n  // upotrebljivo, samo prestaje da bude uslov za poruciti.\n  function isSquareRatioConfig(config) {\n    if (!config) return false;\n    const w = Number(config.width_cm);\n    const h = Number(config.height_cm);\n    if (!w || !h) return false;\n    return Math.abs(w - h) < 0.01;\n  }\n  function isStreetOptional(config) {\n    return config?.shape === \"oblik_4_retro\" || (isSquareRatioConfig(config) && !isNumberOnlyShape(config && config.shape));\n  }\n  function isNumberOnlyShape(shape) {\n\n    return shape === \"oblik_4\" || shape === \"oblik_4_srpski\";\n\n  }\n\n\n\n  function isTextOnlyShape(shape) {\n\n    return shape === \"video_nadzor\" || shape === \"zabranjeno_parkiranje\" || shape === \"cuvaj_se_psa\" || shape === \"postansko_sanduce\" || shape === \"pojedinacni_karakter\";\n\n  }\n\n\n\n  function isApartmentPlateShape(shape) {\n\n    return shape === \"stan_plocica\" || shape === \"plocica_oblik_1\" || shape === \"plocica_oblik_2\" || shape === \"plocica_oblik_4\";\n\n  }\n\n\n\n  function isSingleCharacterShape(shape) {\n\n    return shape === \"pojedinacni_karakter\";\n\n  }\n\n\n\n  function physicalCharacterCount(value) {\n\n    return Array.from(String(value || \"\").replace(/\\s+/g, \"\")).length;\n\n  }\n\n  function unsupportedEngravingChar(value) {\n\n    for (const ch of Array.from(String(value || \"\"))) {\n\n      if (!ENGRAVING_TEXT_RE.test(ch)) return ch;\n\n    }\n\n    return \"\";\n\n  }\n\n\n\n  function unsupportedCharMessage(ch) {\n\n    return `Znak \"${ch}\" nije podrzan za graviranje.`;\n\n  }\n\n\n\n\n\n  function singleCharacterValidation(value) {\n\n    const input = String(value || \"\").trim();\n\n    if (!input) return { ok: false, message: \"Unesite karaktere.\" };\n\n    const count = physicalCharacterCount(input);\n\n    if (!count) return { ok: false, message: \"Unesite karaktere.\" };\n\n    if (count > 20) return { ok: false, message: \"Maksimalno je 20 karaktera.\" };\n\n    const bad = unsupportedEngravingChar(input);\n\n    if (bad) return { ok: false, message: unsupportedCharMessage(bad) };\n\n    return { ok: true, count, value: input };\n\n  }\n\n\n\n  // KB_FLOW_HELPERS_START -- independently regression tested.\n  let flowStage = 'validation';\n  let flowOperation = null;\n  let flowAction = null;\n  let flowPreviewSequence = 0;\n  const flowDiagnosticTimes = new Map();\n  const flowStorageKey = 'kb_design_flow:' + String(cfg.productId || cfg.productHandle || '');\n\n  function flowError(code, stage, detail = '', extra = {}) {\n    return Object.assign(new Error(detail || code), { name: 'KBFlowError', code, stage, ...extra });\n  }\n\n  function flowErrorView(error, saved = false) {\n    const stage = error.stage || flowStage;\n    const code = error.code || (error.name === 'AbortError' ? 'TIMEOUT' : error instanceof TypeError ? 'NETWORK' : 'UNEXPECTED');\n    if (code === 'VALIDATION_ERROR') {\n      const detail = String(error.message || '');\n      return { text: /^(Unesite|Izaberite|Dimenzij|Maksimalno|Broj |Visina |\u010Cuvaj se psa|Izabrani proizvod|Natpis |Dozvoljeni)/i.test(detail) ? detail : 'Proverite unete podatke i izabrane opcije.', action: 'edit' };\n    }\n    if (code === 'FONT_UNSUPPORTED') return { text: 'Izabrani font ne podr\u017Eava neki od unetih znakova. Izaberite drugi font.', action: 'edit' };\n    if (code === 'CART_UNKNOWN') return { text: 'Dodavanje jo\u0161 nije potvr\u0111eno. Va\u0161 dizajn je sa\u010Duvan. Proveri\u0107emo prethodni poku\u0161aj pre ponovnog slanja.', action: 'cart' };\n    if (code === 'CART_WAIT') return { text: 'Prethodni poku\u0161aj se jo\u0161 proverava. Sa\u010Dekajte malo, pa poku\u0161ajte ponovo. Va\u0161 dizajn je sa\u010Duvan.', action: 'cart' };\n    if (code === 'CART_BUSY') return { text: 'Dodavanje je ve\u0107 u toku u drugom prozoru. Sa\u010Dekajte da se zavr\u0161i.', action: 'cart' };\n    if (code === 'CART_PARTIAL') return { text: 'Nije dostupna cela tra\u017Eena koli\u010Dina. Proverite dodate komade u korpi.', action: 'cart' };\n    if (code === 'RATE_LIMIT' || error.status === 429) return { text: 'Sa\u010Dekajte malo pre ponovnog poku\u0161aja. Va\u0161 unos je i dalje ovde.', action: 'retry' };\n    if (code === 'FORBIDDEN' || error.status === 403) return { text: 'Zahtev nije prihva\u0107en. Sa\u010Duvajte svoj unos i osve\u017Eite stranicu pre ponovnog poku\u0161aja.', action: 'none' };\n    if (code === 'PAYLOAD_TOO_LARGE' || error.status === 413) return { text: 'Prikaz dizajna je prevelik za slanje. Poku\u0161ajte ponovo ili zatra\u017Eite pomo\u0107 dizajnera.', action: 'retry' };\n    if (code === 'CART_UNAVAILABLE') return { text: 'Izabrana varijanta ili koli\u010Dina trenutno nije dostupna. Izaberite drugu opciju.', action: 'edit' };\n    if (stage === 'preview' || stage === 'render') return { text: 'Nismo uspeli da u\u010Ditamo pregled dizajna. Va\u0161 unos je i dalje ovde.', action: 'preview' };\n    if (stage === 'cart') return { text: saved ? 'Dizajn je sa\u010Duvan, ali proizvod nije dodat u korpu. Poku\u0161ajte ponovo.' : 'Proizvod nije dodat u korpu. Poku\u0161ajte ponovo.', action: 'retry' };\n    if (code === 'SAVE_IN_PROGRESS') return { text: '\u010Cuvanje dizajna je jo\u0161 u toku. Sa\u010Dekajte malo, pa proverite ponovo.', action: 'retry' };\n    if (code === 'NETWORK' || code === 'TIMEOUT' || code === 'INVALID_RESPONSE') return { text: 'Nismo uspeli da potvrdimo \u010Duvanje dizajna. Va\u0161 unos je i dalje ovde. Poku\u0161ajte ponovo.', action: 'retry' };\n    return { text: 'Trenutno ne mo\u017Eemo da sa\u010Duvamo dizajn. Poku\u0161ajte ponovo za nekoliko trenutaka.', action: 'retry' };\n  }\n\n  async function flowFetch(url, options = {}, stage = 'save', timeoutMs = 15000) {\n    const controller = new AbortController();\n    const timer = setTimeout(() => controller.abort(), timeoutMs);\n    try {\n      const response = await fetch(url, { ...options, signal: controller.signal });\n      let data;\n      try { data = await response.json(); } catch (e) {\n        if (controller.signal.aborted) throw flowError('TIMEOUT', stage);\n        throw flowError('INVALID_RESPONSE', stage, '', { status: response.status });\n      }\n      if (!response.ok) {\n        const status = response.status;\n        const code = status === 429 ? 'RATE_LIMIT' : status === 403 ? 'FORBIDDEN' : status === 413 ? 'PAYLOAD_TOO_LARGE' :\n          stage === 'cart' && status === 422 ? 'CART_UNAVAILABLE' : data.code || (status === 422 ? 'VALIDATION_ERROR' : 'SERVER_ERROR');\n        throw flowError(code, stage, data.msg || data.message || '', { status });\n      }\n      return data;\n    } catch (e) {\n      if (e.name === 'KBFlowError') throw e;\n      throw flowError(controller.signal.aborted ? 'TIMEOUT' : 'NETWORK', stage);\n    } finally { clearTimeout(timer); }\n  }\n\n  function flowDeadline(promise, milliseconds, stage) {\n    let timer;\n    return Promise.race([promise, new Promise((_, reject) => {\n      timer = setTimeout(() => reject(flowError('TIMEOUT', stage)), milliseconds);\n    })]).finally(() => clearTimeout(timer));\n  }\n\n  async function flowPngFromSvg(svg) {\n    // The already-generated preview has outlined text and embedded materials: no font/logo/background downloads.\n    const doc = new DOMParser().parseFromString(svg, 'image/svg+xml');\n    if (doc.querySelector('parsererror')) throw flowError('INVALID_PREVIEW', 'png');\n    const vb = (doc.documentElement.getAttribute('viewBox') || '').trim().split(/\\s+/).map(Number);\n    const ratio = vb.length === 4 && vb[2] > 0 && vb[3] > 0 ? vb[2] / vb[3] : 2;\n    const width = 1200, height = Math.max(120, Math.min(1200, Math.round(width / ratio)));\n    const url = URL.createObjectURL(new Blob([svg], { type: 'image/svg+xml' }));\n    try {\n      const image = new Image();\n      const loaded = new Promise((resolve, reject) => { image.onload = resolve; image.onerror = () => reject(flowError('INVALID_PREVIEW', 'png')); });\n      image.src = url;\n      await flowDeadline(loaded, 1500, 'png');\n      const canvas = document.createElement('canvas');\n      canvas.width = width; canvas.height = height;\n      const ctx = canvas.getContext('2d');\n      ctx.drawImage(image, 0, 0, width, height);\n      return await flowDeadline(new Promise((resolve, reject) => canvas.toBlob(blob => blob ? resolve(blob) : reject(flowError('INVALID_PREVIEW', 'png')), 'image/png')), 1500, 'png');\n    } finally { URL.revokeObjectURL(url); }\n  }\n\n  function readFlowOperation() {\n    if (flowOperation) return flowOperation;\n    for (const storageName of ['localStorage', 'sessionStorage']) {\n      try {\n        const operation = JSON.parse(window[storageName].getItem(flowStorageKey) || 'null');\n        if (operation && /^[a-zA-Z0-9_-]{32,96}$/.test(operation.saveKey || '') && typeof operation.fingerprint === 'string') {\n          flowOperation = operation;\n          break;\n        }\n      } catch (_) {}\n    }\n    return flowOperation;\n  }\n\n  function persistFlowOperation(operation) {\n    flowOperation = operation;\n    for (const storageName of ['localStorage', 'sessionStorage']) {\n      try {\n        if (operation) window[storageName].setItem(flowStorageKey, JSON.stringify(operation));\n        else window[storageName].removeItem(flowStorageKey);\n      } catch (_) {}\n    }\n  }\n\n  function newFlowOperation(config, variantId) {\n    const fingerprint = JSON.stringify([variantId, config]);\n    const prior = readFlowOperation();\n    if (prior && prior.fingerprint === fingerprint && prior.cartState !== 'done') return prior;\n    const operation = {\n      fingerprint, variantId: String(variantId), saveKey: randId('save_') + randId(''),\n      requestId: randId('flow_'), cartAttempt: randId('cart_'), timestamp: Date.now(), cartState: 'idle'\n    };\n    persistFlowOperation(operation);\n    return operation;\n  }\n\n  function flowPostCartDestination() {\n    return '/pages/upotpunite-dom';\n  }\n\n  function flowCartFailure(code, operation, cause, check) {\n    const original = operation.cartFailure || {};\n    return flowError(code, 'cart', '', {\n      original_code: original.code || cause && cause.code || 'UNEXPECTED',\n      original_status: original.status || cause && cause.status || 0,\n      cart_check: check\n    });\n  }\n\n  function flowCartMatches(item, operation) {\n    return String(item.variant_id || item.id) === String(operation.variantId) &&\n      item.properties && item.properties._kb_add_attempt === operation.cartAttempt &&\n      (!operation.design || String(item.properties._design_id || '') === String(operation.design.design_id));\n  }\n\n  async function checkFlowCart(operation, cartRoot) {\n    const cart = await flowFetch(cartRoot + 'cart.js', { cache: 'no-store', credentials: 'same-origin' }, 'cart', 10000);\n    if (!cart || !Array.isArray(cart.items)) throw flowError('INVALID_RESPONSE', 'cart');\n    // Aggregate discount-split lines; one variant can have other personalized lines.\n    const items = cart.items.filter(item => flowCartMatches(item, operation));\n    if (!items.length) return null;\n    if (items.some(item => !Number.isInteger(Number(item.quantity)) || Number(item.quantity) < 1)) {\n      throw flowError('INVALID_RESPONSE', 'cart');\n    }\n    return { items, quantity: items.reduce((total, item) => total + Number(item.quantity || 0), 0) };\n  }\n\n  async function confirmFlowCart(operation, existing, cartRoot, persist) {\n    const wanted = Number(operation.quantity);\n    if (!Number.isInteger(wanted) || wanted < 1) throw flowError('INVALID_RESPONSE', 'cart');\n    const corrected = existing.quantity > wanted;\n    if (existing.quantity < wanted) {\n      operation.cartState = 'partial'; persist(operation);\n      throw flowCartFailure('CART_PARTIAL', operation, null, 'partial');\n    }\n    if (existing.quantity > wanted) {\n      // Set absolute quantities by current line key, preserving unrelated items.\n      // Re-read after each mutation: discounts can change line keys.\n      for (let step = 0; step < 8 && existing && existing.quantity > wanted; step++) {\n        const extra = existing.quantity - wanted;\n        const item = existing.items[existing.items.length - 1];\n        if (!item.key) throw flowError('INVALID_RESPONSE', 'cart');\n        await flowFetch(cartRoot + 'cart/change.js', {\n          method: 'POST', credentials: 'same-origin', headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify({ id: item.key, quantity: Math.max(0, Number(item.quantity) - extra) })\n        }, 'cart', 18000);\n        existing = await checkFlowCart(operation, cartRoot);\n      }\n      if (!existing || existing.quantity !== wanted) {\n        operation.cartState = 'unknown'; persist(operation);\n        throw flowCartFailure('CART_UNKNOWN', operation, null, 'normalization_unconfirmed');\n      }\n    }\n    operation.cartState = 'done'; persist(operation);\n    return { recovered: true, corrected };\n  }\n\n  async function submitFlowCart(operation, payload, cartRoot, persist) {\n    const execute = async (locked) => {\n      // Another tab may have completed the same operation while this tab was stale.\n      try {\n        const shared = JSON.parse(window.localStorage.getItem(flowStorageKey) || 'null');\n        if (shared && shared.cartAttempt === operation.cartAttempt) Object.assign(operation, shared);\n      } catch (_) {}\n      const wasDispatched = ['dispatched', 'unknown', 'partial', 'done'].includes(operation.cartState);\n      if (wasDispatched) {\n        let existing;\n        try { existing = await checkFlowCart(operation, cartRoot); }\n        catch (error) { throw flowCartFailure('CART_UNKNOWN', operation, error, 'failed'); }\n        if (existing) return confirmFlowCart(operation, existing, cartRoot, persist);\n        if (operation.cartState === 'done') throw flowCartFailure('CART_UNKNOWN', operation, null, 'removed');\n        // No automatic replay. Recovery dispatch is permitted only from this\n        // explicit user action with a valid complete payload and cross-tab lock.\n        if (!locked || !payload.id || !payload.properties ||\n            payload.properties._kb_add_attempt !== operation.cartAttempt ||\n            Number(payload.id) !== Number(operation.variantId) ||\n            Number(payload.quantity) !== Number(operation.quantity)) {\n          throw flowCartFailure('CART_UNKNOWN', operation, null, 'empty_no_retry');\n        }\n        const dispatchedAt = Number(operation.cartDispatchedAt || operation.timestamp || Date.now());\n        if (Date.now() - dispatchedAt < 30000) {\n          throw flowCartFailure('CART_WAIT', operation, null, 'empty_wait');\n        }\n        // A separate fresh read guards an item appearing since the first read.\n        await new Promise(resolve => setTimeout(resolve, 1200));\n        try { existing = await checkFlowCart(operation, cartRoot); }\n        catch (error) { throw flowCartFailure('CART_UNKNOWN', operation, error, 'failed'); }\n        if (existing) return confirmFlowCart(operation, existing, cartRoot, persist);\n      }\n      if (!payload.id || !payload.properties || !Number.isInteger(payload.quantity) || payload.quantity < 1) {\n        throw flowError('VALIDATION_ERROR', 'cart');\n      }\n      operation.cartState = 'dispatched';\n      operation.quantity = payload.quantity;\n      operation.cartDispatchedAt = Date.now();\n      persist(operation);\n      try {\n        const result = await flowFetch(cartRoot + 'cart/add.js', {\n          method: 'POST', credentials: 'same-origin', headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify(payload)\n        }, 'cart', 40000);\n        const lines = result && Array.isArray(result.items) ? result.items : result ? [result] : [];\n        if (!lines.some(item => flowCartMatches(item, operation))) throw flowError('INVALID_RESPONSE', 'cart');\n        const existing = await checkFlowCart(operation, cartRoot);\n        if (!existing) throw flowError('INVALID_RESPONSE', 'cart');\n        const confirmed = await confirmFlowCart(operation, existing, cartRoot, persist);\n        return { recovered: wasDispatched || confirmed.corrected === true };\n      } catch (error) {\n        operation.cartFailure = {\n          code: /^[A-Z_]{1,50}$/.test(error.code || '') ? error.code : 'UNEXPECTED',\n          status: Number(error.status) || 0\n        };\n        let existing, checkFailed = false;\n        try { existing = await checkFlowCart(operation, cartRoot); } catch (_) { checkFailed = true; }\n        if (existing) {\n          try { return await confirmFlowCart(operation, existing, cartRoot, persist); }\n          catch (confirmError) { persist(operation); throw confirmError; }\n        }\n        const rejected = [400, 403, 404, 413, 422, 429].includes(error.status);\n        operation.cartState = rejected ? 'idle' : 'unknown'; persist(operation);\n        if (rejected) throw error;\n        throw flowCartFailure('CART_UNKNOWN', operation, error, checkFailed ? 'failed' : 'empty');\n      }\n    };\n    const locks = window.navigator && window.navigator.locks;\n    if (locks && typeof locks.request === 'function') {\n      return locks.request('kb-design-cart', { ifAvailable: true }, lock => {\n        if (!lock) throw flowError('CART_BUSY', 'cart');\n        return execute(true);\n      });\n    }\n    return execute(false);\n  }\n\n\n  function reportFlowOutcome(type, error, operation) {\n    // Diagnostics contain no names, phone numbers, design contents or private save capability.\n    const throttleKey = [type, error.stage || flowStage, error.code || 'UNEXPECTED', operation && operation.requestId || ''].join('|');\n    const now = Date.now();\n    if (now - (flowDiagnosticTimes.get(throttleKey) || 0) < 10000) return;\n    if (flowDiagnosticTimes.size > 60) flowDiagnosticTimes.clear();\n    flowDiagnosticTimes.set(throttleKey, now);\n    void postLeadEvent(type, {\n      stage: error.stage || flowStage, code: error.code || 'UNEXPECTED', status: error.status || 0,\n      request_id: operation && operation.requestId || '', product_handle: cfg.productHandle || '',\n      elapsed_ms: operation ? Math.max(0, Date.now() - operation.timestamp) : 0,\n      original_code: /^[A-Z_]{1,50}$/.test(error.original_code || '') ? error.original_code : '',\n      original_status: Number(error.original_status) || 0,\n      cart_check: /^[a-z_]{1,40}$/.test(error.cart_check || '') ? error.cart_check : ''\n    });\n  }\n\n  function showFlowError(error, saved = false, operation = null) {\n    const view = flowErrorView(error, saved);\n    setMessage(view.text, 'error');\n    reportFlowOutcome('table_design_flow_error', error, operation);\n    if (!message || view.action === 'none' || view.action === 'edit') return;\n    flowAction = document.createElement('div');\n    flowAction.className = 'kb-flow-actions';\n    flowAction.style.cssText = 'display:flex;gap:10px;flex-wrap:wrap;margin:12px 0';\n    const button = document.createElement('button');\n    button.type = 'button';\n    button.className = addButton ? addButton.className : '';\n    button.style.cssText = 'padding:12px 20px;min-height:44px;flex:1';\n    button.textContent = view.action === 'cart' ? 'Proveri ponovo' : 'Poku\u0161ajte ponovo';\n    button.addEventListener('click', () => {\n      if (view.action === 'preview') { setMessage('U\u010Ditavam pregled\u2026', 'loading'); renderPreview(); }\n      else void addToCart();\n    });\n    flowAction.appendChild(button);\n    if (view.action === 'cart') {\n      const link = document.createElement('a');\n      link.href = flowPostCartDestination();\n      link.textContent = 'Nastavite kupovinu';\n      link.style.cssText = 'display:flex;align-items:center;padding:12px;min-height:44px';\n      flowAction.appendChild(link);\n    }\n    message.insertAdjacentElement('afterend', flowAction);\n  }\n\n  function completeFlowPreview(operation, design) {\n    if (!design.preview_pending || !operation) return;\n    try {\n      const endpoint = new URL('complete_preview.php', cfg.saveUrl).href;\n      void fetch(endpoint, { method: 'POST', keepalive: true, headers: { 'Content-Type': 'application/json',\n        ...(cfg.ingestToken ? { 'X-Lead-Ingest-Token': cfg.ingestToken } : {}) },\n        body: JSON.stringify({ idempotency_key: operation.saveKey }) }).catch(() => {});\n    } catch (_) {}\n  }\n  // KB_FLOW_HELPERS_END\n\n\n  function setMessage(text, state) {\n    if (flowAction) { flowAction.remove(); flowAction = null; }\n    if (message) { message.setAttribute(\"aria-live\", \"polite\"); delete message.dataset.flowError; }\n\n    if (!message) return;\n\n    message.textContent = text || \"\";\n\n    message.dataset.state = state || \"\";\n\n  }\n\n\n\n  function numberValidation(config) {\n    if (!form) return { ok: true, message: \"\", input: null };\n    const input = form.querySelector('[name=\"number\"]');\n    if (!input) return { ok: true, message: \"\", input: null };\n    if (config && (isTextOnlyShape(config.shape) || (config.product_type === \"apartment_plate\" && cfg.apartmentNatpisOnly))) {\n      return { ok: true, message: \"\", input };\n    }\n    const value = String(input.value || \"\").trim();\n    const ok = !value || HOUSE_NUMBER_RE.test(value);\n    return { ok, message: ok ? \"\" : HOUSE_NUMBER_MESSAGE, input };\n  }\n\n  function textFieldValidation(config) {\n    const checks = [];\n    const add = (name, value, requiredMessage) => {\n      const input = form ? form.querySelector(`[name=\"${name}\"]`) : null;\n      const raw = String(value || \"\");\n      const trimmed = raw.trim();\n      if (requiredMessage && !trimmed) {\n        checks.push({ ok: false, message: requiredMessage, input });\n        return;\n      }\n      const bad = unsupportedEngravingChar(raw);\n      checks.push({ ok: !bad, message: bad ? unsupportedCharMessage(bad) : \"\", input });\n    };\n    if (!config) return [{ ok: true, message: \"\", input: null }];\n    if (config.product_type === \"single_character\") {\n      const check = singleCharacterValidation(config.characters);\n      checks.push({ ok: check.ok, message: check.ok ? \"\" : check.message, input: form ? form.querySelector('[name=\"characters\"]') : null });\n    } else if (config.product_type === \"video_notice\") {\n      add(\"street\", config.street, \"Unesite gornji tekst.\");\n      add(\"extra_text\", config.extra_text, \"Unesite donji tekst.\");\n    } else if (config.product_type === \"mailbox\") {\n      if (config.mailbox_top_text) add(\"extra_text\", config.mailbox_top_text, \"\");\n      add(\"street\", config.mailbox_bottom_text, \"Unesite donji tekst.\");\n    } else if (config.product_type === \"parking_notice\" || config.product_type === \"dog_notice\") {\n      add(\"street\", config.street, \"Unesite natpis.\");\n    } else if (config.product_type === \"apartment_plate\" && cfg.apartmentNatpisOnly) {\n      add(\"street\", config.street, \"Unesite natpis.\");\n    } else if (config.product_type === \"apartment_plate\" && config.shape === \"stan_plocica\") {\n      const streetInput = form ? form.querySelector('[name=\"street\"]') : null;\n      const numberInput = form ? form.querySelector('[name=\"number\"]') : null;\n      if (!config.street && !config.number) {\n        checks.push({ ok: false, message: \"Unesite natpis ili broj.\", input: streetInput || numberInput });\n      }\n      if (config.street) add(\"street\", config.street, \"\");\n    } else if (isNumberOnlyShape(config.shape)) {\n      if (!config.number) checks.push({ ok: false, message: \"Unesite broj.\", input: form ? form.querySelector('[name=\"number\"]') : null });\n    } else {\n      add(\"street\", config.street, isStreetOptional(config) ? \"\" : \"Unesite natpis.\");\n      if (!config.number) checks.push({ ok: false, message: \"Unesite broj.\", input: form ? form.querySelector('[name=\"number\"]') : null });\n    }\n    return checks.length ? checks : [{ ok: true, message: \"\", input: null }];\n  }\n\n  function validateConfig(config) {\n    const checks = [numberValidation(config), ...textFieldValidation(config)];\n    return checks.find((check) => !check.ok) || { ok: true, message: \"\", input: null };\n  }\n\n  function syncValidationState(showMessage) {\n    const result = validateConfig(currentConfig());\n    const fields = form ? Array.from(form.querySelectorAll('[name=\"street\"], [name=\"number\"], [name=\"extra_text\"], [name=\"characters\"]')) : [];\n    fields.forEach((input) => {\n      const invalid = input === result.input && !result.ok;\n      if (typeof input.setCustomValidity === \"function\") {\n        input.setCustomValidity(invalid ? result.message : \"\");\n      }\n      input.toggleAttribute(\"aria-invalid\", invalid);\n    });\n    root.querySelectorAll(\"[data-kb-add], [data-kb-mobile-add]\").forEach((button) => {\n      if (dodavanjeUToku) return;\n      button.disabled = !result.ok;\n      button.classList.toggle(\"is-disabled\", !result.ok);\n      button.setAttribute(\"aria-disabled\", result.ok ? \"false\" : \"true\");\n    });\n    // Na poslednjem koraku dugme dodaje u korpu, pa mora da deli isto stanje sa [data-kb-add].\n    const onFinalStep = mobileCartActionActive();\n    root.querySelectorAll(\"[data-kb-step-next]\").forEach((button) => {\n      if (dodavanjeUToku) return;\n      const blocked = onFinalStep && !result.ok;\n      button.disabled = blocked;\n      button.classList.toggle(\"is-disabled\", blocked);\n      button.setAttribute(\"aria-disabled\", blocked ? \"true\" : \"false\");\n    });\n    if (showMessage) {\n      if (!result.ok) setMessage(result.message, \"error\");\n      else if (message && message.dataset.state === \"error\") setMessage(\"\", \"\");\n    }\n    return result.ok;\n  }\n\n\n  function safeLocalStorageGet(key) {\n\n    try {\n\n      return window.localStorage ? localStorage.getItem(key) : \"\";\n\n    } catch (err) {\n\n      return \"\";\n\n    }\n\n  }\n\n\n\n  function safeLocalStorageSet(key, value) {\n\n    try {\n\n      if (window.localStorage) {\n        localStorage.setItem(key, String(value));\n        return localStorage.getItem(key) === String(value);\n      }\n\n    } catch (err) {}\n\n  }\n\n\n\n  function safeLocalStorageRemove(key) {\n\n    try {\n\n      if (window.localStorage) localStorage.removeItem(key);\n\n    } catch (err) {}\n\n  }\n\n\n\n  function randId(prefix) {\n\n    const bytes = new Uint8Array(12);\n\n    if (window.crypto && crypto.getRandomValues) {\n\n      crypto.getRandomValues(bytes);\n\n      return prefix + Array.from(bytes).map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n\n    }\n\n    return prefix + Math.random().toString(16).slice(2) + Date.now().toString(16);\n\n  }\n\n\n\n  function getAnonId() {\n\n    let anonId = safeLocalStorageGet(LS_ANON_ID);\n\n    if (!anonId) {\n\n      anonId = randId(\"anon_\");\n\n      safeLocalStorageSet(LS_ANON_ID, anonId);\n\n    }\n\n    window.gsAnonId = anonId;\n\n    return anonId;\n\n  }\n\n\n\n  function getSessionId() {\n\n    const now = Date.now();\n\n    const last = parseInt(safeLocalStorageGet(LS_LAST_ACTIVITY) || \"0\", 10);\n\n    let sessionId = safeLocalStorageGet(LS_SESSION_ID);\n\n    if (!sessionId || !last || now - last > SESSION_TIMEOUT_MS) {\n\n      sessionId = randId(\"sess_\");\n\n    }\n\n    safeLocalStorageSet(LS_SESSION_ID, sessionId);\n\n    safeLocalStorageSet(LS_LAST_ACTIVITY, String(now));\n\n    return sessionId;\n\n  }\n\n\n\n  function getLeadId() {\n\n    const id = parseInt(safeLocalStorageGet(LS_LEAD_ID) || \"\", 10);\n\n    return Number.isFinite(id) && id > 0 ? id : null;\n\n  }\n\n\n\n  function readCookie(name) {\n\n    const prefix = name + \"=\";\n\n    return String(document.cookie || \"\").split(\";\").map((part) => part.trim()).reduce((found, part) => {\n\n      if (found) return found;\n\n      return part.indexOf(prefix) === 0 ? decodeURIComponent(part.slice(prefix.length)) : \"\";\n\n    }, \"\");\n\n  }\n\n\n\n  function queryParam(name) {\n\n    try {\n\n      return new URLSearchParams(window.location.search || \"\").get(name) || \"\";\n\n    } catch (err) {\n\n      return \"\";\n\n    }\n\n  }\n\n\n\n  function metaIdentity() {\n\n    const fbclid = queryParam(\"fbclid\");\n\n    let fbc = readCookie(\"_fbc\");\n\n    if (!fbc && fbclid) fbc = \"fb.1.\" + Math.floor(Date.now() / 1000) + \".\" + fbclid;\n\n    return {\n\n      fbp: readCookie(\"_fbp\"),\n\n      fbc,\n\n      fbclid,\n\n      fb_login_id: facebookLoginId()\n\n    };\n\n  }\n\n\n\n  function facebookLoginId() {\n\n    try {\n\n      if (window.KB_META_FB_LOGIN_ID) return String(window.KB_META_FB_LOGIN_ID || \"\");\n\n      if (window.FB && typeof window.FB.getAuthResponse === \"function\") {\n\n        const auth = window.FB.getAuthResponse();\n\n        if (auth && auth.userID) return String(auth.userID || \"\");\n\n      }\n\n    } catch (err) {}\n\n    return \"\";\n\n  }\n\n\n\n  function trackMetaLeadEvent(leadIdValue) {\n\n    const id = parseInt(leadIdValue, 10);\n\n    if (!id || typeof window.fbq !== \"function\") return;\n\n    const eventId = \"shopify_lead_\" + id + \"_lead\";\n\n    const key = LS_META_LEAD_EVENT_PREFIX + eventId;\n\n    try {\n\n      if (localStorage.getItem(key) === \"1\") return;\n\n      window.fbq(\"track\", \"Lead\", {}, { eventID: eventId });\n\n      localStorage.setItem(key, \"1\");\n\n    } catch (err) {}\n\n  }\n\n\n\n  function googleClientId() {\n\n    const ga = readCookie(\"_ga\");\n\n    const match = /^GA\\d+\\.\\d+\\.(.+)$/.exec(ga);\n\n    return match ? match[1] : \"\";\n\n  }\n\n\n\n  function googleSessionId() {\n\n    const parts = String(document.cookie || \"\").split(\";\");\n\n    for (const raw of parts) {\n\n      const part = raw.trim();\n\n      if (part.indexOf(\"_ga_\") !== 0) continue;\n\n      const value = decodeURIComponent(part.slice(part.indexOf(\"=\") + 1));\n\n      const match = /(?:^|\\.)s(\\d+)(?:\\$|\\.|$)/.exec(value) || /^GS\\d+\\.\\d+\\.(\\d+)/.exec(value);\n\n      if (match) return match[1];\n\n    }\n\n    return \"\";\n\n  }\n\n\n\n  function googleIdentity() {\n\n    return {\n\n      gclid: queryParam(\"gclid\"),\n\n      gbraid: queryParam(\"gbraid\"),\n\n      wbraid: queryParam(\"wbraid\"),\n\n      ga_client_id: googleClientId(),\n\n      ga_session_id: googleSessionId()\n\n    };\n\n  }\n\n\n\n  function visitorIdentity() {\n\n    return {\n\n      anon_id: getAnonId(),\n\n      lead_id: getLeadId(),\n\n      session_id: getSessionId()\n\n    };\n\n  }\n\n\n\n  function crmDesignUrl(designId) {\n\n    const id = String(designId || \"\").trim();\n\n    return id ? CRM_EDITOR_BASE_URL + encodeURIComponent(id) : \"\";\n\n  }\n\n\n\n  function handleLeadResponse(res) {\n\n    if (res && res.anon_id) {\n\n      safeLocalStorageSet(LS_ANON_ID, res.anon_id);\n\n      window.gsAnonId = res.anon_id;\n\n    }\n\n    if (res && res.lead_id) {\n\n      const id = parseInt(res.lead_id, 10);\n\n      if (Number.isFinite(id) && id > 0) {\n\n        safeLocalStorageSet(LS_LEAD_ID, String(id));\n\n        window.gsLeadId = id;\n\n      }\n\n    }\n\n  }\n\n\n\n  async function postLeadEvent(eventType, eventData) {\n    eventData = eventData || {};\n    if (!eventData.event_id) {\n      eventData.event_id = \"kb_\" + Date.now().toString(36) + \"_\" + Math.random().toString(36).slice(2, 10);\n    }\n    // Use the existing allowlisted bridge: customer text stays out of GA4.\n    try {\n      const privacy = window.Shopify && window.Shopify.customerPrivacy;\n      const analyticsAllowed = !privacy || typeof privacy.analyticsProcessingAllowed !== \"function\" ||\n        privacy.analyticsProcessingAllowed();\n      if (analyticsAllowed && typeof window.KB_GA4_TRACK_DESIGN_EVENT === \"function\") {\n        window.KB_GA4_TRACK_DESIGN_EVENT(eventType, eventData);\n      }\n    } catch (err) { /* Analytics must never interrupt design or checkout. */ }\n    if (!cfg.leadEventUrl) return visitorIdentity();\n\n    const visitor = visitorIdentity();\n\n    const controller = new AbortController();\n    const timeout = setTimeout(() => controller.abort(), 2500);\n    try {\n\n      const response = await fetch(cfg.leadEventUrl, {\n\n        method: \"POST\",\n        signal: controller.signal,\n\n        headers: { \"Content-Type\": \"application/json\" },\n\n        body: JSON.stringify({\n\n          anon_id: visitor.anon_id,\n\n          lead_id: visitor.lead_id,\n\n          session_id: visitor.session_id,\n\n          event_type: eventType,\n\n          event_data: eventData || {},\n\n          page: window.location.href,\n\n          referrer: document.referrer || \"\",\n\n          ua: navigator.userAgent || \"\",\n\n          meta: metaIdentity(),\n\n          google: googleIdentity(),\n          /* Ingest token: lead_event.php ga proverava i bez njega vraca 403.\n             cfg.ingestToken dolazi iz Liquid-a i vec je postavljen na stranici \u2014\n             do 14.10.2026. koristio se samo za cuvanje dizajna, pa su se SVI\n             dogadjaji konfiguratora gubili od 12.10. u 23:23. */\n          ingest_token: cfg.ingestToken || \"\"\n\n        })\n\n      });\n\n      const data = await response.json().catch(() => ({}));\n\n      if (response.ok) handleLeadResponse(data);\n\n    } catch (err) {} finally { clearTimeout(timeout); }\n\n    return visitorIdentity();\n  }\n\n  function renderErrorPayload(error, config, context) {\n    const cfgObj = config || {};\n    const message = error && error.message ? String(error.message) : String(error || \"Render greska\");\n    const textLengths = {\n      street: String(cfgObj.street || \"\").length,\n      number: String(cfgObj.number || \"\").length,\n      extra_text: String(cfgObj.extra_text || \"\").length,\n      characters: String(cfgObj.characters || \"\").length\n    };\n    return {\n      context: context || \"preview\",\n      message: message.slice(0, 220),\n      name: error && error.name ? String(error.name).slice(0, 80) : \"\",\n      product_handle: cfg.productHandle || \"\",\n      product_id: cfg.productId || \"\",\n      variant_id: selectedVariantId(),\n      shape: cfgObj.shape || cfgObj.plate_shape || cfg.renderShape || \"\",\n      product_type: cfgObj.product_type || \"\",\n      dimensions: `${cfgObj.width_cm || \"\"}x${cfgObj.height_cm || \"\"}`,\n      character_height_cm: cfgObj.character_height_cm || \"\",\n      physical_character_count: cfgObj.physical_character_count || physicalCharacterCount(cfgObj.characters || \"\"),\n      script: cfgObj.script || \"\",\n      plocica_font: cfgObj.plocica_font || \"\",\n      text_lengths: textLengths\n    };\n  }\n\n  function sendRenderErrorBeacon(error, config, context) {\n    if (!cfg.leadEventUrl) return;\n    const payload = renderErrorPayload(error, config, context);\n    const throttleKey = LS_RENDER_ERROR_PREFIX + [\n      payload.context,\n      payload.shape,\n      payload.product_type,\n      payload.message\n    ].join(\"|\").slice(0, 220);\n    const now = Date.now();\n    const last = parseInt(safeLocalStorageGet(throttleKey) || \"0\", 10);\n    if (last && now - last < 30000) return;\n    safeLocalStorageSet(throttleKey, String(now));\n    const visitor = visitorIdentity();\n    const body = JSON.stringify({\n      anon_id: visitor.anon_id,\n      lead_id: visitor.lead_id,\n      session_id: visitor.session_id,\n      event_type: \"table_design_render_error\",\n      event_data: payload,\n      page: window.location.href,\n      referrer: document.referrer || \"\",\n      ua: navigator.userAgent || \"\",\n      meta: metaIdentity(),\n      google: googleIdentity(),\n      ingest_token: cfg.ingestToken || \"\"\n    });\n    try {\n      if (navigator.sendBeacon) {\n        navigator.sendBeacon(cfg.leadEventUrl, new Blob([body], { type: \"text/plain;charset=UTF-8\" }));\n        return;\n      }\n    } catch (err) {}\n    try {\n      fetch(cfg.leadEventUrl, {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body,\n        keepalive: true\n      }).catch(() => {});\n    } catch (err) {}\n  }\n\n  function field(name) {\n    const el = form ? form.querySelector(`[name=\"${name}\"]`) : null;\n\n    return el ? String(el.value || \"\").trim() : \"\";\n\n  }\n\n\n\n  function normalizeContactPhone(phone) {\n\n    const raw = String(phone || \"\").replace(/\\s+/g, \" \").trim();\n\n    const digits = raw.replace(/\\D/g, \"\");\n\n    if (digits.length < 8) return \"\";\n\n    if (raw === \"+381\" || raw === \"+381 \") return \"\";\n\n    return raw;\n\n  }\n\n\n\n  function identifyContactPhoneNow(phone) {\n\n    const normalized = normalizeContactPhone(phone);\n\n    if (!normalized || normalized === lastIdentifiedContactPhone || typeof window.kbIdentifyLeadByPhone !== \"function\") {\n\n      return Promise.resolve(visitorIdentity());\n\n    }\n\n    lastIdentifiedContactPhone = normalized;\n\n    phoneIdentifyPromise = Promise.resolve(window.kbIdentifyLeadByPhone(normalized, \"table_designer_phone\"))\n\n      .catch(() => null)\n\n      .then((id) => {\n\n        trackMetaLeadEvent(id || window.gsLeadId || getLeadId());\n\n        return visitorIdentity();\n\n      })\n\n      .finally(() => {\n\n        phoneIdentifyPromise = null;\n\n      });\n\n    return phoneIdentifyPromise;\n\n  }\n\n\n\n  function scheduleContactPhoneIdentify() {\n\n    clearTimeout(contactPhoneTimer);\n\n    const phone = field(\"contact_phone\");\n\n    if (!normalizeContactPhone(phone)) return;\n\n    contactPhoneTimer = setTimeout(() => {\n\n      identifyContactPhoneNow(phone);\n\n    }, 900);\n\n  }\n\n\n\n  async function ensureContactPhoneIdentified(config) {\n\n    const phone = config && config.contact_phone ? config.contact_phone : field(\"contact_phone\");\n\n    if (phoneIdentifyPromise) await phoneIdentifyPromise;\n\n    await identifyContactPhoneNow(phone);\n\n    if (phoneIdentifyPromise) await phoneIdentifyPromise;\n\n    return visitorIdentity();\n\n  }\n\n\n\n  function setField(name, value) {\n\n    if (!form || value == null || value === \"\") return;\n\n    const el = form.querySelector(`[name=\"${name}\"]`);\n\n    if (!el) return;\n\n    // Vrednost moze da stigne sa drugog proizvoda (prenos sa \"Upotpunite dom\").\n\n    // Ako taj izbor ovde ne postoji, el.value bi postao prazan i obrisao\n\n    // podrazumevani izbor \u2014 zato se takva vrednost preskace.\n\n    if (el.tagName === \"SELECT\") {\n\n      var postoji = Array.prototype.some.call(el.options, function (o) { return o.value === String(value); });\n\n      if (!postoji) return;\n\n    }\n\n    el.value = String(value);\n\n    el.dispatchEvent(new Event(\"change\", { bubbles: true }));\n\n  }\n\n\n\n  const cyrToLatMap = {\n\n    \"\\u0430\": \"a\", \"\\u0431\": \"b\", \"\\u0432\": \"v\", \"\\u0433\": \"g\", \"\\u0434\": \"d\", \"\\u0452\": \"\\u0111\", \"\\u0435\": \"e\",\n\n    \"\\u0436\": \"\\u017E\", \"\\u0437\": \"z\", \"\\u0438\": \"i\", \"\\u0458\": \"j\", \"\\u043A\": \"k\", \"\\u043B\": \"l\", \"\\u0459\": \"lj\",\n\n    \"\\u043C\": \"m\", \"\\u043D\": \"n\", \"\\u045A\": \"nj\", \"\\u043E\": \"o\", \"\\u043F\": \"p\", \"\\u0440\": \"r\", \"\\u0441\": \"s\",\n\n    \"\\u0442\": \"t\", \"\\u045B\": \"\\u0107\", \"\\u0443\": \"u\", \"\\u0444\": \"f\", \"\\u0445\": \"h\", \"\\u0446\": \"c\", \"\\u0447\": \"\\u010D\",\n\n    \"\\u045F\": \"d\\u017E\", \"\\u0448\": \"\\u0161\"\n\n  };\n\n  const latToCyrDigraphs = { \"lj\": \"\\u0459\", \"nj\": \"\\u045A\", \"dj\": \"\\u0452\", \"d\\u017E\": \"\\u045F\", \"dz\\u030C\": \"\\u045F\" };\n\n  const latToCyrMap = {\n\n    \"a\": \"\\u0430\", \"b\": \"\\u0431\", \"v\": \"\\u0432\", \"g\": \"\\u0433\", \"d\": \"\\u0434\", \"\\u0111\": \"\\u0452\", \"e\": \"\\u0435\",\n\n    \"\\u017E\": \"\\u0436\", \"z\": \"\\u0437\", \"i\": \"\\u0438\", \"j\": \"\\u0458\", \"k\": \"\\u043A\", \"l\": \"\\u043B\", \"m\": \"\\u043C\",\n\n    \"n\": \"\\u043D\", \"o\": \"\\u043E\", \"p\": \"\\u043F\", \"r\": \"\\u0440\", \"s\": \"\\u0441\", \"t\": \"\\u0442\", \"\\u0107\": \"\\u045B\",\n\n    \"u\": \"\\u0443\", \"f\": \"\\u0444\", \"h\": \"\\u0445\", \"c\": \"\\u0446\", \"\\u010D\": \"\\u0447\", \"\\u0161\": \"\\u0448\"\n\n  };\n\nfunction isUpper(ch) {\n\n    return ch && ch !== ch.toLowerCase() && ch === ch.toUpperCase();\n\n  }\n\n\n\n  function applyCase(src, out, nextIsUpper, atEnd) {\n\n    if (!isUpper(src)) return out;\n\n    if (out.length === 1) return out.toUpperCase();\n\n    if (nextIsUpper || atEnd) return out.toUpperCase();\n\n    return out.charAt(0).toUpperCase() + out.slice(1);\n\n  }\n\n\n\n  function cyrToLat(text) {\n\n    const source = String(text || \"\");\n\n    let res = \"\";\n\n    for (let i = 0; i < source.length; i++) {\n\n      const ch = source[i];\n\n      const mapped = cyrToLatMap[ch.toLowerCase()];\n\n      if (mapped == null) {\n\n        res += ch;\n\n        continue;\n\n      }\n\n      const nextUpper = i + 1 < source.length && isUpper(source[i + 1]);\n\n      const atEnd = i + 1 >= source.length;\n\n      res += applyCase(ch, mapped, nextUpper, atEnd);\n\n    }\n\n    return res;\n\n  }\n\n\n\n  function latToCyr(text) {\n\n    const source = String(text || \"\");\n\n    /* q, w, x, y nemaju parnjak u cirilici. Ako ih ima, ostavi ceo tekst u\n       latinici \u2014 mesano pismo na gravuri je gore nego latinica. */\n\n    if (/[qwxy]/i.test(source)) return source;\n\n    let res = \"\";\n\n    let i = 0;\n\n    while (i < source.length) {\n\n      const three = source.substr(i, 3).toLowerCase();\n\n      const two = source.substr(i, 2).toLowerCase();\n\n      const digraph = latToCyrDigraphs[three] || latToCyrDigraphs[two];\n\n      if (digraph) {\n\n        const used = latToCyrDigraphs[three] ? 3 : 2;\n\n        const firstUpper = isUpper(source[i]);\n\n        const secondUpper = isUpper(source[i + 1]);\n\n        res += firstUpper && secondUpper ? digraph.toUpperCase() : (firstUpper ? digraph.toUpperCase() : digraph);\n\n        i += used;\n\n        continue;\n\n      }\n\n      const ch = source[i];\n\n      const mapped = latToCyrMap[ch.toLowerCase()];\n\n      if (mapped == null) {\n\n        res += ch;\n\n        i++;\n\n        continue;\n\n      }\n\n      res += isUpper(ch) ? mapped.toUpperCase() : mapped;\n\n      i++;\n\n    }\n\n    return res;\n\n  }\n\n\n\n  function scriptValue() {\n\n    return field(\"script\") || \"cyrillic\";\n\n  }\n\n\n\n  function textFields() {\n\n    return form ? Array.from(form.querySelectorAll('[name=\"street\"], [name=\"number\"], [name=\"extra_text\"], [name=\"characters\"]')) : [];\n\n  }\n\n\n\n  function transliterateValue(value, targetScript) {\n\n    if (targetScript === \"cyrillic\") return latToCyr(value);\n\n    if (targetScript === \"latin\") return cyrToLat(value);\n\n    return value;\n\n  }\n\n\n\n  function transliterateField(input, targetScript) {\n\n    if (!input || !isTextEntryField(input)) return false;\n\n    const next = transliterateValue(input.value, targetScript);\n\n    if (next === input.value) return false;\n\n    input.value = next;\n\n    const pos = input.value.length;\n\n    if (document.activeElement === input && typeof input.setSelectionRange === \"function\") {\n\n      input.setSelectionRange(pos, pos);\n\n    }\n\n    return true;\n\n  }\n\n\n\n  function transliterateAllFields() {\n\n    const target = scriptValue();\n\n    if (target !== \"cyrillic\" && target !== \"latin\") return;\n\n    let changed = false;\n\n    textFields().forEach((input) => {\n\n      changed = transliterateField(input, target) || changed;\n\n    });\n\n    if (changed) schedulePreview();\n\n  }\n\n\n\n  function scheduleFieldTransliteration(input) {\n\n    const target = scriptValue();\n\n    if (target !== \"cyrillic\" && target !== \"latin\") return;\n\n    clearTimeout(transliterationTimers.get(input));\n\n    transliterationTimers.set(input, setTimeout(() => {\n\n      if (transliterateField(input, target)) schedulePreview();\n\n    }, 260));\n\n  }\n\n\n\n  function selectedVariantId() {\n\n    if (variantInput && variantInput.value) return String(variantInput.value);\n\n    const urlVariant = new URLSearchParams(window.location.search).get(\"variant\");\n\n    if (urlVariant) return String(urlVariant);\n\n    return String(cfg.variantId || \"\");\n\n  }\n\n\n\n  function selectedOptionValues() {\n\n    const values = [];\n\n    const optionInputs = document.querySelectorAll('variant-selects select, variant-radios input[type=\"radio\"]:checked, .product-form__input input[type=\"radio\"]:checked, .product-form__input select');\n\n    optionInputs.forEach((el) => {\n\n      if (el.name === \"id\" || el.disabled) return;\n\n      const value = String(el.value || \"\").trim();\n\n      if (value && !values.includes(value)) values.push(value);\n\n    });\n\n    return values;\n\n  }\n\n\n\n  function selectedVariant() {\n\n    const id = selectedVariantId();\n\n    const variants = Array.isArray(cfg.variants) ? cfg.variants : [];\n\n    const byId = variants.find((v) => String(v.id) === id);\n\n    if (byId) return byId;\n\n    const selectedOptions = selectedOptionValues();\n\n    const byOptions = selectedOptions.length ? variants.find((variant) => {\n\n      const options = Array.isArray(variant.options) ? variant.options.map(String) : [];\n\n      return selectedOptions.every((value) => options.includes(value));\n\n    }) : null;\n\n    return byOptions || { id, title: cfg.variantTitle || \"\", options: [] };\n\n  }\n\n\n\n  function formatMoney(cents) {\n\n    const amount = Number(cents);\n\n    if (!Number.isFinite(amount)) return \"\";\n\n    if (window.Shopify && typeof Shopify.formatMoney === \"function\") {\n\n      return Shopify.formatMoney(amount, window.theme && theme.moneyFormat ? theme.moneyFormat : undefined).replace(/<[^>]+>/g, \"\");\n\n    }\n\n    return new Intl.NumberFormat(\"sr-RS\", {\n\n      style: \"currency\",\n\n      currency: \"RSD\",\n\n      maximumFractionDigits: 0\n\n    }).format(amount / 100);\n\n  }\n\n\n\n  function updatePrice() {\n\n    const variant = selectedVariant();\n\n    const shape = cfg.renderShape || root.dataset.renderShape || \"standard\";\n\n    if (isSingleCharacterShape(shape)) {\n\n      const check = singleCharacterValidation(field(\"characters\"));\n\n      const count = check.ok ? check.count : 0;\n\n      if (customDimActive || isCustomCharacterHeightVariant(variant)) {\n\n        priceNodes.forEach((node) => {\n\n          node.textContent = count ? `Cena \u0107e biti potvr\u0111ena nakon porud\u017Ebine \u00B7 ${count} kom.` : \"Cena \u0107e biti potvr\u0111ena nakon porud\u017Ebine\";\n\n        });\n\n        return;\n\n      }\n\n      const unit = variant && variant.price != null ? Number(variant.price) : 0;\n\n      priceNodes.forEach((node) => {\n\n        node.textContent = count && unit ? `${formatMoney(unit * count)} (${count} x ${formatMoney(unit)})` : (unit ? formatMoney(unit) : \"\");\n\n      });\n\n      return;\n\n    }\n\n    if (customDimActive || isCustomDimVariant(variant)) {\n\n      priceNodes.forEach((node) => {\n\n        node.textContent = \"Cena se prosle\u0111uje nakon porud\u017Ebine\";\n\n      });\n\n      return;\n\n    }\n\n    const price = variant && variant.price != null ? formatMoney(variant.price) : \"\";\n\n    priceNodes.forEach((node) => {\n\n      node.textContent = price || \"\";\n\n    });\n\n  }\n\n\n\n  function parseDimension(value) {\n\n    const text = String(value || \"\").replace(\",\", \".\");\n\n    const match = text.match(/(\\d+(?:\\.\\d+)?)\\s*[x\u00D7]\\s*(\\d+(?:\\.\\d+)?)/i);\n\n    if (!match) return { width_cm: null, height_cm: null, ratio_label: \"\" };\n\n    const width = Number(match[1]);\n\n    const height = Number(match[2]);\n\n    return {\n\n      width_cm: Number.isFinite(width) ? width : null,\n\n      height_cm: Number.isFinite(height) ? height : null,\n\n      ratio_label: width && height ? `${width}:${height}` : \"\"\n\n    };\n\n  }\n\n\n\n  function normalizedNumber(value) {\n\n    const n = Number(String(value || \"\").replace(\",\", \".\"));\n\n    return Number.isFinite(n) ? Math.round(n * 100) / 100 : null;\n\n  }\n\n\n\n  function parseCharacterHeight(value) {\n\n    const text = String(value || \"\").replace(\",\", \".\");\n\n    const match = text.match(/(\\d+(?:\\.\\d+)?)\\s*cm/i);\n\n    if (!match) return null;\n\n    const h = Number(match[1]);\n\n    return Number.isFinite(h) && h > 0 ? Math.round(h * 100) / 100 : null;\n\n  }\n\n\n\n  function selectedCharacterHeightVariant() {\n\n    const variant = selectedVariant();\n\n    const parts = [variant.title || cfg.variantTitle || \"\"].concat(Array.isArray(variant.options) ? variant.options : []);\n\n    for (const part of parts) {\n\n      const height = parseCharacterHeight(part);\n\n      if (height) return { variant, height_cm: height, custom: false };\n\n    }\n\n    return { variant, height_cm: normalizedNumber(customHeightInput && customHeightInput.value) || 20, custom: true };\n\n  }\n\n\n\n  function isCustomCharacterHeightVariant(variant) {\n\n    if (!variant) return false;\n\n    const parts = [variant.title || \"\"].concat(Array.isArray(variant.options) ? variant.options : []);\n\n    return !parts.some((part) => parseCharacterHeight(part));\n\n  }\n\n\n\n  function sameDimension(a, b) {\n\n    return normalizedNumber(a && a.width_cm) === normalizedNumber(b && b.width_cm)\n\n      && normalizedNumber(a && a.height_cm) === normalizedNumber(b && b.height_cm);\n\n  }\n\n\n\n  function preferredDefaultDimension() {\n\n    const shape = cfg.renderShape || root.dataset.renderShape || \"standard\";\n\n    if (shape === \"plocica_oblik_1\") return { width_cm: 12, height_cm: 5 };\n\n    if (shape === \"stan_plocica\" || shape === \"plocica_oblik_2\" || shape === \"plocica_oblik_4\") return { width_cm: 15, height_cm: 4 };\n\n    const ratio = String(cfg.renderRatio || root.dataset.renderRatio || \"\");\n\n    if (ratio === \"1:1\") return { width_cm: 20, height_cm: 20 };\n\n    if (ratio === \"3:2\") return { width_cm: 30, height_cm: 20 };\n\n    return { width_cm: 40, height_cm: 20 };\n\n  }\n\n\n\n  function isPreferredDefaultDimension(dims) {\n\n    return sameDimension(dims, preferredDefaultDimension());\n\n  }\n\n\n\n  function displayCm(value) {\n\n    const n = normalizedNumber(value);\n\n    if (n == null) return \"\";\n\n    return String(n).replace(\".\", \",\");\n\n  }\n\n\n\n  function ratioSlug() {\n\n    const ratio = String(cfg.renderRatio || root.dataset.renderRatio || \"2:1\");\n\n    if (ratio === \"1:1\") return \"1-1\";\n\n    if (ratio === \"3:2\") return \"3-2\";\n\n    return \"2-1\";\n\n  }\n\n\n\n  function ratioFallbackDimension(ratio) {\n\n    const label = String(ratio || cfg.renderRatio || root.dataset.renderRatio || \"\");\n\n    /* Oblik ima prednost nad odnosom. Za plocice je renderRatio namerno \"2:1\" (korpa za\n\n       renderovanje, koristi je ratioSlug za imena asseta), pa bi se ovde bez provere\n\n       vratilo 40x20 umesto 15x4 \u2014 i varijanta \"po meri\" bi lazno prijavila 40x20.\n\n       Isti redosled vec koristi preferredDefaultDimension(). QA 02.11.2026. */\n\n    const shapeFb = cfg.renderShape || root.dataset.renderShape || \"standard\";\n\n    if (shapeFb === \"plocica_oblik_1\") return { width_cm: 12, height_cm: 5, ratio_label: label };\n\n    if (shapeFb === \"stan_plocica\" || shapeFb === \"plocica_oblik_2\" || shapeFb === \"plocica_oblik_4\") return { width_cm: 15, height_cm: 4, ratio_label: label };\n\n    if (label === \"1:1\") return { width_cm: 30, height_cm: 30, ratio_label: \"1:1\" };\n\n    if (label === \"3:2\") return { width_cm: 40, height_cm: 25, ratio_label: \"3:2\" };\n\n    return { width_cm: 40, height_cm: 20, ratio_label: \"2:1\" };\n\n  }\n\n\n\n  function currentDimension(variant) {\n\n    const parts = [variant.title || cfg.variantTitle || \"\"].concat(Array.isArray(variant.options) ? variant.options : []);\n\n    for (const part of parts) {\n\n      const parsed = parseDimension(part);\n\n      if (parsed.width_cm && parsed.height_cm) return parsed;\n\n    }\n\n    return ratioFallbackDimension(cfg.renderRatio || root.dataset.renderRatio);\n\n  }\n\n\n\n  function dimensionLabel(dims) {\n\n    if (dims && !dims.width_cm && dims.height_cm && dims.ratio_label === \"character-height\") return `${displayCm(dims.height_cm)} cm`;\n\n    return dims && dims.width_cm && dims.height_cm ? `${displayCm(dims.width_cm)} x ${displayCm(dims.height_cm)} cm` : \"\";\n\n  }\n\n\n\n  // A variant whose title/options do NOT contain a parseable WxH (e.g.\n\n  // \"Neka druga dimenzija\") is the custom-dimension / quote variant.\n\n  function isCustomDimVariant(variant) {\n\n    if (!variant) return false;\n\n    const parts = [variant.title || \"\"].concat(Array.isArray(variant.options) ? variant.options : []);\n\n    return !parts.some((p) => {\n\n      const d = parseDimension(p);\n\n      return d.width_cm && d.height_cm;\n\n    });\n\n  }\n\n  function customDimVariant() {\n\n    const variants = Array.isArray(cfg.variants) ? cfg.variants : [];\n\n    const shape = cfg.renderShape || root.dataset.renderShape || \"standard\";\n\n    if (isSingleCharacterShape(shape)) return variants.find(isCustomCharacterHeightVariant) || null;\n\n    return variants.find(isCustomDimVariant) || null;\n\n  }\n\n  function customDims() {\n\n    const w = normalizedNumber(customWidthInput && customWidthInput.value);\n\n    const h = normalizedNumber(customHeightInput && customHeightInput.value);\n\n    if (!w || !h) return null;\n\n    return { width_cm: w, height_cm: h, ratio_label: `${w}:${h}` };\n\n  }\n\n\n\n  function productDimensionOptions() {\n\n    const shape = cfg.renderShape || root.dataset.renderShape || \"standard\";\n\n    if (isSingleCharacterShape(shape)) {\n\n      const seenHeights = new Set();\n\n      const variants = Array.isArray(cfg.variants) ? cfg.variants : [];\n\n      return variants.map((variant) => {\n\n        if (isCustomCharacterHeightVariant(variant)) return null;\n\n        const height = parseCharacterHeight(variant.title || (Array.isArray(variant.options) ? variant.options.join(\" \") : \"\"));\n\n        if (!height || seenHeights.has(height)) return null;\n\n        seenHeights.add(height);\n\n        return {\n\n          id: variant.id,\n\n          width_cm: 0,\n\n          height_cm: height,\n\n          label: `${displayCm(height)} cm`,\n\n          recommended: height === 20,\n\n          price: variant.price != null ? formatMoney(variant.price) : \"\"\n\n        };\n\n      }).filter(Boolean);\n\n    }\n\n    const seen = new Set();\n\n    const variants = Array.isArray(cfg.variants) ? cfg.variants : [];\n\n    return variants.map((variant) => {\n\n      if (isCustomDimVariant(variant)) return null;\n\n      const dims = currentDimension(variant);\n\n      const key = `${normalizedNumber(dims.width_cm)}x${normalizedNumber(dims.height_cm)}`;\n\n      if (!dims.width_cm || !dims.height_cm || seen.has(key)) return null;\n\n      seen.add(key);\n\n      return {\n\n        id: variant.id,\n\n        width_cm: dims.width_cm,\n\n        height_cm: dims.height_cm,\n\n        label: dimensionLabel(dims),\n\n        recommended: isPreferredDefaultDimension(dims),\n\n        price: variant.price != null ? formatMoney(variant.price) : \"\"\n\n      };\n\n    }).filter(Boolean);\n\n  }\n\n\n\n  function renderDimensionOptions() {\n\n    if (!dimensionOptions) return;\n\n    const options = productDimensionOptions();\n\n    if (!options.length) {\n\n      var kbPfH = dimensionOptions.closest(\".kb-product-fields\"); if (kbPfH) kbPfH.setAttribute(\"hidden\", \"\");\n\n      return;\n\n    }\n\n    var kbPfS = dimensionOptions.closest(\".kb-product-fields\"); if (kbPfS) kbPfS.removeAttribute(\"hidden\");\n\n    let html = options.map((item) => `\n\n      <button\n\n        type=\"button\"\n\n        class=\"kb-dimension-option\"\n\n        data-kb-dimension-choice\n\n        data-kb-dimension-width=\"${escapeHtml(item.width_cm)}\"\n\n        data-kb-dimension-height=\"${escapeHtml(item.height_cm)}\"\n\n        aria-pressed=\"false\"\n\n      >\n\n        ${escapeHtml(item.label)}\n\n        ${item.recommended ? '<span class=\"kb-dimension-option__hint\">Naj\u010De\u0161\u0107e odabrana</span>' : \"\"}\n\n        ${item.price ? `<small>${escapeHtml(item.price)}</small>` : \"\"}\n\n      </button>\n\n    `).join(\"\");\n\n    if (customDimVariant()) {\n\n      const shape = cfg.renderShape || root.dataset.renderShape || \"standard\";\n\n      const customLabel = isSingleCharacterShape(shape) ? \"Neka druga visina\" : \"Neka druga dimenzija\";\n\n      html += `\n\n      <button\n\n        type=\"button\"\n\n        class=\"kb-dimension-option\"\n\n        data-kb-dimension-custom\n\n        aria-pressed=\"false\"\n\n      >\n\n        ${customLabel}\n\n        <small>Cena nakon porud\u017Ebine</small>\n\n      </button>`;\n\n    }\n\n    dimensionOptions.innerHTML = html;\n\n  }\n\n\n\n  function updateDimensionControls() {\n\n    const variant = selectedVariant();\n\n    const shape = cfg.renderShape || root.dataset.renderShape || \"standard\";\n\n    const charHeight = isSingleCharacterShape(shape) ? selectedCharacterHeightVariant() : null;\n\n    const dims = charHeight\n\n      ? { width_cm: 0, height_cm: charHeight.height_cm, ratio_label: \"character-height\" }\n\n      : ((customDimActive && customDims()) ? customDims() : currentDimension(variant));\n\n    if (selectedDimensionLabel) selectedDimensionLabel.textContent = dimensionLabel(dims);\n\n    if (shapeCurrentLabel) shapeCurrentLabel.textContent = shapeLabels[cfg.renderShape || root.dataset.renderShape || \"standard\"] || \"Oblik\";\n\n    if (!dimensionOptions) return;\n\n    dimensionOptions.querySelectorAll(\"[data-kb-dimension-choice]\").forEach((button) => {\n\n      const buttonDims = {\n\n        width_cm: button.dataset.kbDimensionWidth,\n\n        height_cm: button.dataset.kbDimensionHeight\n\n      };\n\n      const pressed = charHeight\n\n        ? (!customDimActive && normalizedNumber(charHeight.height_cm) === normalizedNumber(buttonDims.height_cm))\n\n        : (!customDimActive && sameDimension(dims, buttonDims));\n\n      button.setAttribute(\"aria-pressed\", pressed ? \"true\" : \"false\");\n\n    });\n\n    const customBtn = dimensionOptions.querySelector(\"[data-kb-dimension-custom]\");\n\n    if (customBtn) customBtn.setAttribute(\"aria-pressed\", customDimActive ? \"true\" : \"false\");\n\n  }\n\n\n\n  function currentConfig() {\n\n    const variant = selectedVariant();\n\n    const dims = (customDimActive && customDims()) ? customDims() : currentDimension(variant);\n\n    const shape = cfg.renderShape || root.dataset.renderShape || \"standard\";\n\n    const isApartmentPlate = isApartmentPlateShape(shape);\n\n    const isVideoNotice = shape === \"video_nadzor\";\n\n    const isParkingNotice = shape === \"zabranjeno_parkiranje\";\n\n    const isDogNotice = shape === \"cuvaj_se_psa\";\n\n    const isMailbox = shape === \"postansko_sanduce\";\n\n    const isSingleCharacters = isSingleCharacterShape(shape);\n\n    const numberOnlyShape = isNumberOnlyShape(shape);\n\n    const numberAlign = centerNumberShapes.has(shape) && field(\"number_align\") === \"center\" ? \"center\" : \"right\";\n\n    const street = numberOnlyShape ? \"\" : field(\"street\");\n\n    const extraText = (numberOnlyShape || shape === \"oblik_4_retro\") ? \"\" : field(\"extra_text\");\n\n    const mailboxTopText = isMailbox ? extraText : \"\";\n\n    const mailboxBottomText = isMailbox ? street : \"\";\n\n    const note = field(\"note\");\n\n    const contactPhone = normalizeContactPhone(field(\"contact_phone\"));\n\n    const characterHeight = isSingleCharacters ? selectedCharacterHeightVariant() : null;\n\n    const characters = isSingleCharacters ? field(\"characters\") : \"\";\n\n    const characterCheck = isSingleCharacters ? singleCharacterValidation(characters) : null;\n\n    const engravingColor = isApartmentPlate ? field(\"engraving_color\") || \"srebrna_graverska\" : \"\";\n\n    const plateStyle = isApartmentPlate && shape === \"stan_plocica\" && cfg.apartmentNatpisOnly && field(\"plate_style\") === \"rounded\" ? \"rounded\" : \"rectangular\";\n\n    const plateColor = isApartmentPlate ? engravingColor : (field(\"plate_color\") || field(\"background_color\") || \"crna\");\n\n    const textColor = isApartmentPlate ? (engravingColor === \"crna_graverska\" ? \"bela\" : \"crna\") : (isMailbox && MAILBOX_MIRROR_PLATE_COLORS.has(plateColor) ? \"siva\" : field(\"text_color\"));\n\n    const productType = isApartmentPlate ? \"apartment_plate\" : (isVideoNotice ? \"video_notice\" : (isParkingNotice ? \"parking_notice\" : (isDogNotice ? \"dog_notice\" : (isMailbox ? \"mailbox\" : (isSingleCharacters ? \"single_character\" : \"house_number\")))));\n\n    return {\n\n      plate_shape: shape,\n      ...(shape === \"oblik_4_retro\" ? { retro_frame_version: 2 } : {}),\n\n      shape,\n\n      product_type: productType,\n\n      ratio_label: isMailbox ? \"mailbox\" : (cfg.renderRatio || root.dataset.renderRatio || dims.ratio_label),\n\n      width_cm: isMailbox ? 19.4 : (isSingleCharacters ? 0 : dims.width_cm),\n\n      height_cm: isMailbox ? 29.6 : (isSingleCharacters ? characterHeight.height_cm : dims.height_cm),\n\n      character_height_cm: isSingleCharacters ? characterHeight.height_cm : null,\n\n      custom_height: isSingleCharacters ? characterHeight.custom : false,\n\n      characters: isSingleCharacters ? characters.toUpperCase() : \"\",\n\n      physical_character_count: isSingleCharacters && characterCheck && characterCheck.ok ? characterCheck.count : 0,\n\n      number: (isTextOnlyShape(shape) || (isApartmentPlate && cfg.apartmentNatpisOnly)) ? \"\" : field(\"number\").toUpperCase(),\n\n      street: isApartmentPlate ? street : street.toUpperCase(),\n\n      extra_text: isApartmentPlate ? extraText : extraText.toUpperCase(),\n\n      mailbox_top_text: isMailbox ? mailboxTopText.toUpperCase() : \"\",\n\n      mailbox_bottom_text: isMailbox ? mailboxBottomText.toUpperCase() : \"\",\n\n      mailbox_has_top_plate: isMailbox ? !!mailboxTopText : false,\n\n      mailbox_door_color: isMailbox ? (field(\"mailbox_door_color\") || \"drvo_dezen\") : \"\",\n\n      mailbox_side_color: isMailbox ? (field(\"mailbox_side_color\") || \"cesljano_srebro\") : \"\",\n\n      dog_symbol_key: isDogNotice ? (field(\"dog_symbol_key\") || \"lovacki_01\") : \"\",\n\n      note,\n\n      contact_phone: contactPhone,\n\n      plate_color: plateColor,\n\n      background_color: plateColor,\n\n      text_color: textColor || \"srebrno_ogledalo\",\n\n      engraving_color: engravingColor,\n\n      plate_style: plateStyle,\n\n      distancer_color: (isApartmentPlate || isMailbox) ? \"\" : (field(\"distancer_color\") || (textColor.indexOf(\"zlatno_ogledalo\") === 0 ? \"zlatna\" : \"srebrna\")),\n\n      script: scriptValue(),\n\n      number_align: numberAlign,\n\n      text_case: field(\"text_case\") || \"uppercase\",\n\n      plocica_font: (isApartmentPlate || isSingleCharacters) ? (field(\"plocica_font\") || \"\") : \"\"\n\n    };\n\n  }\n\n\n\n  function draftStorageKey() {\n\n    const productKey = cfg.productHandle || cfg.productId || root.dataset.renderShape || \"unknown\";\n\n    return LS_DESIGN_DRAFT_PREFIX + String(productKey);\n\n  }\n\n\n\n  function designTextGroup(config) {\n\n    const productType = config && config.product_type ? String(config.product_type) : \"\";\n\n    if (productType === \"house_number\") return \"house_number\";\n\n    if (productType === \"apartment_plate\") return \"apartment_plate\";\n\n    if (productType === \"mailbox\") return \"mailbox\";\n\n    if (productType === \"single_character\") return \"single_character\";\n\n    return \"\";\n\n  }\n\n\n\n  function lastTextStorageKey(group) {\n\n    return group ? LS_DESIGN_TEXT_PREFIX + group : \"\";\n\n  }\n\n\n\n  function draftPrimaryText(config) {\n\n    return [\n\n      config.street,\n\n      config.number,\n\n      config.extra_text,\n\n      config.characters,\n\n      config.mailbox_top_text,\n\n      config.mailbox_bottom_text,\n\n      config.note,\n\n      config.contact_phone\n\n    ].filter(Boolean).join(\" \").trim();\n\n  }\n\n\n\n  function hasMeaningfulDraft(config) {\n\n    if (!config) return false;\n\n    if (draftPrimaryText(config)) return true;\n\n    if (config.dog_symbol_key && config.dog_symbol_key !== \"lovacki_01\") return true;\n\n    if (config.number_align && config.number_align !== \"right\") return true;\n\n    if (config.plate_style && config.plate_style !== \"rectangular\") return true;\n\n    return false;\n\n  }\n\n\n\n  function setFieldValue(name, value) {\n\n    if (!form || value == null) return;\n\n    const el = form.querySelector(`[name=\"${name}\"]`);\n\n    if (!el) return;\n\n    el.value = String(value);\n\n    el.dispatchEvent(new Event(\"change\", { bubbles: true }));\n\n  }\n\n\n\n  function applyDraftConfig(config, preserveVariant = false) {\n\n    if (!config || !form) return false;\n\n    restoringDraft = true;\n\n    [\n\n      \"street\",\n\n      \"number\",\n\n      \"extra_text\",\n\n      \"characters\",\n\n      \"note\",\n\n      \"contact_phone\",\n\n      \"script\",\n\n      \"plate_color\",\n\n      \"background_color\",\n\n      \"text_color\",\n\n      \"distancer_color\",\n\n      \"engraving_color\",\n\n      \"number_align\",\n\n      \"dog_symbol_key\",\n\n      \"mailbox_door_color\",\n\n      \"mailbox_side_color\",\n\n      \"plate_style\",\n\n      \"text_case\",\n\n      \"plocica_font\"\n\n    ].forEach((name) => setFieldValue(name, config[name]));\n\n    if (!preserveVariant && config.product_type === \"single_character\" && config.character_height_cm) {\n\n      selectVariantByCharacterHeight(config.character_height_cm);\n\n    } else if (!preserveVariant && config.width_cm && config.height_cm) {\n\n      selectVariantByDimension(config.width_cm, config.height_cm);\n\n    }\n\n    syncDistancerDefault();\n\n    updateSwatches();\n\n    updateFontSamples();\n\n    restoringDraft = false;\n    if (primaryTextBaseline !== null) resetPrimaryTextMeasurement(currentConfig());\n\n    return true;\n\n  }\n\n\n\n  function readLastTextForCurrentProduct() {\n\n    const group = designTextGroup(currentConfig());\n\n    const key = lastTextStorageKey(group);\n\n    if (!key) return null;\n\n    const raw = safeLocalStorageGet(key);\n\n    if (!raw) return null;\n\n    try {\n\n      const parsed = JSON.parse(raw);\n\n      return parsed && parsed.text ? parsed : null;\n\n    } catch (err) {\n\n      safeLocalStorageRemove(key);\n\n      return null;\n\n    }\n\n  }\n\n\n\n  function applyLastTextForRelatedProduct() {\n\n    if (readLocalDraft() || !form) return false;\n\n    const lastText = readLastTextForCurrentProduct();\n\n    const text = lastText && lastText.text;\n\n    if (!text) return false;\n\n    // Ranije se gledalo \"ima li teksta u poljima\", ali tu UVEK stoji podrazumevani\n    // tekst iz Liquid-a (npr. \"\u0412\u041E\u0408\u0412\u041E\u0402\u0410\u041D\u0421\u041A\u0410 23\"), pa se prenos unosa nikad nije desio.\n    // Sada preuzimamo samo ako je na stranici jos uvek netaknuto podrazumevano stanje.\n    if (pristinePrimaryText === null) {\n      try { pristinePrimaryText = draftPrimaryText(currentConfig()); } catch (e) { pristinePrimaryText = \"\"; }\n    }\n\n    if (draftDiffersFromPristine(currentConfig())) return false;\n\n\n\n    restoringDraft = true;\n\n    [\"street\", \"number\", \"extra_text\", \"characters\", \"contact_phone\"].forEach((name) => {\n\n      if (text[name]) setFieldValue(name, text[name]);\n\n    });\n\n    restoringDraft = false;\n\n    if (!relatedPrefillReported) {\n\n      relatedPrefillReported = true;\n\n      postLeadEvent(\"table_design_related_prefill_used\", {\n\n        source_product_handle: lastText.product_handle || \"\",\n\n        target_product_handle: cfg.productHandle || \"\",\n\n        group: lastText.group || designTextGroup(currentConfig()),\n\n        has_street: !!text.street,\n\n        has_number: !!text.number,\n\n        has_extra_text: !!text.extra_text,\n\n        has_characters: !!text.characters,\n\n        has_contact_phone: !!text.contact_phone\n\n      }).catch(() => {});\n\n    }\n\n    return true;\n\n  }\n\n\n\n  function readLocalDraft() {\n\n    const raw = safeLocalStorageGet(draftStorageKey());\n\n    if (!raw) return null;\n\n    try {\n\n      return JSON.parse(raw);\n\n    } catch (err) {\n\n      safeLocalStorageRemove(draftStorageKey());\n\n      return null;\n\n    }\n\n  }\n\n\n\n  // Konfigurator snimi nacrt i sa PODRAZUMEVANIM vrednostima (npr. \"23\" /\n  // \"VOJVODJANSKA\"), pa je dugme pisalo \"Nastavi unos\" i kupcu koji nista nije\n  // uneo. Zato pamtimo netaknuto stanje i trazimo stvarnu razliku.\n  // Prvi poziv ove funkcije desava se PRE restoreLocalDraft() u inicijalizaciji,\n  // pa tada u DOM-u jos stoje podrazumevane vrednosti iz Liquid-a.\n  let pristinePrimaryText = null;\n\n  function draftDiffersFromPristine(config) {\n\n    if (!config) return false;\n\n    if (pristinePrimaryText !== null && draftPrimaryText(config) !== pristinePrimaryText) return true;\n\n    if (config.dog_symbol_key && config.dog_symbol_key !== \"lovacki_01\") return true;\n\n    if (config.number_align && config.number_align !== \"right\") return true;\n\n    if (config.plate_style && config.plate_style !== \"rectangular\") return true;\n\n    return false;\n\n  }\n\n  function updateMobileOpenButtonLabel() {\n\n    if (!mobileOpenButton) return;\n\n    if (pristinePrimaryText === null) {\n\n      try { pristinePrimaryText = draftPrimaryText(currentConfig()); } catch (e) { pristinePrimaryText = \"\"; }\n\n    }\n\n    const draft = readLocalDraft();\n\n    const resumable = draft && hasMeaningfulDraft(draft.config) && draftDiffersFromPristine(draft.config);\n\n    mobileOpenButton.textContent = resumable\n\n      ? \"Nastavi unos\"\n\n      : mobileOpenDefaultText;\n\n  }\n\n\n\n  function showAutosaveStatus(text, persistent) {\n\n    if (!autosaveStatus) return;\n\n    autosaveStatus.textContent = text || \"\";\n\n    autosaveStatus.classList.toggle(\"is-visible\", !!text);\n\n    clearTimeout(autosaveStatusTimer);\n\n    if (text && !persistent) {\n\n      autosaveStatusTimer = setTimeout(() => {\n\n        autosaveStatus.classList.remove(\"is-visible\");\n\n      }, 2600);\n\n    }\n\n  }\n\n\n\n  function showSaveToast(text) {\n\n    let toast = document.querySelector(\"[data-kb-save-toast]\");\n\n    if (!toast) {\n\n      toast = document.createElement(\"div\");\n\n      toast.className = \"kb-save-toast\";\n\n      toast.setAttribute(\"data-kb-save-toast\", \"1\");\n\n      toast.setAttribute(\"role\", \"status\");\n\n      toast.setAttribute(\"aria-live\", \"polite\");\n\n      document.body.appendChild(toast);\n\n    }\n\n    toast.textContent = text || \"\";\n\n    window.requestAnimationFrame(() => {\n\n      toast.classList.add(\"is-visible\");\n\n    });\n\n    clearTimeout(saveToastTimer);\n\n    saveToastTimer = setTimeout(() => {\n\n      toast.classList.remove(\"is-visible\");\n\n    }, 3600);\n\n  }\n\n\n\n  function restoreLocalDraft() {\n\n    const draft = readLocalDraft();\n\n    if (!draft) return false;\n\n    const config = draft && draft.config;\n\n    if (!hasMeaningfulDraft(config)) return false;\n\n    const urlVariant = new URLSearchParams(window.location.search).get(\"variant\");\n\n    const preserveVariant = !!urlVariant && Array.isArray(cfg.variants) && cfg.variants.some((variant) => String(variant.id) === urlVariant);\n\n    const applied = applyDraftConfig(config, preserveVariant);\n\n    updateMobileOpenButtonLabel();\n\n    return applied;\n\n  }\n\n\n\n  function resetPrimaryTextMeasurement(config) {\n    primaryTextBaseline = {\n      street: String(config.street || \"\"),\n      number: String(config.number || \"\")\n    };\n    primaryTextTouched.street = false;\n    primaryTextTouched.number = false;\n  }\n\n  function notePrimaryTextInput(input, userInitiated) {\n    if (!userInitiated || restoringDraft || primaryTextBaseline === null || !input) return;\n    if (input.name === \"street\" || input.name === \"number\") {\n      primaryTextTouched[input.name] = true;\n    }\n  }\n\n  function primaryTextMeasurement(config) {\n    return {\n      street_changed: !!(primaryTextBaseline && primaryTextTouched.street &&\n        String(config.street || \"\") !== primaryTextBaseline.street),\n      number_changed: !!(primaryTextBaseline && primaryTextTouched.number &&\n        String(config.number || \"\") !== primaryTextBaseline.number)\n    };\n  }\n\n  function reportConfiguratorOpened(source) {\n    if (configuratorOpenedReported || primaryTextBaseline === null ||\n        document.visibilityState === \"hidden\" || !form) return;\n    if (mobilePreviewEnabled() && !root.classList.contains(\"kb-mobile-modal-open\")) return;\n    const target = mobilePreviewEnabled() ? root : form;\n    const rect = target.getBoundingClientRect();\n    const visibleHeight = Math.min(rect.bottom, window.innerHeight) - Math.max(rect.top, 0);\n    if (!target.getClientRects().length || rect.width <= 0 ||\n        rect.right <= 0 || rect.left >= window.innerWidth ||\n        visibleHeight < Math.min(48, rect.height) || rect.height <= 0) return;\n    configuratorOpenedReported = true;\n    if (configuratorVisibilityObserver) configuratorVisibilityObserver.disconnect();\n    window.removeEventListener(\"scroll\", checkConfiguratorVisibility);\n    window.removeEventListener(\"resize\", checkConfiguratorVisibility);\n    document.removeEventListener(\"visibilitychange\", checkConfiguratorVisibility);\n    const config = currentConfig();\n    void postLeadEvent(\"table_design_opened\", {\n      source: source || \"visible\",\n      draft_source: initialDraftSource,\n      product_handle: cfg.productHandle || \"\",\n      product_id: cfg.productId || \"\",\n      variant_id: selectedVariantId(),\n      shape: config.shape,\n      product_type: config.product_type,\n      step: currentStep()\n    });\n  }\n\n  function checkConfiguratorVisibility() {\n    reportConfiguratorOpened(\"visible\");\n  }\n\n  function initConfiguratorMeasurement() {\n    resetPrimaryTextMeasurement(currentConfig());\n    if (!form) return;\n    if (\"IntersectionObserver\" in window) {\n      configuratorVisibilityObserver = new IntersectionObserver(checkConfiguratorVisibility);\n      configuratorVisibilityObserver.observe(form);\n    }\n    window.addEventListener(\"scroll\", checkConfiguratorVisibility, { passive: true });\n    window.addEventListener(\"resize\", checkConfiguratorVisibility);\n    document.addEventListener(\"visibilitychange\", checkConfiguratorVisibility);\n    checkConfiguratorVisibility();\n  }\n\n  function draftAnalyticsPayload(config, source) {\n\n    return {\n\n      source: source || \"auto\",\n      ...primaryTextMeasurement(config),\n      draft_source: initialDraftSource,\n\n      product_handle: cfg.productHandle || \"\",\n\n      product_id: cfg.productId || \"\",\n\n      variant_id: selectedVariantId(),\n\n      shape: config.shape,\n\n      product_type: config.product_type,\n\n      dimensions: `${config.width_cm || \"\"}x${config.height_cm || \"\"}`,\n\n      street: config.street,\n\n      number: config.number,\n\n      extra_text: config.extra_text,\n\n      characters: config.characters,\n\n      contact_phone: config.contact_phone,\n\n      plate_color: config.plate_color,\n\n      text_color: config.text_color,\n\n      distancer_color: config.distancer_color,\n\n      engraving_color: config.engraving_color,\n\n      step: currentStep()\n\n    };\n\n  }\n\n\n\n  function saveLocalDraftNow(source) {\n\n    if (restoringDraft) return;\n\n    const config = currentConfig();\n\n    const draftConfig = { ...config, step: currentStep() };\n\n    const key = draftStorageKey();\n\n    if (!hasMeaningfulDraft(draftConfig)) {\n\n      safeLocalStorageRemove(key);\n\n      updateMobileOpenButtonLabel();\n\n      showAutosaveStatus(\"\", true);\n\n      return;\n\n    }\n\n    const draftSaved = safeLocalStorageSet(key, JSON.stringify({\n\n      version: 1,\n\n      saved_at: new Date().toISOString(),\n\n      product_handle: cfg.productHandle || \"\",\n\n      product_id: cfg.productId || \"\",\n\n      config: draftConfig\n\n    }));\n\n    saveLastTextForRelatedProducts(draftConfig);\n\n    updateMobileOpenButtonLabel();\n\n    showAutosaveStatus(draftSaved ? \"Nacrt sa\u010Duvan na ovom ure\u0111aju\" : \"Unos je dostupan dok je stranica otvorena\", false);\n\n\n\n    clearTimeout(draftAnalyticsTimer);\n\n    const now = Date.now();\n\n    const textChange = primaryTextMeasurement(config);\n    const firstTextEdit = !primaryTextEditReported && (\n      (textChange.street_changed && String(config.street || \"\").trim()) ||\n      (textChange.number_changed && String(config.number || \"\").trim())\n    );\n    // Capture quick first entries; restored/default drafts retain the old cadence.\n    const wait = firstTextEdit ? 500 : Math.max(DRAFT_ANALYTICS_DELAY_MS, DRAFT_ANALYTICS_MIN_INTERVAL_MS - (now - lastDraftAnalyticsAt));\n\n    draftAnalyticsTimer = setTimeout(() => {\n\n      lastDraftAnalyticsAt = Date.now();\n\n      const analyticsConfig = currentConfig();\n      const analyticsPayload = draftAnalyticsPayload(analyticsConfig, source);\n      if ((analyticsPayload.street_changed && String(analyticsConfig.street || \"\").trim()) ||\n          (analyticsPayload.number_changed && String(analyticsConfig.number || \"\").trim())) {\n        primaryTextEditReported = true;\n      }\n      // Consume only the emitted interval; later color-only saves are not edits.\n      resetPrimaryTextMeasurement(analyticsConfig);\n      postLeadEvent(\"table_design_draft_saved\", analyticsPayload).catch(() => {});\n\n    }, wait);\n\n  }\n\n\n\n  function clearLocalDraft() {\n\n    safeLocalStorageRemove(draftStorageKey());\n\n    updateMobileOpenButtonLabel();\n\n    showAutosaveStatus(\"\", true);\n\n  }\n\n\n\n  function saveLastTextForRelatedProducts(config) {\n\n    const group = designTextGroup(config);\n\n    const key = lastTextStorageKey(group);\n\n    if (!key) return;\n    // Konfigurator autosnimi nacrt i sa PODRAZUMEVANIM vrednostima, cim se stranica\n    // otvori. Bez ove provere takav snimak pregazi tekst koji je kupac uneo na\n    // prethodnom obliku, pa mu se unos gubi pri promeni oblika.\n    if (pristinePrimaryText === null) {\n      try { pristinePrimaryText = draftPrimaryText(currentConfig()); } catch (e) { pristinePrimaryText = \"\"; }\n    }\n    if (!draftDiffersFromPristine(config)) return;\n\n    const text = {\n\n      street: config.street || \"\",\n\n      number: config.number || \"\",\n\n      extra_text: config.extra_text || \"\",\n\n      characters: config.characters || \"\",\n\n      contact_phone: config.contact_phone || \"\"\n\n    };\n\n    if (!Object.values(text).some(Boolean)) return;\n\n    safeLocalStorageSet(key, JSON.stringify({\n\n      version: 1,\n\n      group,\n\n      saved_at: new Date().toISOString(),\n\n      product_handle: cfg.productHandle || \"\",\n\n      product_id: cfg.productId || \"\",\n\n      text\n\n    }));\n\n  }\n\n\n\n  function scheduleDraftSave(source) {\n\n    if (restoringDraft) return;\n\n    clearTimeout(draftSaveTimer);\n\n    draftSaveTimer = setTimeout(() => saveLocalDraftNow(source || \"change\"), DRAFT_SAVE_DELAY_MS);\n\n  }\n\n\n\n  function findVariantByDimension(widthCm, heightCm) {\n\n    const target = { width_cm: normalizedNumber(widthCm), height_cm: normalizedNumber(heightCm) };\n\n    if (!target.width_cm || !target.height_cm) return null;\n\n    const variants = Array.isArray(cfg.variants) ? cfg.variants : [];\n\n    return variants.find((variant) => {\n\n      /* Varijanta \"po meri\" nema dimenziju u nazivu, pa currentDimension() za nju padne\n         na ratioFallbackDimension i prijavi 40x20. Bez ove provere se lazno poklopi sa\n         trazenih 40x20, izabere se varijanta od 1 RSD i nestane cena. Ista zastita vec\n         postoji kod gradjenja liste dimenzija. QA 02.11.2026. */\n      if (isCustomDimVariant(variant)) return false;\n      const dims = currentDimension(variant);\n\n      return sameDimension(dims, target);\n\n    }) || null;\n\n  }\n\n\n\n  function selectVariantByDimension(widthCm, heightCm) {\n\n    const variant = findVariantByDimension(widthCm, heightCm);\n\n    if (!variant) return false;\n\n    if (variantInput) {\n\n      variantInput.value = String(variant.id);\n\n      variantInput.dispatchEvent(new Event(\"change\", { bubbles: true }));\n\n    }\n\n    const options = Array.isArray(variant.options) ? variant.options.map(String) : [];\n\n    options.forEach((optionValue) => {\n\n      document.querySelectorAll('variant-selects select, .product-form__input select').forEach((select) => {\n\n        Array.from(select.options || []).forEach((option) => {\n\n          if (String(option.value) === optionValue || String(option.textContent || \"\").trim() === optionValue) {\n\n            select.value = option.value;\n\n            select.dispatchEvent(new Event(\"change\", { bubbles: true }));\n\n          }\n\n        });\n\n      });\n\n      document.querySelectorAll('variant-radios input[type=\"radio\"], .product-form__input input[type=\"radio\"]').forEach((input) => {\n\n        if (String(input.value) === optionValue) {\n\n          input.checked = true;\n\n          input.dispatchEvent(new Event(\"change\", { bubbles: true }));\n\n        }\n\n      });\n\n    });\n\n    return true;\n\n  }\n\n\n\n  function selectVariantByCharacterHeight(heightCm) {\n\n    const target = normalizedNumber(heightCm);\n\n    if (!target) return false;\n\n    const variants = Array.isArray(cfg.variants) ? cfg.variants : [];\n\n    const variant = variants.find((item) => {\n\n      const parts = [item.title || \"\"].concat(Array.isArray(item.options) ? item.options : []);\n\n      return parts.some((part) => parseCharacterHeight(part) === target);\n\n    });\n\n    if (!variant) return false;\n\n    if (variantInput) {\n\n      variantInput.value = String(variant.id);\n\n      variantInput.dispatchEvent(new Event(\"change\", { bubbles: true }));\n\n    }\n\n    applyVariantOptions(variant);\n\n    return true;\n\n  }\n\n\n\n  function applyVariantOptions(variant) {\n\n    const options = Array.isArray(variant.options) ? variant.options.map(String) : [];\n\n    options.forEach((optionValue) => {\n\n      document.querySelectorAll('variant-selects select, .product-form__input select').forEach((select) => {\n\n        Array.from(select.options || []).forEach((option) => {\n\n          if (String(option.value) === optionValue || String(option.textContent || \"\").trim() === optionValue) {\n\n            select.value = option.value;\n\n            select.dispatchEvent(new Event(\"change\", { bubbles: true }));\n\n          }\n\n        });\n\n      });\n\n      document.querySelectorAll('variant-radios input[type=\"radio\"], .product-form__input input[type=\"radio\"]').forEach((input) => {\n\n        if (String(input.value) === optionValue) {\n\n          input.checked = true;\n\n          input.dispatchEvent(new Event(\"change\", { bubbles: true }));\n\n        }\n\n      });\n\n    });\n\n  }\n\n\n\n  function activateCustomDimension() {\n\n    const variant = customDimVariant();\n\n    if (!variant) return false;\n\n    customDimActive = true;\n\n    if (variantInput) {\n\n      variantInput.value = String(variant.id);\n\n      variantInput.dispatchEvent(new Event(\"change\", { bubbles: true }));\n\n    }\n\n    applyVariantOptions(variant);\n\n    if (customDimWrap) customDimWrap.removeAttribute(\"hidden\");\n\n    return true;\n\n  }\n\n\n\n  function deactivateCustomDimension() {\n\n    customDimActive = false;\n\n    if (customDimWrap) customDimWrap.setAttribute(\"hidden\", \"\");\n\n  }\n\n\n\n  function selectPreferredDefaultVariant() {\n\n    const params = new URLSearchParams(window.location.search);\n\n    if (params.get(\"variant\")) return false;\n\n    const preferred = preferredDefaultDimension();\n\n    return selectVariantByDimension(preferred.width_cm, preferred.height_cm);\n\n  }\n\n\n\n  function applyIncomingConfigFromUrl() {\n\n    const params = new URLSearchParams(window.location.search);\n\n    if (params.get(\"kb_cfg\") !== \"1\") return false;\n\n    setField(\"street\", params.get(\"kb_street\"));\n\n    setField(\"number\", params.get(\"kb_number\"));\n\n    setField(\"extra_text\", params.get(\"kb_extra\"));\n\n    setField(\"note\", params.get(\"kb_note\"));\n\n    setField(\"script\", params.get(\"kb_script\"));\n\n    setField(\"plate_color\", params.get(\"kb_plate\"));\n\n    setField(\"text_color\", params.get(\"kb_text\"));\n\n    setField(\"distancer_color\", params.get(\"kb_dist\"));\n\n    setField(\"engraving_color\", params.get(\"kb_engraving\"));\n\n    setField(\"number_align\", params.get(\"kb_align\"));\n\n    setField(\"dog_symbol_key\", params.get(\"kb_dog\"));\n\n    selectVariantByDimension(params.get(\"kb_w\"), params.get(\"kb_h\"));\n\n    syncDistancerDefault();\n\n    return true;\n\n  }\n\n\n\n  function escapeHtml(value) {\n\n    return String(value || \"\").replace(/[&<>\"']/g, (ch) => ({\n\n      \"&\": \"&amp;\",\n\n      \"<\": \"&lt;\",\n\n      \">\": \"&gt;\",\n\n      '\"': \"&quot;\",\n\n      \"'\": \"&#039;\"\n\n    })[ch]);\n\n  }\n\n\n\n  function dogSymbolBaseKey(key) {\n\n    return String(key || \"\").replace(/_\\d+$/g, \"\");\n\n  }\n\n\n\n  function dogSymbolRootKey(key) {\n\n    return dogSymbolBaseKey(key).replace(/_\\d+$/g, \"\");\n\n  }\n\n\n\n  function normalizeDogSearch(value) {\n\n    return String(value || \"\")\n\n      .toLowerCase()\n\n      .replace(/\\u0452/g, \"dj\")\n\n      .replace(/\\u0111/g, \"dj\")\n\n      .normalize(\"NFD\")\n\n      .replace(/[\\u0300-\\u036f]/g, \"\")\n\n      .replace(/[^a-z0-9]+/g, \" \")\n\n      .trim();\n\n  }\n\n\n\n  function dogSmartEntry(key) {\n\n    return dogSmartNames[key] || dogSmartNames[dogSymbolBaseKey(key)] || dogSmartNames[dogSymbolRootKey(key)] || null;\n\n  }\n\n\n\n  async function loadDogSmartNames() {\n\n    if (!cfg.dogSmartNamesUrl) return {};\n\n    try {\n\n      const res = await fetch(cfg.dogSmartNamesUrl, { cache: \"force-cache\" });\n\n      if (!res.ok) return {};\n\n      const data = await res.json();\n\n      return data && (data.breeds || data) || {};\n\n    } catch (err) {\n\n      return {};\n\n    }\n\n  }\n\n\n\n  function dogSymbolLabel(key, symbol) {\n\n    const smart = dogSmartEntry(key);\n\n    if (smart && smart.name) return smart.name;\n\n    if (symbol && symbol.label) return symbol.label;\n\n    return String(key || \"\")\n\n      .replace(/_\\d+$/g, (suffix) => \" \" + suffix.slice(1))\n\n      .replace(/_/g, \" \")\n\n      .replace(/\\b\\w/g, (ch) => ch.toUpperCase());\n\n  }\n\n\n\n  function dogSymbolPreviewSvg(symbol) {\n\n    if (!symbol || !symbol.viewBox || !Array.isArray(symbol.paths)) return \"\";\n\n    return '<svg viewBox=\"' + escapeHtml(symbol.viewBox) + '\" aria-hidden=\"true\" focusable=\"false\" preserveAspectRatio=\"xMidYMid meet\">'\n\n      + symbol.paths.map((d) => '<path d=\"' + escapeHtml(d) + '\" fill=\"currentColor\"/>').join(\"\")\n\n      + \"</svg>\";\n\n  }\n\n\n\n  function renderDogSymbolGrid(filterText) {\n\n    if (!dogSymbolGrid) return;\n\n    const tokens = normalizeDogSearch(filterText).split(/\\s+/).filter(Boolean);\n\n    const selected = field(\"dog_symbol_key\") || \"lovacki_01\";\n\n    const items = dogSymbols.filter((item) => !tokens.length || tokens.every((token) => item.search.indexOf(token) !== -1)).slice(0, 60);\n\n    dogSymbolGrid.innerHTML = items.map((item) => {\n\n      const active = item.key === selected;\n\n      return '<button type=\"button\" class=\"kb-dog-symbol-option\" data-kb-dog-symbol-key=\"' + escapeHtml(item.key) + '\" aria-pressed=\"' + (active ? \"true\" : \"false\") + '\">'\n\n        + '<span class=\"kb-dog-symbol-preview\">' + dogSymbolPreviewSvg(item) + \"</span>\"\n\n        + '<span class=\"kb-dog-symbol-name\">' + escapeHtml(item.label) + \"</span>\"\n\n        + \"</button>\";\n\n    }).join(\"\") || '<div class=\"kb-field-help\">Nema rezultata za pretragu.</div>';\n\n  }\n\n\n\n  async function initDogSymbolPicker() {\n\n    if (!dogSymbolPicker || !dogSymbolGrid) return;\n\n    try {\n\n      const rendererModule = await loadRendererModule();\n\n      if (!rendererModule || typeof rendererModule.loadDogSymbolBundle !== \"function\") return;\n\n      const results = await Promise.all([rendererModule.loadDogSymbolBundle(), loadDogSmartNames()]);\n\n      const bundle = results[0] || {};\n\n      dogSmartNames = results[1] || {};\n\n      dogSymbols = Object.entries(bundle.symbols || {}).map(([key, symbol]) => {\n\n        const smart = dogSmartEntry(key) || {};\n\n        const item = {\n\n          key,\n\n          file: symbol.file || \"\",\n\n          label: dogSymbolLabel(key, symbol),\n\n          aliases: Array.isArray(smart.aliases) ? smart.aliases : [],\n\n          viewBox: symbol.viewBox || \"0 0 1000 1000\",\n\n          paths: Array.isArray(symbol.paths) ? symbol.paths : []\n\n        };\n\n        item.search = normalizeDogSearch([item.key, dogSymbolBaseKey(item.key), dogSymbolRootKey(item.key), item.label, item.file].concat(item.aliases).join(\" \"));\n\n        return item;\n\n      });\n\n      if (!field(\"dog_symbol_key\") && dogSymbols[0]) setField(\"dog_symbol_key\", dogSymbols[0].key);\n\n      renderDogSymbolGrid(dogSymbolSearch ? dogSymbolSearch.value : \"\");\n\n    } catch (err) {\n\n      dogSymbolGrid.innerHTML = '<div class=\"kb-field-help\">Simboli pasa nisu u\u010Ditani.</div>';\n\n    }\n\n  }\n\n\n\n  function desktopPreviewEnabled() {\n\n    return window.matchMedia && window.matchMedia(\"(min-width: 990px)\").matches;\n\n  }\n\n\n\n  function mobilePreviewEnabled() {\n\n    return window.matchMedia && window.matchMedia(\"(max-width: 749px)\").matches;\n\n  }\n\n\n\n  function productGallery() {\n\n    return document.querySelector(\"media-gallery, .product__media-wrapper\");\n\n  }\n\n\n\n  function ensureGalleryPreview() {\n\n    const gallery = productGallery();\n\n    if (!gallery) return null;\n\n    if (galleryPreview && gallery.contains(galleryPreview)) return galleryPreview;\n\n    galleryPreview = document.createElement(\"div\");\n\n    galleryPreview.className = \"kb-gallery-preview\";\n\n    galleryPreview.setAttribute(\"aria-live\", \"polite\");\n\n    galleryPreview.innerHTML = `\n\n      <div class=\"kb-gallery-preview__head\">\n\n        <p class=\"kb-gallery-preview__title\">Va\u0161 dizajn</p>\n\n        <p class=\"kb-gallery-preview__hint\">Veliki pregled personalizacije</p>\n\n      </div>\n\n      <div class=\"kb-gallery-preview__stage\" data-kb-gallery-preview-stage></div>\n\n    `;\n\n    gallery.insertBefore(galleryPreview, gallery.firstChild);\n\n    return galleryPreview;\n\n  }\n\n\n\n  function activateGalleryPreview() {\n\n    if (!desktopPreviewEnabled()) return;\n\n    const gallery = productGallery();\n\n    if (!gallery) return;\n\n    galleryPreviewActive = true;\n\n    ensureGalleryPreview();\n\n    gallery.classList.add(\"kb-gallery-preview-active\");\n\n    root.classList.add(\"kb-desktop-gallery-active\");\n\n  }\n\n\n\n  function syncGalleryPreview(svg) {\n\n    if (!galleryPreviewActive || !desktopPreviewEnabled()) return;\n\n    const mirror = ensureGalleryPreview();\n\n    if (!mirror) return;\n\n    const stage = mirror.querySelector(\"[data-kb-gallery-preview-stage]\");\n\n    if (stage) {\n\n      stage.innerHTML = svg || \"\";\n\n      const cfg = currentConfig();\n\n      if (cfg.product_type !== \"single_character\" && cfg.width_cm && cfg.height_cm) {\n\n        const mw = document.createElement(\"span\");\n\n        mw.className = \"kb-dimension-marker kb-dimension-marker--width\";\n\n        mw.setAttribute(\"data-kb-dimension-width\", \"\");\n\n        mw.textContent = cfg.width_cm + \" cm\";\n\n        const mh = document.createElement(\"span\");\n\n        mh.className = \"kb-dimension-marker kb-dimension-marker--height\";\n\n        mh.setAttribute(\"data-kb-dimension-height\", \"\");\n\n        mh.innerHTML = \"<strong>\" + escapeHtml(cfg.height_cm) + \" cm</strong>\";\n\n        stage.appendChild(mw);\n\n        stage.appendChild(mh);\n\n      }\n\n      positionDimensionMarkers();\n\n    }\n\n    const gallery = productGallery();\n\n    if (gallery) gallery.classList.add(\"kb-gallery-preview-active\");\n\n    root.classList.add(\"kb-desktop-gallery-active\");\n\n  }\n\n\n\n  function updateMobilePreviewCompact() {\n\n    if (!mobilePreviewEnabled()) {\n\n      root.classList.remove(\"kb-mobile-preview-compact\");\n\n      return;\n\n    }\n\n    const rect = root.getBoundingClientRect();\n\n    const compactAfter = Math.min(180, Math.max(120, window.innerHeight * 0.16));\n\n    root.classList.toggle(\"kb-mobile-preview-compact\", rect.top < -compactAfter);\n\n  }\n\n\n\n  function updateResponsivePreviewState() {\n\n    syncConfiguratorMount();\n\n    const gallery = productGallery();\n\n    if (!desktopPreviewEnabled()) {\n\n      root.classList.remove(\"kb-desktop-gallery-active\");\n\n      if (gallery) gallery.classList.remove(\"kb-gallery-preview-active\");\n\n    } else if (galleryPreviewActive && gallery) {\n\n      root.classList.add(\"kb-desktop-gallery-active\");\n\n      gallery.classList.add(\"kb-gallery-preview-active\");\n\n      if (preview && preview.innerHTML) syncGalleryPreview(preview.innerHTML);\n\n    }\n\n    updateMobilePreviewCompact();\n\n  }\n\n\n\n  function syncConfiguratorMount() {\n\n    if (mobilePreviewEnabled()) {\n\n      if (root.parentElement !== document.body) document.body.appendChild(root);\n\n      return;\n\n    }\n\n    if (root.parentElement === document.body && rootPlaceholder.parentNode) {\n\n      rootPlaceholder.parentNode.insertBefore(root, rootPlaceholder.nextSibling);\n\n    }\n\n  }\n\n\n\n  /* Automatsko otvaranje na mobilnom.\n     Konfigurator je sustina ove stranice, a mereno je da 97,3% plitkih sesija nikad ne\n     tapne dugme za otvaranje. Zato se na uskim ekranima otvara sam, uz tri ograde:\n       - poseban analiticki razlog \"mobile_auto\", da dubina levka ostane merljiva\n       - unos u istoriju, da sistemsko \"nazad\" zatvori modal umesto da napusti sajt\n         (u IG/FB ugradjenom pregledacu je to glavni izlaz)\n       - pamcenje zatvaranja za tu sesiju, da se ne nabija posetiocu ponovo */\n\n  const AUTO_OPEN_KLJUC = \"kb_auto_open_zatvoren\";\n\n  let istorijskiUnosGurnut = false;\n\n  let zatvaranjeIzIstorije = false;\n\n  function autoOpenOdbijen() {\n\n    try { return sessionStorage.getItem(AUTO_OPEN_KLJUC) === \"1\"; } catch (e) { return false; }\n\n  }\n\n  function zapamtiZatvaranje() {\n\n    try { sessionStorage.setItem(AUTO_OPEN_KLJUC, \"1\"); } catch (e) {}\n\n  }\n\n  function gurniIstorijskiUnos() {\n\n    if (istorijskiUnosGurnut) return;\n\n    try { history.pushState({ kbKonfigurator: true }, \"\"); istorijskiUnosGurnut = true; } catch (e) {}\n\n  }\n\n  window.addEventListener(\"popstate\", () => {\n\n    if (!root.classList.contains(\"kb-mobile-modal-open\")) return;\n\n    istorijskiUnosGurnut = false;\n\n    zatvaranjeIzIstorije = true;\n\n    closeMobileConfigurator();\n\n    zatvaranjeIzIstorije = false;\n\n  });\n\n  /* Polja dolaze popunjena primerom, pa kupac vidi gotovu tablu sa tudjom adresom.\n\n     Na prvi fokus se tekst oznaci, da ga prvi otkucaj zameni umesto da se dopisuje.\n\n     Delegirano na root jer syncConfiguratorMount premesta polja u modal i\n\n     osluskivaci na pojedinacnim poljima se tom prilikom gube. */\n\n  const primeriPocetni = new Map();\n\n  function pripremiPrimereUPoljima() {\n\n    root.querySelectorAll('[name=\"street\"], [name=\"number\"], [name=\"extra_text\"], [name=\"characters\"]').forEach((el) => {\n\n      if (el.value) primeriPocetni.set(el.name, el.value);\n\n    });\n\n  }\n\n  root.addEventListener(\"focusin\", (ev) => {\n\n    const el = ev.target;\n\n    if (!el || !el.name || !primeriPocetni.has(el.name)) return;\n\n    if (el.value !== primeriPocetni.get(el.name)) return;\n\n    try { el.select(); } catch (e) {}\n\n  });\n\n  function dovediPrvoPoljeUVidik() {\n\n    const panel = root.querySelector(\".kb-studio-layout\");\n\n    if (!panel || !root.classList.contains(\"kb-mobile-modal-open\")) return;\n\n    const polja = Array.prototype.slice\n      .call(root.querySelectorAll(\".kb-studio-form input, .kb-studio-form textarea\"))\n      .filter((el) => el.type !== \"hidden\" && el.offsetParent !== null &&\n                      el.getBoundingClientRect().height > 0);\n\n    if (!polja.length) return;\n\n    const okvir = panel.getBoundingClientRect();\n\n    /* Apsolutni racun, ne dodavanje: kad se pregled smanji, skrol se i SMANJUJE,\n       pa vrh table ne ostaje odsecen od ranijeg, vec\u0435\u0433 skrola. */\n\n    const dnoUSadrzaju = polja[0].getBoundingClientRect().bottom - okvir.top + panel.scrollTop;\n\n    const zeljeni = Math.max(0, Math.ceil(dnoUSadrzaju - panel.clientHeight + 8));\n\n    if (panel.scrollHeight <= panel.clientHeight) return zeljeni === 0;\n\n    if (Math.abs(panel.scrollTop - zeljeni) > 1) panel.scrollTop = zeljeni;\n\n    return Math.round(polja[0].getBoundingClientRect().bottom - okvir.bottom) <= 0;\n\n  }\n\n  function dovediPrvoPoljeUVidikUporno() {\n\n    /* Premium stranica se sleze i posle 3,5 s (jezicci, scena, Google sekcija),\n       pa su fiksni pokusaji tiho promasivali. Sada se pokusava dok ne uspe. */\n\n    let preostalo = 14;\n\n    const tik = () => {\n\n      if (--preostalo < 0) return;\n\n      if (!root.classList.contains(\"kb-mobile-modal-open\")) return;\n\n      syncDonjiSloj();\n\n      if (dovediPrvoPoljeUVidik()) return;\n\n      setTimeout(tik, 600);\n\n    };\n\n    setTimeout(tik, 400);\n\n  }\n\n  function syncDonjiSloj() {\n\n    if (!mobilePreviewEnabled() || !root.classList.contains(\"kb-mobile-modal-open\")) {\n\n      root.style.removeProperty(\"--kb-donji-sloj\");\n\n      return;\n\n    }\n\n    let visina = 0;\n\n    document.querySelectorAll(\".shopify-pc__banner__dialog, .shopify-pc__banner\").forEach((el) => {\n\n      const r = el.getBoundingClientRect();\n\n      if (r.height > 0 && r.bottom > window.innerHeight - 4) visina = Math.max(visina, r.height);\n\n    });\n\n    root.style.setProperty(\"--kb-donji-sloj\", Math.round(visina) + \"px\");\n\n  }\n\n  /* Baner se crta kasno i nestaje kad ga posetilac sklopi, pa se mera osvezava. */\n  window.addEventListener(\"resize\", syncDonjiSloj);\n\n  document.addEventListener(\"click\", () => {\n\n    requestAnimationFrame(syncDonjiSloj);\n\n  }, true);\n\n  /* Pregled se docrtava posle prvog uspesnog skrola i opet gurne polje van vidika,\n     pa se posle svake promene visine provera ponavlja dok je modal otvoren. */\n\n  let posmatracPregleda = null;\n\n  function pratiPromeneVisine() {\n\n    if (posmatracPregleda || typeof ResizeObserver === \"undefined\") return;\n\n    const karta = root.querySelector(\".kb-studio-preview-card\");\n\n    if (!karta) return;\n\n    posmatracPregleda = new ResizeObserver(() => {\n\n      if (!root.classList.contains(\"kb-mobile-modal-open\")) return;\n\n      syncDonjiSloj();\n\n      dovediPrvoPoljeUVidik();\n\n    });\n\n    posmatracPregleda.observe(karta);\n\n    const panel = root.querySelector(\".kb-studio-layout\");\n\n    if (panel) posmatracPregleda.observe(panel);\n\n  }\n\n  function autoOpenMobileConfigurator() {\n\n    if (!mobilePreviewEnabled()) return;\n\n    if (autoOpenOdbijen()) return;\n\n    if (root.classList.contains(\"kb-mobile-modal-open\")) return;\n\n    openMobileConfigurator(\"mobile_auto\");\n\n  }\n\n  function openMobileConfigurator(razlog) {\n\n    if (!mobilePreviewEnabled()) return;\n\n    syncConfiguratorMount();\n\n    root.classList.add(\"kb-mobile-modal-open\");\n\n    root.classList.remove(\"kb-mobile-preview-compact\");\n\n    document.body.classList.add(\"kb-configurator-open\");\n\n    if (mobileOpenButton) mobileOpenButton.setAttribute(\"aria-expanded\", \"true\");\n\n    setWizardStep(currentStep());\n\n    updateResponsivePreviewState();\n    gurniIstorijskiUnos();\n\n    syncDonjiSloj();\n\n    pratiPromeneVisine();\n    dovediPrvoPoljeUVidikUporno();\n\n    reportConfiguratorOpened(typeof razlog === \"string\" ? razlog : \"mobile_open\");\n\n  }\n\n\n\n  function closeMobileConfigurator() {\n\n    const config = currentConfig();\n\n    if (hasMeaningfulDraft(config)) {\n\n      saveLocalDraftNow(\"mobile_close\");\n\n      showAutosaveStatus(\"Unos je sa\u010Duvan. Mo\u017Eete nastaviti kasnije.\", true);\n\n      showSaveToast(\"Unos je sa\u010Duvan. Mo\u017Eete nastaviti kasnije.\");\n\n    }\n\n    root.classList.remove(\"kb-mobile-modal-open\");\n\n    root.classList.remove(\"kb-mobile-preview-compact\");\n\n    document.body.classList.remove(\"kb-configurator-open\");\n\n    if (mobileOpenButton) mobileOpenButton.setAttribute(\"aria-expanded\", \"false\");\n\n    updateResponsivePreviewState();\n\n    zapamtiZatvaranje();\n\n    if (istorijskiUnosGurnut && !zatvaranjeIzIstorije) {\n\n      istorijskiUnosGurnut = false;\n\n      try { history.back(); } catch (e) {}\n\n    }\n\n  }\n\n\n\n  function syncMobileConfiguratorMode() {\n\n    syncConfiguratorMount();\n\n    if (!mobilePreviewEnabled()) closeMobileConfigurator();\n\n  }\n\n\n\n  function fitInlinePreviewSvg() {\n\n    if (!preview) return;\n\n    const svg = preview.querySelector(\"svg\");\n\n    if (!svg) return;\n\n    preview.style.setProperty(\"--kb-preview-fit-scale\", \"1\");\n\n    window.requestAnimationFrame(() => {\n\n      const previewRect = preview.getBoundingClientRect();\n\n      const svgRect = svg.getBoundingClientRect();\n\n      if (!previewRect.width || !previewRect.height || !svgRect.width || !svgRect.height) return;\n\n      const maxWidth = previewRect.width - 18;\n\n      const maxHeight = previewRect.height - 18;\n\n      const scale = Math.min(1, maxWidth / svgRect.width, maxHeight / svgRect.height);\n\n      preview.style.setProperty(\"--kb-preview-fit-scale\", String(Math.max(0.72, Math.floor(scale * 100) / 100)));\n\n    });\n\n  }\n\n\n\n  function ensureDimensionMarkers() {\n\n    if (!preview) return;\n\n    let widthMarker = preview.querySelector(\"[data-kb-dimension-width]\");\n\n    let heightMarker = preview.querySelector(\"[data-kb-dimension-height]\");\n\n    if (!widthMarker) {\n\n      widthMarker = document.createElement(\"span\");\n\n      widthMarker.className = \"kb-dimension-marker kb-dimension-marker--width\";\n\n      widthMarker.setAttribute(\"data-kb-dimension-width\", \"\");\n\n      preview.appendChild(widthMarker);\n\n    }\n\n    if (!heightMarker) {\n\n      heightMarker = document.createElement(\"span\");\n\n      heightMarker.className = \"kb-dimension-marker kb-dimension-marker--height\";\n\n      heightMarker.setAttribute(\"data-kb-dimension-height\", \"\");\n\n      preview.appendChild(heightMarker);\n\n    }\n\n    if (!dimResizeObserver && typeof ResizeObserver === \"function\") {\n\n      dimResizeObserver = new ResizeObserver(function () { positionDimensionMarkers(); });\n\n      dimResizeObserver.observe(preview);\n\n    }\n\n  }\n\n\n\n  function updateDimensionMarkers() {\n\n    if (!preview) return;\n\n    const config = currentConfig();\n\n    ensureDimensionMarkers();\n\n    const widthMarker = preview.querySelector(\"[data-kb-dimension-width]\");\n\n    const heightMarker = preview.querySelector(\"[data-kb-dimension-height]\");\n\n    if (config.product_type === \"single_character\") {\n\n      if (widthMarker) widthMarker.textContent = \"\";\n\n      if (heightMarker) heightMarker.innerHTML = \"\";\n\n      return;\n\n    }\n\n    if (widthMarker) widthMarker.textContent = config.width_cm ? `${config.width_cm} cm` : \"\";\n\n    if (heightMarker) {\n\n      heightMarker.innerHTML = config.height_cm\n\n        ? `<strong>${escapeHtml(config.height_cm)} cm</strong>`\n\n        : \"\";\n\n    }\n\n    positionDimensionMarkers();\n\n  }\n\n\n\n  // Markeri mere moraju da le\u017Ee ta\u010Dno na ivicama table. Ranije su bili\n\n  // zakucani na 17%/18% kutije pregleda, pa je strelica \"40 cm\" pokrivala\n\n  // 88% \u0161irine a linija \"20 cm\" 128% visine \u2014 kupac je \u010Ditao pogre\u0161nu meru.\n\n  function plateRectOnScreen(svg) {\n\n    try {\n\n      const ctm = svg.getScreenCTM();\n\n      if (!ctm) return null;\n\n      const vb = svg.viewBox && svg.viewBox.baseVal;\n\n      const x0 = vb && vb.width ? vb.x : 0;\n\n      const y0 = vb && vb.height ? vb.y : 0;\n\n      const x1 = vb && vb.width ? vb.x + vb.width : 0;\n\n      const y1 = vb && vb.height ? vb.y + vb.height : 0;\n\n      if (x1 === x0 || y1 === y0) return svg.getBoundingClientRect();\n\n      const p0 = svg.createSVGPoint(); p0.x = x0; p0.y = y0;\n\n      const p1 = svg.createSVGPoint(); p1.x = x1; p1.y = y1;\n\n      const a = p0.matrixTransform(ctm);\n\n      const b = p1.matrixTransform(ctm);\n\n      return {\n\n        left: Math.min(a.x, b.x),\n\n        top: Math.min(a.y, b.y),\n\n        width: Math.abs(b.x - a.x),\n\n        height: Math.abs(b.y - a.y)\n\n      };\n\n    } catch (e) {\n\n      return svg.getBoundingClientRect();\n\n    }\n\n  }\n\n\n\n  // Postavlja markere tacno na ivice table unutar datog kontejnera.\n\n  // CSS `left/top` se meri od padding-ivice, pa se oduzima debljina okvira.\n\n  function layoutMarkersIn(box) {\n\n    if (!box) return;\n\n    const svg = box.querySelector(\"svg\");\n\n    const mw = box.querySelector(\"[data-kb-dimension-width]\");\n\n    const mh = box.querySelector(\"[data-kb-dimension-height]\");\n\n    if (!svg || !mw || !mh) return;\n\n    const br = box.getBoundingClientRect();\n\n    if (!br.width || !br.height) return;\n\n    const sr = plateRectOnScreen(svg);\n\n    if (!sr || !sr.width || !sr.height) return;\n\n    const cs = window.getComputedStyle(box);\n\n    const bl = parseFloat(cs.borderLeftWidth) || 0;\n\n    const brw = parseFloat(cs.borderRightWidth) || 0;\n\n    const bt = parseFloat(cs.borderTopWidth) || 0;\n\n    const bb = parseFloat(cs.borderBottomWidth) || 0;\n\n    const levo = sr.left - br.left - bl;\n\n    const desno = br.right - (sr.left + sr.width) - brw;\n\n    const gore = sr.top - br.top - bt;\n\n    const dole = br.bottom - (sr.top + sr.height) - bb;\n\n    const st = box.style;\n\n    st.setProperty(\"--kb-dim-w-left\", levo + \"px\");\n\n    st.setProperty(\"--kb-dim-w-right\", desno + \"px\");\n\n    st.setProperty(\"--kb-dim-w-bottom\", Math.max(4, dole - 29) + \"px\");\n\n    st.setProperty(\"--kb-dim-h-top\", gore + \"px\");\n\n    st.setProperty(\"--kb-dim-h-bottom\", dole + \"px\");\n\n    const linijaX = Math.min(br.width - 6, levo + sr.width + 9);\n\n    st.setProperty(\"--kb-dim-h-left\", (linijaX - 27) + \"px\");\n\n    st.setProperty(\"--kb-dim-h-right\", \"auto\");\n\n  }\n\n\n\n  function positionDimensionMarkers() {\n\n    window.requestAnimationFrame(function () {\n\n    window.requestAnimationFrame(function () {\n\n      layoutMarkersIn(preview);\n\n      layoutMarkersIn(galleryStage());\n\n    });\n\n    });\n\n  }\n\n\n\n  function galleryStage() {\n\n    return galleryPreview ? galleryPreview.querySelector(\"[data-kb-gallery-preview-stage]\") : null;\n\n  }\n\n\n\n  function luminance(color) {\n\n    const map = {\n\n      crna: 0.02,\n\n      teget: 0.05,\n\n      braon: 0.06,\n\n      plava: 0.10,\n\n      crvena: 0.12,\n\n      antracit: 0.35,\n\n      siva: 0.50,\n\n      srebrna_metalik: 0.36,\n\n      srebrno_ogledalo: 0.76,\n\n      zlatno_ogledalo: 0.68,\n\n      bela: 0.96,\n\n      srebrna: 0.78,\n\n      zlatna: 0.70\n\n    };\n\n    return map[color] == null ? 0.5 : map[color];\n\n  }\n\n\n\n  function updateContrastWarning() {\n\n    if (!contrastWarning) return;\n\n    const plate = field(\"plate_color\");\n\n    const text = field(\"text_color\");\n\n    const weak = Math.abs(luminance(plate) - luminance(text)) < 0.34;\n\n    contrastWarning.hidden = !weak;\n\n  }\n\n\n\n  function applyBetterContrast() {\n\n    if (!form) return false;\n\n    const plateSelect = form.querySelector('[name=\"plate_color\"]');\n\n    const textSelect = form.querySelector('[name=\"text_color\"]');\n\n    const distancerSelect = form.querySelector('[name=\"distancer_color\"]');\n\n    if (!plateSelect || !textSelect) return false;\n\n    const plate = field(\"plate_color\");\n\n    const next = isMailboxMirrorTextLocked()\n\n      ? { plate: \"crna\", text: \"srebrno_ogledalo\", distancer: \"srebrna\" }\n\n      : (luminance(plate) > 0.55\n\n        ? { plate, text: \"crna\", distancer: \"srebrna\" }\n\n        : { plate, text: \"srebrno_ogledalo\", distancer: \"srebrna\" });\n\n    plateSelect.value = next.plate;\n\n    textSelect.value = next.text;\n\n    if (distancerSelect) distancerSelect.value = next.distancer;\n\n    syncMailboxMirrorTextLock();\n\n    updateSwatches();\n\n    schedulePreview();\n\n    postLeadEvent(\"table_design_color_preset_click\", {\n\n      product_handle: cfg.productHandle || \"\",\n\n      preset: \"Primeni bolju kombinaciju\",\n\n      plate_color: next.plate,\n\n      text_color: next.text,\n\n      distancer_color: next.distancer,\n\n      source: \"contrast_warning\"\n\n    }).catch(() => {});\n\n    return true;\n\n  }\n\n\n\n  // The footer follows the cart action once its inline button is reached.\n  function mobileCartActionActive() {\n    if (currentStep() === wizardSteps[wizardSteps.length - 1]) return true;\n    if (!mobilePreviewEnabled() || !root.classList.contains(\"kb-mobile-modal-open\") || !addButton) return false;\n    const scroller = root.querySelector(\".kb-studio-layout\");\n    const controls = root.querySelector(\".kb-wizard-controls\");\n    if (!scroller || !controls) return false;\n    const target = addButton.getBoundingClientRect();\n    const area = scroller.getBoundingClientRect();\n    const footer = controls.getBoundingClientRect();\n    const bottom = Math.min(area.bottom, footer.top);\n    return target.width > 0 && target.height > 0 && target.top + target.height * 0.5 <= bottom;\n  }\n\n  function syncWizardPrimaryAction() {\n    if (dodavanjeUToku) return;\n    const cartAction = mobileCartActionActive();\n    const valid = !cartAction || validateConfig(currentConfig()).ok;\n    root.querySelectorAll(\"[data-kb-step-next]\").forEach((button) => {\n      button.dataset.kbPrimaryAction = cartAction ? \"cart\" : \"next\";\n      button.textContent = cartAction ? \"Dodaj u korpu\" : (wizardStepActions[currentStep()] || \"Dalje\");\n      button.disabled = !valid;\n      button.classList.toggle(\"is-disabled\", !valid);\n      button.setAttribute(\"aria-disabled\", valid ? \"false\" : \"true\");\n    });\n  }\n\n  let wizardActionFrame = 0;\n  function scheduleWizardPrimaryAction() {\n    if (wizardActionFrame) return;\n    wizardActionFrame = window.requestAnimationFrame(() => {\n      wizardActionFrame = 0;\n      syncWizardPrimaryAction();\n    });\n  }\n\n  function initWizardPrimaryActionSync() {\n    const scroller = root.querySelector(\".kb-studio-layout\");\n    if (scroller) scroller.addEventListener(\"scroll\", scheduleWizardPrimaryAction, { passive: true });\n    window.addEventListener(\"resize\", scheduleWizardPrimaryAction, { passive: true });\n    if (typeof ResizeObserver !== \"undefined\") {\n      const observer = new ResizeObserver(scheduleWizardPrimaryAction);\n      if (scroller) observer.observe(scroller);\n      if (addButton) observer.observe(addButton);\n      const actions = root.querySelector(\".kb-table-designer__actions\");\n      if (actions) observer.observe(actions);\n    }\n    scheduleWizardPrimaryAction();\n  }\n\n  function setActiveStep(step) {\n\n    const next = wizardSteps.includes(step) ? step : \"text\";\n\n    root.dataset.kbActiveStep = next;\n\n    root.querySelectorAll(\"[data-kb-step-jump]\").forEach((button) => {\n\n      button.setAttribute(\"aria-pressed\", button.dataset.kbStepJump === next ? \"true\" : \"false\");\n\n    });\n\n    const index = wizardSteps.indexOf(next);\n\n    const progress = root.querySelector(\"[data-kb-step-progress-fill]\");\n\n    const label = root.querySelector(\"[data-kb-step-label]\");\n\n    const title = root.querySelector(\"[data-kb-step-title]\");\n\n    if (progress) progress.style.setProperty(\"--kb-step-progress\", `${((index + 1) / wizardSteps.length) * 100}%`);\n\n    if (label) label.textContent = `Korak ${index + 1} od ${wizardSteps.length}`;\n\n    if (title) title.textContent = wizardStepTitles[next] || \"\";\n\n    root.querySelectorAll(\"[data-kb-step-prev]\").forEach((button) => {\n\n      button.disabled = index <= 0;\n\n    });\n\n    syncWizardPrimaryAction();\n    scheduleWizardPrimaryAction();\n\n    if (next === wizardSteps[wizardSteps.length - 1]) syncValidationState(false);\n\n  }\n\n\n\n  function stepIndex(step) {\n\n    const index = wizardSteps.indexOf(step);\n\n    return index < 0 ? 0 : index;\n\n  }\n\n\n\n  function currentStep() {\n\n    return root.dataset.kbActiveStep || \"text\";\n\n  }\n\n\n\n  function resetMobileStepScroll() {\n\n    if (!mobilePreviewEnabled() || !root.classList.contains(\"kb-mobile-modal-open\")) return;\n\n    const scroller = root.querySelector(\".kb-studio-layout\");\n\n    if (!scroller) return;\n\n    window.requestAnimationFrame(() => {\n\n      scroller.scrollTop = 0;\n\n    });\n\n  }\n\n\n\n  function setWizardStep(step) {\n\n    const next = wizardSteps[stepIndex(step)];\n\n    const section = root.querySelector(`[data-kb-step-section=\"${next}\"]`);\n\n    if (section && section.tagName === \"DETAILS\") section.open = true;\n\n    if (mobilePreviewEnabled()) root.classList.remove(\"kb-mobile-preview-compact\");\n\n    setActiveStep(next);\n\n    resetMobileStepScroll();\n\n    updateMobilePreviewCompact();\n\n  }\n\n\n\n  function stepScrollOffset() {\n\n    if (mobilePreviewEnabled()) {\n\n      const previewCard = root.querySelector(\".kb-studio-preview-card\");\n\n      const stickyTop = parseFloat(getComputedStyle(root).getPropertyValue(\"--kb-mobile-sticky-top\")) || 66;\n\n      const previewHeight = previewCard ? previewCard.getBoundingClientRect().height : 0;\n\n      return Math.ceil(stickyTop + previewHeight + 18);\n\n    }\n\n    return desktopPreviewEnabled() ? 28 : 72;\n\n  }\n\n\n\n  function scrollToStep(step) {\n\n    if (mobilePreviewEnabled()) {\n\n      setWizardStep(step);\n\n      return;\n\n    }\n\n    const section = root.querySelector(`[data-kb-step-section=\"${step}\"]`);\n\n    if (!section) return;\n\n    if (section.tagName === \"DETAILS\") section.open = true;\n\n    if (mobilePreviewEnabled()) {\n\n      root.classList.add(\"kb-mobile-preview-compact\");\n\n      void root.offsetHeight;\n\n    }\n\n    const top = window.scrollY + section.getBoundingClientRect().top - stepScrollOffset();\n\n    activeStepLockUntil = Date.now() + 1000;\n\n    window.scrollTo({ top: Math.max(0, top), behavior: \"smooth\" });\n\n    setActiveStep(step);\n\n    window.setTimeout(updateActiveStepFromScroll, 1050);\n\n  }\n\n\n\n  function mountMobileCheckoutBar() {\n\n    if (!mobileCheckoutBar || mobileCheckoutBar.parentElement === document.body) return;\n\n    document.body.appendChild(mobileCheckoutBar);\n\n  }\n\n\n\n  function updateActiveStepFromScroll() {\n\n    if (mobilePreviewEnabled()) return;\n\n    if (Date.now() < activeStepLockUntil) return;\n\n    const sections = Array.from(root.querySelectorAll(\"[data-kb-step-section]\"));\n\n    if (!sections.length) return;\n\n    const focusLine = mobilePreviewEnabled() ? stepScrollOffset() : 170;\n\n    let active = sections[0].dataset.kbStepSection || \"text\";\n\n    let closestDistance = Infinity;\n\n    sections.forEach((section) => {\n\n      const rect = section.getBoundingClientRect();\n\n      const distance = Math.abs(rect.top - focusLine);\n\n      if (distance < closestDistance) {\n\n        closestDistance = distance;\n\n        active = section.dataset.kbStepSection || active;\n\n      }\n\n    });\n\n    setActiveStep(active);\n\n  }\n\n\n\n  function fallbackPreviewSvg(config) {\n\n    const w = Number(config.width_cm || 40);\n\n    const h = Number(config.height_cm || 20);\n\n    const street = escapeHtml(config.street || \"Naziv ulice\");\n\n    const number = escapeHtml(config.number || \"12A\");\n\n    const bg = config.background_color === \"bela\" ? \"#f8fafc\" : \"#151515\";\n\n    const fg = [\"zlatna\", \"zlatno_ogledalo\"].includes(config.text_color) ? \"#c59b43\" : \"#f8fafc\";\n\n    return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${w * 10}mm\" height=\"${h * 10}mm\" viewBox=\"0 0 ${w} ${h}\">\n\n  <rect x=\"0.35\" y=\"0.35\" width=\"${w - 0.7}\" height=\"${h - 0.7}\" rx=\"0.8\" fill=\"${bg}\" stroke=\"#999\" stroke-width=\"0.15\"/>\n\n  <text x=\"${w / 2}\" y=\"${h * 0.43}\" text-anchor=\"middle\" dominant-baseline=\"middle\" font-family=\"Arial, sans-serif\" font-size=\"${h * 0.34}\" font-weight=\"700\" fill=\"${fg}\">${number}</text>\n\n  <line x1=\"${w * 0.18}\" x2=\"${w * 0.82}\" y1=\"${h * 0.58}\" y2=\"${h * 0.58}\" stroke=\"${fg}\" stroke-width=\"0.12\"/>\n\n  <text x=\"${w / 2}\" y=\"${h * 0.74}\" text-anchor=\"middle\" dominant-baseline=\"middle\" font-family=\"Arial, sans-serif\" font-size=\"${h * 0.13}\" fill=\"${fg}\">${street}</text>\n\n</svg>`;\n\n  }\n\n\n\n  let rendererImportAttempt = 0;\n  async function loadRendererModule() {\n    if (!cfg.rendererUrl) return null;\n    if (!rendererModulePromise) {\n      const url = new URL(cfg.rendererUrl, location.href);\n      if (rendererImportAttempt) url.searchParams.set('kb_flow_retry', String(rendererImportAttempt));\n      const pending = flowDeadline(import(url.href), 12000, 'render');\n      rendererModulePromise = pending.catch(error => {\n        rendererModulePromise = null;\n        rendererImportAttempt++;\n        throw error;\n      });\n    }\n    return rendererModulePromise;\n  }\n\n  // Use the existing visual render; package its material images for SVG <img> use.\n  // Optional scene work must never prevent the existing design/cart save.\n  async function portableSceneSvg(svg) {\n    try {\n      const doc = new DOMParser().parseFromString(svg, \"image/svg+xml\");\n      if (doc.querySelector(\"parsererror\") || doc.documentElement.localName !== \"svg\") throw new Error(\"Invalid preview\");\n      const cache = new Map();\n      await Promise.all(Array.from(doc.querySelectorAll(\"image\")).map(async (image) => {\n        const href = image.getAttribute(\"href\") || image.getAttributeNS(\"http://www.w3.org/1999/xlink\", \"href\");\n        if (!href) throw new Error(\"Missing material\");\n        if (/^data:image\\/(png|jpeg|webp);base64,/i.test(href)) return;\n        const key = href.startsWith(\"/assets/table_designer/\") ? href.slice(\"/assets/table_designer/\".length) : \"\";\n        const mapped = key && (window.KB_TABLE_RENDERER_ASSETS || {})[key];\n        const rendererBase = new URL(cfg.rendererUrl || location.href, location.href);\n        const url = new URL(mapped || href, rendererBase);\n        if (url.protocol !== \"https:\" || ![location.hostname, \"cdn.shopify.com\", \"app.fordservisbeograd.rs\"].includes(url.hostname)) throw new Error(\"Invalid material host\");\n        if (!cache.has(url.href)) cache.set(url.href, (async () => {\n          const response = await fetch(url.href, {credentials: \"omit\", signal: AbortSignal.timeout(6000)});\n          if (!response.ok) throw new Error(\"Material unavailable\");\n          const bitmap = await createImageBitmap(await response.blob());\n          try {\n            const scale = Math.min(1, 1024 / Math.max(bitmap.width, bitmap.height));\n            const canvas = document.createElement(\"canvas\");\n            canvas.width = Math.max(1, Math.round(bitmap.width * scale));\n            canvas.height = Math.max(1, Math.round(bitmap.height * scale));\n            canvas.getContext(\"2d\").drawImage(bitmap, 0, 0, canvas.width, canvas.height);\n            return canvas.toDataURL(\"image/webp\", 0.86);\n          } finally { bitmap.close(); }\n        })());\n        const dataUrl = await cache.get(url.href);\n        image.setAttribute(\"href\", dataUrl);\n        image.setAttributeNS(\"http://www.w3.org/1999/xlink\", \"xlink:href\", dataUrl);\n      }));\n      const content = new XMLSerializer().serializeToString(doc.documentElement);\n      if (new Blob([content]).size > 4500000) throw new Error(\"Preview too large\");\n      return {svg: content, ready: true};\n    } catch (_) { return {svg, ready: false}; }\n  }\n\n  async function buildRenderFiles(config) {\n\n    if (!syncValidationState(true)) throw new Error(HOUSE_NUMBER_MESSAGE);\n\n    const rendererModule = await loadRendererModule();\n\n    if (rendererModule && typeof rendererModule.renderTableDesign === \"function\") {\n\n      const rendered = await rendererModule.renderTableDesign(config);\n\n      const files = rendered.files || {};\n\n      const visualPreviewSvg = rendered.preview && rendered.preview.svg\n\n        ? rendered.preview.svg\n\n        : (files.preview_svg && files.preview_svg.content ? files.preview_svg.content : \"\");\n\n      return {\n\n        preview_svg: visualPreviewSvg,\n\n        corel_svg: files.corel_svg && files.corel_svg.content ? files.corel_svg.content : \"\",\n\n        layer2_svg: files.layer2_svg && files.layer2_svg.content ? files.layer2_svg.content : \"\",\n\n        combined_svg: files.combined_svg && files.combined_svg.content ? files.combined_svg.content : \"\",\n\n        laser_svg: files.laser_svg && files.laser_svg.content ? files.laser_svg.content : \"\",\n\n        json: files.json && files.json.content ? files.json.content : JSON.stringify(rendered, null, 2),\n\n        filenames: {\n\n          preview_svg: files.preview_svg && files.preview_svg.filename,\n\n          corel_svg: files.corel_svg && files.corel_svg.filename,\n\n          layer2_svg: files.layer2_svg && files.layer2_svg.filename,\n\n          combined_svg: files.combined_svg && files.combined_svg.filename,\n\n          laser_svg: files.laser_svg && files.laser_svg.filename,\n\n          json: files.json && files.json.filename\n\n        },\n\n        warnings: rendered.warnings || []\n\n      };\n\n    }\n\n\n\n    if (window.KBHousePlateRenderer && typeof window.KBHousePlateRenderer.render === \"function\") {\n\n      return window.KBHousePlateRenderer.render(config);\n\n    }\n\n\n\n    const previewSvg = fallbackPreviewSvg(config);\n\n    return {\n\n      preview_svg: previewSvg,\n\n      combined_svg: previewSvg,\n\n      json: JSON.stringify(config, null, 2),\n\n      warnings: [\"Privremeni rezervni pregled. Renderer nije u\u010Ditan, proveriti kb-table-renderer.js.\"]\n\n    };\n\n  }\n\n\n\n  function contentFile(filename, content, mime) {\n\n    return { filename, mime, content };\n\n  }\n\n\n\n  function base64File(filename, contentBase64, mime) {\n\n    return { filename, mime, content_base64: contentBase64 };\n\n  }\n\n\n\n  function blobToBase64(blob) {\n\n    return new Promise((resolve, reject) => {\n\n      const reader = new FileReader();\n\n      reader.onload = () => resolve(String(reader.result || \"\").split(\",\")[1] || \"\");\n\n      reader.onerror = reject;\n\n      reader.readAsDataURL(blob);\n\n    });\n\n  }\n\n\n\n  async function addPreviewPngFile(config, files) {\n\n    const rendererModule = await loadRendererModule();\n\n    if (!rendererModule || typeof rendererModule.renderPreviewPngBlob !== \"function\") return;\n\n    const blob = await rendererModule.renderPreviewPngBlob(config);\n\n    if (!(blob instanceof Blob) || !blob.size) return;\n\n    files.preview_png = base64File(\"preview.png\", await blobToBase64(blob), \"image/png\");\n\n  }\n\n\n\n  async function buildPayload(config, renderFiles) {\n\n    const variant = selectedVariant();\n\n    const filenames = renderFiles.filenames || {};\n\n    const payloadConfig = config.product_type === \"single_character\"\n\n      ? { ...config, street: config.characters, number: config.characters }\n\n      : config;\n\n    const scenePreview = await portableSceneSvg(renderFiles.preview_svg);\n    renderFiles.scene_preview_ready = scenePreview.ready;\n    const files = {\n\n      preview_svg: contentFile(filenames.preview_svg || \"preview.svg\", scenePreview.svg, \"image/svg+xml\"),\n\n      combined_svg: contentFile(filenames.combined_svg || \"komplet.svg\", renderFiles.combined_svg, \"image/svg+xml\"),\n\n      json: contentFile(filenames.json || \"design.json\", renderFiles.json || JSON.stringify(payloadConfig), \"application/json\")\n\n    };\n\n    if (renderFiles.corel_svg) files.corel_svg = contentFile(filenames.corel_svg || \"corel.svg\", renderFiles.corel_svg, \"image/svg+xml\");\n\n    if (renderFiles.layer2_svg) files.layer2_svg = contentFile(filenames.layer2_svg || \"layer2.svg\", renderFiles.layer2_svg, \"image/svg+xml\");\n\n    if (renderFiles.laser_svg) files.laser_svg = contentFile(filenames.laser_svg || \"laser.svg\", renderFiles.laser_svg, \"image/svg+xml\");\n\n    try {\n      // A late result cannot mutate the payload after it has been sent.\n      const optionalFiles = {};\n      await flowDeadline(addPreviewPngFile(config, optionalFiles), 2500, 'png');\n      if (optionalFiles.preview_png) files.preview_png = optionalFiles.preview_png;\n    } catch (error) {\n      try {\n        if (!scenePreview.ready) throw error;\n        const blob = await flowPngFromSvg(scenePreview.svg);\n        files.preview_png = base64File(\"preview.png\", await blobToBase64(blob), \"image/png\");\n      } catch (_) {\n        reportFlowOutcome('table_design_flow_error', { stage: 'png', code: 'OPTIONAL_PREVIEW_FAILED' }, flowOperation);\n      }\n    }\n\n\n\n    return {\n\n      shopify: {\n\n        shop: cfg.shop || \"\",\n\n        product: {\n\n          id: cfg.productId || \"\",\n\n          handle: cfg.productHandle || \"\"\n\n        },\n\n        variant: {\n\n          id: variant.id || selectedVariantId(),\n\n          title: variant.title || \"\"\n\n        }\n\n      },\n\n      visitor: visitorIdentity(),\n\n      config: payloadConfig,\n\n      warnings: renderFiles.warnings || [],\n\n      files\n\n    };\n\n  }\n\n\n\n  function alternateProductUrl(shapeInfo, config) {\n\n    const params = new URLSearchParams();\n\n    params.set(\"kb_cfg\", \"1\");\n\n    params.set(\"kb_street\", config.street || \"\");\n\n    params.set(\"kb_number\", shapeInfo.natpisOnly ? \"\" : (config.number || \"\"));\n\n    params.set(\"kb_extra\", config.extra_text || \"\");\n\n    params.set(\"kb_note\", config.note || \"\");\n\n    params.set(\"kb_script\", config.script || \"cyrillic\");\n\n    params.set(\"kb_plate\", config.plate_color || \"crna\");\n\n    params.set(\"kb_text\", config.text_color || \"srebrno_ogledalo\");\n\n    params.set(\"kb_dist\", config.distancer_color || \"srebrna\");\n\n    params.set(\"kb_engraving\", config.engraving_color || \"\");\n\n    params.set(\"kb_align\", config.number_align || \"right\");\n\n    params.set(\"kb_dog\", config.dog_symbol_key || \"\");\n\n    params.set(\"kb_w\", String(shapeInfo.width_cm || config.width_cm || \"\"));\n\n    params.set(\"kb_h\", String(shapeInfo.height_cm || config.height_cm || \"\"));\n\n    if (shapeInfo.productHandle) {\n\n      return `/products/${shapeInfo.productHandle}?${params.toString()}`;\n\n    }\n\n    if (shapeInfo.shape === \"oblik_4\") {\n\n      return `/products/oblik-4-linije?${params.toString()}`;\n\n    }\n\n    if (shapeInfo.shape === \"oblik_4_srpski\") {\n\n      return `/products/oblik-4-srpski?${params.toString()}`;\n\n    }\n\n    if (shapeInfo.shape === \"oblik_4_retro\") {\n\n      return `/products/oblik-4-retro?${params.toString()}`;\n\n    }\n\n    if (shapeInfo.shape === \"oblik_4_pola_pola\") {\n\n      return `/products/oblik-4-2-1-pola-pola?${params.toString()}`;\n\n    }\n\n    return `/products/oblik-${shapeInfo.handlePart}-${ratioSlug()}?${params.toString()}`;\n\n  }\n\n\n\n  async function renderAlternateShapes() {\n\n    if (!alternateShapes || !alternateShapesGrid) return;\n\n    const base = currentConfig();\n\n    const isHouseNumber = base.product_type === \"house_number\";\n\n    const isApartmentPlate = base.product_type === \"apartment_plate\";\n\n    if ((!isHouseNumber && !isApartmentPlate) || !base.width_cm || !base.height_cm) {\n\n      alternateShapes.hidden = true;\n\n      alternateShapesGrid.innerHTML = \"\";\n\n      return;\n\n    }\n\n    const currentShape = base.shape;\n\n    const sourceOptions = isApartmentPlate ? apartmentPlateShapeOptions : houseShapeOptions;\n\n    const options = sourceOptions.filter((item) => isApartmentPlate\n\n      ? item.productHandle !== cfg.productHandle\n\n      : item.shape !== currentShape);\n\n    if (!options.length) {\n\n      alternateShapes.hidden = true;\n\n      alternateShapesGrid.innerHTML = \"\";\n\n      return;\n\n    }\n\n\n\n    const seq = ++alternateRenderSeq;\n\n    alternateShapes.hidden = false;\n\n    alternateShapesGrid.innerHTML = options.map((item) => `\n\n      <a class=\"kb-alternate-shape\" href=\"${escapeHtml(alternateProductUrl(item, base))}\" data-kb-alternate-shape=\"${escapeHtml(item.key || item.shape)}\" data-kb-alternate-label=\"${escapeHtml(item.label)}\">\n\n        <span class=\"kb-alternate-shape__preview\" aria-hidden=\"true\"></span>\n\n        <span class=\"kb-alternate-shape__label\">${escapeHtml(item.label)}</span>\n\n        <span class=\"kb-alternate-shape__hint\">Isti tekst</span>\n\n      </a>\n\n    `).join(\"\");\n\n\n\n    const rendererModule = await loadRendererModule();\n\n    if (seq !== alternateRenderSeq) return;\n\n    await Promise.all(options.map(async (item) => {\n\n      const card = alternateShapesGrid.querySelector(`[data-kb-alternate-shape=\"${item.key || item.shape}\"] .kb-alternate-shape__preview`);\n\n      if (!card) return;\n\n      const previewConfig = {\n\n        ...base,\n\n        shape: item.shape,\n\n        plate_shape: item.shape,\n\n        width_cm: item.width_cm || base.width_cm,\n\n        height_cm: item.height_cm || base.height_cm,\n\n        number: item.natpisOnly ? \"\" : base.number,\n\n        number_align: centerNumberShapes.has(item.shape) ? base.number_align : \"right\"\n\n      };\n\n      try {\n\n        if (rendererModule && typeof rendererModule.renderTableDesign === \"function\") {\n\n          const rendered = await rendererModule.renderTableDesign(previewConfig);\n\n          if (seq === alternateRenderSeq) card.innerHTML = rendered.preview && rendered.preview.svg ? rendered.preview.svg : \"\";\n\n        } else {\n\n          card.innerHTML = fallbackPreviewSvg(previewConfig);\n\n        }\n\n      } catch (err) {\n        sendRenderErrorBeacon(err, previewConfig, \"alternate_shape_preview\");\n        if (seq === alternateRenderSeq) card.innerHTML = fallbackPreviewSvg(previewConfig);\n      }\n    }));\n\n  }\n\n\n\n  function scheduleAlternateShapes() {\n\n    clearTimeout(alternateRenderTimer);\n\n    alternateRenderTimer = setTimeout(() => {\n\n      renderAlternateShapes().catch(() => {});\n\n    }, 220);\n\n  }\n\n\n\n  async function saveDesign(config = currentConfig(), operation = null) {\n    flowStage = \"validation\";\n    const validation = validateConfig(config);\n    if (!validation.ok) throw new Error(validation.message);\n    if (config.product_type === \"video_notice\") {\n      if (!config.street || !config.extra_text) throw new Error(\"Unesite gornji i donji tekst.\");\n    } else if (config.product_type === \"mailbox\") {\n\n      if (!config.mailbox_bottom_text) throw new Error(\"Unesite donji tekst.\");\n\n    } else if (config.product_type === \"parking_notice\") {\n\n      if (!config.street) throw new Error(\"Unesite natpis.\");\n\n    } else if (config.product_type === \"dog_notice\") {\n\n      if (!config.street) throw new Error(\"Unesite natpis.\");\n\n      if (!config.dog_symbol_key) throw new Error(\"Izaberite rasu / simbol psa.\");\n\n    } else if (config.product_type === \"single_character\") {\n\n      const check = singleCharacterValidation(config.characters);\n\n      if (!check.ok) throw new Error(check.message);\n\n      if (!config.character_height_cm) throw new Error(\"Izaberite visinu karaktera.\");\n\n    } else if (config.product_type === \"apartment_plate\" && cfg.apartmentNatpisOnly) {\n      if (!config.street) throw new Error(\"Unesite natpis.\");\n    } else if (config.product_type === \"apartment_plate\" && config.shape === \"stan_plocica\") {\n      if (!config.street && !config.number) throw new Error(\"Unesite natpis ili broj.\");\n    } else if (!config.number || (!isNumberOnlyShape(config.shape) && !isStreetOptional(config) && !config.street)) {\n      throw new Error((isNumberOnlyShape(config.shape) || isStreetOptional(config)) ? \"Unesite broj.\" : \"Unesite broj i natpis.\");\n    }\n    if (config.product_type !== \"single_character\" && (!config.width_cm || !config.height_cm)) throw new Error(\"Dimenzija nije prepoznata.\");\n\n    await flowDeadline(ensureContactPhoneIdentified(config), 1500, \"identity\").catch(() => {});\n\n\n\n    void postLeadEvent(\"table_design_started\", {\n\n      product_handle: cfg.productHandle || \"\",\n\n      shape: config.shape,\n\n      dimensions: `${config.width_cm}x${config.height_cm}`,\n\n      number: config.number,\n\n      street: config.street\n\n    });\n\n    flowStage = \"render\";\n    const renderFiles = await buildRenderFiles(config);\n    const payload = await buildPayload(config, renderFiles);\n    if (operation) {\n      payload.idempotency_key = operation.saveKey;\n      payload.request_id = operation.requestId;\n      payload.defer_preview_png = true;\n    }\n    flowStage = \"save\";\n\n    const data = await flowFetch(cfg.saveUrl, {\n\n      method: \"POST\",\n\n      headers: {\n\n        \"Content-Type\": \"application/json\",\n\n        ...(cfg.ingestToken ? { \"X-Lead-Ingest-Token\": cfg.ingestToken } : {})\n\n      },\n\n      body: JSON.stringify(payload)\n\n    }, \"save\", 20000);\n\n    if (data.status !== \"ok\" || !data.design_id || !data.revision_id || !data.files?.preview_svg?.url || !data.combined_svg_url) {\n      throw flowError(\"INVALID_RESPONSE\", \"save\");\n    }\n\n\n\n    data._scene_preview_ready = renderFiles.scene_preview_ready === true;\n    lastDesign = data;\n\n    dirty = false;\n    if (operation) { operation.design = data; persistFlowOperation(operation); }\n    showAutosaveStatus(\"Dizajn je sa\u010Duvan\", false);\n    completeFlowPreview(operation, data);\n\n    void postLeadEvent(\"table_design_saved\", {\n\n      design_id: data.design_id || \"\",\n\n      preview_url: data.preview_url || \"\",\n\n      product_handle: cfg.productHandle || \"\",\n\n      shape: config.shape,\n\n      dimensions: `${config.width_cm}x${config.height_cm}`,\n\n      number: config.number,\n\n      street: config.street\n\n    });\n\n    return data;\n\n  }\n\n\n\n  function renderPreview() {\n\n    if (!syncValidationState(true)) {\n\n      if (preview) preview.classList.remove(\"kb-preview-loading\");\n\n      return;\n\n    }\n\n    const config = currentConfig();\n    const sequence = ++flowPreviewSequence;\n\n    if (preview) preview.classList.add(\"kb-preview-loading\");\n\n    buildRenderFiles(config).then((renderFiles) => {\n\n      if (sequence !== flowPreviewSequence) return;\n      const svg = renderFiles.preview_svg || \"\";\n      if (message && message.dataset.flowError === \"preview\") { setMessage(\"\", \"\"); delete message.dataset.flowError; }\n\n      if (preview) preview.innerHTML = svg;\n\n      updateDimensionMarkers();\n\n      fitInlinePreviewSvg();\n\n      positionDimensionMarkers();\n\n      syncGalleryPreview(svg);\n\n    }).catch((err) => {\n      if (sequence !== flowPreviewSequence || dodavanjeUToku) return;\n      sendRenderErrorBeacon(err, config, \"preview\");\n      showFlowError(Object.assign(err, { stage: \"preview\" }), false, null);\n      if (message) message.dataset.flowError = \"preview\";\n    })\n      .finally(() => {\n\n        if (preview && sequence === flowPreviewSequence) preview.classList.remove(\"kb-preview-loading\");\n\n      });\n\n  }\n\n\n\n  function schedulePreview() {\n\n    dirty = true;\n\n    if (!syncValidationState(false)) {\n\n      clearTimeout(renderTimer);\n\n      return;\n\n    }\n\n    clearTimeout(renderTimer);\n\n    renderTimer = setTimeout(renderPreview, 150);\n\n    scheduleDraftSave(\"change\");\n\n    scheduleAlternateShapes();\n\n  }\n\n\n\n  function isTextEntryField(el) {\n\n    if (!el || el.tagName !== \"INPUT\") return false;\n\n    const type = String(el.getAttribute(\"type\") || \"text\").toLowerCase();\n\n    return [\"\", \"text\", \"search\", \"tel\"].includes(type);\n\n  }\n\n\n\n  function textInsertTarget() {\n\n    if (activeTextField && form && form.contains(activeTextField) && isTextEntryField(activeTextField)) {\n\n      return activeTextField;\n\n    }\n\n    return form ? (form.querySelector('[name=\"characters\"]') || form.querySelector('[name=\"street\"]')) : null;\n\n  }\n\n\n\n  function insertTextAtCursor(input, text) {\n\n    if (!input || !text) return;\n\n    const value = String(input.value || \"\");\n\n    const start = Number.isInteger(input.selectionStart) ? input.selectionStart : value.length;\n\n    const end = Number.isInteger(input.selectionEnd) ? input.selectionEnd : start;\n\n    input.value = value.slice(0, start) + text + value.slice(end);\n\n    input.focus({ preventScroll: true });\n\n    const nextPosition = start + text.length;\n\n    if (typeof input.setSelectionRange === \"function\") input.setSelectionRange(nextPosition, nextPosition);\n\n    notePrimaryTextInput(input, true);\n    input.dispatchEvent(new Event(\"input\", { bubbles: true }));\n\n    schedulePreview();\n\n  }\n\n\n\n  // Dodavanje u korpu prvo cuva dizajn na CRM-u, pa tek onda zove cart/add.\n\n  // Na slaboj vezi to traje par sekundi - bez vidljivog znaka kupac misli da\n\n  // klik nije prosao i klikce ponovo.\n\n  var dodavanjeUToku = false;\n\n\n\n  function postaviZauzeto(zauzeto) {\n\n    dodavanjeUToku = !!zauzeto;\n\n    root.querySelectorAll(\"[data-kb-add], [data-kb-mobile-add], [data-kb-step-next]\").forEach(function (b) {\n\n      if (zauzeto) {\n\n        if (b.dataset.kbTekstPre === undefined) b.dataset.kbTekstPre = b.innerHTML;\n\n        b.innerHTML = '<span class=\"kb-busy-dot\" aria-hidden=\"true\"></span>Dodajem u korpu\\u2026';\n\n        b.classList.add(\"is-busy\");\n\n        b.disabled = true;\n\n        b.setAttribute(\"aria-busy\", \"true\");\n\n      } else {\n\n        if (b.dataset.kbTekstPre !== undefined) { b.innerHTML = b.dataset.kbTekstPre; delete b.dataset.kbTekstPre; }\n\n        b.classList.remove(\"is-busy\");\n\n        b.disabled = false;\n\n        b.removeAttribute(\"aria-busy\");\n\n      }\n\n    });\n\n    if (!zauzeto) syncWizardPrimaryAction();\n\n  }\n\n\n\n  async function addToCart() {\n\n    if (dodavanjeUToku) return;   // zastita od dvostrukog klika\n\n    setShareFallbackVisible(false);\n    postaviZauzeto(true);\n    const config = currentConfig();\n    const variant = selectedVariant();\n    const cartRoot = (window.Shopify && Shopify.routes ? Shopify.routes.root : \"/\");\n    let operation = readFlowOperation();\n\n    try {\n\n      setMessage(\"\u010Cuvam dizajn...\", \"loading\");\n\n      if (operation && ['dispatched', 'unknown', 'partial'].includes(operation.cartState) &&\n          operation.fingerprint !== JSON.stringify([variant.id || selectedVariantId(), config])) {\n        setMessage(\"Proveravamo da li je proizvod dodat u korpu\u2026\", \"loading\");\n        await submitFlowCart(operation, { quantity: operation.quantity }, cartRoot, persistFlowOperation);\n        reportFlowOutcome('table_design_flow_recovered', { stage: 'cart', code: 'CART_CONFIRMED' }, operation);\n        clearLocalDraft();\n        persistFlowOperation(null);\n        window.location.href = flowPostCartDestination();\n        return;\n      }\n      operation = newFlowOperation(config, variant.id || selectedVariantId());\n      const design = operation.design || await saveDesign(config, operation);\n      const visitor = visitorIdentity();\n      flowStage = \"cart\";\n\n      const designUrl = crmDesignUrl(design.design_id);\n\n      const properties = {\n\n        \"Napomena\": config.note,\n\n        \"Oblik\": config.plate_shape,\n\n        \"Dimenzije\": config.product_type === \"single_character\" ? `${displayCm(config.character_height_cm || config.height_cm)} cm` : `${config.width_cm} x ${config.height_cm} cm`,\n\n        // Shopify ne cuva stavke redom dodavanja, pa stranica \"Upotpunite dom\"\n\n        // ne moze da se osloni na cart.items.last. Ovim znamo sta je bas sad dodato.\n\n        \"_kb_ts\": String(operation.timestamp),\n        \"_kb_add_attempt\": operation.cartAttempt,\n\n        \"_design_id\": design.design_id,\n\n        \"_crm_design_url\": designUrl,\n\n        \"_preview_url\": design.preview_url || \"\",\n        \"_preview_svg_url\": design._scene_preview_ready ? (design.files?.preview_svg?.url || \"\") : \"\",\n\n        \"_combined_svg_url\": design.combined_svg_url || \"\",\n\n        \"_lead_id\": visitor.lead_id || \"\",\n\n        \"_anon_id\": visitor.anon_id || \"\",\n\n        \"_session_id\": visitor.session_id || \"\"\n\n      };\n\n      // Mesto sa scene (\u201Eza sanduce\", \u201Eza interfon\") \u2014 ista plocica, razlicita\n      // namena. Bez ovoga doprodajna stranica ne prepoznaje da je bas to vec\n      // kupljeno, jer je u korpi obicna plocica.\n      try {\n        var kbMesto = new URLSearchParams(window.location.search).get(\"kb_mesto\");\n        if (kbMesto && /^[a-zA-Z]{1,30}$/.test(kbMesto)) properties[\"_kb_mesto\"] = kbMesto;\n      } catch (e) {}\n      if (config.contact_phone) properties[\"Telefon\"] = config.contact_phone;\n\n      if (config.product_type === \"apartment_plate\") {\n\n        properties[\"Materijal\"] = selectedLabel(\"engraving_color\") || config.engraving_color;\n        // \"Materijal\" je naziv za kupca (\"Srebrna graverska\"), a prenos u drugi\n        // konfigurator trazi vrednost (\"srebrna_graverska\"). Skriveno polje nosi\n        // vrednost, da bi plocica za sanduce/interfon mogla da nasledi materijal.\n        if (config.engraving_color) properties[\"_kb_engraving\"] = config.engraving_color;\n\n        properties[\"Prezime / natpis\"] = config.street;\n\n        if (config.number) properties[\"Broj\"] = config.number;\n\n        properties[\"Font\"] = selectedLabel(\"plocica_font\") || \"Corsica MX\";\n\n        properties[\"Prikaz natpisa\"] = config.text_case === \"as_entered\" ? \"Kako je uneto\" : \"Sva velika slova\";\n\n        if (cfg.apartmentNatpisOnly) properties[\"Izgled plo\u010Dice\"] = config.plate_style === \"rounded\" ? \"Zaobljena\" : \"Pravougaona\";\n\n        if (config.width_cm && config.height_cm) {\n\n          properties[\"Dimenzije\"] = `${displayCm(config.width_cm)} x ${displayCm(config.height_cm)} cm`;\n\n        }\n\n        if (customDimActive) {\n\n          properties[\"Napomena\"] = \"Druga dimenzija \u2014 cena se prosle\u0111uje nakon porud\u017Ebine\";\n\n        }\n\n      } else if (config.product_type === \"single_character\") {\n\n        properties[\"Karakteri\"] = config.characters;\n\n        properties[\"Broj karaktera\"] = config.physical_character_count || physicalCharacterCount(config.characters);\n\n        properties[\"Visina\"] = `${displayCm(config.character_height_cm || config.height_cm)} cm`;\n\n        properties[\"Font\"] = selectedLabel(\"plocica_font\") || \"Corsica MX\";\n\n        properties[\"Boja / materijal\"] = selectedLabel(\"text_color\") || config.text_color;\n\n        if (config.custom_height) {\n\n          properties[\"\u017Deljena visina\"] = `${displayCm(config.character_height_cm || config.height_cm)} cm`;\n\n          properties[\"Napomena\"] = \"Neka druga visina - cena se potvr\u0111uje nakon porud\u017Ebine\";\n\n        }\n\n      } else {\n\n        properties[\"Boja table\"] = config.background_color;\n\n        properties[\"Boja teksta\"] = config.text_color;\n\n      }\n\n      if (config.distancer_color) properties[\"Distanceri\"] = config.distancer_color;\n\n      if (centerNumberShapes.has(config.shape)) {\n\n        properties[\"Pozicija broja\"] = config.number_align === \"center\" ? \"Centar\" : \"Desno\";\n\n      }\n\n      if (config.product_type === \"video_notice\") {\n\n        properties[\"Gornji tekst\"] = config.street;\n\n        properties[\"Donji tekst\"] = config.extra_text;\n\n      } else if (config.product_type === \"mailbox\") {\n\n        if (config.mailbox_top_text) properties[\"Gornji tekst\"] = config.mailbox_top_text;\n\n        properties[\"Donji tekst\"] = config.mailbox_bottom_text;\n\n        properties[\"Vrata\"] = config.mailbox_door_color;\n\n        properties[\"Sa strane\"] = config.mailbox_side_color;\n\n      } else if (config.product_type === \"parking_notice\") {\n\n        properties[\"Natpis\"] = config.street;\n\n      } else if (config.product_type === \"dog_notice\") {\n\n        const dog = dogSymbols.find((item) => item.key === config.dog_symbol_key);\n\n        properties[\"Rasa psa\"] = dog ? dog.label : config.dog_symbol_key;\n\n        properties[\"Natpis\"] = config.street;\n\n      } else if (config.product_type !== \"apartment_plate\" && config.product_type !== \"single_character\") {\n\n        properties[\"Broj\"] = config.number;\n\n      }\n\n      if (config.product_type !== \"apartment_plate\" && !isNumberOnlyShape(config.shape) && !isTextOnlyShape(config.shape)) {\n\n        if (config.street) properties[\"Natpis\"] = config.street;\n\n        if (config.extra_text) properties[\"Dodatni natpis\"] = config.extra_text;\n\n      }\n\n\n\n      Object.assign(properties, window.KBUpsellAttribution?.properties(cfg.productHandle || \"\") || {});\n      const cartResult = await submitFlowCart(operation, {\n        id: Number(operation.variantId),\n        quantity: config.product_type === \"single_character\" ? Math.max(1, config.physical_character_count || physicalCharacterCount(config.characters)) : 1,\n        properties\n      }, cartRoot, persistFlowOperation);\n      if (cartResult.recovered) reportFlowOutcome('table_design_flow_recovered', { stage: 'cart', code: 'CART_CONFIRMED' }, operation);\n\n      clearLocalDraft();\n      persistFlowOperation(null);\n\n      // Artikal je VEC u korpi. CRM dogadjaj je sporedan, pa ne sme ni da obori\n      // ni da zadrzi preusmerenje na /cart - inace kupac vidi gresku za nesto sto je\n      // uspelo i ostaje na mestu. Zato: greska se guta, ceka se najvise 2.5s.\n      await Promise.race([\n        postLeadEvent(\"table_design_add_to_cart\", {\n\n        design_id: design.design_id || \"\",\n\n        crm_design_url: designUrl,\n\n        preview_url: design.preview_url || \"\",\n\n        product_handle: cfg.productHandle || \"\",\n\n        variant_id: variant.id || selectedVariantId(),\n\n        shape: config.shape,\n\n        dimensions: `${config.width_cm}x${config.height_cm}`,\n\n        number: config.number,\n\n        street: config.street\n\n        }).catch(function () {}),\n        new Promise(function (resolve) { window.setTimeout(resolve, 2500); })\n      ]);\n\n      setMessage(\"Dodato u korpu.\", \"ok\");\n\n      // Normal and recovered additions continue to the requested product suggestions page.\n\n      window.location.href = flowPostCartDestination();\n\n    } catch (err) {\n\n      postaviZauzeto(false);\n\n      const code = err.code || (flowStage === 'validation' ? 'VALIDATION_ERROR' :\n        /font.*(podrzava|podr\u017Eava)/i.test(err.message || '') ? 'FONT_UNSUPPORTED' : err instanceof TypeError ? 'NETWORK' : 'UNEXPECTED');\n      showFlowError(Object.assign(err, { code, stage: err.stage || flowStage }), Boolean(operation && operation.design), operation);\n      setShareFallbackVisible(true);\n\n    }\n\n  }\n\n\n\n  function syncDistancerDefault() {\n\n    const textSelect = form ? form.querySelector('[name=\"text_color\"]') : null;\n\n    const distancerSelect = form ? form.querySelector('[name=\"distancer_color\"]') : null;\n\n    if (!textSelect || !distancerSelect) return;\n\n    if (textSelect.value.indexOf(\"zlatno_ogledalo\") === 0 && distancerSelect.value === \"srebrna\") {\n\n      distancerSelect.value = \"zlatna\";\n\n    } else if (textSelect.value.indexOf(\"srebrno_ogledalo\") === 0 && distancerSelect.value === \"zlatna\") {\n\n      distancerSelect.value = \"srebrna\";\n\n    }\n\n  }\n\n\n\n  function isMailboxMirrorTextLocked() {\n\n    const shape = cfg.renderShape || root.dataset.renderShape || \"\";\n\n    return shape === \"postansko_sanduce\" && MAILBOX_MIRROR_PLATE_COLORS.has(field(\"plate_color\"));\n\n  }\n\n\n\n  function syncMailboxMirrorTextLock() {\n\n    if (!form) return false;\n\n    const locked = isMailboxMirrorTextLocked();\n\n    const textSelect = form.querySelector('[name=\"text_color\"]');\n\n    if (textSelect) {\n\n      if (locked && textSelect.value !== \"siva\") textSelect.value = \"siva\";\n\n      textSelect.disabled = locked;\n\n      textSelect.title = locked ? \"Boja teksta je zaklju\u010Dana kada su plo\u010Dice ogledalo.\" : \"\";\n\n    }\n\n    root.querySelectorAll('[data-kb-swatch-select=\"text_color\"]').forEach((button) => {\n\n      button.disabled = locked;\n\n      button.classList.toggle(\"is-disabled\", locked);\n\n      button.setAttribute(\"aria-disabled\", locked ? \"true\" : \"false\");\n\n      button.title = locked ? \"Boja teksta je zaklju\u010Dana kada su plo\u010Dice ogledalo.\" : (button.getAttribute(\"aria-label\") || \"\");\n\n    });\n\n    return locked;\n\n  }\n\n\n\n\n  // Text-only sharing stays available without saving a design on the CRM.\n  function formatWhatsAppSelection(config, details) {\n    const labels = details.labels || {};\n    const clean = (value) => String(value == null ? \"\" : value).trim();\n    const lines = [\"Zdravo! \u017Delim da naru\u010Dim slede\u0107i proizvod:\"];\n    const add = (label, value) => { if (clean(value)) lines.push(label + \": \" + clean(value)); };\n    const colorNames = {\n      crna: \"Crna\", bela: \"Bela\", siva: \"Siva\", antracit: \"Antracit\",\n      srebrno_ogledalo: \"Srebrno ogledalo\", zlatno_ogledalo: \"Zlatno ogledalo\",\n      srebrna_graverska: \"Srebrna graverska\", zlatna_graverska: \"Zlatna graverska\",\n      crna_graverska: \"Crna graverska\", drvo_dezen: \"Drvo dezen\",\n      cesljano_srebro: \"\u010Ce\u0161ljano srebro\", srebrna: \"Srebrna\", zlatna: \"Zlatna\"\n    };\n    const color = (key, label) => colorNames[key] || label || key;\n    const cm = (value) => clean(value).replace(\".\", \",\");\n    const inscription = (value) => config.text_case === \"uppercase\" ? clean(value).toUpperCase() : clean(value);\n    add(\"Proizvod\", details.productTitle);\n    add(\"Oblik\", details.shapeLabel || config.shape);\n    if (config.product_type === \"single_character\") {\n      add(\"Visina\", cm(config.character_height_cm || config.height_cm) + \" cm\");\n      add(\"Karakteri\", config.characters);\n      add(\"Broj karaktera\", config.physical_character_count || details.characterCount);\n      add(\"Boja / materijal\", color(config.text_color, labels.text_color));\n    } else {\n      if (config.width_cm && config.height_cm) add(\"Dimenzije\", cm(config.width_cm) + \" \u00D7 \" + cm(config.height_cm) + \" cm\");\n      if (config.product_type === \"apartment_plate\") {\n        add(\"Materijal\", labels.engraving_color || color(config.engraving_color));\n        add(\"Natpis\", inscription(config.street));\n        add(\"Broj\", config.number);\n        if (details.apartmentNatpisOnly) add(\"Izgled plo\u010Dice\", config.plate_style === \"rounded\" ? \"Zaobljena\" : \"Pravougaona\");\n      } else {\n        add(\"Boja table / plo\u010Dice\", color(config.background_color, labels.plate_color));\n        add(\"Boja teksta\", color(config.text_color, labels.text_color));\n        if (config.product_type === \"mailbox\") {\n          add(\"Vrata sandu\u010Deta\", labels.mailbox_door_color || color(config.mailbox_door_color));\n          add(\"Stranice sandu\u010Deta\", labels.mailbox_side_color || color(config.mailbox_side_color));\n          add(\"Gornja plo\u010Dica\", config.mailbox_has_top_plate ? \"Da\" : \"Ne\");\n          add(\"Gornji natpis\", config.mailbox_top_text);\n          add(\"Donji natpis\", config.mailbox_bottom_text);\n        } else {\n          add(config.product_type === \"video_notice\" ? \"Gornji natpis\" : \"Natpis\", inscription(config.street));\n          add(config.product_type === \"video_notice\" ? \"Donji natpis\" : \"Dodatni natpis\", inscription(config.extra_text));\n          add(\"Broj\", config.number);\n          if (config.product_type === \"dog_notice\") add(\"Rasa / simbol psa\", details.dogLabel || config.dog_symbol_key);\n        }\n      }\n    }\n    if (config.distancer_color) add(\"Distanceri\", labels.distancer_color || color(config.distancer_color));\n    if (details.numberPosition) add(\"Pozicija broja\", details.numberPosition);\n    add(\"Pismo\", { latin: \"Latinica\", cyrillic: \"\u0106irilica\", as_entered: \"Kako je uneto\" }[config.script] || labels.script || config.script);\n    if (config.plocica_font) add(\"Font\", labels.plocica_font || config.plocica_font);\n    if (config.product_type === \"apartment_plate\") add(\"Prikaz natpisa\", config.text_case === \"as_entered\" ? \"Kako je uneto\" : \"Sva velika slova\");\n    add(\"Koli\u010Dina\", config.product_type === \"single_character\" ? \"1 komplet navedenih karaktera\" : \"1 komad\");\n    if (details.customDimensions || config.custom_height) add(\"Posebna dimenzija\", \"Da \u2014 cenu je potrebno potvrditi\");\n    add(\"Napomena\", config.note);\n    add(\"Kontakt telefon\", config.contact_phone);\n    add(\"Link proizvoda\", details.productUrl);\n    return lines.join(\"\\n\");\n  }\n\n  function currentSelectionMessage() {\n    const config = currentConfig();\n    const variant = selectedVariant();\n    const labels = {};\n    [\"plate_color\", \"text_color\", \"distancer_color\", \"engraving_color\", \"mailbox_door_color\", \"mailbox_side_color\", \"plocica_font\", \"script\"].forEach((name) => {\n      labels[name] = selectedLabel(name);\n    });\n    const dog = dogSymbols.find((item) => item.key === config.dog_symbol_key);\n    const productUrl = new URL(window.location.pathname, window.location.origin);\n    if (variant.id) productUrl.searchParams.set(\"variant\", variant.id);\n    const text = formatWhatsAppSelection(config, {\n      labels,\n      productTitle: cfg.productTitle || document.querySelector(\"h1\")?.textContent.trim() || cfg.productHandle,\n      shapeLabel: shapeLabels[config.shape],\n      apartmentNatpisOnly: cfg.apartmentNatpisOnly,\n      characterCount: config.product_type === \"single_character\" ? physicalCharacterCount(config.characters) : 0,\n      dogLabel: dog && dog.label,\n      numberPosition: centerNumberShapes.has(config.shape) ? (config.number_align === \"center\" ? \"Centar\" : \"Desno\") : \"\",\n      customDimensions: customDimActive,\n      productUrl: productUrl.href\n    });\n    return text;\n  }\n\n  function setShareFallbackVisible(visible) {\n    root.querySelectorAll(\"[data-kb-share-error]\").forEach((group) => {\n      group.hidden = !visible;\n    });\n  }\n\n  function initWhatsAppSharing() {\n    const links = root.querySelectorAll(\"[data-kb-whatsapp-share], [data-kb-email-share]\");\n    function refresh() {\n      try {\n        const text = currentSelectionMessage();\n        const whatsappUrl = \"https://wa.me/381658416212?text=\" + encodeURIComponent(text);\n        const emailUrl = \"mailto:goodsigndoo@gmail.com?subject=\" + encodeURIComponent(\"Upit za proizvod \u2014 \" + (cfg.productTitle || cfg.productHandle || \"Ku\u0107ni brojevi\")) + \"&body=\" + encodeURIComponent(text);\n        links.forEach((link) => { link.href = link.hasAttribute(\"data-kb-email-share\") ? emailUrl : whatsappUrl; });\n        return true;\n      } catch (error) { return false; }\n    }\n    links.forEach((link) => {\n      link.addEventListener(\"click\", (event) => {\n        transliterateAllFields();\n        if (!refresh()) {\n          event.preventDefault();\n          if (message) message.textContent = \"Poruku trenutno ne mo\u017Eemo da pripremimo. Poku\u0161ajte ponovo.\";\n        }\n      });\n      link.addEventListener(\"focus\", refresh);\n      link.addEventListener(\"pointerdown\", refresh);\n      link.addEventListener(\"contextmenu\", refresh);\n    });\n    if (form) {\n      form.addEventListener(\"input\", refresh);\n      form.addEventListener(\"change\", refresh);\n    }\n    if (variantInput) variantInput.addEventListener(\"change\", refresh);\n    refresh();\n  }\n\n  function selectedLabel(name) {\n\n    const select = form ? form.querySelector(`[name=\"${name}\"]`) : null;\n\n    if (!select) return \"\";\n\n    const option = select.options[select.selectedIndex];\n\n    return option ? option.textContent.trim() : select.value;\n\n  }\n\n\n\n  function updateSelectionSummary() {\n\n    if (!selectionSummary) return;\n\n    const config = currentConfig();\n\n    const plate = selectedLabel(\"plate_color\");\n\n    const text = selectedLabel(\"text_color\");\n\n    const distancer = selectedLabel(\"distancer_color\");\n\n    const align = centerNumberShapes.has(config.shape) ? (config.number_align === \"center\" ? \"broj centar\" : \"broj desno\") : \"\";\n\n    const dimensions = config.width_cm && config.height_cm ? `${config.width_cm} x ${config.height_cm} cm` : \"dimenzija iz proizvoda\";\n\n    const shape = shapeLabels[config.shape] || config.shape || \"Oblik\";\n\n    const alignPart = align ? ` | <strong>${escapeHtml(align)}</strong>` : \"\";\n\n    if (config.product_type === \"apartment_plate\") {\n\n      const style = cfg.apartmentNatpisOnly ? ` | izgled: <strong>${config.plate_style === \"rounded\" ? \"Zaobljena\" : \"Pravougaona\"}</strong>` : \"\";\n\n      selectionSummary.innerHTML = `<span>Trenutno: <strong>${escapeHtml(dimensions)}</strong> | <strong>${escapeHtml(shape)}</strong> | materijal: <strong>${escapeHtml(selectedLabel(\"engraving_color\"))}</strong>${style}</span>`;\n\n      return;\n\n    }\n\n    if (config.product_type === \"single_character\") {\n\n      const count = config.physical_character_count || physicalCharacterCount(config.characters);\n\n      selectionSummary.innerHTML = `<span>Trenutno: <strong>${escapeHtml(displayCm(config.character_height_cm || config.height_cm))} cm</strong> | <strong>${escapeHtml(shape)}</strong> | karaktera: <strong>${escapeHtml(count)}</strong> | materijal: <strong>${escapeHtml(selectedLabel(\"text_color\"))}</strong></span>`;\n\n      return;\n\n    }\n\n    if (config.product_type === \"mailbox\") {\n\n      selectionSummary.innerHTML = `<span>Trenutno: <strong>19,4 x 29,6 cm</strong> | <strong>${escapeHtml(shape)}</strong> | plo\u010Dice: <strong>${escapeHtml(plate)}</strong> | tekst: <strong>${escapeHtml(text)}</strong></span>`;\n\n      return;\n\n    }\n\n    if (isTextOnlyShape(config.shape)) {\n\n      selectionSummary.innerHTML = `<span>Trenutno: <strong>${escapeHtml(dimensions)}</strong> | <strong>${escapeHtml(shape)}</strong> | tabla: <strong>${escapeHtml(plate)}</strong> | tekst: <strong>${escapeHtml(text)}</strong> | distanceri: <strong>${escapeHtml(distancer)}</strong></span>`;\n\n      return;\n\n    }\n\n    selectionSummary.innerHTML = `<span>Trenutno: <strong>${escapeHtml(dimensions)}</strong> | <strong>${escapeHtml(shape)}</strong>${alignPart} | tabla: <strong>${escapeHtml(plate)}</strong> | tekst: <strong>${escapeHtml(text)}</strong> | distanceri: <strong>${escapeHtml(distancer)}</strong></span>`;\n\n  }\n\n\n\n  function updateNumberAlignState() {\n\n    if (!form) return;\n\n    const shape = cfg.renderShape || root.dataset.renderShape || \"standard\";\n\n    const supported = centerNumberShapes.has(shape);\n\n    const select = form.querySelector('[name=\"number_align\"]');\n\n    root.querySelectorAll(\"[data-kb-number-align-field]\").forEach((fieldEl) => {\n\n      fieldEl.hidden = !supported;\n\n    });\n\n    if (select && !supported && select.value !== \"right\") {\n\n      select.value = \"right\";\n\n    }\n\n    root.querySelectorAll(\"[data-kb-number-align]\").forEach((button) => {\n\n      button.setAttribute(\"aria-pressed\", select && select.value === button.dataset.kbNumberAlign ? \"true\" : \"false\");\n\n    });\n\n  }\n\n\n\n  function updateScriptState() {\n\n    if (!form) return;\n\n    const select = form.querySelector('[name=\"script\"]');\n\n    root.querySelectorAll(\"[data-kb-script-select]\").forEach((button) => {\n\n      button.setAttribute(\"aria-pressed\", select && select.value === button.dataset.kbScriptSelect ? \"true\" : \"false\");\n\n    });\n\n  }\n\n\n\n  function updateTextCaseState() {\n\n    if (!form) return;\n\n    const select = form.querySelector('[name=\"text_case\"]');\n\n    const current = select ? (select.value || \"uppercase\") : \"uppercase\";\n\n    root.querySelectorAll(\"[data-kb-text-case]\").forEach((button) => {\n\n      button.setAttribute(\"aria-pressed\", current === button.dataset.kbTextCase ? \"true\" : \"false\");\n\n    });\n\n  }\n\n\n\n  function updatePlateStyleState() {\n\n    if (!form) return;\n\n    const select = form.querySelector('[name=\"plate_style\"]');\n\n    const current = select ? (select.value || \"rectangular\") : \"rectangular\";\n\n    root.querySelectorAll(\"[data-kb-plate-style]\").forEach((button) => {\n\n      button.setAttribute(\"aria-pressed\", current === button.dataset.kbPlateStyle ? \"true\" : \"false\");\n\n    });\n\n  }\n\n\n\n  function updateCartCheck() {\n\n    if (!cartCheck) return;\n\n    const config = currentConfig();\n\n    const street = config.street || \"natpis\";\n\n    const number = config.number || \"broj\";\n\n    if (config.product_type === \"video_notice\") {\n\n      const bottom = config.extra_text || \"\";\n\n      cartCheck.innerHTML = `<strong>${escapeHtml(street)}</strong>${bottom ? ` <strong>${escapeHtml(bottom)}</strong>` : \"\"} - ${escapeHtml(selectedLabel(\"plate_color\"))} + ${escapeHtml(selectedLabel(\"text_color\"))}`;\n\n      return;\n\n    }\n\n    if (config.product_type === \"parking_notice\") {\n\n      cartCheck.innerHTML = `<strong>${escapeHtml(street)}</strong> - ${escapeHtml(selectedLabel(\"plate_color\"))} + ${escapeHtml(selectedLabel(\"text_color\"))}`;\n\n      return;\n\n    }\n\n    if (config.product_type === \"mailbox\") {\n\n      const top = config.mailbox_top_text ? `<strong>${escapeHtml(config.mailbox_top_text)}</strong> ` : \"\";\n\n      cartCheck.innerHTML = `${top}<strong>${escapeHtml(config.mailbox_bottom_text || \"\")}</strong> - ${escapeHtml(selectedLabel(\"plate_color\"))} + ${escapeHtml(selectedLabel(\"text_color\"))}`;\n\n      return;\n\n    }\n\n    if (config.product_type === \"dog_notice\") {\n\n      const dog = dogSymbols.find((item) => item.key === config.dog_symbol_key);\n\n      cartCheck.innerHTML = `<strong>${escapeHtml(street)}</strong>${dog ? ` \u00B7 ${escapeHtml(dog.label)}` : \"\"} - ${escapeHtml(selectedLabel(\"plate_color\"))} + ${escapeHtml(selectedLabel(\"text_color\"))}`;\n\n      return;\n\n    }\n\n    if (config.product_type === \"apartment_plate\") {\n\n      cartCheck.innerHTML = cfg.apartmentNatpisOnly\n\n        ? `<strong>${escapeHtml(street)}</strong> - ${escapeHtml(selectedLabel(\"engraving_color\"))}`\n\n        : `<strong>${escapeHtml(street)}</strong> <strong>${escapeHtml(number)}</strong> - ${escapeHtml(selectedLabel(\"engraving_color\"))}`;\n\n      return;\n\n    }\n\n    if (config.product_type === \"single_character\") {\n\n      const count = config.physical_character_count || physicalCharacterCount(config.characters);\n\n      cartCheck.innerHTML = `<strong>${escapeHtml(config.characters || \"karakteri\")}</strong> \u00B7 ${escapeHtml(count)} kom. \u00B7 ${escapeHtml(displayCm(config.character_height_cm || config.height_cm))} cm - ${escapeHtml(selectedLabel(\"text_color\"))}`;\n\n      return;\n\n    }\n\n    if (isNumberOnlyShape(config.shape) || !street) {\n\n      cartCheck.innerHTML = `<strong>${escapeHtml(number)}</strong> - ${escapeHtml(selectedLabel(\"plate_color\"))} + ${escapeHtml(selectedLabel(\"text_color\"))}`;\n\n      return;\n\n    }\n\n    cartCheck.innerHTML = `<strong>${escapeHtml(street)}</strong> <strong>${escapeHtml(number)}</strong> - ${escapeHtml(selectedLabel(\"plate_color\"))} + ${escapeHtml(selectedLabel(\"text_color\"))}`;\n\n  }\n\n\n\n  /* --- Privremeno nedostupne boje -------------------------------\n     Spisak dolazi iz snippeta (data-unavailable-colors). Boja se NE uklanja\n     iz izbora nego ostaje vidljiva i zatamnjena, sa objasnjenjem \u2014 inace\n     kupcu boja nestane bez razloga. Klik na nju nudi zamenu.\n     Prazan atribut = sve dostupno, ceo mehanizam miruje. */\n  var NEDOSTUPNE = String(root.dataset.unavailableColors || \"\")\n    .split(\",\").map(function (x) { return x.trim(); }).filter(Boolean);\n  var ZAMENA = String(root.dataset.colorFallback || \"crna\").trim();\n  var ZAMENA_NAZIV = String(root.dataset.colorFallbackLabel || \"Crna\").trim();\n  /* Akuzativ, da poruka ne glasi \u201EIzabrali smo Crna\". Snippet ga zadaje;\n     ako nije zadat, pravimo ga iz naziva (Crna -> Crnu, Siva -> Sivu). */\n  var ZAMENA_AKUZATIV = String(root.dataset.colorFallbackAccusative || \"\").trim()\n    || ZAMENA_NAZIV.replace(/a$/, \"u\");\n  var BOJA_POLJA = [\"plate_color\", \"text_color\", \"distancer_color\", \"engraving_color\"];\n\n  function jeNedostupna(v) {\n    return NEDOSTUPNE.length > 0 && NEDOSTUPNE.indexOf(String(v || \"\")) !== -1;\n  }\n\n  function nazivBoje(v) {\n    var opt = form && form.querySelector('option[value=\"' + v + '\"]');\n    return opt ? opt.textContent.replace(/\\s*\u2014.*$/, \"\").trim() : v;\n  }\n\n  /* Sacuvan nacrt, preset ili URL mogu doneti nedostupnu boju \u2014 prebaci je. */\n  function zameniNedostupneBoje(tiho) {\n    if (!form || !NEDOSTUPNE.length) return false;\n    var promenjeno = null;\n    BOJA_POLJA.forEach(function (name) {\n      var sel = form.querySelector('[name=\"' + name + '\"]');\n      if (!sel || !jeNedostupna(sel.value)) return;\n      promenjeno = nazivBoje(sel.value);\n      sel.value = ZAMENA;\n      sel.dispatchEvent(new Event(\"change\", { bubbles: true }));\n    });\n    if (promenjeno && !tiho) {\n      setMessage(promenjeno + \" je trenutno rasprodat \u2014 prebacili smo na \" + ZAMENA_AKUZATIV + \".\", \"info\");\n    }\n    return !!promenjeno;\n  }\n\n  function oznaciNedostupneBoje() {\n    if (!form || !NEDOSTUPNE.length) return;\n    BOJA_POLJA.forEach(function (name) {\n      var sel = form.querySelector('[name=\"' + name + '\"]');\n      if (!sel) return;\n      sel.querySelectorAll(\"option\").forEach(function (opt) {\n        if (!jeNedostupna(opt.value)) return;\n        opt.disabled = true;\n        if (!/nedostupno/i.test(opt.textContent)) opt.textContent += \" \u2014 trenutno nedostupno\";\n      });\n    });\n    root.querySelectorAll(\"[data-kb-swatch-select]\").forEach(function (btn) {\n      if (!jeNedostupna(btn.dataset.kbSwatchValue)) return;\n      btn.classList.add(\"is-unavailable\");\n      btn.setAttribute(\"aria-disabled\", \"true\");\n      var naziv = btn.getAttribute(\"title\") || \"Ova boja\";\n      if (!/nedostupno/i.test(naziv)) btn.setAttribute(\"title\", naziv + \" \u2014 trenutno nedostupno\");\n    });\n\n  }\n\n  /* Napomena se NE prikazuje unapred \u2014 pojavljuje se tek kad kupac pokusa da\n     izabere nedostupnu boju, i to odmah ispod tog reda uzoraka. Na telefonu\n     nema hovera pa `title` niko ne vidi, a poruka u traci zna da bude van\n     ekrana; ovako objasnjenje stoji tacno tamo gde je kliknuo.\n     Sama se sklanja posle 6 sekundi ili cim izabere drugu boju. */\n  var napomenaTajmeri = {};\n\n  function prikaziNapomenuNedostupno(polje, boja) {\n    var grupa = root.querySelector('[data-kb-swatch-options=\"' + polje + '\"]');\n    if (!grupa) return;\n    var nota = grupa.parentNode.querySelector(\"[data-kb-unavailable-note]\");\n    if (!nota) {\n      nota = document.createElement(\"div\");\n      nota.className = \"kb-unavailable-note\";\n      nota.setAttribute(\"data-kb-unavailable-note\", \"\");\n      nota.setAttribute(\"role\", \"status\");\n      grupa.insertAdjacentElement(\"afterend\", nota);\n    }\n    var naziv = nazivBoje(boja);\n    nota.innerHTML =\n      '<span class=\"kb-un-dot\" style=\"--kb-un-fill:' + (swatchFills[boja] || \"#383E42\") + '\"></span>'\n      + '<span class=\"kb-un-txt\">'\n      +   '<strong>' + escapeHtml(naziv) + ' je trenutno rasprodat.</strong> '\n      +   'Prebacili smo na <strong>' + escapeHtml(ZAMENA_AKUZATIV) + '</strong> \u2014 najbli\u017Ee je po izgledu.'\n      + '</span>';\n    /* restart animacije kad se ista napomena pozove ponovo */\n    nota.classList.remove(\"is-visible\");\n    void nota.offsetWidth;\n    nota.classList.add(\"is-visible\");\n    clearTimeout(napomenaTajmeri[polje]);\n    napomenaTajmeri[polje] = setTimeout(function () { sakrijNapomenu(polje); }, 7000);\n  }\n\n  function sakrijNapomenu(polje) {\n    var grupa = root.querySelector('[data-kb-swatch-options=\"' + polje + '\"]');\n    var nota = grupa && grupa.parentNode.querySelector(\"[data-kb-unavailable-note]\");\n    if (nota) nota.classList.remove(\"is-visible\");\n    clearTimeout(napomenaTajmeri[polje]);\n  }\n\n  function updateSwatches() {\n\n    if (!form) return;\n\n    syncMailboxMirrorTextLock();\n\n    root.querySelectorAll(\"[data-kb-swatch-select]\").forEach((button) => {\n\n      const name = button.dataset.kbSwatchSelect;\n\n      const value = button.dataset.kbSwatchValue || \"\";\n\n      const select = form.querySelector(`[name=\"${name}\"]`);\n\n      button.style.setProperty(\"--kb-swatch-fill\", swatchFills[value] || \"#030303\");\n\n      button.setAttribute(\"aria-pressed\", select && select.value === value ? \"true\" : \"false\");\n\n    });\n\n    root.querySelectorAll(\"[data-kb-selected-label]\").forEach((label) => {\n\n      label.textContent = selectedLabel(label.dataset.kbSelectedLabel);\n\n    });\n\n    root.querySelectorAll(\"[data-kb-color-combo]\").forEach((button) => {\n\n      const parts = String(button.dataset.kbColorCombo || \"\").split(\"|\");\n\n      button.style.setProperty(\"--kb-combo-left\", comboSolidFills[parts[0]] || \"#030303\");\n\n      button.style.setProperty(\"--kb-combo-right\", comboSolidFills[parts[1]] || \"#cfd5da\");\n\n      button.setAttribute(\"aria-pressed\",\n\n        field(\"plate_color\") === parts[0] && field(\"text_color\") === parts[1] && field(\"distancer_color\") === parts[2] ? \"true\" : \"false\"\n\n      );\n\n    });\n\n    updateNumberAlignState();\n\n    updateScriptState();\n\n    updateTextCaseState();\n\n    updatePlateStyleState();\n\n    updateSelectionSummary();\n\n    updateCartCheck();\n\n    updateContrastWarning();\n\n    updateDimensionMarkers();\n\n    updateDimensionControls();\n\n    updatePrice();\n\n  }\n\n\n\n  function setPreviewMode(mode) {\n\n    const next = mode === \"facade\" ? \"facade\" : \"clean\";\n\n    if (preview) preview.dataset.previewMode = next;\n\n    root.classList.toggle(\"kb-preview-facade-active\", next === \"facade\");\n\n    root.querySelectorAll(\"[data-kb-preview-mode]\").forEach((button) => {\n\n      button.setAttribute(\"aria-pressed\", button.dataset.kbPreviewMode === next ? \"true\" : \"false\");\n\n    });\n\n  }\n\n\n\n  function setFacadeBackground(background) {\n\n    const next = [\"dark\", \"concrete\"].includes(background) ? background : \"light\";\n\n    if (preview) preview.dataset.facadeBg = next;\n\n    root.querySelectorAll(\"[data-kb-facade-bg]\").forEach((button) => {\n\n      button.setAttribute(\"aria-pressed\", button.dataset.kbFacadeBg === next ? \"true\" : \"false\");\n\n    });\n\n  }\n\n\n\n  if (form) {\n\n    const rememberTextField = (event) => {\n\n      if (isTextEntryField(event.target)) activeTextField = event.target;\n\n      if (event.target && (isTextEntryField(event.target) || event.target.closest(\"[data-kb-swatch-select], [data-kb-color-combo], [data-kb-script-select], [data-kb-number-align], [data-kb-dog-symbol-key]\"))) {\n\n        activateGalleryPreview();\n\n        const currentSvg = preview ? preview.innerHTML : \"\";\n\n        if (currentSvg) syncGalleryPreview(currentSvg);\n\n      }\n\n    };\n\n    form.addEventListener(\"focusin\", (event) => {\n      rememberTextField(event);\n      reportConfiguratorOpened(\"field_focus\");\n    });\n\n    form.addEventListener(\"click\", rememberTextField);\n\n    form.addEventListener(\"pointerdown\", rememberTextField);\n\n    form.addEventListener(\"input\", (event) => {\n\n      notePrimaryTextInput(event.target, event.isTrusted === true);\n      activateGalleryPreview();\n\n      if (event.target && textFields().includes(event.target)) scheduleFieldTransliteration(event.target);\n\n      if (event.target && event.target.name === \"contact_phone\") scheduleContactPhoneIdentify();\n\n      updateCartCheck();\n\n      updateFontSamples();\n\n      syncValidationState(true);\n\n      schedulePreview();\n\n    });\n\n  }\n\n  if (form) form.addEventListener(\"change\", (event) => {\n\n    activateGalleryPreview();\n\n    if (event.target && event.target.name === \"text_color\") syncDistancerDefault();\n\n    if (event.target && event.target.name === \"script\") transliterateAllFields();\n\n    syncMailboxMirrorTextLock();\n\n    updateSwatches();\n\n    updateFontSamples();\n\n    schedulePreview();\n\n  });\n\n  root.querySelectorAll(\"[data-kb-swatch-select]\").forEach((button) => {\n    button.addEventListener(\"click\", () => {\n      if (!form) return;\n      if (button.dataset.kbSwatchSelect === \"text_color\" && isMailboxMirrorTextLocked()) return;\n      /* Jedan klik: objasni i odmah ponudi zamenu. Dupli klik bi bio zbunjuju\u0107\n         na uzorku koji je vizuelno precrtan. */\n      if (jeNedostupna(button.dataset.kbSwatchValue)) {\n        var polje0 = button.dataset.kbSwatchSelect;\n        var sel0 = form.querySelector('[name=\"' + polje0 + '\"]');\n        if (sel0 && sel0.value !== ZAMENA) {\n          sel0.value = ZAMENA;\n          sel0.dispatchEvent(new Event(\"change\", { bubbles: true }));\n          updateSwatches();\n        }\n        prikaziNapomenuNedostupno(polje0, button.dataset.kbSwatchValue);\n        return;\n      }\n      sakrijNapomenu(button.dataset.kbSwatchSelect);\n      const select = form.querySelector(`[name=\"${button.dataset.kbSwatchSelect}\"]`);\n\n      if (!select) return;\n\n      select.value = button.dataset.kbSwatchValue || \"\";\n\n      select.dispatchEvent(new Event(\"change\", { bubbles: true }));\n\n      updateSwatches();\n    });\n  });\n  const chipFontPromises = new Map();\n\n  function loadFontChipPreview(button) {\n    if (!button || !button.dataset.kbFontFamily || !button.dataset.kbFontUrl) return Promise.resolve(false);\n    const family = button.dataset.kbFontFamily;\n    if (chipFontPromises.has(family)) return chipFontPromises.get(family);\n    if (!(\"FontFace\" in window) || !document.fonts) return Promise.resolve(false);\n    const font = new FontFace(family, `url(${button.dataset.kbFontUrl})`, {\n      display: \"swap\",\n      style: \"normal\",\n      weight: \"400\"\n    });\n    const promise = font.load()\n      .then((loaded) => {\n        document.fonts.add(loaded);\n        root.querySelectorAll(`[data-kb-font-family=\"${family}\"]`).forEach((chip) => {\n          chip.classList.add(\"is-font-loaded\");\n        });\n        return true;\n      })\n      .catch(() => false);\n    chipFontPromises.set(family, promise);\n    return promise;\n  }\n\n  function initFontChipLazyLoading() {\n    const chips = Array.from(root.querySelectorAll(\"[data-kb-font-chip]\"));\n    if (!chips.length) return;\n    chips.filter((chip) => chip.getAttribute(\"aria-pressed\") === \"true\").forEach((chip) => {\n      loadFontChipPreview(chip);\n    });\n    if (!(\"IntersectionObserver\" in window)) return;\n    const observer = new IntersectionObserver((entries) => {\n      entries.forEach((entry) => {\n        if (!entry.isIntersecting) return;\n        loadFontChipPreview(entry.target);\n        observer.unobserve(entry.target);\n      });\n    }, { rootMargin: \"160px 0px\" });\n    chips.forEach((chip) => observer.observe(chip));\n  }\n\n  function updateFontSamples() {\n    const samples = root.querySelectorAll(\".kb-font-sample\");\n    if (!samples.length || !form) return;\n    const raw = ((isSingleCharacterShape(cfg.renderShape || root.dataset.renderShape || \"standard\") ? field(\"characters\") : field(\"street\")) || \"\").trim();\n\n    let sample = raw || \"Aa \u040B\u045B 123\";\n\n    if (raw && field(\"text_case\") !== \"as_entered\") {\n\n      sample = raw.toLocaleUpperCase(\"sr-RS\");\n\n    }\n\n    samples.forEach((el) => { el.textContent = sample; });\n\n  }\n\n  function syncFontChips() {\n\n    if (!form) return;\n\n    const select = form.querySelector('[name=\"plocica_font\"]');\n\n    const current = select ? select.value || \"\" : \"\";\n\n    root.querySelectorAll(\"[data-kb-font-chip]\").forEach((b) => {\n\n      b.setAttribute(\"aria-pressed\", (b.dataset.kbFontChip || \"\") === current ? \"true\" : \"false\");\n\n    });\n\n  }\n\n  root.querySelectorAll(\"[data-kb-font-chip]\").forEach((button) => {\n\n    button.addEventListener(\"click\", () => {\n\n      if (!form) return;\n\n      const select = form.querySelector('[name=\"plocica_font\"]');\n\n      if (!select) return;\n      select.value = button.dataset.kbFontChip || \"\";\n      loadFontChipPreview(button);\n      syncFontChips();\n      select.dispatchEvent(new Event(\"change\", { bubbles: true }));\n      schedulePreview();\n    });\n  });\n  initFontChipLazyLoading();\n  syncFontChips();\n  updateFontSamples();\n  (function preloadEngravingTextures() {\n\n    const map = window.KB_TABLE_RENDERER_ASSETS || {};\n\n    [\"materials/cesljano_srebro.png\", \"materials/cesljano_zlato.png\"].forEach((key) => {\n\n      const url = map[key];\n\n      if (!url) return;\n\n      const img = new Image();\n\n      img.onload = () => { schedulePreview(); };\n\n      img.src = url;\n\n    });\n\n  })();\n\n  root.querySelectorAll(\"[data-kb-color-combo]\").forEach((button) => {\n\n    button.addEventListener(\"click\", () => {\n\n      if (!form) return;\n\n      const parts = String(button.dataset.kbColorCombo || \"\").split(\"|\");\n\n      const plate = form.querySelector('[name=\"plate_color\"]');\n\n      const text = form.querySelector('[name=\"text_color\"]');\n\n      const distancer = form.querySelector('[name=\"distancer_color\"]');\n\n      if (plate && parts[0]) plate.value = parts[0];\n\n      if (text && parts[1]) text.value = parts[1];\n\n      if (distancer && parts[2]) distancer.value = parts[2];\n\n      zameniNedostupneBoje(true);\n      syncMailboxMirrorTextLock();\n\n      updateSwatches();\n\n      schedulePreview();\n\n      postLeadEvent(\"table_design_color_preset_click\", {\n\n        product_handle: cfg.productHandle || \"\",\n\n        preset: button.dataset.kbPresetLabel || button.textContent || \"\",\n\n        plate_color: parts[0] || \"\",\n\n        text_color: parts[1] || \"\",\n\n        distancer_color: parts[2] || \"\"\n\n      }).catch(() => {});\n\n    });\n\n  });\n\n  root.querySelectorAll(\"[data-kb-contrast-fix]\").forEach((button) => {\n\n    button.addEventListener(\"click\", () => {\n\n      applyBetterContrast();\n\n    });\n\n  });\n\n  if (alternateShapesGrid) {\n\n    alternateShapesGrid.addEventListener(\"click\", (event) => {\n\n      const link = event.target && event.target.closest(\"[data-kb-alternate-shape]\");\n\n      if (!link || !alternateShapesGrid.contains(link)) return;\n\n      const config = currentConfig();\n\n      postLeadEvent(\"table_design_alternate_shape_click\", {\n\n        source_product_handle: cfg.productHandle || \"\",\n\n        target: link.dataset.kbAlternateShape || \"\",\n\n        target_label: link.dataset.kbAlternateLabel || \"\",\n\n        product_type: config.product_type || \"\",\n\n        dimensions: `${config.width_cm || \"\"}x${config.height_cm || \"\"}`,\n\n        has_street: !!config.street,\n\n        has_number: !!config.number,\n\n        has_extra_text: !!config.extra_text\n\n      }).catch(() => {});\n\n    });\n\n  }\n\n  root.querySelectorAll(\"[data-kb-number-align]\").forEach((button) => {\n\n    button.addEventListener(\"click\", () => {\n\n      if (!form) return;\n\n      const select = form.querySelector('[name=\"number_align\"]');\n\n      if (!select) return;\n\n      select.value = button.dataset.kbNumberAlign === \"center\" ? \"center\" : \"right\";\n\n      updateSwatches();\n\n      schedulePreview();\n\n    });\n\n  });\n\n  if (dimensionOptions) {\n\n    dimensionOptions.addEventListener(\"click\", (event) => {\n\n      const customBtn = event.target.closest(\"[data-kb-dimension-custom]\");\n\n      if (customBtn && dimensionOptions.contains(customBtn)) {\n\n        if (!activateCustomDimension()) return;\n\n        updateSwatches();\n\n        updatePrice();\n\n        schedulePreview();\n\n        scheduleAlternateShapes();\n\n        return;\n\n      }\n\n      const button = event.target.closest(\"[data-kb-dimension-choice]\");\n\n      if (!button || !dimensionOptions.contains(button)) return;\n\n      const shape = cfg.renderShape || root.dataset.renderShape || \"standard\";\n\n      const changed = isSingleCharacterShape(shape)\n\n        ? selectVariantByCharacterHeight(button.dataset.kbDimensionHeight)\n\n        : selectVariantByDimension(button.dataset.kbDimensionWidth, button.dataset.kbDimensionHeight);\n\n      if (!changed) return;\n\n      deactivateCustomDimension();\n\n      updateSwatches();\n\n      updatePrice();\n\n      schedulePreview();\n\n      scheduleAlternateShapes();\n\n    });\n\n  }\n\n  if (customWidthInput || customHeightInput) {\n\n    [customWidthInput, customHeightInput].forEach((inp) => {\n\n      if (!inp) return;\n\n      inp.addEventListener(\"input\", () => {\n\n        if (!customDimActive) return;\n\n        updateDimensionControls();\n\n        updateSelectionSummary();\n\n        updateCartCheck();\n\n        schedulePreview();\n\n      });\n\n    });\n\n  }\n\n  if (dogSymbolSearch) {\n\n    dogSymbolSearch.addEventListener(\"input\", () => {\n\n      renderDogSymbolGrid(dogSymbolSearch.value);\n\n    });\n\n  }\n\n  if (dogSymbolGrid) {\n\n    dogSymbolGrid.addEventListener(\"click\", (event) => {\n\n      const button = event.target.closest(\"[data-kb-dog-symbol-key]\");\n\n      if (!button || !dogSymbolGrid.contains(button)) return;\n\n      setField(\"dog_symbol_key\", button.dataset.kbDogSymbolKey || \"lovacki_01\");\n\n      renderDogSymbolGrid(dogSymbolSearch ? dogSymbolSearch.value : \"\");\n\n      updateCartCheck();\n\n      activateGalleryPreview();\n\n      schedulePreview();\n\n    });\n\n  }\n\n  root.querySelectorAll(\"[data-kb-script-select]\").forEach((button) => {\n\n    button.addEventListener(\"click\", () => {\n\n      if (!form) return;\n\n      const select = form.querySelector('[name=\"script\"]');\n\n      if (!select) return;\n\n      select.value = button.dataset.kbScriptSelect || \"cyrillic\";\n\n      select.dispatchEvent(new Event(\"change\", { bubbles: true }));\n\n      updateSwatches();\n\n      schedulePreview();\n\n    });\n\n  });\n\n  root.querySelectorAll(\"[data-kb-text-case]\").forEach((button) => {\n\n    button.addEventListener(\"click\", () => {\n\n      if (!form) return;\n\n      const select = form.querySelector('[name=\"text_case\"]');\n\n      if (!select) return;\n\n      select.value = button.dataset.kbTextCase === \"as_entered\" ? \"as_entered\" : \"uppercase\";\n\n      select.dispatchEvent(new Event(\"change\", { bubbles: true }));\n\n      updateTextCaseState();\n\n      updateFontSamples();\n\n      schedulePreview();\n\n    });\n\n  });\n\n  root.querySelectorAll(\"[data-kb-plate-style]\").forEach((button) => {\n\n    button.addEventListener(\"click\", () => {\n\n      if (!form) return;\n\n      const select = form.querySelector('[name=\"plate_style\"]');\n\n      if (!select) return;\n\n      select.value = button.dataset.kbPlateStyle === \"rounded\" ? \"rounded\" : \"rectangular\";\n\n      select.dispatchEvent(new Event(\"change\", { bubbles: true }));\n\n      updatePlateStyleState();\n\n      updateSelectionSummary();\n\n      updateCartCheck();\n\n      schedulePreview();\n\n    });\n\n  });\n\n  root.querySelectorAll(\"[data-kb-preview-mode]\").forEach((button) => {\n\n    button.addEventListener(\"click\", () => {\n\n      setPreviewMode(button.dataset.kbPreviewMode);\n\n    });\n\n  });\n\n  root.querySelectorAll(\"[data-kb-facade-bg]\").forEach((button) => {\n\n    button.addEventListener(\"click\", () => {\n\n      setFacadeBackground(button.dataset.kbFacadeBg);\n\n      setPreviewMode(\"facade\");\n\n    });\n\n  });\n\n  root.querySelectorAll(\"[data-kb-step-jump]\").forEach((button) => {\n\n    button.addEventListener(\"click\", () => {\n\n      scrollToStep(button.dataset.kbStepJump || \"text\");\n\n    });\n\n  });\n\n  root.querySelectorAll(\"[data-kb-step-prev]\").forEach((button) => {\n\n    button.addEventListener(\"click\", () => {\n\n      const index = stepIndex(currentStep());\n\n      setWizardStep(wizardSteps[Math.max(0, index - 1)]);\n\n    });\n\n  });\n\n  initWizardPrimaryActionSync();\n\n  root.querySelectorAll(\"[data-kb-step-next]\").forEach((button) => {\n\n    button.addEventListener(\"click\", () => {\n\n      const index = stepIndex(currentStep());\n\n      if (mobileCartActionActive()) {\n\n        if (!syncValidationState(true)) {\n\n          const target = validateConfig(currentConfig()).input;\n\n          if (target && typeof target.focus === \"function\") target.focus();\n\n          return;\n\n        }\n\n        addToCart();\n\n        return;\n\n      }\n\n      setWizardStep(wizardSteps[Math.min(wizardSteps.length - 1, index + 1)]);\n\n    });\n\n  });\n\n  if (mobileOpenButton) {\n\n    mobileOpenButton.addEventListener(\"click\", openMobileConfigurator);\n\n  }\n\n  if (mobileCloseButton) {\n\n    mobileCloseButton.addEventListener(\"click\", closeMobileConfigurator);\n\n  }\n\n  document.addEventListener(\"keydown\", (event) => {\n\n    if (event.key === \"Escape\" && root.classList.contains(\"kb-mobile-modal-open\")) {\n\n      closeMobileConfigurator();\n\n    }\n\n  });\n\n  root.querySelectorAll(\"[data-kb-insert]\").forEach((button) => {\n\n    button.addEventListener(\"mousedown\", (event) => {\n\n      event.preventDefault();\n\n    });\n\n    button.addEventListener(\"click\", () => {\n\n      insertTextAtCursor(textInsertTarget(), button.dataset.kbInsert || button.textContent || \"\");\n\n    });\n\n  });\n\n  if (variantInput) variantInput.addEventListener(\"change\", () => {\n\n    updatePrice();\n\n    updateDimensionControls();\n\n    schedulePreview();\n\n  });\n\n  window.addEventListener(\"scroll\", updateMobilePreviewCompact, { passive: true });\n\n  document.addEventListener(\"scroll\", updateMobilePreviewCompact, { passive: true, capture: true });\n\n  document.addEventListener(\"scroll\", updateActiveStepFromScroll, { passive: true, capture: true });\n\n  window.setInterval(updateMobilePreviewCompact, 300);\n\n  window.addEventListener(\"resize\", updateResponsivePreviewState);\n\n  window.addEventListener(\"resize\", syncMobileConfiguratorMode);\n\n  window.addEventListener(\"resize\", positionDimensionMarkers);\n\n  if (addButton) addButton.addEventListener(\"click\", addToCart);\n\n  document.querySelectorAll(\"[data-kb-mobile-add]\").forEach((button) => {\n\n    button.addEventListener(\"click\", addToCart);\n\n  });\n\n  mountMobileCheckoutBar();\n\n  const incomingConfigApplied = applyIncomingConfigFromUrl();\n\n  selectPreferredDefaultVariant();\n\n  updateMobileOpenButtonLabel();\n\n  const localDraftRestored = !incomingConfigApplied && restoreLocalDraft();\n  initialDraftSource = incomingConfigApplied ? \"incoming_config\" : (localDraftRestored ? \"local_draft\" : \"default\");\n  if (!incomingConfigApplied && !localDraftRestored && applyLastTextForRelatedProduct()) {\n    initialDraftSource = \"related_prefill\";\n  }\n\n  /* Oznaci nedostupne boje i prebaci ih ako ih je doneo sacuvan nacrt.\n     Tiho pri ucitavanju \u2014 kupca ne docekuje poruka pre nego sto sta uradi. */\n  oznaciNedostupneBoje();\n\n  zameniNedostupneBoje(true);\n\n  syncDistancerDefault();\n\n  setPreviewMode(\"clean\");\n\n  setFacadeBackground(\"light\");\n\n  setActiveStep(\"text\");\n\n  renderDimensionOptions();\n\n  updateSwatches();\n\n  updateResponsivePreviewState();\n\n  updateActiveStepFromScroll();\n\n  initDogSymbolPicker().then(() => {\n\n    updateCartCheck();\n\n  }).catch(() => {});\n\n  initWhatsAppSharing();\n\n  renderPreview();\n\n  scheduleAlternateShapes();\n\n  pripremiPrimereUPoljima();\n  initConfiguratorMeasurement();\n\n  autoOpenMobileConfigurator();\n\n})();\n\n\n"],
  "mappings": "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",
  "names": ["message", "cfg"]
}
