{
  "version": 3,
  "sources": ["/cdn/shop/t/91/assets/florame-messages-app.js?florame_v=20261008-review-demo-v1222"],
  "sourcesContent": ["(() => {\r\n  'use strict';\r\n  let customerLive;\r\n  let proposalExpiryTimer;\r\n\r\n  const root = document.querySelector('[data-florame-messages-app]');\r\n  if (!root || root.__florameMessagesMounted) return;\r\n  root.__florameMessagesMounted = true;\r\n  const demoMode = new URL(location.href).searchParams.get('demo') === '1';\r\n  const demo = demoMode ? window.FlorameReviewDemo : null;\r\n  if (demoMode && !demo) { root.textContent = 'Demo non disponibile / Demo unavailable. Reload this page.'; return; }\r\n  if (demo) demo.mount(root);\r\n\r\n  function getLocale() {\r\n    const language = window.FlorameI18n?.getLanguage?.() || document.documentElement.lang || 'it';\r\n    return String(language).startsWith('en') ? 'en-GB' : 'it-IT';\r\n  }\r\n\r\n  const apiPath = root.dataset.apiPath || '/apps/florame-messages';\r\n  const initialPartner = String(root.dataset.partnerSlug || new URL(location.href).searchParams.get('partner') || '').trim();\r\n  const initialOrderId = String(new URL(location.href).searchParams.get('orderId') || '').trim();\r\n  const initialCompose = String(new URL(location.href).searchParams.get('compose') || '').trim();\r\n  const initialAuthenticated = demoMode || root.dataset.authenticated === 'true';\r\n  const state = {\r\n    threads: [],\r\n    listCursor: \"\", messagesCursor: \"\", listExpanded: false, historyExpanded: false, pageBusy: false, openSequence: 0,\r\n    selected: null,\r\n    messages: [],\r\n    preferences: {},\r\n    search: '',\r\n    busy: false,\r\n    outbox: [], sendingThreads: new Set(), verifyingMessages: new Set(), proposalBusy: false, authExpired: false,\r\n    newMessages: 0, inboxLoading: false, sessionEpoch: 0,\r\n    drafts: new Map(),\r\n    threadLoading: false,\r\n    threadReady: false,\r\n    filter: 'all',\r\n    composePrepared: false,\r\n    poll: null\r\n  };\r\n\r\n  const $ = (selector, scope = root) => scope.querySelector(selector);\r\n  const $$ = (selector, scope = root) => [...scope.querySelectorAll(selector)];\r\n  const list = $('[data-messages-list]');\r\n  const status = $('[data-messages-status]');\r\n  const thread = $('[data-messages-thread]');\r\n  const blank = $('[data-messages-blank]');\r\n  const messagesNode = $('[data-messages-messages]');\r\n  const scrollNode = $('[data-messages-thread-scroll]');\r\n  const composer = $('[data-messages-composer]');\r\n  const readonly = $('[data-messages-readonly]');\r\n  const draft = $('[data-messages-draft]');\r\n  const send = $('[data-messages-send]');\r\n  const settings = $('[data-messages-settings]');\r\n  const detailsSheet = $('[data-messages-details-sheet]');\r\n  const orderSheet = $('[data-messages-order-sheet]');\r\n  const photoSheet = $('[data-messages-photo-sheet]');\r\n  const latest = $('[data-messages-latest]');\r\n  const reducedMotion = () => matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n\r\n  // Private tab-local state. No conversation body is placed in the public read cache.\r\n  const sessionKey = demoMode ? 'florame_review_demo_messages_v1' : root.dataset.customerId ? 'florame_messages_session_v1:' + root.dataset.customerId : '';\r\n  const confirmations = new Set(), observedConfirmations = new Map();\r\n  const conversationMemory = new Map();\r\n  function saveSession() {\r\n    if (!sessionKey || state.authExpired) return;\r\n    try { sessionStorage.setItem(sessionKey, JSON.stringify({ at: Date.now(), drafts: [...state.drafts], outbox: state.outbox, confirmations: [...confirmations] })); } catch (_) {}\r\n  }\r\n  try {\r\n    // Purge records belonging to a previous login in this tab.\r\n    if (!demoMode) for (const key of Object.keys(sessionStorage)) if (key.startsWith('florame_messages_session_v1:') && key !== sessionKey) sessionStorage.removeItem(key);\r\n    const saved = sessionKey && JSON.parse(sessionStorage.getItem(sessionKey) || 'null');\r\n    if (saved && Date.now() >= saved.at && Date.now() - saved.at < 86400000) {\r\n      state.drafts = new Map(Array.isArray(saved.drafts) ? saved.drafts : []);\r\n      state.outbox = (Array.isArray(saved.outbox) ? saved.outbox : []).filter(row => row && typeof row.text === 'string' && row.text.length <= 1200 && row.threadId && row.key).map(row => ({ ...row, status: row.status === 'sent' ? 'sent' : 'uncertain' }));\r\n      (saved.confirmations || []).forEach(key => confirmations.add(key));\r\n    }\r\n  } catch (_) {}\r\n  function reconcileOutbox(rows) {\r\n    const ids = new Set(rows.map(row => row.messageId)), keys = new Set(rows.filter(row => row.sender === 'customer').map(row => row.clientRequestId).filter(Boolean));\r\n    state.outbox = state.outbox.filter(row => !keys.has(row.key) && !(row.serverId && ids.has(row.serverId)));\r\n    saveSession();\r\n  }\r\n  function outboxMessages() {\r\n    return state.outbox.filter(row => row.threadId === state.selected?.threadId).map(row => ({\r\n      messageId: row.serverId || 'local-' + row.key, clientRequestId: row.key, sender: 'customer', kind: 'text', text: row.text,\r\n      createdAt: row.createdAt, localStatus: row.status, verifying: state.verifyingMessages.has(row.key), retryAt: row.retryAt || 0, localError: row.error || ''\r\n    }));\r\n  }\r\n  function refreshLocalThread(id) { if (state.selected?.threadId === id && state.threadReady) renderMessages({ keepScroll: scrollNode.scrollHeight - scrollNode.scrollTop - scrollNode.clientHeight > 100 }); }\r\n  function clearPrivateState() {\r\n    customerLive?.close();\r\n    state.authExpired = true; state.sessionEpoch++; state.openSequence++;\r\n    state.drafts.clear(); state.outbox = []; conversationMemory.clear(); confirmations.clear();\r\n    try { if (sessionKey) sessionStorage.removeItem(sessionKey); } catch (_) {}\r\n    state.selected = null; state.messages = []; state.threads = []; state.threadReady = false;\r\n    draft.value = ''; messagesNode.replaceChildren(); $('[data-messages-context]').replaceChildren(); list.replaceChildren();\r\n    utilitySheets.forEach(layer => { if (!layer.hidden) closeUtility(layer); });\r\n    const account = document.querySelector('[data-florame-account-center]')?.__florameAccountCenter;\r\n    if (account?.helpContext || (account?.lastTrigger && root.contains(account.lastTrigger))) { account.clearHelpContext(); account.close(false); }\r\n    closePhoto(); closeOrderDetails({restoreUrl:false}); closePartnerDetails(); closeSettings(); thread.hidden = true; root.classList.remove('is-thread-open');\r\n    updateComposer(); loginState();\r\n  }\r\n  ['florame:logout', 'florame:auth-changed'].forEach(name => document.addEventListener(name, clearPrivateState));\r\n  window.addEventListener('pagehide', saveSession);\r\n\r\n  async function drainOutbox(id) {\r\n    if (state.sendingThreads.has(id) || state.authExpired || !navigator.onLine) return;\r\n    state.sendingThreads.add(id);\r\n    const epoch = state.sessionEpoch;\r\n    try {\r\n      while (epoch === state.sessionEpoch) {\r\n        const row = state.outbox.find(item => item.threadId === id && item.status !== 'sent');\r\n        if (!row || row.status !== 'queued') break;\r\n        row.status = 'sending'; saveSession(); refreshLocalThread(id);\r\n        try {\r\n          const result = await request('send', { method: 'POST', body: { threadId: id, text: row.text, idempotencyKey: row.key } });\r\n          if (epoch !== state.sessionEpoch) return;\r\n          row.serverId = result.message?.messageId || ''; row.status = row.serverId ? 'sent' : 'uncertain';\r\n          row.error = ''; saveSession(); refreshLocalThread(id);\r\n        } catch (error) {\r\n          if (epoch !== state.sessionEpoch) return;\r\n          row.status = [400,403,404,409,429].includes(error.status) ? 'failed' : 'uncertain';\r\n          row.retryAt = error.status === 429 ? Date.now() + Math.max(1000, error.retryAfterMs || 30000) : 0;\r\n          row.error = error.status === 401 ? 'Accedi di nuovo per verificare l\u2019invio.'\r\n            : error.status === 403 ? 'Questa conversazione non accetta risposte.'\r\n            : error.status === 409 ? 'La conversazione \u00E8 cambiata. Verifica con Florame.'\r\n            : error.status === 429 ? 'Troppi invii ravvicinati. Attendi qualche secondo.'\r\n            : error.status === 404 ? 'La conversazione non \u00E8 pi\u00F9 disponibile.' : '';\r\n          saveSession(); refreshLocalThread(id);\r\n          if (error.status === 401) { clearPrivateState(); requestAuthentication(send, 'messages_send'); }\r\n          break;\r\n        }\r\n      }\r\n    } finally {\r\n      state.sendingThreads.delete(id);\r\n      if (epoch === state.sessionEpoch && state.selected?.threadId === id && !state.threadLoading) void openThread(state.selected, { quiet: true });\r\n    }\r\n  }\r\n  async function retryMessage(key) {\r\n    const row = state.outbox.find(item => item.key === key);\r\n    if (!row || state.authExpired || state.sendingThreads.has(row.threadId) || state.verifyingMessages.has(key)) return;\r\n    if (!navigator.onLine) { setMessageStatus('Sei offline. Torna online per verificare questo invio.'); return; }\r\n    if (row.retryAt > Date.now()) { setMessageStatus('Puoi riprovare tra ' + Math.ceil((row.retryAt - Date.now()) / 1000) + ' secondi.'); return; }\r\n    const epoch = state.sessionEpoch;\r\n    state.verifyingMessages.add(key); refreshLocalThread(row.threadId);\r\n    try {\r\n      // A lost response may hide a successful write. Reconcile before resending the same key.\r\n      try {\r\n        const payload = await request('thread', { query: { threadId: row.threadId } });\r\n        if (epoch !== state.sessionEpoch) return;\r\n        reconcileOutbox(payload.messages || []);\r\n      } catch (error) {\r\n        if (epoch !== state.sessionEpoch) return;\r\n        if (error.status === 401) { clearPrivateState(); requestAuthentication(send, 'messages_send'); return; }\r\n      }\r\n      if (epoch !== state.sessionEpoch) return;\r\n      if (!state.outbox.includes(row)) { if(state.selected?.threadId === row.threadId) void openThread(state.selected, {quiet:true}); return; }\r\n      row.status = 'queued'; row.error = ''; saveSession(); refreshLocalThread(row.threadId); void drainOutbox(row.threadId);\r\n    } finally {\r\n      state.verifyingMessages.delete(key);\r\n      if (epoch === state.sessionEpoch) refreshLocalThread(row.threadId);\r\n    }\r\n  }\r\n\r\n  function updateComposer() {\r\n    const unavailable = state.authExpired || !state.threadReady || state.selected?.readOnly || state.selected?.conversationKind === 'florame';\r\n    send.disabled = !draft.value.trim() || state.busy || unavailable;\r\n    send.setAttribute('aria-busy', String(state.busy));\r\n    send.setAttribute('aria-label', state.busy ? 'Invio del messaggio\u2026' : 'Invia messaggio');\r\n    draft.disabled = !!unavailable;\r\n    resizeComposer();\r\n  }\r\n\r\n  function resizeComposer() {\r\n    if (!draft.getClientRects().length) return;\r\n    const style = getComputedStyle(draft);\r\n    const border = parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth);\r\n    const previousScroll = draft.scrollTop;\r\n    draft.style.overflowY = 'hidden';\r\n    draft.style.height = 'auto';\r\n    const height = draft.scrollHeight + border;\r\n    draft.style.height = `${Math.min(120, Math.max(48, height))}px`;\r\n    draft.style.overflowY = height > 120 ? 'auto' : 'hidden';\r\n    if (height > 120) draft.scrollTop = previousScroll;\r\n  }\r\n\r\n  function updateLatest() {\r\n    const nearBottom = scrollNode.scrollHeight - scrollNode.scrollTop - scrollNode.clientHeight < 100;\r\n    if (nearBottom) state.newMessages = 0;\r\n    if (latest) {\r\n      latest.hidden = !state.threadReady || nearBottom;\r\n      latest.lastChild.textContent = state.newMessages ? (state.newMessages + (state.newMessages === 1 ? ' nuovo messaggio' : ' nuovi messaggi')) : 'Ultimi messaggi';\r\n    }\r\n  }\r\n\r\n  function jumpToLatest() {\r\n    scrollNode.scrollTo({ top: scrollNode.scrollHeight, behavior: reducedMotion() ? 'instant' : 'smooth' });\r\n  }\r\n\r\n  function renderPhoto(url, title, size = 92) {\r\n    const image = safeImage(url);\r\n    if (!image) return '';\r\n    const img = `<img src=\"${escapeHtml(image)}\" alt=\"${escapeHtml(title || 'Bouquet Florame')}\" width=\"${size}\" height=\"${size}\" loading=\"lazy\">`;\r\n    return `<button type=\"button\" class=\"florame-messages__photo\" style=\"--photo-size:${size}px\" data-messages-photo=\"${escapeHtml(image)}\" data-photo-title=\"${escapeHtml(title || 'Bouquet Florame')}\" aria-label=\"${escapeHtml(`Ingrandisci la foto: ${title || 'Bouquet Florame'}`)}\" aria-haspopup=\"dialog\">${window.FlorameImageVariants?.html(img, `${size}px`) || img}</button>`;\r\n  }\r\n\r\n  function openPhoto(button) {\r\n    const url = safeImage(button.dataset.messagesPhoto);\r\n    if (!photoSheet || !url) return;\r\n    // Safari pointer clicks may leave focus on the preceding summary.\r\n    rememberSheetOpener(photoSheet, button);\r\n    const image = $('[data-messages-photo-image]');\r\n    image.hidden = false;\r\n    $('[data-messages-photo-error]').hidden = true;\r\n    image.alt = button.dataset.photoTitle || 'Bouquet Florame';\r\n    image.src = url;\r\n    $('[data-messages-photo-title]').textContent = image.alt;\r\n    photoSheet.hidden = false;\r\n    document.body.classList.add('florame-messages-overlay-open');\r\n    document.documentElement.style.overflow = 'hidden';\r\n    requestAnimationFrame(() => $('.florame-messages__sheet-panel', photoSheet)?.focus());\r\n  }\r\n\r\n  function closePhoto() {\r\n    if (!photoSheet) return;\r\n    photoSheet.hidden = true;\r\n    restoreSheetOpener(photoSheet);\r\n    if ([orderSheet, detailsSheet, settings].every(sheet => !sheet || sheet.hidden)) {\r\n      document.body.classList.remove('florame-messages-overlay-open');\r\n      document.documentElement.style.removeProperty('overflow');\r\n    }\r\n  }\r\n\r\n  function setMessageStatus(message) {\r\n    status.textContent = message;\r\n    const threadStatus = $('[data-messages-thread-status]');\r\n    if (threadStatus) threadStatus.textContent = message;\r\n  }\r\n\r\n  function escapeHtml(value) {\r\n    return String(value ?? '').replace(/[&<>'\"]/g, (character) => ({\r\n      '&': '&amp;', '<': '&lt;', '>': '&gt;', \"'\": '&#39;', '\"': '&quot;'\r\n    })[character]);\r\n  }\r\n\r\n  function safeImage(value) {\r\n    if (!String(value || '').trim()) return '';\r\n    try {\r\n      const url = new URL(String(value || ''), location.origin);\r\n      return /^https?:$/.test(url.protocol) ? url.href : '';\r\n    } catch (_) { return ''; }\r\n  }\r\n\r\n  function safeUrl(value) {\r\n    if (!String(value || '').trim()) return '';\r\n    try {\r\n      const url = new URL(String(value || ''), location.origin);\r\n      return /^https?:$/.test(url.protocol) ? url.href : '';\r\n    } catch (_) { return ''; }\r\n  }\r\n\r\n  function initials(name) {\r\n    return String(name || 'F').split(/\\s+/).filter(Boolean).slice(0, 2).map((part) => part[0]).join('').toUpperCase();\r\n  }\r\n\r\n  function avatar(threadData, compact = false) {\r\n    const isFlorame = threadData?.conversationKind === 'florame';\r\n    const image = safeImage(threadData?.partnerAvatarUrl);\r\n    const className = `${compact ? 'florame-messages__thread-avatar' : 'florame-messages__avatar'}${isFlorame ? ' florame-messages__avatar--florame' : ''}`;\r\n    if (image) return `<span class=\"${className}\">${window.FlorameImageVariants?.html(`<img src=\"${escapeHtml(image)}\" alt=\"\" width=\"64\" height=\"64\" loading=\"lazy\">`, \"64px\") || `<img src=\"${escapeHtml(image)}\" alt=\"\" width=\"64\" height=\"64\" loading=\"lazy\">`}</span>`;\r\n    return `<span class=\"${className}\" aria-hidden=\"true\">${escapeHtml(initials(threadData?.partnerName))}</span>`;\r\n  }\r\n\r\n  function relativeTime(value) {\r\n    const time = Date.parse(value || '');\r\n    if (!Number.isFinite(time)) return '';\r\n    const minutes = Math.max(0, Math.floor((Date.now() - time) / 60000));\r\n    if (minutes < 2) return 'Ora';\r\n    if (minutes < 60) return `${minutes} min`;\r\n    const hours = Math.floor(minutes / 60);\r\n    if (hours < 24) return `${hours} h`;\r\n    const date = new Date(time);\r\n    if (hours < 48) return 'Ieri';\r\n    return date.toLocaleDateString(getLocale(), { day: '2-digit', month: '2-digit', year: date.getFullYear() === new Date().getFullYear() ? undefined : '2-digit' });\r\n  }\r\n\r\n  function formatPrice(cents, currency = 'EUR') {\r\n    return new Intl.NumberFormat(getLocale(), { style: 'currency', currency: currency || 'EUR' })\r\n      .format(Math.max(0, Number(cents || 0)) / 100);\r\n  }\r\n\r\n  function materialLabel(value) {\r\n    const colors = {lightpink:'rosa chiaro',white:'bianco',pink:'rosa',red:'rosso',yellow:'giallo',orange:'arancione',green:'verde',blue:'blu',skyblue:'azzurro',purple:'viola',fuchsia:'fucsia'};\r\n    return String(value || '').replace(/\\b(lightpink|white|pink|red|yellow|orange|green|blue|skyblue|purple|fuchsia)\\b/gi, color => colors[color.toLowerCase()]);\r\n  }\r\n\r\n  function renderProposalCard(proposal = {}) {\r\n    const image = safeImage(proposal.imageUrl);\r\n    const expired = proposal.expiresAt && Date.parse(proposal.expiresAt) <= Date.now() && ['available','sent','viewed','checkout_started','payment_failed'].includes(proposal.status);\r\n    const status = expired ? 'expired' : proposal.status || 'sent';\r\n    const actionable = ['available', 'sent', 'viewed', 'checkout_started', 'payment_failed'].includes(status);\r\n    const composition = (Array.isArray(proposal.composition) ? proposal.composition : [])\r\n      .filter((item) => item?.label)\r\n      .map((item) => `${Math.max(1, Number(item.quantity || 1))}\u00D7 ${item.label}${item.color && !item.label.toLowerCase().includes(String(item.color).toLowerCase()) ? ` \u00B7 ${item.color}` : ''}`)\r\n      .slice(0, 30);\r\n    const packaging = [proposal.packaging?.paper, proposal.packaging?.ribbon, ...(proposal.packaging?.decorations || [])].filter(Boolean);\r\n    const flowerCount = (proposal.composition || []).reduce((sum, item) => sum + Math.max(1, Number(item.quantity || 1)), 0);\r\n    const statusCopy = {\r\n      accepted: 'Proposta confermata',\r\n      declined: 'Proposta non accettata',\r\n      expired: 'Proposta scaduta',\r\n      payment_processing: 'Pagamento in verifica',\r\n      payment_failed: 'Puoi riprovare il checkout',\r\n      checkout_started: 'Riepilogo pronto da rivedere',\r\n      superseded: 'Sostituita da una nuova proposta',\r\n      unavailable: 'Proposta non disponibile'\r\n    }[status] || 'Nuova proposta del fiorista';\r\n    return `<article class=\"florame-messages__proposal\" data-proposal-state=\"${escapeHtml(status)}\" data-proposal-id=\"${escapeHtml(proposal.proposalId || '')}\">\r\n      <div class=\"florame-messages__proposal-head\">\r\n        ${image ? renderPhoto(image, proposal.title) : '<span class=\"florame-messages__proposal-placeholder\" aria-label=\"Foto non disponibile\">\u273F</span>'}\r\n        <span class=\"florame-messages__proposal-copy\"><small>${escapeHtml(statusCopy)}</small><strong>${escapeHtml(proposal.title || 'Bouquet su misura')}</strong><b>${escapeHtml(formatPrice(proposal.priceCents, proposal.currency))}</b><small>Prezzo del bouquet</small></span>\r\n      </div>\r\n      ${actionable && proposal.expiresAt && Number.isFinite(Date.parse(proposal.expiresAt)) ? `<p class=\"florame-messages__proposal-expiry\">Disponibile fino al ${escapeHtml(new Date(proposal.expiresAt).toLocaleString(getLocale(), {day:'numeric',month:'short',hour:'2-digit',minute:'2-digit'}))}</p>` : ''}\r\n      ${composition.length ? `<details class=\"florame-messages__proposal-detail\"><summary>Composizione \u00B7 ${flowerCount} steli</summary><p>${composition.map(escapeHtml).join(' \u00B7 ')}</p></details>` : ''}\r\n      ${packaging.length ? `<details class=\"florame-messages__proposal-detail\"><summary>Carta, nastro e decorazioni</summary><p>${packaging.map(escapeHtml).join(' \u00B7 ')}</p></details>` : ''}\r\n      ${proposal.description || proposal.shortDescription ? `<details class=\"florame-messages__proposal-detail\"><summary>Il bouquet in dettaglio</summary><p>${escapeHtml(proposal.description || proposal.shortDescription)}</p></details>` : ''}\r\n      ${proposal.financial?.originalAuthorizationReleased ? `<p class=\"florame-messages__proposal-safe\">${escapeHtml(proposalPaymentCopy())} Rivedi consegna e totale prima di continuare.</p>` : ''}\r\n      ${actionable && proposal.proposalId ? `<div class=\"florame-messages__proposal-actions\"><button type=\"button\" data-proposal-action=\"decline\">Non accetto</button><button type=\"button\" data-proposal-action=\"checkout\">Rivedi e continua</button></div>` : ''}\r\n      ${status === 'accepted' && /^\\d+$/.test(String(proposal.replacementOrderId || '')) ? `<a class=\"florame-messages__event-action is-primary\" href=\"/pages/florame-order?orderId=${encodeURIComponent(proposal.replacementOrderId)}\">Apri il nuovo ordine</a>` : ''}\r\n      ${['declined','expired','superseded','unavailable','payment_failed'].includes(status) ? '<button type=\"button\" class=\"florame-messages__proposal-support\" data-proposal-support>Troviamo una soluzione \u00B7 Assistenza</button>' : ''}\r\n      ${status === 'accepted' && proposal.coupon?.code && Number(proposal.coupon.percentage) > 0 && (!proposal.coupon.expiresAt || Date.parse(proposal.coupon.expiresAt) > Date.now()) ? `<details class=\"florame-messages__proposal-coupon\"><summary>Il tuo vantaggio \u00B7 ${escapeHtml(proposal.coupon.percentage)}%</summary><p>Codice <strong>${escapeHtml(proposal.coupon.code)}</strong>${proposal.coupon.expiresAt ? ` \u00B7 Valido fino al ${escapeHtml(new Date(proposal.coupon.expiresAt).toLocaleDateString(getLocale()))}` : ''}</p></details>` : ''}\r\n    </article>`;\r\n  }\r\n\r\n  function proposalPaymentCopy() {\r\n    const status = state.selected?.orderDetail?.payment?.status;\r\n    if (status === 'refunded') return 'Il rimborso del pagamento iniziale \u00E8 stato disposto sul metodo originale. I tempi di accredito dipendono dal gestore del pagamento.';\r\n    if (status === 'voided') return 'Il pagamento iniziale \u00E8 stato annullato. I tempi di sblocco dell\u2019importo dipendono dal gestore del pagamento.';\r\n    if (status === 'partially_refunded') return 'Il pagamento iniziale risulta rimborsato in parte. Consulta gli importi nei dettagli dell\u2019ordine.';\r\n    return 'Abbiamo avviato l\u2019annullamento del pagamento iniziale. L\u2019importo viene sbloccato o rimborsato, secondo il metodo usato.';\r\n  }\r\n\r\n  function proposalSlotKey(value) {\r\n    const time = String(value || '').toLowerCase();\r\n    if (time.includes('matt') || time.includes('09') || time.includes('12')) return 'morning';\r\n    if (time.includes('pomer') || time.includes('14') || time.includes('17')) return 'afternoon';\r\n    if (time.includes('sera') || time.includes('18') || time.includes('21')) return 'evening';\r\n    return time;\r\n  }\r\n\r\n  async function checkoutProposal(button, proposalId) {\r\n    if (demoMode) return demo.note();\r\n    if(state.proposalBusy || state.authExpired || !proposalId) return;\r\n    state.proposalBusy = true;\r\n    button.disabled = true;\r\n    button.setAttribute('aria-busy', 'true');\r\n    button.textContent = 'Preparo il riepilogo\u2026';\r\n    setMessageStatus('');\r\n    const epoch = state.sessionEpoch;\r\n    let originalCart = null;\r\n    let cartMutationStarted = false;\r\n    let proposalAttributes = {};\r\n    const cartRequest = async (path, body) => {\r\n      if (epoch !== state.sessionEpoch) throw new Error('SESSION_CHANGED');\r\n      const controller = new AbortController();\r\n      const timeout = setTimeout(() => controller.abort(), 15000);\r\n      try {\r\n      const response = await fetch(path, {\r\n        method: body === undefined ? 'GET' : 'POST', credentials: 'same-origin', cache: 'no-store',\r\n        signal: controller.signal,\r\n        headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\r\n        ...(body === undefined ? {} : { body: JSON.stringify(body) })\r\n      });\r\n      const result = await response.json();\r\n      if (!response.ok) throw new Error(result?.description || 'PROPOSAL_CART_UPDATE_FAILED');\r\n      return result;\r\n      } finally { clearTimeout(timeout); }\r\n    };\r\n    try {\r\n      setMessageStatus('Verifico la proposta\u2026');\r\n      const payload = await request('proposal_checkout', { method: 'POST', body: { proposalId } });\r\n      const checkout = payload.checkout || {};\r\n      if (!/^\\d+$/.test(String(checkout.variantId || ''))) throw new Error('PROPOSAL_VARIANT_UNAVAILABLE');\r\n      const currentCart = await cartRequest('/cart.js');\r\n      if (!Array.isArray(currentCart.items)) throw new Error('PROPOSAL_CART_UNAVAILABLE');\r\n      if (Number(currentCart.item_count || 0) > 0 && !await confirmChoice('Per continuare con la proposta sostituiremo i prodotti nel carrello attuale. Potrai rivedere consegna e totale prima del pagamento.', 'Usa questa proposta')) { setMessageStatus(''); return; }\r\n      if (epoch !== state.sessionEpoch) return;\r\n      originalCart = currentCart;\r\n      proposalAttributes = checkout.cartAttributes || {};\r\n      setMessageStatus('Preparo il tuo carrello\u2026');\r\n      cartMutationStarted = true;\r\n      await cartRequest('/cart/clear.js', {});\r\n      await cartRequest('/cart/add.js', { id: Number(checkout.variantId), quantity: Number(checkout.quantity || 1), properties: checkout.lineProperties || {} });\r\n      await cartRequest('/cart/update.js', {\r\n        attributes: { ...Object.fromEntries(Object.keys(currentCart.attributes || {}).map(key => [key, ''])), ...checkout.cartAttributes }\r\n      });\r\n      if (epoch !== state.sessionEpoch) return;\r\n      const resume = checkout.deliveryResume || {};\r\n      const deliveryAttributes = checkout.cartAttributes || {};\r\n      const intent = {\r\n        version: 1,\r\n        deliveryType: resume.method || 'delivery',\r\n        selectedDate: /^\\d{4}-\\d{2}-\\d{2}$/.test(String(resume.date || '')) ? resume.date : '',\r\n        selectedTimeSlot: proposalSlotKey(resume.time),\r\n        address: resume.address ? { display: resume.address, fullAddress: resume.address } : {},\r\n        deliveryDetails: {\r\n          apartment: deliveryAttributes.Interno || '',\r\n          staircase: deliveryAttributes.Scala || '',\r\n          floor: deliveryAttributes.Piano || '',\r\n          intercom: deliveryAttributes.Citofono || deliveryAttributes.Campanello || '',\r\n          notes: deliveryAttributes['Note indirizzo'] || ''\r\n        },\r\n        source: 'counter_proposal',\r\n        proposalId,\r\n        savedAt: Date.now()\r\n      };\r\n      [window.sessionStorage, window.localStorage].forEach((storage) => {\r\n        try { storage.setItem('florame_delivery_intent_v1', JSON.stringify(intent)); } catch (_) {}\r\n      });\r\n      try { sessionStorage.setItem('florame_counter_proposal_resume_v1', JSON.stringify({ proposalId, checkout, intent, savedAt: Date.now() })); } catch (_) {}\r\n      location.href = `/cart?proposal=${encodeURIComponent(proposalId)}&review=delivery`;\r\n    } catch (error) {\r\n      if (epoch !== state.sessionEpoch) return;\r\n      let restored = false;\r\n      if (cartMutationStarted && originalCart) {\r\n        try {\r\n          await cartRequest('/cart/clear.js', {});\r\n          const items = originalCart.items.map(item => ({\r\n            id: item.variant_id || item.id, quantity: item.quantity, properties: item.properties || {},\r\n            ...(item.selling_plan_allocation?.selling_plan?.id ? { selling_plan: item.selling_plan_allocation.selling_plan.id } : {})\r\n          }));\r\n          if (items.length) await cartRequest('/cart/add.js', { items });\r\n          await cartRequest('/cart/update.js', {\r\n            attributes: { ...Object.fromEntries(Object.keys(proposalAttributes).map(key => [key, ''])), ...originalCart.attributes },\r\n            note: originalCart.note || ''\r\n          });\r\n          restored = true;\r\n        } catch (_) { /* Keep the customer here if cart recovery also fails. */ }\r\n      }\r\n      setMessageStatus(error?.message === 'proposal_expired' ? 'Questa proposta \u00E8 scaduta.'\r\n        : error?.message === 'proposal_product_changed' ? 'Il bouquet della proposta \u00E8 cambiato. Scrivi qui per ricevere una proposta aggiornata.'\r\n        : restored ? 'Non siamo riusciti a preparare la proposta. Il carrello precedente \u00E8 stato ripristinato: puoi riprovare.'\r\n          : cartMutationStarted ? 'Non siamo riusciti a completare il cambio. Apri il carrello e controlla i prodotti prima di riprovare.'\r\n            : 'Non riusciamo ad aprire il riepilogo. Riprova tra poco.');\r\n      if (cartMutationStarted && !restored) {\r\n        const actions = document.createElement('span'); actions.className = 'florame-messages__recovery';\r\n        actions.innerHTML = '<a href=\"/cart\">Controlla il carrello</a><button type=\"button\" data-proposal-support>Chiedi assistenza</button>';\r\n        $('[data-messages-thread-status]').append(actions);\r\n      }\r\n    } finally {\r\n      state.proposalBusy = false;\r\n      button.disabled = false;\r\n      button.removeAttribute('aria-busy');\r\n      button.textContent = 'Rivedi e continua';\r\n    }\r\n  }\r\n\r\n  async function declineProposal(button, proposalId) {\r\n    if(state.proposalBusy || state.authExpired || !proposalId) return;\r\n    const epoch = state.sessionEpoch, threadId = state.selected?.threadId;\r\n    state.proposalBusy = true;\r\n    if (!await confirmChoice('Vuoi rifiutare questa proposta? Non avvierai un nuovo pagamento.', 'Non accetto la proposta')) { state.proposalBusy = false; return; }\r\n    if (epoch !== state.sessionEpoch) { state.proposalBusy = false; return; }\r\n    button.disabled = true;\r\n    try {\r\n      await request('proposal_decline', { method: 'POST', body: { proposalId } });\r\n      state.proposalBusy = false;\r\n      if (epoch === state.sessionEpoch && state.selected?.threadId === threadId) await openThread(state.selected, { quiet: true });\r\n    } catch (_) {\r\n      button.disabled = false;\r\n      setMessageStatus('Non riesco a registrare la scelta. Riprova.');\r\n    } finally { state.proposalBusy = false; }\r\n  }\r\n\r\n  function renderConversationEvent(event = {}) {\r\n    const stateName = String(event.state || 'open').replace(/[^a-z_]/g, '') || 'open';\r\n    const positive = ['accepted', 'captured', 'approved', 'prepared', 'fulfilled', 'resolved'].includes(stateName);\r\n    const warning = ['failed', 'change_requested', 'cancelled'].includes(stateName);\r\n    const icon = positive\r\n      ? '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"m5 12 4 4L19 6\"/></svg>'\r\n      : warning\r\n        ? '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 8v5m0 3h.01M10.3 4.7 2.8 18a2 2 0 0 0 1.7 3h15a2 2 0 0 0 1.7-3L13.7 4.7a2 2 0 0 0-3.4 0Z\"/></svg>'\r\n        : '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 7v5l3 2\"/></svg>';\r\n    const actions = (Array.isArray(event.actions) ? event.actions : []).map((action) => {\r\n      const href = safeUrl(action.href);\r\n      const className = `florame-messages__event-action is-${escapeHtml(action.style || 'secondary')}`;\r\n      if (action.enabled === false) return `<button class=\"${className}\" type=\"button\" disabled>${escapeHtml(action.label || 'Apri')}</button>`;\r\n      if (href) return `<a class=\"${className}\" href=\"${escapeHtml(href)}\">${escapeHtml(action.label || 'Apri')}</a>`;\r\n      return `<button class=\"${className}\" type=\"button\" data-message-event-action=\"${escapeHtml(action.action || action.id || '')}\">${escapeHtml(action.label || 'Apri')}</button>`;\r\n    }).join('');\r\n    const amount = Number(event.amountCents || 0) > 0 ? `<span>${escapeHtml(formatPrice(event.amountCents, event.currency))}</span>` : '';\r\n    return `<article class=\"florame-messages__event is-${escapeHtml(stateName)}\">\r\n      <i class=\"florame-messages__event-icon\">${icon}</i>\r\n      <div class=\"florame-messages__event-copy\"><strong>${escapeHtml(event.title || 'Aggiornamento')}</strong>${event.detail ? `<p>${escapeHtml(event.detail)}</p>` : ''}${amount}${actions ? `<div class=\"florame-messages__event-actions\">${actions}</div>` : ''}</div>\r\n    </article>`;\r\n  }\r\n\r\n  function contextLabel(item) {\r\n    if (item?.conversationKind === 'florame') return 'Aggiornamenti Florame';\r\n    if (item?.contextType === 'request') return `Richiesta${item.orderNumber ? ` \u00B7 ${item.orderNumber}` : ''}`;\r\n    if (item?.contextType === 'order') return `Ordine${item.orderNumber ? ` \u00B7 ${item.orderNumber}` : ''}`;\r\n    return 'Conversazione con il fiorista';\r\n  }\r\n\r\n  function requestState(item) {\r\n    if (item?.orderDetail?.lifecycle) return [item.orderDetail.lifecycle.label,item.orderDetail.lifecycle.description];\r\n    const phase = item?.orderDetail?.status;\r\n    if (phase === 'prepared') return ['Bouquet pronto', 'La preparazione \u00E8 terminata \u00B7 segui la consegna nei dettagli'];\r\n    if (phase === 'fulfilled') return ['Preparazione completata', 'Consulta nei dettagli lo stato del ritiro o della consegna'];\r\n    if (phase === 'replaced') return ['Ordine sostituito', 'Questa \u00E8 la conversazione dell\u2019ordine iniziale'];\r\n    const value = String(item?.requestStatus || '').toLowerCase();\r\n    const states = {\r\n      awaiting_partner: ['Richiesta inviata', 'In attesa della conferma del fiorista'],\r\n      awaiting_manual_florist: ['Richiesta inviata', 'Florame sta cercando un fiorista per la tua consegna'],\r\n      accepted: ['Richiesta confermata', 'Il fiorista ha accettato \u00B7 pagamento acquisito'],\r\n      cancelled: ['Ordine annullato', 'Consulta il pagamento e l\u2019eventuale rimborso nei dettagli'],\r\n      declined: ['Richiesta non accettata', 'Importo in annullamento o rimborso'],\r\n      expired: ['Richiesta scaduta', 'Importo in annullamento o rimborso'],\r\n      counter_proposed: ['Hai una nuova proposta', 'Nuovo pagamento solo se decidi di continuare'],\r\n      proposal_declined: ['Proposta non accettata', 'Nessun nuovo addebito'],\r\n      proposal_expired: ['Proposta scaduta', 'Nessun nuovo addebito'],\r\n      payment_processing: ['Conferma pagamento', 'Il fiorista ha accettato \u00B7 pagamento in verifica'],\r\n      payment_failed: ['Pagamento da verificare', 'Segui le indicazioni nello stato ufficiale dell\u2019ordine']\r\n    };\r\n    return states[value] || ['Richiesta al fiorista', 'Stato aggiornato da Florame'];\r\n  }\r\n\r\n  function requestGuide(item) {\r\n    if (item?.orderDetail?.lifecycle?.guide) return item.orderDetail.lifecycle.guide;\r\n    const phase = item?.orderDetail?.status;\r\n    if (phase === 'prepared') return ['Richiesta accettata', 'Bouquet pronto', 'Controlla lo stato della consegna nei dettagli'];\r\n    if (phase === 'fulfilled') return ['Richiesta accettata', 'Preparazione completata', 'Consulta consegna e assistenza nei dettagli'];\r\n    if (phase === 'replaced') return ['Ordine iniziale sostituito', 'La nuova proposta ha un ordine dedicato', 'Segui il nuovo ordine dai tuoi ordini'];\r\n    const value = String(item?.requestStatus || '').toLowerCase();\r\n    if (value === 'cancelled') return ['Ordine annullato', 'Preparazione e consegna interrotte', 'Controlla nei dettagli lo stato del pagamento'];\r\n    if (value === 'counter_proposed') {\r\n      return ['Controlla il nuovo bouquet e il prezzo', 'Rivedi consegna e totale', 'Continua al nuovo checkout solo se accetti'];\r\n    }\r\n    if (value === 'proposal_declined' || value === 'proposal_expired') {\r\n      return ['Proposta conclusa', 'Nessun nuovo addebito', 'Scrivici per valutare un\u2019altra soluzione'];\r\n    }\r\n    if (value === 'accepted') {\r\n      return ['Richiesta accettata', 'Pagamento acquisito', 'Il fiorista prepara il tuo ordine'];\r\n    }\r\n    if (value === 'declined' || value === 'expired') {\r\n      return ['Richiesta conclusa', 'Importo in annullamento o rimborso', 'I tempi dipendono dal metodo di pagamento'];\r\n    }\r\n    if (value === 'payment_processing' || value === 'payment_failed') {\r\n      return ['Richiesta accettata', 'Pagamento in verifica', 'Non inviare una seconda richiesta'];\r\n    }\r\n    return ['Richiesta inviata', 'Il fiorista risponde qui', 'Controlla qui la conferma dell\u2019ordine'];\r\n  }\r\n\r\n  async function request(action, { method = 'GET', query = {}, body = null } = {}) {\r\n    if (demoMode) return demo.request(action, { ...query, ...body });\r\n    const url = new URL(apiPath, location.origin);\r\n    url.searchParams.set('action', action);\r\n    Object.entries(query).forEach(([key, value]) => {\r\n      if (value !== '' && value != null) url.searchParams.set(key, String(value));\r\n    });\r\n    const controller = new AbortController();\r\n    const timer = setTimeout(() => controller.abort(), 15000);\r\n    try {\r\n      const response = await fetch(url.toString(), {\r\n        method,\r\n        credentials: 'same-origin',\r\n        cache: 'no-store',\r\n        headers: body ? { 'Content-Type': 'application/json', Accept: 'application/json' } : { Accept: 'application/json' },\r\n        body: body ? JSON.stringify({ action, ...body }) : undefined,\r\n        signal: controller.signal\r\n      });\r\n      const payload = await response.json().catch(() => ({}));\r\n      if (response.status === 401) throw Object.assign(new Error(payload.error || 'LOGIN_REQUIRED'), { status: 401 });\r\n      if (!response.ok || payload?.success === false) throw Object.assign(new Error(payload?.error || 'MESSAGES_UNAVAILABLE'), { status: response.status, retryAfterMs: Number(payload?.retryAfterMs || 0) });\r\n      return payload;\r\n    } finally { clearTimeout(timer); }\r\n  }\r\n\r\n  function requestAuthentication(trigger, intent = 'messages_inbox') {\r\n    if (demoMode) return demo.note();\r\n    const returnTo = `${location.pathname}${location.search}${location.hash}`;\r\n    if (window.FlorameAccountCenter?.requestAuth) {\r\n      window.FlorameAccountCenter.requestAuth({ intent, returnTo, trigger: trigger || null });\r\n      return;\r\n    }\r\n    window.__floramePendingAuthRequest = { intent, returnTo, trigger: trigger || null };\r\n    window.dispatchEvent(new CustomEvent('florame:request-auth', {\r\n      detail: { intent, returnTo, trigger: trigger || null }\r\n    }));\r\n  }\r\n\r\n  function loginState() {\r\n    state.threads = [{\r\n      threadId: 'florame-welcome-guest',\r\n      conversationKind: 'florame',\r\n      contextType: 'announcement',\r\n      partnerName: 'Florame',\r\n      lastMessage: 'Benvenuto in Florame: qui troverai aggiornamenti utili, offerte e tutorial.',\r\n      updatedAt: new Date().toISOString(),\r\n      readOnly: true,\r\n      guestStatic: true\r\n    }];\r\n    renderList();\r\n    list.insertAdjacentHTML('beforeend', `<div class=\"florame-messages__empty florame-messages__auth-gate\"><h2>Le tue conversazioni, al sicuro</h2><p>Accedi per scrivere ai fioristi e seguire richieste e ordini.</p><button class=\"florame-messages__save\" type=\"button\" data-messages-auth data-florame-auth-trigger data-florame-auth-intent=\"messages_inbox\">Accedi o registrati</button></div>`);\r\n    if (matchMedia('(min-width: 900px)').matches) openThread(state.threads[0], { quiet: true });\r\n    if (initialOrderId || new URL(location.href).searchParams.get('thread')) {\r\n      requestAnimationFrame(() => requestAuthentication(null, 'messages_private_thread'));\r\n    }\r\n    setMessageStatus('');\r\n  }\r\n\r\n  function sortThreads(items) {\r\n    return [...items].sort((a, b) => {\r\n      if (a.conversationKind === 'florame' && b.conversationKind !== 'florame') return -1;\r\n      if (b.conversationKind === 'florame' && a.conversationKind !== 'florame') return 1;\r\n      return String(b.updatedAt || b.lastMessageAt || '').localeCompare(String(a.updatedAt || a.lastMessageAt || ''));\r\n    });\r\n  }\r\n\r\n  const mergeRows = (before, rows, key) => [...new Map([...before, ...rows].map(row => [row[key], row])).values()];\r\n  function appendMoreThreads() {\r\n    if (!state.listCursor) return;\r\n    list.insertAdjacentHTML('beforeend', '<button type=\"button\" class=\"florame-messages__save\" data-more-threads>Altre conversazioni</button>');\r\n    $('[data-more-threads]', list).addEventListener('click', async event => { event.currentTarget.disabled = true; await loadInbox({ cursor: state.listCursor }); });\r\n  }\r\n  async function olderMessages() {\r\n    if (state.pageBusy || !state.messagesCursor || !state.selected) return;\r\n    state.pageBusy = true;\r\n    const control = $('[data-older-messages]', messagesNode);\r\n    if (control) { control.disabled = true; control.textContent = 'Carico\u2026'; }\r\n    const id = state.selected.threadId, sequence = state.openSequence;\r\n    try {\r\n      const payload = await request('thread', { query: { threadId: id, messagesCursor: state.messagesCursor } });\r\n      if (state.selected?.threadId !== id || sequence !== state.openSequence) return;\r\n      state.messages = mergeRows(payload.messages || [], state.messages, 'messageId');\r\n      state.messagesCursor = payload.messagesCursor || '';\r\n      state.historyExpanded = true;\r\n      renderMessages({ prepend: true });\r\n    } catch { setMessageStatus('Non riusciamo a caricare i messaggi precedenti. Riprova.'); }\r\n    finally { state.pageBusy = false; if (control?.isConnected) { control.disabled = false; control.textContent = 'Messaggi precedenti'; } }\r\n  }\r\n\r\n  function renderList() {\r\n    const query = state.search.toLocaleLowerCase('it');\r\n    const visible = sortThreads(state.threads).filter((item) => (state.filter !== 'unread' || Number(item.customerUnreadCount) > 0) && (state.filter !== 'orders' || ['request', 'order'].includes(item.contextType)) && (!query || [item.partnerName, item.lastMessage, contextLabel(item)].join(' ').toLocaleLowerCase('it').includes(query)));\r\n    if (!visible.length) {\r\n      list.innerHTML = `<div class=\"florame-messages__empty\"><strong>Nessuna conversazione trovata</strong><p>Prova con un altro nome o messaggio.</p></div>`;\r\n      appendMoreThreads();\r\n      return;\r\n    }\r\n    list.innerHTML = visible.map((item) => {\r\n      const florame = item.conversationKind === 'florame';\r\n      const preview = item.lastMessage || (item.contextType === 'request' ? 'Segui qui la richiesta al fiorista' : 'Apri la conversazione');\r\n      const privatePreview = item.lastMessage && !florame && !['system', 'florame'].includes(item.lastMessageSender);\r\n      return `<button class=\"florame-messages__row${state.selected?.threadId === item.threadId ? ' is-active' : ''}\" aria-current=\"${state.selected?.threadId === item.threadId ? 'true' : 'false'}\" type=\"button\" data-thread-id=\"${escapeHtml(item.threadId)}\">\r\n        ${avatar(item)}\r\n        <span class=\"florame-messages__row-copy\">\r\n          <span class=\"florame-messages__row-title\"><strong>${escapeHtml(item.partnerName || 'Fiorista Florame')}</strong>${florame ? '<i class=\"florame-messages__verified\" title=\"Canale ufficiale Florame\">\u2713</i>' : ''}</span>\r\n          <span class=\"florame-messages__preview\"${privatePreview ? ' translate=\"no\" data-florame-no-translate' : ''}>${escapeHtml(preview)}</span>\r\n          <span class=\"florame-messages__meta\">${escapeHtml(contextLabel(item))}</span>\r\n        </span>\r\n        <span class=\"florame-messages__row-side\"><time>${escapeHtml(relativeTime(item.lastMessageAt || item.updatedAt))}</time>${Number(item.customerUnreadCount || 0) ? `<i class=\"florame-messages__unread\">${Math.min(99, Number(item.customerUnreadCount))}</i>` : ''}</span>\r\n      </button>`;\r\n    }).join('');\r\n    appendMoreThreads();\r\n    $$('[data-thread-id]', list).forEach((button) => button.addEventListener('click', () => {\r\n      const selected = state.threads.find((item) => item.threadId === button.dataset.threadId);\r\n      if (selected) openThread(selected);\r\n    }));\r\n  }\r\n\r\n  function renderContext(item) {\r\n    const node = $('[data-messages-context]');\r\n    // Message previews/unread receipts do not change the bouquet. Preserve the\r\n    // card, photo opener and entry animation until its actual order data changes.\r\n    const signature = JSON.stringify(item && {locale:getLocale(), threadId:item.threadId, contextType:item.contextType, requestStatus:item.requestStatus, requestSummary:item.requestSummary, requestResponseDeadlineAt:item.requestResponseDeadlineAt, orderId:item.orderId, orderNumber:item.orderNumber, orderDetail:item.orderDetail});\r\n    if (node.__contextSignature === signature) return;\r\n    const sameThread = node.dataset.contextThread === item?.threadId;\r\n    const focusedDetail = sameThread && node.contains(document.activeElement) ? document.activeElement.closest('[data-bouquet-detail]')?.dataset.bouquetDetail : '';\r\n    const openDetails = sameThread ? [...node.querySelectorAll('details[open]')].map(el => el.dataset.bouquetDetail || 'more') : [];\r\n    node.dataset.contextThread = item?.threadId || '';\r\n    node.__contextSignature = signature;\r\n    if (!item || !['request', 'order'].includes(item.contextType)) {\r\n      node.hidden = true;\r\n      node.innerHTML = '';\r\n      $('[data-messages-product-shortcut]').hidden = true;\r\n      return;\r\n    }\r\n    const request = item.contextType === 'request';\r\n    const [title, subtitle] = request ? requestState(item) : ['Ordine Florame', `Ordine ${item.orderNumber || ''}`.trim()];\r\n    const summary = item.requestSummary || {};\r\n    const amount = summary.totalPrice ? new Intl.NumberFormat(getLocale(), { style: 'currency', currency: summary.currency || 'EUR' }).format(Number(String(summary.totalPrice).replace(',', '.')) || 0) : '';\r\n    const delivery = [summary.deliveryDate ? formatDeliveryDate(summary.deliveryDate) : '', summary.deliveryTime].filter(Boolean).join(' \u00B7 ');\r\n    const paymentLabel = item.orderDetail?.payment?.label || 'Pagamento da confermare';\r\n    const requestPolicy = item.orderDetail?.lifecycle?.policy || (['cancelled','declined','expired','proposal_declined','proposal_expired'].includes(item.requestStatus) ? 'Richiesta conclusa' : item.orderDetail?.status === 'replaced' ? 'Ordine iniziale sostituito' : item.requestStatus === 'accepted' ? 'Disponibilit\u00E0 confermata dal fiorista' : summary.requestKind === 'stock_confirmed'\r\n      ? 'Fiori verificati nello stock'\r\n      : 'Disponibilit\u00E0 da confermare');\r\n    const image = safeImage(summary.imageUrl);\r\n    const guide = request ? requestGuide(item) : [];\r\n    node.innerHTML = `<span class=\"florame-messages__context-kicker\">${request ? 'Richiesta al fiorista' : 'Ordine'}</span><h3>${escapeHtml(title)}</h3><div class=\"florame-messages__context-meta\"><span>${escapeHtml(subtitle)}</span>${item.requestResponseDeadlineAt && item.requestStatus === 'awaiting_partner' ? `<span>Risposta entro ${escapeHtml(new Date(item.requestResponseDeadlineAt).toLocaleString(getLocale(), { day: 'numeric', month: 'short', hour: '2-digit', minute: '2-digit' }))}</span>` : ''}</div>${request && (summary.title || image) ? `<div class=\"florame-messages__request-card\"><span><strong>${escapeHtml(summary.title || 'Bouquet Florame')}</strong>${delivery ? `<span>${escapeHtml(delivery)}</span>` : ''}<span>${escapeHtml(requestPolicy)}</span>${amount ? `<span>${escapeHtml(amount)} \u00B7 ${escapeHtml(paymentLabel)}</span>` : ''}</span>${image ? renderPhoto(image, summary.title, 74) : ''}</div>` : ''}${request ? `<ol class=\"florame-messages__request-flow\">${guide.map((step, index) => `<li><i>${index + 1}</i><span>${escapeHtml(step)}</span></li>`).join('')}</ol>` : ''}${item.orderDetail ? '<button class=\"florame-messages__context-open\" type=\"button\" data-messages-open-order>Apri ordine o richiesta <span aria-hidden=\"true\">\u203A</span></button>' : ''}`;\r\n    if (request) {\r\n      node.querySelector('.florame-messages__request-card')?.remove();\r\n      const composition = (summary.composition || []).filter(row => row.label);\r\n      const count = composition.reduce((sum, row) => sum + row.quantity, 0);\r\n      const packaging = [['Carta', summary.packaging?.paper], ['Nastro', summary.packaging?.ribbon], ['Decorazioni', (summary.packaging?.decorations || []).join(' \u00B7 ')]].filter(row => row[1]).map(([label,value]) => [label,materialLabel(value)]);\r\n      const svg = path => `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">${path}</svg>`;\r\n      const flowerIcon = svg('<path d=\"M12 5a3 3 0 1 1 3 3m-3-3a3 3 0 1 0-3 3m3-3v1M9 8a3 3 0 1 0 3 3M9 8h1m5 0a3 3 0 1 1-3 3m3-3h-1m-2 3v-1\"/><circle cx=\"12\" cy=\"8\" r=\"2\"/><path d=\"M12 10v12M12 22c4.2 0 7-1.667 7-5-4.2 0-7 1.667-7 5ZM12 22c-4.2 0-7-1.667-7-5 4.2 0 7 1.667 7 5Z\"/>');\r\n      const giftIcon = svg('<rect x=\"3\" y=\"8\" width=\"18\" height=\"4\" rx=\"1\"/><path d=\"M5 12v9h14v-9M12 8v13M12 8C4 8 5 1 9 3l3 5c8 0 7-7 3-5l-3 5\"/>');\r\n      const detail = (key, label, icon, body) => `<details data-bouquet-detail=\"${key}\" class=\"florame-messages__bouquet-detail\" ${openDetails.includes(key) ? 'open' : ''}><summary><i>${icon}</i><span>${label}</span><b aria-hidden=\"true\">\u2304</b></summary><div>${body}</div></details>`;\r\n      const article = document.createElement('article');\r\n      article.className = 'florame-messages__requested-bouquet'; article.dataset.requestedBouquet = ''; article.tabIndex = -1;\r\n      article.setAttribute('aria-label', 'Bouquet richiesto');\r\n      article.innerHTML = `<div class=\"florame-messages__bouquet-hero\">${image ? renderPhoto(image, summary.title, 108) : `<span class=\"florame-messages__bouquet-placeholder\" aria-label=\"Foto non disponibile\">${flowerIcon}</span>`}<div><small>Il bouquet richiesto</small><h4>${escapeHtml(summary.title || 'Bouquet su richiesta')}</h4>${count ? `<span class=\"florame-messages__bouquet-count\">${count} steli \u00B7 ${composition.length} ${composition.length === 1 ? 'variet\u00E0' : 'variet\u00E0'}</span>` : ''}<span class=\"florame-messages__bouquet-policy\">${escapeHtml(requestPolicy)}</span></div></div><div class=\"florame-messages__bouquet-facts\">${delivery ? `<span><small>${item.orderDetail?.delivery?.method === 'pickup' ? 'Ritiro' : 'Consegna'}</small><strong>${escapeHtml(delivery)}</strong></span>` : ''}${amount ? `<span><small>Totale ordine</small><strong>${escapeHtml(amount)}</strong><em>${escapeHtml(paymentLabel)}</em></span>` : ''}</div>${detail('composition', count ? `Composizione \u00B7 ${count} steli` : 'Composizione', flowerIcon, composition.length ? `<ul>${composition.map(row => `<li><b>${row.quantity}\u00D7</b><span>${escapeHtml(row.label)}${row.color && !row.label.toLowerCase().includes(row.color.toLowerCase()) ? `<small>${escapeHtml(row.color)}</small>` : ''}</span></li>`).join('')}</ul>` : '<p>La composizione non \u00E8 presente nel riepilogo di questa richiesta. Puoi chiederla al fiorista nella chat.</p>')}${detail('packaging', 'Carta, nastro e decorazioni', giftIcon, packaging.length ? `<dl>${packaging.map(([label, value]) => `<div><dt>${label}</dt><dd>${escapeHtml(value)}</dd></div>`).join('')}</dl>` : '<p>Confezione e decorazioni non sono specificate in questa richiesta. Concordale con il fiorista nella chat.</p>')}${summary.description ? detail('description', 'Il bouquet in dettaglio', flowerIcon, `<p>${escapeHtml(summary.description)}</p>`) : ''}<button class=\"florame-messages__bouquet-ask\" type=\"button\" data-bouquet-ask>Parliamone in chat <span aria-hidden=\"true\">\u2197</span></button>`;\r\n      node.querySelector('.florame-messages__context-meta').after(article);\r\n      const shortcut = $('[data-messages-product-shortcut]');\r\n      shortcut.hidden = false;\r\n      shortcut.innerHTML = `${image ? `<img src=\"${escapeHtml(image)}\" alt=\"\" width=\"32\" height=\"32\">` : flowerIcon}<span><small>Il tuo bouquet</small><strong>${escapeHtml(summary.title || 'Bouquet su richiesta')}</strong></span><b>Dettagli <span aria-hidden=\"true\">\u2304</span></b>`;\r\n      $('[data-bouquet-ask]', article).addEventListener('click', () => {\r\n        if (!draft.value.trim()) { draft.value = 'Vorrei parlare di composizione e decorazioni del bouquet richiesto.'; draft.dispatchEvent(new Event('input', { bubbles: true })); }\r\n        draft.focus();\r\n      });\r\n    } else $('[data-messages-product-shortcut]').hidden = true;\r\n    const existingDetails = node.querySelector('[data-context-more]');\r\n    if(!existingDetails) {\r\n      const details = document.createElement('details'); details.dataset.contextMore = ''; details.open = openDetails.includes('more');\r\n      details.innerHTML = '<summary>Dettagli e prossimi passi</summary>';\r\n      [...node.querySelectorAll('.florame-messages__request-flow')].forEach(child=>details.appendChild(child));\r\n      if(details.children.length > 1) node.appendChild(details);\r\n    }\r\n    node.hidden = false;\r\n    if(item.orderId && !demoMode) {\r\n      const report=document.createElement('button');report.type='button';report.className='florame-messages__context-open';report.dataset.reportOrderProblem='';report.innerHTML='\u26A0\uFE0F <span>Segnala un problema</span>';\r\n      report.addEventListener('click',openOrderProblem);node.appendChild(report);\r\n    }\r\n    $('[data-messages-open-order]', node)?.addEventListener('click', openOrderDetails);\r\n    if (focusedDetail) node.querySelector(`[data-bouquet-detail=\"${focusedDetail}\"]>summary`)?.focus({ preventScroll: true });\r\n  }\r\n\r\n  $('[data-messages-product-shortcut]').addEventListener('click', () => {\r\n    const card = $('[data-requested-bouquet]');\r\n    if (!card) return;\r\n    scrollNode.scrollTo({ top: Math.max(0, scrollNode.scrollTop + card.getBoundingClientRect().top - scrollNode.getBoundingClientRect().top - 12), behavior: reducedMotion() ? 'instant' : 'smooth' });\r\n    card.focus({ preventScroll: true });\r\n  });\r\n\r\n  function formatDeliveryDate(value) {\r\n    if (!String(value || '').trim()) return 'Da definire';\r\n    const parsed = new Date(`${String(value).slice(0, 10)}T12:00:00`);\r\n    if (Number.isNaN(parsed.getTime())) return String(value);\r\n    return parsed.toLocaleDateString(getLocale(), { weekday: 'long', day: 'numeric', month: 'long' });\r\n  }\r\n\r\n  function openOrderDetails() {\r\n    const item = state.selected;\r\n    if (demoMode && item?.orderId) { location.href = demo.link('/pages/florame-account', { orderId: item.orderId }); return; }\r\n    if (item?.orderId) {\r\n      const params = new URLSearchParams({ orderId: item.orderId });\r\n      if (item.threadId) params.set('thread', item.threadId);\r\n      location.href = `/pages/florame-order?${params.toString()}`;\r\n      return;\r\n    }\r\n    const detail = item?.orderDetail;\r\n    if (!detail || !orderSheet) return;\r\n    const delivery = detail.delivery || {};\r\n    const payment = detail.payment || {};\r\n    const items = Array.isArray(detail.items) ? detail.items : [];\r\n    const timeline = Array.isArray(detail.timeline) ? detail.timeline : [];\r\n    $('[data-messages-order-kicker]').textContent = item.contextType === 'request' ? 'Richiesta al fiorista' : 'Ordine Florame';\r\n    $('[data-messages-order-title]').textContent = item.orderNumber ? `Ordine ${item.orderNumber}` : (detail.statusLabel || 'Dettagli');\r\n    $('[data-messages-order-content]').innerHTML = `\r\n      <section class=\"florame-messages__order-status\" data-state=\"${escapeHtml(detail.status || '')}\">\r\n        <small>Stato ufficiale</small><strong>${escapeHtml(detail.statusLabel || 'Aggiornato')}</strong>\r\n      </section>\r\n      <section class=\"florame-messages__order-block\">\r\n        <h3>Pagamento</h3>\r\n        <div class=\"florame-messages__order-info\"><span class=\"florame-messages__order-info-icon\" aria-hidden=\"true\">\u2713</span><span><strong>${escapeHtml(payment.label || 'Pagamento aggiornato')}</strong><small>${escapeHtml(payment.detail || '')}</small></span></div>\r\n      </section>\r\n      <section class=\"florame-messages__order-block\">\r\n        <h3>${delivery.method === 'pickup' ? 'Ritiro' : 'Consegna'}</h3>\r\n        <dl class=\"florame-messages__order-facts\">\r\n          <div><dt>Quando</dt><dd translate=\"no\" data-florame-no-translate>${escapeHtml(formatDeliveryDate(delivery.date))}${delivery.time ? ` \u00B7 ${escapeHtml(delivery.time)}` : ''}</dd></div>\r\n          ${delivery.recipient ? `<div><dt>Per chi</dt><dd translate=\"no\" data-florame-no-translate>${escapeHtml(delivery.recipient)}</dd></div>` : ''}\r\n          ${delivery.address ? `<div><dt>Dove</dt><dd translate=\"no\" data-florame-no-translate>${escapeHtml(delivery.address)}</dd></div>` : ''}${delivery.access ? `<div><dt>Accesso</dt><dd translate=\"no\" data-florame-no-translate>${escapeHtml(delivery.access)}</dd></div>` : ''}${delivery.doorbell ? `<div><dt>Citofono</dt><dd translate=\"no\" data-florame-no-translate>${escapeHtml(delivery.doorbell)}</dd></div>` : ''}${delivery.notes ? `<div><dt>Istruzioni</dt><dd translate=\"no\" data-florame-no-translate>${escapeHtml(delivery.notes)}</dd></div>` : ''}\r\n        </dl>\r\n        ${delivery.changeCopy ? `<p class=\"florame-messages__change-policy\"><strong>${escapeHtml(delivery.changeTitle || (['request_change', 'self_service'].includes(delivery.changePolicy) ? 'Puoi ancora chiedere una modifica' : 'Prima di modificare, scrivi al fiorista'))}</strong>${escapeHtml(delivery.changeCopy)}</p>` : ''}\r\n      </section>\r\n      ${items.length ? `<section class=\"florame-messages__order-block\"><h3>Cosa hai scelto</h3><div class=\"florame-messages__order-items\">${items.map((product) => {\r\n        const productImage = safeImage(product.imageUrl);\r\n        return `<div>${productImage ? `${window.FlorameImageVariants?.html(`<img src=\"${escapeHtml(productImage)}\" alt=\"\" width=\"54\" height=\"54\" loading=\"lazy\">`, \"54px\") || `<img src=\"${escapeHtml(productImage)}\" alt=\"\" width=\"54\" height=\"54\" loading=\"lazy\">`}` : '<span class=\"florame-messages__order-item-placeholder\" aria-hidden=\"true\">\u273F</span>'}<span><strong>${escapeHtml(product.title || 'Bouquet Florame')}</strong><small>${product.kind === 'extra' ? 'Extra' : 'Bouquet'} \u00B7 quantit\u00E0 ${Math.max(1, Number(product.quantity || 1))}</small></span></div>`;\r\n      }).join('')}</div></section>` : ''}\r\n      ${timeline.length ? `<section class=\"florame-messages__order-block\"><h3>A che punto siamo</h3><ol class=\"florame-messages__timeline\">${timeline.map((event) => `<li class=\"is-${escapeHtml(event.state || 'upcoming')}\"><i aria-hidden=\"true\"></i><span><strong>${escapeHtml(event.label || '')}</strong>${event.detail ? `<small>${escapeHtml(event.detail)}</small>` : ''}${event.at ? `<time>${escapeHtml(new Date(event.at).toLocaleString(getLocale(), { day: 'numeric', month: 'short', hour: '2-digit', minute: '2-digit' }))}</time>` : ''}</span></li>`).join('')}</ol></section>` : ''}`;\r\n    rememberSheetOpener(orderSheet);\r\n    orderSheet.hidden = false;\r\n    document.body.classList.add('florame-messages-overlay-open');\r\n    document.documentElement.style.overflow = 'hidden';\r\n    const params = new URLSearchParams(location.search);\r\n    params.set('view', 'order');\r\n    if (item.orderId) params.set('orderId', item.orderId);\r\n    history.replaceState(history.state, '', `${location.pathname}?${params.toString()}`);\r\n    requestAnimationFrame(() => $('.florame-messages__order-panel', orderSheet)?.focus());\r\n  }\r\n\r\n  function closeOrderDetails({ restoreUrl = true } = {}) {\r\n    if (!orderSheet) return;\r\n    orderSheet.hidden = true;\r\n    restoreSheetOpener(orderSheet);\r\n    if (settings.hidden && detailsSheet.hidden) document.body.classList.remove('florame-messages-overlay-open');\r\n    document.documentElement.style.removeProperty('overflow');\r\n    if (restoreUrl) {\r\n      const params = new URLSearchParams(location.search);\r\n      params.delete('view');\r\n      history.replaceState(history.state, '', `${location.pathname}${params.toString() ? `?${params.toString()}` : ''}`);\r\n    }\r\n    $('[data-messages-open-order]')?.focus();\r\n  }\r\n\r\n  function confirmationKey(message) {\r\n    if (message.proposal) return 'proposal:' + message.proposal.proposalId;\r\n    if (!message.event || !['accepted', 'captured'].includes(message.event.state)) return '';\r\n    const order = message.event.orderId || state.selected?.orderId;\r\n    const matching = state.messages.find(row => row.proposal?.status === 'accepted' && row.proposal.replacementOrderId === order);\r\n    return matching ? 'proposal:' + matching.proposal.proposalId : order ? 'order:' + order : '';\r\n  }\r\n  function celebrate(node, message) {\r\n    const key = confirmationKey(message);\r\n    if (!key) return;\r\n    const accepted = message.proposal ? message.proposal.status === 'accepted' : true;\r\n    const previous = observedConfirmations.get(key);\r\n    observedConfirmations.set(key, accepted);\r\n    let returning = false;\r\n    try { const resume = JSON.parse(sessionStorage.getItem('florame_counter_proposal_resume_v1') || 'null'); returning = key === 'proposal:' + resume?.proposalId && Date.now() - resume.savedAt < 86400000; } catch (_) {}\r\n    if (!accepted || confirmations.has(key)) return;\r\n    confirmations.add(key); saveSession();\r\n    if ((previous !== false && !returning) || reducedMotion()) return;\r\n    const surface = node.querySelector('.florame-messages__proposal,.florame-messages__event');\r\n    if (!surface) return;\r\n    const rect = surface.getBoundingClientRect(), area = scrollNode.getBoundingClientRect();\r\n    if(rect.bottom < area.top || rect.top > area.bottom) return;\r\n    window.FlorameMotion?.confirm?.(surface);\r\n    const bloom = document.createElement('span'); bloom.className = 'florame-messages__bloom'; bloom.setAttribute('aria-hidden','true');\r\n    bloom.innerHTML = '<svg viewBox=\"0 0 24 24\"><path d=\"m5 12 4 4L19 6\"/></svg>' + Array.from({length:8},(_,i)=>'<i style=\"--petal:' + i + '\"></i>').join('');\r\n    surface.appendChild(bloom); setTimeout(()=>bloom.remove(),850);\r\n  }\r\n  function renderMessageAttachments(files) {\r\n    return (Array.isArray(files)?files:[]).filter(file=>/^https:\\/\\/firebasestorage\\.googleapis\\.com\\/v0\\/b\\//.test(file?.url||'')).map(file=>'<a class=\"florame-messages__file\" href=\"'+escapeHtml(file.url)+'\" target=\"_blank\" rel=\"noopener noreferrer\">'+(String(file.mime).startsWith('image/')?'<img src=\"'+escapeHtml(file.url)+'\" alt=\"'+escapeHtml(file.name)+'\" loading=\"lazy\">':'')+'<span><strong>'+escapeHtml(file.name)+'</strong><small>'+Math.max(1,Math.round(Number(file.size)/1024))+' KB \u00B7 Apri allegato</small></span></a>').join('');\r\n  }\r\n\r\n  function renderMessages({ keepScroll = false, prepend = false } = {}) {\r\n    const oldTop = scrollNode.scrollTop, oldHeight = scrollNode.scrollHeight;\r\n    const item = state.selected, sequence = state.openSequence;\r\n    const areaTop = scrollNode.getBoundingClientRect().top;\r\n    const anchor = [...messagesNode.children].find(node => node.dataset.messageKey && node.getBoundingClientRect().bottom > areaTop);\r\n    const anchorKey = anchor?.dataset.messageKey, anchorOffset = anchor ? anchor.getBoundingClientRect().top - areaTop : 0;\r\n    const existing = new Map([...messagesNode.children].filter(node => node.dataset.messageKey).map(node => [node.dataset.messageKey, node]));\r\n    renderContext(item);\r\n    if (item?.orderId && ['awaiting_partner','awaiting_manual_florist','assigned','payment_processing','counter_proposed'].includes(item.requestStatus)) observedConfirmations.set('order:' + item.orderId, false);\r\n    const rows = [...state.messages, ...outboxMessages()];\r\n    clearTimeout(proposalExpiryTimer);\r\n    const nextExpiry = Math.min(...rows.filter(row => row.proposal && ['available','sent','viewed','checkout_started','payment_failed'].includes(row.proposal.status)).map(row => Date.parse(row.proposal.expiresAt)).filter(at => at > Date.now()));\r\n    if (Number.isFinite(nextExpiry)) proposalExpiryTimer = setTimeout(() => {\r\n      if (sequence === state.openSequence && state.threadReady && !state.authExpired) renderMessages({ keepScroll: true });\r\n    }, Math.min(2147483647, Math.max(1, nextExpiry - Date.now())));\r\n    let prior = null, priorDay = '';\r\n    const html = rows.length ? rows.map((message, index) => {\r\n      const own = message.sender === 'customer', sender = own ? 'Tu' : message.sender === 'partner' ? item?.partnerName || 'Fiorista' : 'florame.ai';\r\n      const proposal = message.kind === 'proposal' && message.proposal ? message.proposal : null;\r\n      const event = message.kind === 'event' && message.event ? message.event : null;\r\n      const timestamp = event?.occurredAt && Number.isFinite(Date.parse(event.occurredAt)) ? event.occurredAt : message.createdAt;\r\n      const time = new Date(timestamp), valid = !Number.isNaN(time.getTime());\r\n      const day = valid ? time.toLocaleDateString(getLocale(),{day:'numeric',month:'long'}) : '';\r\n      const grouped = prior && !proposal && !event && !prior.proposal && !prior.event && prior.sender === message.sender && day === priorDay && Math.abs(time - new Date(prior.createdAt)) < 300000;\r\n      const separator = day && day !== priorDay ? '<div class=\"florame-messages__day\" data-message-key=\"day-' + escapeHtml(message.messageId || index) + '\">' + escapeHtml(day) + '</div>' : '';\r\n      prior = message; priorDay = day;\r\n      const local = message.localStatus;\r\n      const label = message.verifying ? 'Verifico l\u2019invio\u2026' : local === 'queued' ? (navigator.onLine ? 'In coda' : 'In attesa di connessione') : local === 'sending' ? 'In invio' : local === 'uncertain' ? 'Invio da verificare' : local === 'failed' ? 'Non inviato' : own ? 'Inviato' : '';\r\n      const controls = local === 'uncertain' || local === 'failed' ? '<span class=\"florame-messages__send-recovery\"><button type=\"button\" data-message-retry=\"' + escapeHtml(message.clientRequestId) + '\"' + (message.verifying ? ' disabled aria-busy=\"true\"' : '') + '>Verifica e riprova</button><button type=\"button\" data-message-edit=\"' + escapeHtml(message.clientRequestId) + '\"' + (message.verifying ? ' disabled' : '') + '>Modifica</button></span>' : '';\r\n      const clock = valid ? time.toLocaleTimeString(getLocale(),{hour:'2-digit',minute:'2-digit'}) : '';\r\n      return separator + '<div data-message-key=\"' + escapeHtml(message.messageId || 'message-' + index) + '\" class=\"florame-messages__message' + (own ? ' florame-messages__message--customer' : '') + (proposal ? ' florame-messages__message--proposal' : '') + (event ? ' florame-messages__message--event' : '') + (grouped ? ' is-grouped' : '') + '\" data-send-state=\"' + escapeHtml(local || '') + '\"><p class=\"florame-messages__message-label\">' + escapeHtml(sender) + '</p>' + (event ? renderConversationEvent(event) : '<div class=\"florame-messages__bubble\">' + '<span' + (['customer', 'partner'].includes(message.sender) && !proposal ? ' translate=\"no\" data-florame-no-translate' : '') + '>' + escapeHtml(message.text) + '</span>' + renderMessageAttachments(message.attachments) + (proposal ? renderProposalCard(proposal) : '') + '</div>') + '<div class=\"florame-messages__message-meta\"><time datetime=\"' + escapeHtml(timestamp || '') + '\">' + escapeHtml(clock) + '</time><span>' + label + '</span></div>' + (message.localError ? '<small class=\"florame-messages__send-error\">' + escapeHtml(message.localError) + '</small>' : '') + controls + '</div>';\r\n    }).join('') : '<div class=\"florame-messages__empty\"><p>Scrivi il primo messaggio: il fiorista lo vedr\u00E0 nel suo Hub.</p></div>';\r\n    const template = document.createElement('template'); template.innerHTML = html;\r\n    let newCount = 0;\r\n    const nodes = [...template.content.children].map(node => {\r\n      const previous = existing.get(node.dataset.messageKey), signature = node.outerHTML;\r\n      if (previous?.__messageMarkup === signature) return previous;\r\n      node.__messageMarkup = signature;\r\n      if(previous) {\r\n        [...previous.querySelectorAll('details')].forEach((detail,i)=> { if(detail.open && node.querySelectorAll('details')[i]) node.querySelectorAll('details')[i].open = true; });\r\n        if(previous.contains(document.activeElement)) {\r\n          const action = document.activeElement.dataset.proposalAction;\r\n          requestAnimationFrame(()=> { if(sequence === state.openSequence && action) node.querySelector('[data-proposal-action=\"' + CSS.escape(action) + '\"]')?.focus({preventScroll:true}); });\r\n        }\r\n      } else if (existing.size && !prepend && node.classList.contains('florame-messages__message')) {\r\n        if(!node.classList.contains('florame-messages__message--customer')) newCount++;\r\n        if(!reducedMotion()) node.classList.add('is-arriving');\r\n      }\r\n      return node;\r\n    });\r\n    nodes.forEach((node,index)=> { if(messagesNode.children[index] !== node) messagesNode.insertBefore(node,messagesNode.children[index] || null); });\r\n    while(messagesNode.children.length > nodes.length) messagesNode.lastElementChild.remove();\r\n    if(state.messagesCursor) {\r\n      messagesNode.insertAdjacentHTML('afterbegin','<button type=\"button\" class=\"florame-messages__save\" data-older-messages>Messaggi precedenti</button>');\r\n      $('[data-older-messages]',messagesNode).addEventListener('click',olderMessages);\r\n    }\r\n    // Apply known UI copy as soon as messages appear; authored text is protected above.\r\n    window.FlorameI18n?.apply(root);\r\n    const isReadonly = item?.readOnly === true || item?.conversationKind === 'florame';\r\n    composer.hidden = isReadonly; readonly.hidden = !isReadonly;\r\n    if(keepScroll) state.newMessages += newCount;\r\n    requestAnimationFrame(()=> {\r\n      if(sequence !== state.openSequence) return;\r\n      const currentAnchor = anchorKey && [...messagesNode.children].find(node=>node.dataset.messageKey === anchorKey);\r\n      const top = (keepScroll || prepend) && currentAnchor ? scrollNode.scrollTop + currentAnchor.getBoundingClientRect().top - areaTop - anchorOffset : prepend ? oldTop + scrollNode.scrollHeight - oldHeight : keepScroll ? oldTop : scrollNode.scrollHeight;\r\n      scrollNode.scrollTo({top,behavior:'instant'}); updateLatest();\r\n      rows.forEach(message=> { const node = [...messagesNode.children].find(node=>node.dataset.messageKey === message.messageId); if(node) celebrate(node,message); });\r\n    });\r\n  }\r\n\r\n  function renderThreadHeader(item) {\r\n    const avatarNode = $('[data-messages-thread-avatar]');\r\n    if (avatarNode) avatarNode.outerHTML = avatar(item, true).replace('class=\"florame-messages__thread-avatar', 'data-messages-thread-avatar class=\"florame-messages__thread-avatar');\r\n    $('[data-messages-thread-title]').textContent = item?.partnerName || 'Conversazione';\r\n    $('[data-messages-thread-subtitle]').textContent = contextLabel(item);\r\n    $('[data-messages-details]').hidden = item?.conversationKind === 'florame';\r\n  }\r\n\r\n  function openPartnerDetails() {\r\n    const item = state.selected;\r\n    if (!item || item.conversationKind === 'florame') return;\r\n    const storefront = safeUrl(item.partnerStorefrontUrl || (item.partnerSlug ? `/pages/${encodeURIComponent(item.partnerSlug)}` : ''));\r\n    const website = safeUrl(item.partnerWebsite);\r\n    const phone = String(item.partnerPhone || '').trim();\r\n    const address = String(item.partnerAddress || '').trim();\r\n    $('[data-messages-partner-title]').textContent = 'Dettagli fiorista';\r\n    $('[data-messages-partner-details]').innerHTML = `<div class=\"florame-messages__partner-profile\">\r\n      ${avatar(item)}\r\n      <div><strong>${escapeHtml(item.partnerName || 'Fiorista Florame')}</strong>${item.partnerCity ? `<span>${escapeHtml(item.partnerCity)}</span>` : ''}</div>\r\n    </div>\r\n    <div class=\"florame-messages__partner-links\">\r\n      ${storefront ? `<a href=\"${escapeHtml(storefront)}\"><span><b>Pagina del fiorista</b><small>Foto, bouquet e disponibilit\u00E0</small></span><i aria-hidden=\"true\">\u203A</i></a>` : ''}\r\n      ${address ? `<div><span><b>Indirizzo</b><small>${escapeHtml(address)}</small></span></div>` : ''}\r\n      ${phone ? `<a href=\"tel:${escapeHtml(phone)}\"><span><b>Telefono</b><small>${escapeHtml(phone)}</small></span><i aria-hidden=\"true\">\u203A</i></a>` : ''}\r\n      ${website ? `<a href=\"${escapeHtml(website)}\" target=\"_blank\" rel=\"noopener\"><span><b>Sito web</b><small>Apri in una nuova scheda</small></span><i aria-hidden=\"true\">\u203A</i></a>` : ''}\r\n    </div>\r\n    <p class=\"florame-messages__partner-note\">Pagamenti, modifiche e rimborsi restano sempre gestiti da Florame. In chat puoi concordare preferenze e dettagli del bouquet.</p>`;\r\n    rememberSheetOpener(detailsSheet);\r\n    detailsSheet.hidden = false;\r\n    document.body.classList.add('florame-messages-overlay-open');\r\n    document.documentElement.style.overflow = 'hidden';\r\n    requestAnimationFrame(() => $('.florame-messages__partner-sheet', detailsSheet)?.focus());\r\n  }\r\n\r\n  function closePartnerDetails() {\r\n    detailsSheet.hidden = true;\r\n    restoreSheetOpener(detailsSheet);\r\n    if (settings.hidden) document.body.classList.remove('florame-messages-overlay-open');\r\n    document.documentElement.style.removeProperty('overflow');\r\n  }\r\n\r\n  async function openThread(item, { quiet = false } = {}) {\r\n    if (!item?.threadId || state.authExpired || (quiet && (state.threadLoading || state.proposalBusy))) return;\r\n    const sequence = ++state.openSequence;\r\n    if (!quiet) {\r\n      if (state.selected) state.drafts.set(state.selected.threadId, draft.value);\r\n      state.historyExpanded = false; state.messagesCursor = \"\";\r\n      state.threadReady = false;\r\n      draft.value = state.drafts.get(item.threadId) || '';\r\n      setMessageStatus('');\r\n      $('[data-messages-context]').hidden = true;\r\n      $('[data-messages-context]').__contextSignature = null;\r\n      if (latest) latest.hidden = true;\r\n    }\r\n    state.selected = item;\r\n    state.threadLoading = true;\r\n    updateComposer();\r\n    thread.hidden = false;\r\n    blank.hidden = true;\r\n    root.classList.add('is-thread-open');\r\n    renderThreadHeader(item);\r\n    if (item.guestStatic) {\r\n      state.threadLoading = false;\r\n      state.messages = [{ sender: 'florame', text: item.lastMessage, createdAt: item.updatedAt }];\r\n      renderMessages();\r\n      return;\r\n    }\r\n    if (!quiet) {\r\n      const cached = conversationMemory.get(item.threadId);\r\n      if (cached) { state.messages = cached.messages; state.messagesCursor = cached.cursor; renderMessages(); }\r\n      else messagesNode.innerHTML = window.FlorameSkeletons.message;\r\n    }\r\n    try {\r\n      const payload = await request('thread', { query: { threadId: item.threadId, orderId: item.orderId || '' } });\r\n      if (sequence !== state.openSequence || state.selected?.threadId !== item.threadId) return;\r\n      state.selected = payload.thread || item;\r\n      state.threadReady = true;\r\n      setMessageStatus('');\r\n      const received = Array.isArray(payload.messages) ? payload.messages : [];\r\n      reconcileOutbox(received);\r\n      if (state.outbox.find(row=>row.threadId === item.threadId && row.status !== 'sent')?.status === 'queued') void drainOutbox(item.threadId);\r\n      state.messages = mergeRows(quiet ? state.messages : [], received, \"messageId\");\r\n      conversationMemory.set(item.threadId, { messages: state.messages, cursor: payload.messagesCursor || '' });\r\n      if (!quiet || !state.historyExpanded) state.messagesCursor = payload.messagesCursor || \"\";\r\n      state.threads = state.threads.map((row) => row.threadId === state.selected.threadId ? state.selected : row);\r\n      renderThreadHeader(state.selected);\r\n      renderMessages({ keepScroll: quiet && scrollNode.scrollHeight - scrollNode.scrollTop - scrollNode.clientHeight > 100 });\r\n      renderList();\r\n      if (initialCompose === 'delivery_change' && !state.composePrepared && draft && !draft.value.trim()) {\r\n        state.composePrepared = true;\r\n        draft.value = 'Vorrei chiedere una modifica a data, fascia o indirizzo di consegna. La preferenza attuale deve restare valida finch\u00E9 non mi confermate la modifica.';\r\n        draft.dispatchEvent(new Event('input', { bubbles: true }));\r\n        draft.focus();\r\n      }\r\n      const shouldOpenOrderView = new URL(location.href).searchParams.get('view') === 'order';\r\n      const threadParams = new URLSearchParams({ ...(initialPartner ? { partner: initialPartner } : {}), thread: state.selected.threadId });\r\n      if (demoMode) { threadParams.set('demo', '1'); if (new URL(location.href).searchParams.get('lang')) threadParams.set('lang', new URL(location.href).searchParams.get('lang')); }\r\n      if (state.selected.orderId) threadParams.set('orderId', state.selected.orderId);\r\n      history.replaceState(history.state, '', `${location.pathname}?${threadParams.toString()}`);\r\n      // An order ID identifies the conversation for push/history links. Only\r\n      // an explicit detail-view request should leave Messages for the order.\r\n      if (shouldOpenOrderView) {\r\n        openOrderDetails();\r\n      }\r\n    } catch (error) {\r\n      if (sequence !== state.openSequence || state.selected?.threadId !== item.threadId) return;\r\n      if (error?.status === 401) { clearPrivateState(); return requestAuthentication(null, 'messages_thread'); }\r\n      if (quiet) { setMessageStatus('Aggiornamento in pausa. I messaggi gi\u00E0 caricati restano qui.'); return false; }\r\n      messagesNode.innerHTML = '<div class=\"florame-messages__empty\"><strong>La chat non si \u00E8 aperta</strong><p>La tua bozza \u00E8 al sicuro. Riproviamo?</p><button type=\"button\" class=\"florame-messages__save\" data-messages-thread-retry>Riprova</button></div>';\r\n      $('[data-messages-thread-retry]').onclick = () => openThread(item);\r\n    } finally {\r\n      if (sequence === state.openSequence) { state.threadLoading = false; updateComposer(); }\r\n    }\r\n  }\r\n\r\n  function closeThread() {\r\n    if (state.selected) state.drafts.set(state.selected.threadId, draft.value);\r\n    state.openSequence++;\r\n    saveSession();\r\n    state.selected = null;\r\n    state.threadReady = false;\r\n    state.threadLoading = false;\r\n    closeOrderDetails({ restoreUrl: false });\r\n    root.classList.remove('is-thread-open');\r\n    if (matchMedia('(max-width: 899px)').matches) {\r\n      thread.hidden = true;\r\n      blank.hidden = false;\r\n    }\r\n    history.replaceState(history.state, '', demoMode ? demo.link(location.pathname, { partner: initialPartner }) : `${location.pathname}${initialPartner ? `?partner=${encodeURIComponent(initialPartner)}` : ''}`);\r\n    renderList();\r\n  }\r\n\r\n  async function loadInbox({ quiet = false, cursor = \"\" } = {}) {\r\n    if (state.inboxLoading || state.authExpired) return;\r\n    state.inboxLoading = true; const epoch = state.sessionEpoch;\r\n    try {\r\n      const payload = await request('list', { query: { cursor } });\r\n      if (epoch !== state.sessionEpoch) return;\r\n      state.threads = mergeRows(quiet || cursor ? state.threads : [], Array.isArray(payload.threads) ? payload.threads : [], 'threadId');\r\n      if (cursor) state.listExpanded = true;\r\n      if (!quiet || !state.listExpanded) state.listCursor = payload.nextCursor || '';\r\n      state.preferences = payload.preferences || {};\r\n      renderList();\r\n      setMessageStatus('');\r\n      const partnerStart = $('[data-messages-partner-start]');\r\n      const hasPartnerThread = initialPartner && state.threads.some((item) => item.partnerSlug === initialPartner && item.contextType === 'inquiry');\r\n      partnerStart.hidden = !initialPartner || hasPartnerThread;\r\n      if (!quiet && !state.selected) {\r\n        const target = initialOrderId\r\n          ? state.threads.find((item) => String(item.orderId) === initialOrderId)\r\n          : state.threads.find((item) => item.threadId === new URL(location.href).searchParams.get('thread'));\r\n        const requestedId = new URL(location.href).searchParams.get('thread');\r\n        if (!target && (requestedId || initialOrderId)) { await openThread({ threadId: requestedId || ('order_' + initialOrderId), orderId: initialOrderId }); return; }\r\n        const desktopDefault = !target && matchMedia('(min-width: 900px)').matches ? sortThreads(state.threads)[0] : null;\r\n        if (target || desktopDefault) await openThread(target || desktopDefault);\r\n      }\r\n    } catch (error) {\r\n      if (epoch !== state.sessionEpoch) return;\r\n      if (error?.status === 401) return clearPrivateState();\r\n      if (!quiet) list.innerHTML = '<div class=\"florame-messages__empty\"><strong>Messaggi non disponibili</strong><p>Riprova tra poco. Le tue conversazioni restano salvate.</p><button type=\"button\" class=\"florame-messages__save\" data-messages-retry>Riprova</button></div>';\r\n      setMessageStatus('Non siamo riusciti ad aggiornare i messaggi.');\r\n      $('[data-messages-retry]')?.addEventListener('click', () => loadInbox());\r\n      return false;\r\n    } finally { state.inboxLoading = false; }\r\n  }\r\n\r\n  async function startPartnerConversation() {\r\n    if (!initialPartner || state.busy) return;\r\n    state.busy = true;\r\n    const button = $('[data-messages-partner-start-button]');\r\n    button.disabled = true;\r\n    button.textContent = 'Apro\u2026';\r\n    try {\r\n      const payload = await request('start', { method: 'POST', body: { partnerSlug: initialPartner } });\r\n      if (payload.thread) {\r\n        state.threads = [payload.thread, ...state.threads.filter((item) => item.threadId !== payload.thread.threadId)];\r\n        $('[data-messages-partner-start]').hidden = true;\r\n        renderList();\r\n        await openThread(payload.thread);\r\n      }\r\n    } catch (error) {\r\n      if (error?.status === 401) requestAuthentication(button, 'messages_start_partner');\r\n      else setMessageStatus('Non riusciamo ad aprire la conversazione con questo fiorista.');\r\n    }\r\n    finally { state.busy = false; button.disabled = false; button.textContent = 'Scrivi'; }\r\n  }\r\n\r\n  async function sendMessage(event) {\r\n    event.preventDefault();\r\n    const text = draft.value.trim(), id = state.selected?.threadId;\r\n    if (!text || !id || state.authExpired || !state.threadReady || state.selected.readOnly || state.selected.conversationKind === 'florame') return;\r\n    state.outbox.push({ key: crypto.randomUUID(), threadId: id, text, status: 'queued', createdAt: new Date().toISOString() });\r\n    state.drafts.delete(id); draft.value = ''; updateComposer(); saveSession();\r\n    renderMessages(); void drainOutbox(id);\r\n  }\r\n\r\n  const utilitySheets = [];\r\n  function utilitySheet(name, title) {\r\n    const layer = document.createElement('div'); layer.className = 'florame-messages__sheet'; layer.hidden = true; layer.dataset.messagesUtility = name;\r\n    layer.innerHTML = '<button type=\"button\" class=\"florame-messages__sheet-backdrop\" data-messages-utility-close aria-label=\"Chiudi\" tabindex=\"-1\"></button><section class=\"florame-messages__sheet-panel\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"fm-' + name + '-title\" tabindex=\"-1\"><header><h2 id=\"fm-' + name + '-title\">' + title + '</h2><button type=\"button\" data-messages-utility-close aria-label=\"Chiudi\">\u00D7</button></header><div data-utility-content></div></section>';\r\n    layer.querySelectorAll('[data-messages-utility-close]').forEach(button=>button.addEventListener('click',()=>closeUtility(layer)));\r\n    root.appendChild(layer); utilitySheets.push(layer); return layer;\r\n  }\r\n  const supportSheet = utilitySheet('support','Assistenza florame.ai');\r\n  const confirmSheet = utilitySheet('confirm','Prima di continuare');\r\n  const problemSheet=utilitySheet('order-problem','Segnala un problema');\r\n  function openOrderProblem() {\r\n    if(!state.threadReady||state.authExpired||!state.selected?.orderId||demoMode)return;\r\n    const selected={...state.selected},key=crypto.randomUUID(),content=$('[data-utility-content]',problemSheet);\r\n    const categories=[['delay','\u23F0','Consegna in ritardo'],['not_received','\uD83D\uDCE6','Ordine non ricevuto'],['wrong_bouquet','\uD83D\uDC90','Bouquet diverso'],['damaged','\uD83E\uDD40','Fiori danneggiati'],['missing_extra','\u2709\uFE0F','Biglietto o extra mancante'],['other','\uD83D\uDCAC','Altro problema']];\r\n    content.innerHTML='<form data-problem-form><p class=\"florame-messages__sheet-intro\"><strong>'+escapeHtml(selected.orderNumber?'Ordine '+selected.orderNumber:'Il tuo ordine')+'</strong></p><fieldset class=\"florame-messages__problem-categories\"><legend>Cosa \u00E8 successo?</legend>'+categories.map(([value,emoji,label])=>'<label><input type=\"radio\" name=\"category\" value=\"'+value+'\" required><span aria-hidden=\"true\">'+emoji+'</span><strong>'+escapeHtml(label)+'</strong></label>').join('')+'</fieldset><label class=\"florame-messages__problem-detail\">Descrivi il problema<textarea name=\"detail\" rows=\"4\" minlength=\"5\" maxlength=\"1600\" required placeholder=\"Raccontaci cosa \u00E8 successo e cosa ti serve\"></textarea></label><p role=\"alert\" data-problem-error hidden></p><button type=\"submit\" class=\"florame-messages__save\">Invia segnalazione</button></form>';\r\n    let busy=false;\r\n    $('[data-problem-form]',content).addEventListener('submit',async event=>{\r\n      event.preventDefault();if(busy)return;const form=event.currentTarget,values=new FormData(form),category=values.get('category'),text=String(values.get('detail')||'').trim();if(!category||text.length<5)return;\r\n      busy=true;form.querySelectorAll('input,textarea,button').forEach(el=>el.disabled=true);const error=$('[data-problem-error]',content);error.hidden=true;\r\n      try{await request('report_problem',{method:'POST',body:{threadId:selected.threadId,category,text,idempotencyKey:key}});content.innerHTML='<div class=\"florame-messages__empty\" role=\"status\"><strong>\u2705 Segnalazione ricevuta</strong><p>Il team florame.ai vede il problema e la conversazione di questo ordine.</p><button type=\"button\" class=\"florame-messages__save\" data-problem-done>Torna alla chat</button></div>';$('[data-problem-done]',content).onclick=()=>closeUtility(problemSheet);}\r\n      catch(e){error.textContent=e.status===401?'Accedi di nuovo per inviare la segnalazione.':e.message||'Invio non riuscito. Riprova.';error.hidden=false;form.querySelectorAll('input,textarea,button').forEach(el=>el.disabled=false);}\r\n      finally{busy=false;}\r\n    });showUtility(problemSheet);\r\n  }\r\n  let confirmResult = null, supportEpoch = 0, supportOpening = false, cancelSupportWait = null;\r\n  function showUtility(layer) {\r\n    rememberSheetOpener(layer); layer.hidden = false;\r\n    document.body.classList.add('florame-messages-overlay-open'); document.documentElement.style.overflow = 'hidden';\r\n    requestAnimationFrame(()=>layer.querySelector('.florame-messages__sheet-panel').focus());\r\n  }\r\n  function closeUtility(layer, accepted = false, restoreFocus = true) {\r\n    layer.hidden = true;\r\n    if (restoreFocus) restoreSheetOpener(layer); else sheetOpeners.delete(layer);\r\n    if(layer === confirmSheet && confirmResult) { const resolve=confirmResult; confirmResult=null; resolve(accepted); }\r\n    if(layer === supportSheet) cancelSupportOpening();\r\n    if([...utilitySheets,photoSheet,orderSheet,detailsSheet,settings].every(sheet=>!sheet || sheet.hidden)) {\r\n      document.body.classList.remove('florame-messages-overlay-open'); document.documentElement.style.removeProperty('overflow');\r\n    }\r\n  }\r\n  function confirmChoice(copy, label) {\r\n    if(confirmResult) return Promise.resolve(false);\r\n    $('[data-utility-content]',confirmSheet).innerHTML = '<p class=\"florame-messages__sheet-intro\">' + escapeHtml(copy) + '</p><div class=\"florame-messages__utility-actions\"><button type=\"button\" data-choice-no>Torna alla chat</button><button type=\"button\" class=\"florame-messages__save\" data-choice-yes>' + escapeHtml(label) + '</button></div>';\r\n    $('[data-choice-no]',confirmSheet).onclick=()=>closeUtility(confirmSheet);\r\n    $('[data-choice-yes]',confirmSheet).onclick=()=>closeUtility(confirmSheet,true);\r\n    showUtility(confirmSheet); return new Promise(resolve=>confirmResult=resolve);\r\n  }\r\n  function cancelSupportOpening() {\r\n    supportEpoch++;\r\n    cancelSupportWait?.(); cancelSupportWait = null;\r\n    if (supportOpening) window.FlorameShopifyInbox?.close?.();\r\n    supportOpening = false;\r\n  }\r\n  function supportContext(event) {\r\n    // The inbox card is general help, even when desktop has selected a thread.\r\n    const fromThread = event?.target?.closest?.('[data-messages-thread]');\r\n    const selected = fromThread && state.threadReady && !state.authExpired ? state.selected : null;\r\n    const proposalNode = event?.target?.closest?.('[data-proposal-id]');\r\n    const proposalId = proposalNode?.dataset.proposalId;\r\n    const proposal = selected && proposalId ? state.messages.find(row=>row.proposal?.proposalId === proposalId)?.proposal : null;\r\n    const proposalExpired = proposal?.expiresAt && Date.parse(proposal.expiresAt) <= Date.now() && ['available','sent','viewed','checkout_started'].includes(proposal.status);\r\n    const status = proposal ? (proposalExpired ? 'expired' : proposal.status) : selected?.requestStatus;\r\n    const proposalCopy = {\r\n      expired: ['Proposta scaduta', 'Questa proposta non \u00E8 pi\u00F9 utilizzabile. Puoi chiedere al fiorista una nuova proposta o contattare Florame.'],\r\n      declined: ['Proposta non accettata', 'Puoi tornare alla conversazione per valutare un\u2019altra proposta con il fiorista. Per altri dubbi, siamo qui.'],\r\n      superseded: ['C\u2019\u00E8 una proposta pi\u00F9 recente', 'Torna alla conversazione e cerca l\u2019ultima proposta del fiorista. Se non la trovi, contattaci.'],\r\n      unavailable: ['Proposta non disponibile', 'Chiedi al fiorista un\u2019alternativa oppure contatta Florame per assistenza.'],\r\n      accepted: ['Proposta confermata', 'Per chiarimenti sul pagamento, modifiche o problemi con la consegna, contatta Florame.']\r\n    };\r\n    const requestCopy = {\r\n      awaiting_partner: ['In attesa del fiorista', 'La richiesta attende una risposta. Puoi controllarne i dettagli o chiedere aiuto a Florame.'],\r\n      awaiting_manual_florist: ['Ricerca del fiorista in corso', 'Florame sta cercando un fiorista per la richiesta. Qui puoi chiedere un aggiornamento.'],\r\n      declined: ['Richiesta non accettata', 'Consulta lo stato dell\u2019ordine per gli aggiornamenti su annullamento o rimborso. Florame pu\u00F2 aiutarti a chiarire i prossimi passi.'],\r\n      expired: ['Richiesta scaduta', 'Consulta lo stato dell\u2019ordine per gli aggiornamenti su annullamento o rimborso. Per dubbi, contatta Florame.'],\r\n      counter_proposed: ['Nuova proposta del fiorista', 'Puoi rivedere la proposta nella conversazione. Contatta Florame se hai dubbi su come procedere.'],\r\n      proposal_declined: ['Proposta non accettata', 'Per valutare come proseguire con la richiesta, contatta Florame.'],\r\n      proposal_expired: ['Proposta scaduta', 'Per valutare come proseguire con la richiesta, contatta Florame.']\r\n    };\r\n    let copy = proposal ? proposalCopy[status] : requestCopy[status];\r\n    if (status === 'payment_failed') copy = ['Pagamento da verificare', 'Se vedi un addebito o non sai se l\u2019ordine \u00E8 confermato, contattaci prima di ripetere il pagamento.'];\r\n    if (status === 'payment_processing') copy = ['Pagamento in verifica', 'Controlla lo stato dell\u2019ordine prima di ripetere il pagamento. Per chiarimenti, contatta Florame.'];\r\n    const stateTitle = copy?.[0] || '';\r\n    const isFlorame = selected?.conversationKind === 'florame';\r\n    const hasOrder = selected && (selected.orderId || selected.orderNumber);\r\n    if (!copy) copy = hasOrder ? ['Aiuto con il tuo ordine', 'Per pagamenti, modifiche, consegne o rimborsi, scrivi al team Florame.']\r\n      : selected?.readOnly && !isFlorame ? ['Conversazione in sola lettura', 'Qui non puoi rispondere. Per ricevere aiuto, apri la chat di assistenza Florame.']\r\n      : selected && !isFlorame ? ['Fiorista o assistenza?', 'Per fiori e composizione puoi scrivere al fiorista. Per acquisti o problemi con il sito, contatta Florame.']\r\n      : ['', 'Per ordini, pagamenti, consegne o aiuto con il sito, scrivi al team Florame.'];\r\n    const fields = selected && !isFlorame ? [\r\n      selected.orderNumber ? 'Ordine: ' + selected.orderNumber : selected.orderId ? 'Riferimento ordine: ' + selected.orderId : '',\r\n      selected.partnerName ? 'Fiorista: ' + selected.partnerName : '',\r\n      proposal?.title ? 'Bouquet: ' + proposal.title : '',\r\n      proposal?.proposalId ? 'Proposta: ' + proposal.proposalId : '',\r\n      stateTitle ? 'Stato: ' + stateTitle : ''\r\n    ].filter(Boolean) : [];\r\n    return {title:copy[0], description:copy[1], summary:fields.join('\\n'), canReply:!!(selected && !isFlorame && !selected.readOnly), canViewOrder:!!selected?.orderDetail};\r\n  }\r\n  function openSupport(event) {\r\n    if (demoMode) { event?.preventDefault?.(); return demo.note(); }\r\n    event?.preventDefault?.();\r\n    if (!supportSheet.hidden) return;\r\n    const context = supportContext(event), summary = context.summary;\r\n    const trigger = event?.target?.closest?.('button') || document.activeElement;\r\n    const shared = window.FlorameAccountCenter?.openUtility?.('help', {\r\n      trigger,\r\n      helpContext: summary ? {\r\n        ...context,\r\n        returnLabel: context.canViewOrder ? 'Vedi dettagli dell\u2019ordine' : 'Torna alla chat del fiorista',\r\n        onReturn: context.canViewOrder || context.canReply ? () => { if (!state.authExpired) { if (context.canViewOrder) openOrderDetails(); else draft?.focus(); } } : null\r\n      } : null\r\n    });\r\n    if (shared) return;\r\n    // Keep support reachable if the shared menu runtime is unavailable.\r\n    const content = $('[data-utility-content]',supportSheet);\r\n    const icon = path => '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"' + path + '\"></path></svg>';\r\n    const chatIcon = icon('M20 15a4 4 0 0 1-4 4H8l-5 3V7a4 4 0 0 1 4-4h10a4 4 0 0 1 4 4z M8 9h8 M8 13h5');\r\n    const chevron = icon('m9 5 7 7-7 7');\r\n    $('header [data-messages-utility-close]',supportSheet).innerHTML=icon('m6 6 12 12 M18 6 6 18');\r\n    const email = 'mailto:assistenza@florame.ai?subject=' + encodeURIComponent('Assistenza Florame') + (summary ? '&body=' + encodeURIComponent('Buongiorno, ho bisogno di aiuto con:\\n\\n' + summary + '\\n\\nLa mia domanda: ') : '');\r\n    content.innerHTML = '<div class=\"florame-messages__support-context\">' + (context.title ? '<strong>' + escapeHtml(context.title) + '</strong>' : '') + '<p>' + escapeHtml(context.description) + '</p></div>'\r\n      + '<button type=\"button\" class=\"florame-messages__save florame-messages__support-chat\" data-support-open>' + chatIcon + '<span>Apri chat Florame</span></button>'\r\n      + '<p class=\"florame-messages__support-note\">Si apre una chat dedicata con l\u2019assistenza, separata dai messaggi al fiorista.</p><p role=\"status\" aria-live=\"polite\" data-support-status></p>'\r\n      + (context.canViewOrder || context.canReply ? '<button type=\"button\" class=\"florame-messages__support-return\" data-support-return>' + (context.canViewOrder ? 'Vedi dettagli dell\u2019ordine' : 'Torna alla chat del fiorista') + '</button>' : '')\r\n      + (summary ? '<details class=\"florame-messages__support-summary\"><summary><span>Dettagli utili da condividere</span>' + chevron + '</summary><p class=\"florame-messages__support-note\">La chat di assistenza non riceve automaticamente questi dettagli. Puoi copiarli e incollarli; nell\u2019email sono gi\u00E0 preparati.</p><textarea readonly aria-label=\"Dettagli da condividere con l\u2019assistenza\">' + escapeHtml(summary) + '</textarea><button type=\"button\" data-support-copy>Copia dettagli</button></details>' : '')\r\n      + '<details class=\"florame-messages__support-contacts\"><summary><span>Preferisci email o telefono?</span>' + chevron + '</summary><div class=\"florame-messages__support-fallback\" data-support-fallback><a href=\"' + escapeHtml(email) + '\">' + icon('M3 5h18v14H3z M3 5l9 7 9-7') + '<span><strong>Scrivi un\u2019email</strong><small>assistenza@florame.ai</small></span></a><a href=\"tel:+393931389130\">' + icon('M5 3h4l2 5-3 2a14 14 0 0 0 6 6l2-3 5 2v4a2 2 0 0 1-2 2C10 21 3 14 3 5a2 2 0 0 1 2-2') + '<span><strong>Chiama Florame</strong><small>+39 393 138 9130</small></span></a></div></details>';\r\n    const button = $('[data-support-open]',content), buttonLabel = $('span',button), statusNode = $('[data-support-status]',content);\r\n    const contacts = $('.florame-messages__support-contacts',content);\r\n    const unavailable = message => {\r\n      statusNode.textContent=message;\r\n      const details=$('.florame-messages__support-summary',content);\r\n      if(details) details.open=false;\r\n      contacts.open=true; buttonLabel.textContent='Riprova ad aprire la chat';\r\n    };\r\n    $('[data-support-return]',content)?.addEventListener('click',()=> { closeUtility(supportSheet); if(context.canViewOrder) openOrderDetails(); });\r\n    $('[data-support-copy]',content)?.addEventListener('click',async ()=> {\r\n      const input = $('textarea',content);\r\n      try { await navigator.clipboard.writeText(summary); statusNode.textContent='Dettagli copiati. Incollali nella chat di assistenza.'; }\r\n      catch { input.closest('details').open=true; input.focus(); input.select(); statusNode.textContent='Copia non disponibile: seleziona e copia i dettagli qui sopra.'; }\r\n    });\r\n    contacts.querySelectorAll('a').forEach(link=>link.addEventListener('click',()=> {\r\n      if(supportOpening) { cancelSupportOpening(); button.disabled=false; button.removeAttribute('aria-busy'); buttonLabel.textContent='Apri chat Florame'; }\r\n      statusNode.textContent=link.protocol==='mailto:' ? 'Si apre la tua app email. Il messaggio sar\u00E0 inviato solo quando lo invierai tu.' : 'Si apre l\u2019app per telefonare.';\r\n    }));\r\n    button.onclick = async event => {\r\n      if(supportOpening) return;\r\n      if(!navigator.onLine) { unavailable('Sei offline. Riconnettiti per la chat oppure usa il numero di telefono.'); return; }\r\n      const epoch=++supportEpoch; supportOpening=true; button.disabled=true; button.setAttribute('aria-busy','true'); buttonLabel.textContent='Apertura chat\u2026';\r\n      statusNode.textContent='Puoi restare qui oppure scegliere email o telefono.';\r\n      let timer;\r\n      try {\r\n        const opener=window.FlorameShopifyInbox?.open || window.openShopifyInboxFromMenu;\r\n        const limit = new Promise(resolve=>{ timer=setTimeout(()=>resolve(false),15000); cancelSupportWait=()=>resolve(false); });\r\n        const opened=typeof opener === 'function' && await Promise.race([Promise.resolve(opener(event)),limit]);\r\n        if(epoch !== supportEpoch) return;\r\n        if(opened === true) { supportOpening=false; closeUtility(supportSheet,false,false); }\r\n        else { window.FlorameShopifyInbox?.close?.(); unavailable('La chat non si \u00E8 aperta. Riprova oppure scegli email o telefono qui sotto.'); }\r\n      } catch (_) {\r\n        if(epoch===supportEpoch) { window.FlorameShopifyInbox?.close?.(); unavailable('Non riusciamo ad aprire la chat. Riprova oppure scegli email o telefono.'); }\r\n      } finally { clearTimeout(timer); if(epoch===supportEpoch) { cancelSupportWait=null; supportOpening=false; button.disabled=false; button.removeAttribute('aria-busy'); } }\r\n    };\r\n    if(!navigator.onLine) unavailable('Sei offline. Riconnettiti per la chat oppure usa il numero di telefono.');\r\n    showUtility(supportSheet);\r\n  }\r\n\r\n  function renderPreferences() {\r\n    const rows = [\r\n      ['partnerOffers', 'Offerte dai tuoi fioristi', 'Promozioni pertinenti, senza riempire la posta.'],\r\n      ['backInStock', 'Di nuovo disponibile', 'Quando torna un bouquet o un fiore salvato.'],\r\n      ['seasonalIdeas', 'Idee e tutorial', 'Spunti utili per occasioni e stagioni.'],\r\n      ['reorderReminders', 'Promemoria ricorrenze', 'Un avviso discreto prima delle date importanti.']\r\n    ];\r\n    $('[data-messages-preferences]').innerHTML = rows.map(([key, title, copy]) => `<label class=\"florame-messages__preference\"><span><strong>${escapeHtml(title)}</strong><small>${escapeHtml(copy)}</small></span><input type=\"checkbox\" data-preference=\"${key}\" ${state.preferences[key] === true ? 'checked' : ''}></label>`).join('');\r\n  }\r\n\r\n  // Each sheet returns to its opener and keeps keyboard navigation inside its panel.\r\n  const sheetOpeners = new WeakMap();\r\n  function rememberSheetOpener(sheet, opener = document.activeElement) {\r\n    if (sheet.hidden) sheetOpeners.set(sheet, opener);\r\n  }\r\n  function restoreSheetOpener(sheet) {\r\n    const opener = sheetOpeners.get(sheet);\r\n    if (opener?.isConnected) opener.focus({ preventScroll: true });\r\n    sheetOpeners.delete(sheet);\r\n  }\r\n  document.addEventListener('keydown', (event) => {\r\n    if (event.key !== 'Tab' || event.defaultPrevented) return;\r\n    const activeSheet = [...utilitySheets, photoSheet, orderSheet, detailsSheet, settings].find(sheet => sheet && !sheet.hidden);\r\n    const panel = activeSheet?.querySelector('.florame-messages__sheet-panel');\r\n    if (!panel) return;\r\n    const controls = [...panel.querySelectorAll('a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])')]\r\n      .filter(node => node.getClientRects().length && getComputedStyle(node).visibility !== 'hidden');\r\n    const first = controls[0];\r\n    const last = controls[controls.length - 1];\r\n    if (!first) { event.preventDefault(); panel.focus(); return; }\r\n    if (event.shiftKey && (document.activeElement === first || document.activeElement === panel || !panel.contains(document.activeElement))) {\r\n      event.preventDefault(); last.focus();\r\n    } else if (!event.shiftKey && (document.activeElement === last || !panel.contains(document.activeElement))) {\r\n      event.preventDefault(); first.focus();\r\n    }\r\n  });\r\n\r\n  function openSettings() {\r\n    renderPreferences();\r\n    rememberSheetOpener(settings);\r\n    settings.hidden = false;\r\n    document.body.classList.add('florame-messages-overlay-open');\r\n    document.documentElement.style.overflow = 'hidden';\r\n    requestAnimationFrame(() => $('.florame-messages__sheet-panel', settings)?.focus());\r\n  }\r\n\r\n  function closeSettings() {\r\n    settings.hidden = true;\r\n    restoreSheetOpener(settings);\r\n    if (detailsSheet.hidden) document.body.classList.remove('florame-messages-overlay-open');\r\n    document.documentElement.style.removeProperty('overflow');\r\n  }\r\n\r\n  async function saveSettings() {\r\n    const preferences = { ...state.preferences };\r\n    $$('[data-preference]', settings).forEach((input) => { preferences[input.dataset.preference] = input.checked; });\r\n    const button = $('[data-messages-settings-save]');\r\n    button.disabled = true;\r\n    button.textContent = 'Salvo\u2026';\r\n    try {\r\n      const payload = await request('preferences', { method: 'POST', body: { preferences } });\r\n      state.preferences = payload.preferences || preferences;\r\n      closeSettings();\r\n      setMessageStatus('Preferenze salvate.');\r\n      setTimeout(() => { if (status.textContent === 'Preferenze salvate.') setMessageStatus(''); }, 2200);\r\n    } catch (_) { button.textContent = 'Riprova'; }\r\n    finally { button.disabled = false; if (button.textContent !== 'Riprova') button.textContent = 'Salva preferenze'; }\r\n  }\r\n\r\n  $('[data-messages-search-toggle]').addEventListener('click', (event) => {\r\n    const search = $('[data-messages-search]');\r\n    search.hidden = false;\r\n    event.currentTarget.setAttribute('aria-expanded', 'true');\r\n    $('[data-messages-search-input]').focus();\r\n  });\r\n  $('[data-messages-search-close]').addEventListener('click', () => {\r\n    $('[data-messages-search]').hidden = true;\r\n    $('[data-messages-search-toggle]').setAttribute('aria-expanded', 'false');\r\n    state.search = '';\r\n    $('[data-messages-search-input]').value = '';\r\n    renderList();\r\n  });\r\n  $('[data-messages-search-input]').addEventListener('input', (event) => { state.search = event.target.value.trim(); renderList(); });\r\n  root.addEventListener('click', event=> { if(event.target.closest('[data-messages-support], [data-proposal-support]')) openSupport(event); });\r\n  messagesNode.addEventListener('click', (event) => {\r\n    const retry = event.target.closest('[data-message-retry]');\r\n    if(retry) { void retryMessage(retry.dataset.messageRetry); return; }\r\n    const edit = event.target.closest('[data-message-edit]');\r\n    if(edit) {\r\n      const row = state.outbox.find(row=>row.key === edit.dataset.messageEdit);\r\n      if(row) {\r\n        if(row.status === 'uncertain') { setMessageStatus('Verifica prima l\u2019invio: il messaggio potrebbe essere gi\u00E0 arrivato.'); return; }\r\n        if(draft.value.trim()) { setMessageStatus('Conserva o invia la bozza attuale prima di modificare questo messaggio.'); return; }\r\n        state.outbox = state.outbox.filter(item=>item !== row); draft.value = row.text; state.drafts.set(row.threadId,row.text); saveSession(); updateComposer(); refreshLocalThread(row.threadId); draft.focus(); void drainOutbox(row.threadId);\r\n      }\r\n      return;\r\n    }\r\n    const proposalAction = event.target.closest('[data-proposal-action]');\r\n    if (proposalAction) {\r\n      const proposalId = proposalAction.closest('[data-proposal-id]')?.dataset.proposalId;\r\n      if (proposalAction.dataset.proposalAction === 'checkout') checkoutProposal(proposalAction, proposalId);\r\n      else declineProposal(proposalAction, proposalId);\r\n      return;\r\n    }\r\n    const action = event.target.closest('[data-message-event-action]');\r\n    if (!action) return;\r\n    const name = action.dataset.messageEventAction;\r\n    if (name === 'view_order') openOrderDetails();\r\n    if (name === 'support') openSupport(event);\r\n  });\r\n  $('[data-messages-partner-start-button]').addEventListener('click', startPartnerConversation);\r\n  $('[data-messages-back]').addEventListener('click', closeThread);\r\n  $('[data-messages-details]').addEventListener('click', openPartnerDetails);\r\n  $$('[data-messages-details-close]').forEach((button) => button.addEventListener('click', closePartnerDetails));\r\n  $$('[data-messages-order-close]').forEach((button) => button.addEventListener('click', () => closeOrderDetails()));\r\n  root.addEventListener('click', event => {\r\n    const button = event.target.closest('[data-messages-photo]');\r\n    if (button) openPhoto(button);\r\n  });\r\n  $$('[data-messages-photo-close]').forEach(button => button.addEventListener('click', closePhoto));\r\n  $('[data-messages-photo-image]')?.addEventListener('error', event => {\r\n    event.currentTarget.hidden = true;\r\n    $('[data-messages-photo-error]').hidden = false;\r\n  });\r\n  $('[data-messages-order-message]')?.addEventListener('click', () => {\r\n    closeOrderDetails();\r\n    draft?.focus();\r\n  });\r\n  composer.addEventListener('submit', sendMessage);\r\n  draft.addEventListener('input', () => { if (state.selected) state.drafts.set(state.selected.threadId, draft.value); saveSession(); updateComposer(); });\r\n  scrollNode.addEventListener('scroll', updateLatest, { passive: true });\r\n  latest?.addEventListener('click', jumpToLatest);\r\n  const viewport = window.visualViewport;\r\n  let viewportFrame;\r\n  const updateViewport = () => {\r\n    cancelAnimationFrame(viewportFrame);\r\n    viewportFrame = requestAnimationFrame(() => {\r\n      const height = viewport?.height || innerHeight;\r\n      const keyboard = height < innerHeight - 140;\r\n      root.style.setProperty('--messages-viewport-height', `${height}px`);\r\n      root.style.setProperty('--messages-viewport-top', `${viewport?.offsetTop || 0}px`);\r\n      root.classList.toggle('is-keyboard-open', keyboard);\r\n      const nav = document.querySelector('.florame-global-nav');\r\n      if (nav) {\r\n        // The dock can expand, disappear or change height. Reserve its actual\r\n        // layout box, not a second set of hard-coded navigation dimensions.\r\n        const reserve = nav.getClientRects().length ? nav.offsetHeight : 0;\r\n        root.style.setProperty('--messages-nav-height', `${reserve}px`);\r\n      }\r\n      updateLatest();\r\n    });\r\n  };\r\n  viewport?.addEventListener('resize', updateViewport);\r\n  viewport?.addEventListener('scroll', updateViewport);\r\n  window.addEventListener('resize', updateViewport);\r\n  if (window.ResizeObserver) {\r\n    let draftWidth = 0;\r\n    let previousScrollHeight = scrollNode.clientHeight;\r\n    const layoutObserver = new ResizeObserver(entries => {\r\n      for (const entry of entries) {\r\n        if (entry.target === scrollNode) {\r\n          const wasAtEnd = previousScrollHeight > 0 && scrollNode.scrollHeight - scrollNode.scrollTop - previousScrollHeight < 40;\r\n          previousScrollHeight = scrollNode.clientHeight;\r\n          requestAnimationFrame(() => {\r\n            if (wasAtEnd && state.threadReady) scrollNode.scrollTo({ top: scrollNode.scrollHeight, behavior: 'instant' });\r\n            updateLatest();\r\n          });\r\n        } else if (entry.target === composer) {\r\n          if (entry.contentRect.width !== draftWidth) {\r\n            draftWidth = entry.contentRect.width;\r\n            requestAnimationFrame(resizeComposer);\r\n          }\r\n        } else updateViewport();\r\n      }\r\n    });\r\n    layoutObserver.observe(composer);\r\n    layoutObserver.observe(scrollNode);\r\n    const observeNavigation = () => {\r\n      const nav = document.querySelector('.florame-global-nav');\r\n      if (nav) layoutObserver.observe(nav);\r\n      updateViewport();\r\n    };\r\n    if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', observeNavigation, { once: true });\r\n    else observeNavigation();\r\n  }\r\n  updateViewport();\r\n  $$('[data-messages-filter]').forEach(button => button.addEventListener('click', () => {\r\n    state.filter = button.dataset.messagesFilter;\r\n    $$('[data-messages-filter]').forEach(item => item.setAttribute('aria-pressed', String(item === button)));\r\n    renderList();\r\n  }));\r\n  $('[data-messages-settings-open]').addEventListener('click', (event) => {\r\n    if (!initialAuthenticated) return requestAuthentication(event.currentTarget, 'messages_preferences');\r\n    openSettings();\r\n  });\r\n  $$('[data-messages-settings-close]').forEach((button) => button.addEventListener('click', closeSettings));\r\n  $('[data-messages-settings-save]').addEventListener('click', saveSettings);\r\n  document.addEventListener('keydown', (event) => {\r\n    if (event.key !== 'Escape') return;\r\n    const utility = utilitySheets.find(sheet=>!sheet.hidden);\r\n    if (utility) closeUtility(utility);\r\n    else if (photoSheet && !photoSheet.hidden) closePhoto();\r\n    else if (orderSheet && !orderSheet.hidden) closeOrderDetails();\r\n    else if (!detailsSheet.hidden) closePartnerDetails();\r\n    else if (!settings.hidden) closeSettings();\r\n    else if (root.classList.contains('is-thread-open') && matchMedia('(max-width: 899px)').matches) closeThread();\r\n  });\r\n  document.addEventListener('visibilitychange', () => {\r\n    if (initialAuthenticated && !state.authExpired && !document.hidden) refreshVisible();\r\n  });\r\n\r\n  function refreshVisible() {\r\n    if (!initialAuthenticated || state.authExpired) return;\r\n    if (document.hidden || !navigator.onLine || state.pageBusy || state.proposalBusy || state.threadLoading || state.inboxLoading) return false;\r\n    return Promise.all([state.selected ? openThread(state.selected, { quiet: true }) : null, loadInbox({ quiet: true })]);\r\n  }\r\n  window.addEventListener('online', () => { refreshVisible(); new Set(state.outbox.filter(row=>row.status==='queued').map(row=>row.threadId)).forEach(id=>void drainOutbox(id)); });\r\n  window.addEventListener('offline', () => { setMessageStatus('Sei offline. I messaggi e le bozze restano qui.'); if(state.selected) refreshLocalThread(state.selected.threadId); });\r\n  window.addEventListener('florame:native-language-change', () => {\r\n    // Reformat the current conversation without refetching or changing its draft.\r\n    renderList();\r\n    if (state.selected) {\r\n      renderThreadHeader(state.selected);\r\n      renderContext(state.selected);\r\n      if (state.threadReady) renderMessages({ keepScroll: true });\r\n    }\r\n    window.FlorameI18n?.apply(root);\r\n  });\r\n  if (initialAuthenticated) loadInbox();\r\n  else loginState();\r\n  function bindCustomerLive() {\r\n    if (demoMode || customerLive || !initialAuthenticated || state.authExpired || !window.FlorameLiveSync) return;\r\n    customerLive = window.FlorameLiveSync.customer({ getSession: () => request('live_session'), onChange: async () => {\r\n      const result = await refreshVisible();\r\n      if (result === false) return false; // Busy: retry locally, without a DB read.\r\n      if (result?.includes(false)) throw new Error('MESSAGES_REFRESH_FAILED');\r\n    } });\r\n  }\r\n  window.addEventListener('florame:live-sync-ready', bindCustomerLive);\r\n  bindCustomerLive();\r\n  const stopCustomerLive = () => { customerLive?.close(); customerLive = null; };\r\n  window.addEventListener('pagehide', stopCustomerLive);\r\n  window.addEventListener('pageshow', event => { if (event.persisted) bindCustomerLive(); });\r\n  ['florame:logout', 'florame:auth-changed'].forEach(name => window.addEventListener(name, stopCustomerLive));\r\n  state.poll = setInterval(() => {\r\n    if (customerLive) return;\r\n    if (!initialAuthenticated || state.authExpired || !navigator.onLine || document.hidden || state.busy || state.proposalBusy || state.threadLoading || state.pageBusy) return;\r\n    if (state.selected) openThread(state.selected, { quiet: true });\r\n    else loadInbox({ quiet: true });\r\n  }, 10 * 60000);\r\n})();\r\n"],
  "mappings": "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",
  "names": ["status", "request", "params", "node", "event", "row"]
}
