{
  "version": 3,
  "sources": ["/cdn/shop/t/2/assets/craftdiy-multiline-v1.js?craftdiy_release=v44-final.5"],
  "sourcesContent": ["(() => {\n  'use strict';\n\n  const VERSION = '1.0.0-geometry-aware';\n  const ELEMENT_NAME = 'craftdiy-customizer';\n  const MAX_LINES = 4;\n  const FORCE_SINGLE_LINE_CONFIGS = new Set([\n    'engraved-bracelets/81',\n    'engraved-bracelets/82',\n    'photo-necklaces/32',\n    'photo-necklaces/33',\n    'photo-necklaces/34',\n  ]);\n  const EXPLICIT_MULTILINE_LIMITS = Object.freeze({\n    'personalized-envelope-message-necklace-663': Object.freeze({ maxChars: 16, maxLines: 4 }),\n    'personalized-sliding-photo-engraved-tag-necklace-671': Object.freeze({ maxChars: 18, maxLines: 4 }),\n    'personalized-double-sided-round-photo-necklace-1311': Object.freeze({ maxChars: 18, maxLines: 4 }),\n    'personalized-braided-heart-tag-bracelet-1286': Object.freeze({ maxChars: 16, maxLines: 4 }),\n  });\n\n  function clamp(value, min, max) {\n    return Math.min(max, Math.max(min, value));\n  }\n\n  function characters(value) {\n    return Array.from(String(value || ''));\n  }\n\n  function normalizedLines(value) {\n    return String(value || '').replace(/\\r\\n?/g, '\\n').split('\\n');\n  }\n\n  function normalizeValue(value, maxChars, maxLines) {\n    const lines = normalizedLines(value);\n    if (maxLines === 1) {\n      return characters(lines.join(' ')).slice(0, maxChars).join('');\n    }\n    return lines\n      .slice(0, maxLines)\n      .map((line) => characters(line).slice(0, maxChars).join(''))\n      .join('\\n');\n  }\n\n  function longestLineLength(value) {\n    return normalizedLines(value).reduce((longest, line) => (\n      Math.max(longest, characters(line).length)\n    ), 0);\n  }\n\n  function geometryLineCapacity(zone) {\n    const fontSize = Math.max(1, Number(zone.fontSize || 18));\n    const minFontSize = Math.max(1, Number(zone.minFontSize || Math.ceil(fontSize * 0.6)));\n    const lineHeight = Math.max(0.8, Number(zone.lineHeight || 1.25));\n    const zoneHeightAt1000 = Math.max(0, Number(zone.h || 0) * 10);\n    if (!zoneHeightAt1000) return 1;\n    return clamp(Math.floor(zoneHeightAt1000 / (minFontSize * lineHeight)), 1, MAX_LINES);\n  }\n\n  function lineLimit(customizer, zone) {\n    const configKey = String(customizer.config?.key || customizer.dataset.configKey || '');\n    if (FORCE_SINGLE_LINE_CONFIGS.has(configKey)) return 1;\n    const handle = String(customizer.dataset.productHandle || '');\n    const explicit = EXPLICIT_MULTILINE_LIMITS[handle];\n    if (explicit) return explicit.maxLines;\n    if (customizer.config.textZones.length !== 1) return 1;\n    return geometryLineCapacity(zone);\n  }\n\n  function updateCounter(customizer, index, value) {\n    const counter = customizer.querySelector(`[data-character-count=\"${index}\"]`);\n    if (counter) counter.textContent = String(longestLineLength(value));\n  }\n\n  function enhanceTextFields(customizer) {\n    customizer.config.textZones.forEach((zone, index) => {\n      let field = customizer.querySelector(`[data-text-index=\"${index}\"]`);\n      if (!field) return;\n      const maxChars = Math.max(1, Number(zone.maxChars || 50));\n      const maxLines = Math.max(1, Number(zone.maxLines || 1));\n      if (maxLines === 1 && field instanceof HTMLTextAreaElement) {\n        const input = document.createElement('input');\n        [...field.attributes].forEach((attribute) => {\n          if (attribute.name !== 'rows') input.setAttribute(attribute.name, attribute.value);\n        });\n        input.type = 'text';\n        field.replaceWith(input);\n        field = input;\n      }\n      if (field instanceof HTMLTextAreaElement) field.rows = Math.min(MAX_LINES, maxLines);\n      field.maxLength = maxChars * maxLines + Math.max(0, maxLines - 1);\n    });\n  }\n\n  function patchCustomizer(Customizer) {\n    const prototype = Customizer?.prototype;\n    if (!prototype || prototype.craftdiyMultilineVersion) return;\n    prototype.craftdiyMultilineVersion = VERSION;\n\n    const originalNormalizeConfig = prototype.normalizeConfig;\n    prototype.normalizeConfig = function normalizeConfigWithLineCapacity() {\n      originalNormalizeConfig.call(this);\n      const handle = String(this.dataset.productHandle || '');\n      const explicit = EXPLICIT_MULTILINE_LIMITS[handle];\n      this.config.textZones.forEach((zone) => {\n        if (explicit) zone.maxChars = explicit.maxChars;\n        zone.maxLines = lineLimit(this, zone);\n      });\n      this.dataset.multilineLogic = VERSION;\n    };\n\n    const originalRenderShell = prototype.renderShell;\n    prototype.renderShell = function renderShellWithLineCapacity() {\n      originalRenderShell.call(this);\n      enhanceTextFields(this);\n    };\n\n    const originalBindEvents = prototype.bindEvents;\n    prototype.bindEvents = function bindEventsWithLineCapacity() {\n      originalBindEvents.call(this);\n      if (this.multilineEventsBound) return;\n      this.multilineEventsBound = true;\n      this.addEventListener('keydown', (event) => {\n        const target = event.target;\n        if (!target.matches?.('[data-text-index]') || event.key !== 'Enter') return;\n        const zone = this.config.textZones[Number(target.dataset.textIndex)];\n        if (Number(zone?.maxLines || 1) === 1) event.preventDefault();\n      }, true);\n      this.addEventListener('input', (event) => {\n        const target = event.target;\n        if (!target.matches?.('[data-text-index]')) return;\n        const index = Number(target.dataset.textIndex);\n        const zone = this.config.textZones[index];\n        const normalized = normalizeValue(\n          target.value,\n          Math.max(1, Number(zone?.maxChars || 50)),\n          Math.max(1, Number(zone?.maxLines || 1)),\n        );\n        if (target.value !== normalized) target.value = normalized;\n      }, true);\n      this.addEventListener('input', (event) => {\n        const target = event.target;\n        if (!target.matches?.('[data-text-index]')) return;\n        updateCounter(this, Number(target.dataset.textIndex), target.value);\n      });\n    };\n\n    const originalImportState = prototype.importState;\n    prototype.importState = function importStateWithLineCapacity(saved) {\n      originalImportState.call(this, saved);\n      let changed = false;\n      this.config.textZones.forEach((zone, index) => {\n        const field = this.querySelector(`[data-text-index=\"${index}\"]`);\n        const state = this.textState[index];\n        if (!field || !state) return;\n        const normalized = normalizeValue(\n          state.value,\n          Math.max(1, Number(zone.maxChars || 50)),\n          Math.max(1, Number(zone.maxLines || 1)),\n        );\n        if (state.value !== normalized) changed = true;\n        state.value = normalized;\n        field.value = normalized;\n        updateCounter(this, index, normalized);\n      });\n      if (changed) this.onStateChange();\n    };\n\n    document.documentElement.dataset.craftdiyMultilineLogic = VERSION;\n  }\n\n  const Customizer = customElements.get(ELEMENT_NAME);\n  if (Customizer) patchCustomizer(Customizer);\n  else customElements.whenDefined(ELEMENT_NAME).then(() => patchCustomizer(customElements.get(ELEMENT_NAME)));\n})();\n\r\n"],
  "mappings": "CAAC,IAAM,CACL,aAEA,MAAM,QAAU,uBACV,aAAe,sBAEf,0BAA4B,IAAI,IAAI,CACxC,wBACA,wBACA,qBACA,qBACA,oBACF,CAAC,EACK,0BAA4B,OAAO,OAAO,CAC9C,6CAA8C,OAAO,OAAO,CAAE,SAAU,GAAI,SAAU,CAAE,CAAC,EACzF,uDAAwD,OAAO,OAAO,CAAE,SAAU,GAAI,SAAU,CAAE,CAAC,EACnG,sDAAuD,OAAO,OAAO,CAAE,SAAU,GAAI,SAAU,CAAE,CAAC,EAClG,+CAAgD,OAAO,OAAO,CAAE,SAAU,GAAI,SAAU,CAAE,CAAC,CAC7F,CAAC,EAED,SAAS,MAAM,MAAO,IAAK,IAAK,CAC9B,OAAO,KAAK,IAAI,IAAK,KAAK,IAAI,IAAK,KAAK,CAAC,CAC3C,CAEA,SAAS,WAAW,MAAO,CACzB,OAAO,MAAM,KAAK,OAAO,OAAS,EAAE,CAAC,CACvC,CAEA,SAAS,gBAAgB,MAAO,CAC9B,OAAO,OAAO,OAAS,EAAE,EAAE,QAAQ,SAAU;AAAA,CAAI,EAAE,MAAM;AAAA,CAAI,CAC/D,CAEA,SAAS,eAAe,MAAO,SAAU,SAAU,CACjD,MAAM,MAAQ,gBAAgB,KAAK,EACnC,OAAI,WAAa,EACR,WAAW,MAAM,KAAK,GAAG,CAAC,EAAE,MAAM,EAAG,QAAQ,EAAE,KAAK,EAAE,EAExD,MACJ,MAAM,EAAG,QAAQ,EACjB,IAAK,MAAS,WAAW,IAAI,EAAE,MAAM,EAAG,QAAQ,EAAE,KAAK,EAAE,CAAC,EAC1D,KAAK;AAAA,CAAI,CACd,CAEA,SAAS,kBAAkB,MAAO,CAChC,OAAO,gBAAgB,KAAK,EAAE,OAAO,CAAC,QAAS,OAC7C,KAAK,IAAI,QAAS,WAAW,IAAI,EAAE,MAAM,EACxC,CAAC,CACN,CAEA,SAAS,qBAAqB,KAAM,CAClC,MAAM,SAAW,KAAK,IAAI,EAAG,OAAO,KAAK,UAAY,EAAE,CAAC,EAClD,YAAc,KAAK,IAAI,EAAG,OAAO,KAAK,aAAe,KAAK,KAAK,SAAW,EAAG,CAAC,CAAC,EAC/E,WAAa,KAAK,IAAI,GAAK,OAAO,KAAK,YAAc,IAAI,CAAC,EAC1D,iBAAmB,KAAK,IAAI,EAAG,OAAO,KAAK,GAAK,CAAC,EAAI,EAAE,EAC7D,OAAK,iBACE,MAAM,KAAK,MAAM,kBAAoB,YAAc,WAAW,EAAG,EAAG,CAAS,EADtD,CAEhC,CAEA,SAAS,UAAU,WAAY,KAAM,CACnC,MAAM,UAAY,OAAO,WAAW,QAAQ,KAAO,WAAW,QAAQ,WAAa,EAAE,EACrF,GAAI,0BAA0B,IAAI,SAAS,EAAG,MAAO,GACrD,MAAM,OAAS,OAAO,WAAW,QAAQ,eAAiB,EAAE,EACtD,SAAW,0BAA0B,MAAM,EACjD,OAAI,SAAiB,SAAS,SAC1B,WAAW,OAAO,UAAU,SAAW,EAAU,EAC9C,qBAAqB,IAAI,CAClC,CAEA,SAAS,cAAc,WAAY,MAAO,MAAO,CAC/C,MAAM,QAAU,WAAW,cAAc,0BAA0B,KAAK,IAAI,EACxE,UAAS,QAAQ,YAAc,OAAO,kBAAkB,KAAK,CAAC,EACpE,CAEA,SAAS,kBAAkB,WAAY,CACrC,WAAW,OAAO,UAAU,QAAQ,CAAC,KAAM,QAAU,CACnD,IAAI,MAAQ,WAAW,cAAc,qBAAqB,KAAK,IAAI,EACnE,GAAI,CAAC,MAAO,OACZ,MAAM,SAAW,KAAK,IAAI,EAAG,OAAO,KAAK,UAAY,EAAE,CAAC,EAClD,SAAW,KAAK,IAAI,EAAG,OAAO,KAAK,UAAY,CAAC,CAAC,EACvD,GAAI,WAAa,GAAK,iBAAiB,oBAAqB,CAC1D,MAAM,MAAQ,SAAS,cAAc,OAAO,EAC5C,CAAC,GAAG,MAAM,UAAU,EAAE,QAAS,WAAc,CACvC,UAAU,OAAS,QAAQ,MAAM,aAAa,UAAU,KAAM,UAAU,KAAK,CACnF,CAAC,EACD,MAAM,KAAO,OACb,MAAM,YAAY,KAAK,EACvB,MAAQ,KACV,CACI,iBAAiB,sBAAqB,MAAM,KAAO,KAAK,IAAI,EAAW,QAAQ,GACnF,MAAM,UAAY,SAAW,SAAW,KAAK,IAAI,EAAG,SAAW,CAAC,CAClE,CAAC,CACH,CAEA,SAAS,gBAAgBA,YAAY,CACnC,MAAM,UAAYA,aAAY,UAC9B,GAAI,CAAC,WAAa,UAAU,yBAA0B,OACtD,UAAU,yBAA2B,QAErC,MAAM,wBAA0B,UAAU,gBAC1C,UAAU,gBAAkB,UAA2C,CACrE,wBAAwB,KAAK,IAAI,EACjC,MAAM,OAAS,OAAO,KAAK,QAAQ,eAAiB,EAAE,EAChD,SAAW,0BAA0B,MAAM,EACjD,KAAK,OAAO,UAAU,QAAS,MAAS,CAClC,WAAU,KAAK,SAAW,SAAS,UACvC,KAAK,SAAW,UAAU,KAAM,IAAI,CACtC,CAAC,EACD,KAAK,QAAQ,eAAiB,OAChC,EAEA,MAAM,oBAAsB,UAAU,YACtC,UAAU,YAAc,UAAuC,CAC7D,oBAAoB,KAAK,IAAI,EAC7B,kBAAkB,IAAI,CACxB,EAEA,MAAM,mBAAqB,UAAU,WACrC,UAAU,WAAa,UAAsC,CAC3D,mBAAmB,KAAK,IAAI,EACxB,MAAK,uBACT,KAAK,qBAAuB,GAC5B,KAAK,iBAAiB,UAAY,OAAU,CAC1C,MAAM,OAAS,MAAM,OACrB,GAAI,CAAC,OAAO,UAAU,mBAAmB,GAAK,MAAM,MAAQ,QAAS,OACrE,MAAM,KAAO,KAAK,OAAO,UAAU,OAAO,OAAO,QAAQ,SAAS,CAAC,EAC/D,OAAO,MAAM,UAAY,CAAC,IAAM,GAAG,MAAM,eAAe,CAC9D,EAAG,EAAI,EACP,KAAK,iBAAiB,QAAU,OAAU,CACxC,MAAM,OAAS,MAAM,OACrB,GAAI,CAAC,OAAO,UAAU,mBAAmB,EAAG,OAC5C,MAAM,MAAQ,OAAO,OAAO,QAAQ,SAAS,EACvC,KAAO,KAAK,OAAO,UAAU,KAAK,EAClC,WAAa,eACjB,OAAO,MACP,KAAK,IAAI,EAAG,OAAO,MAAM,UAAY,EAAE,CAAC,EACxC,KAAK,IAAI,EAAG,OAAO,MAAM,UAAY,CAAC,CAAC,CACzC,EACI,OAAO,QAAU,aAAY,OAAO,MAAQ,WAClD,EAAG,EAAI,EACP,KAAK,iBAAiB,QAAU,OAAU,CACxC,MAAM,OAAS,MAAM,OAChB,OAAO,UAAU,mBAAmB,GACzC,cAAc,KAAM,OAAO,OAAO,QAAQ,SAAS,EAAG,OAAO,KAAK,CACpE,CAAC,EACH,EAEA,MAAM,oBAAsB,UAAU,YACtC,UAAU,YAAc,SAAqC,MAAO,CAClE,oBAAoB,KAAK,KAAM,KAAK,EACpC,IAAI,QAAU,GACd,KAAK,OAAO,UAAU,QAAQ,CAAC,KAAM,QAAU,CAC7C,MAAM,MAAQ,KAAK,cAAc,qBAAqB,KAAK,IAAI,EACzD,MAAQ,KAAK,UAAU,KAAK,EAClC,GAAI,CAAC,OAAS,CAAC,MAAO,OACtB,MAAM,WAAa,eACjB,MAAM,MACN,KAAK,IAAI,EAAG,OAAO,KAAK,UAAY,EAAE,CAAC,EACvC,KAAK,IAAI,EAAG,OAAO,KAAK,UAAY,CAAC,CAAC,CACxC,EACI,MAAM,QAAU,aAAY,QAAU,IAC1C,MAAM,MAAQ,WACd,MAAM,MAAQ,WACd,cAAc,KAAM,MAAO,UAAU,CACvC,CAAC,EACG,SAAS,KAAK,cAAc,CAClC,EAEA,SAAS,gBAAgB,QAAQ,uBAAyB,OAC5D,CAEA,MAAM,WAAa,eAAe,IAAI,YAAY,EAC9C,WAAY,gBAAgB,UAAU,EACrC,eAAe,YAAY,YAAY,EAAE,KAAK,IAAM,gBAAgB,eAAe,IAAI,YAAY,CAAC,CAAC,CAC5G,GAAG",
  "names": ["Customizer"]
}
