{
  "version": 3,
  "sources": ["/cdn/shop/t/33/assets/azar-staff.js?x=5223"],
  "sourcesContent": ["/* Azar Group \u2014 ground staff page.\n\n   Runs on a phone, in a warehouse, on a bad connection. No framework, no build\n   step, and every step degrades into something a man can still act on.\n\n   The flow: choose your name \u2192 type your PIN, on one screen \u2192 your items. Typed counts are\n   kept on the phone as he goes, so a locked screen never loses the morning.\n\n   Answers go to a Google Sheet when \"Sheet script URL\" is set in the theme\n   editor: the button saves the number and turns into a tick. Without that URL\n   the page falls back to WhatsApp, the way it worked before.\n\n   Two deliberate limits, both documented in the section file:\n   - the PIN identifies who is answering, it does not secure the page;\n   - the item's expected quantity is never sent here, so counting stays blind. */\n\n(function () {\n  var root = document.querySelector('[data-azar-staff]');\n  if (!root) return;\n\n  var WA = (root.dataset.whatsapp || '').replace(/[^0-9]/g, '');\n  var TASKS_URL = root.dataset.tasks;\n  var SHEET = /^https:\\/\\/script\\.google\\.com\\//.test(root.dataset.sheetUrl || '') ? root.dataset.sheetUrl : '';\n  /* Activity (Elio 18/10/2026): visits go to the Sheet script unless the theme\n     setting \"Record staff visits\" is off. The owners see the Activity tab and are\n     never tracked themselves (\"Don't track our activity\"). Showing the tab is only\n     display: the script checks the PIN and the owner list before it answers. */\n  var ACTIVITY_ON = root.dataset.activity !== 'off';\n  /* /pages/staff?demo=shelves: the location page with invented items, for screenshots and\n     training. No sign-in, no PIN and no request to the Sheet script (call() answers locally). */\n  var DEMO = /[?&]demo=(shelves|review)(&|$)/.test(location.search);\n  var DEMO_REVIEW = /[?&]demo=review(&|$)/.test(location.search); /* the review side: add &owner=1 to see it as Elio/Juan */\n  var OWNER_IDS = ['elio-test', 'georges', 'juan'];   /* the family: never tracked */\n  var VIEWER_IDS = ['elio-test'];   /* Elio 18/10/2026: only he sees the Activity tab */\n\n  /* Every word the script writes comes from the theme editor, so the page can be\n     reworded \u2014 or translated again \u2014 without touching this file. */\n  var T = {\n    count: root.dataset.labelCount || '\u0643\u0645 \u0627\u0644\u0639\u062F\u062F\u061F',\n    send: root.dataset.labelSend || '\u0625\u0631\u0633\u0627\u0644',\n    photos: root.dataset.labelPhotos || '\u0623\u0631\u0633\u0644 \u0627\u0644\u0635\u0648\u0631',\n    display: root.dataset.labelDisplay || '\u0627\u0644\u0639\u0631\u0636',\n    progress: root.dataset.labelProgress || '\u062A\u0645 \u062C\u0631\u062F [done] \u0645\u0646 [total]',\n    empty: root.dataset.labelEmpty || '\u0644\u0627 \u064A\u0648\u062C\u062F \u0634\u064A\u0621 \u0639\u0644\u0649 \u0642\u0627\u0626\u0645\u062A\u0643 \u0627\u0644\u064A\u0648\u0645.',\n    error: root.dataset.labelError || '\u0644\u0645 \u062A\u064F\u0641\u062A\u062D \u0627\u0644\u0642\u0627\u0626\u0645\u0629. \u062A\u0623\u0643\u062F \u0645\u0646 \u0627\u0644\u0625\u0646\u062A\u0631\u0646\u062A \u0648\u0627\u0641\u062A\u062D \u0627\u0644\u0635\u0641\u062D\u0629 \u0645\u0646 \u062C\u062F\u064A\u062F.',\n    photoNote: root.dataset.labelPhotoNote || '\u0627\u0644\u0635\u0648\u0631\u0629 \u0645\u0631\u0641\u0642\u0629.',\n    saving: root.dataset.labelSaving || '\u062C\u0627\u0631\u064D \u0627\u0644\u0625\u0631\u0633\u0627\u0644\u2026',\n    sent: root.dataset.labelSent || '\u062A\u0645 \u0627\u0644\u0625\u0631\u0633\u0627\u0644 \u2713',\n    failed: root.dataset.labelFailed || '\u0644\u0645 \u064A\u064F\u0631\u0633\u0644\u060C \u0627\u0636\u063A\u0637 \u0645\u0631\u0629 \u062B\u0627\u0646\u064A\u0629',\n    approved: root.dataset.labelApproved || '\u062A\u0645\u062A \u0627\u0644\u0645\u0648\u0627\u0641\u0642\u0629 \u2713',\n    family: root.dataset.labelFamily || '\u0627\u0644\u0639\u0627\u0626\u0644\u0629',\n    brand: root.dataset.labelBrand || '\u0627\u0644\u0645\u0627\u0631\u0643\u0629',\n    code: root.dataset.labelCode || '\u0631\u0642\u0645 \u0627\u0644\u0635\u0646\u0641',\n    place: root.dataset.labelPlace || '\u0627\u0644\u0645\u0643\u0627\u0646',\n    zoom: root.dataset.labelZoom || '\u0643\u0628\u0651\u0631 \u0627\u0644\u0635\u0648\u0631\u0629',\n    close: root.dataset.labelClose || '\u0625\u063A\u0644\u0627\u0642',\n    /* order lists and sign-in through the Sheet script (version 5) */\n    offline: '\u0644\u0627 \u064A\u0648\u062C\u062F \u0627\u062A\u0635\u0627\u0644. \u062A\u0623\u0643\u062F \u0645\u0646 \u0627\u0644\u0625\u0646\u062A\u0631\u0646\u062A \u0648\u062D\u0627\u0648\u0644 \u0645\u0631\u0629 \u062B\u0627\u0646\u064A\u0629.',\n    checking: '\u062C\u0627\u0631\u064D \u0627\u0644\u062A\u062D\u0642\u0642\u2026',\n    orders: '\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0637\u0644\u0628',\n    recommended: '\u0627\u0644\u0643\u0645\u064A\u0629 \u0627\u0644\u0645\u0642\u062A\u0631\u062D\u0629',\n    qty: '\u0627\u0644\u0643\u0645\u064A\u0629',\n    note: '\u0645\u0644\u0627\u062D\u0638\u0629 (\u0627\u062E\u062A\u064A\u0627\u0631\u064A)',\n    sendList: '\u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u0642\u0627\u0626\u0645\u0629',\n    listSent: '\u062A\u0645 \u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u2713',\n    listHint: '\u063A\u064A\u0651\u0631 \u0627\u0644\u0643\u0645\u064A\u0629 \u0625\u0630\u0627 \u0644\u0632\u0645\u060C \u062B\u0645 \u0623\u0631\u0633\u0644 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0643\u0644\u0647\u0627 \u0645\u0631\u0629 \u0648\u0627\u062D\u062F\u0629. \u064A\u0645\u0643\u0646\u0643 \u0627\u0644\u0625\u0631\u0633\u0627\u0644 \u0645\u0631\u0629 \u062B\u0627\u0646\u064A\u0629 \u0644\u0644\u062A\u0639\u062F\u064A\u0644.',\n    listFailed: '\u0644\u0645 \u062A\u064F\u0631\u0633\u0644 \u0627\u0644\u0642\u0627\u0626\u0645\u0629\u060C \u0627\u0636\u063A\u0637 \u0645\u0631\u0629 \u062B\u0627\u0646\u064A\u0629',\n    locked: '\u0645\u062D\u0627\u0648\u0644\u0627\u062A \u0643\u062B\u064A\u0631\u0629. \u0627\u0646\u062A\u0638\u0631 \u0631\u0628\u0639 \u0633\u0627\u0639\u0629 \u0623\u0648 \u0627\u0633\u0623\u0644 \u0627\u0644\u0645\u062F\u064A\u0631\u0629 \u0633\u062A\u064A\u0641\u0627\u0646\u064A.',\n    sessionExpired: '\u0627\u0646\u062A\u0647\u062A \u0645\u062F\u0629 \u0627\u0644\u062F\u062E\u0648\u0644\u060C \u0623\u062F\u062E\u0644 \u0631\u0645\u0632\u0643. \u00B7 Your sign-in expired, enter your PIN.',\n    pausedUntil: '\u0627\u0644\u062F\u062E\u0648\u0644 \u0645\u062A\u0648\u0642\u0641 \u0645\u0624\u0642\u062A\u0627\u064B \u062D\u062A\u0649 {t} \u00B7 Sign-in paused until {t}',\n    noDataOffline: '\u0644\u0645 \u062A\u0635\u0644 \u0628\u064A\u0627\u0646\u0627\u062A\u0643 \u0628\u0639\u062F\u060C \u062C\u0627\u0631\u064D \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629\u2026 \u00B7 Your data has not arrived yet, trying again\u2026',\n    noDataOther: '\u062A\u0639\u0630\u0651\u0631 \u062A\u062D\u0645\u064A\u0644 \u0628\u064A\u0627\u0646\u0627\u062A\u0643. \u0627\u0636\u063A\u0637 \u00AB\u0644\u0633\u062A \u0623\u0646\u062A\u061F\u00BB \u0648\u0627\u062F\u062E\u0644 \u0645\u0646 \u062C\u062F\u064A\u062F. \u00B7 Your data could not load. Tap \u00AB\u0644\u0633\u062A \u0623\u0646\u062A\u061F\u00BB and sign in again.',\n    lockedUntil: '\u0645\u062D\u0627\u0648\u0644\u0627\u062A \u062E\u0627\u0637\u0626\u0629 \u0643\u062B\u064A\u0631\u0629. \u0627\u0644\u062F\u062E\u0648\u0644 \u0645\u0642\u0641\u0644 \u062D\u062A\u0649 {t}. \u00B7 Too many wrong tries. Locked until {t}.',\n    unknown: '\u0627\u0633\u0645\u0643 \u063A\u064A\u0631 \u0645\u0633\u062C\u064E\u0651\u0644 \u0628\u0639\u062F \u0641\u064A \u0627\u0644\u0646\u0638\u0627\u0645. \u0627\u0633\u0623\u0644 \u0627\u0644\u0645\u062F\u064A\u0631\u0629 \u0633\u062A\u064A\u0641\u0627\u0646\u064A.',\n    listChanged: '\u062A\u063A\u064A\u0651\u0631\u062A \u0627\u0644\u0642\u0627\u0626\u0645\u0629. \u0623\u063A\u0644\u0642 \u0627\u0644\u0635\u0641\u062D\u0629 \u0648\u0627\u0641\u062A\u062D\u0647\u0627 \u0645\u0646 \u062C\u062F\u064A\u062F\u061B \u0623\u0631\u0642\u0627\u0645\u0643 \u0645\u062D\u0641\u0648\u0638\u0629 \u0639\u0644\u0649 \u0627\u0644\u0647\u0627\u062A\u0641.'\n  };\n\n  /* ---------- News and Info cards (Elio 17/10/2026) ----------\n     They live in their own sections (a section holds at most 50 blocks and this\n     one carries the roster); move them into their tab. In the theme editor a\n     changed section is re-rendered in its own place, so do it again then. */\n  function mountBoards() {\n    Array.prototype.forEach.call(document.querySelectorAll('[data-staff-board]'), function (board) {\n      var name = board.getAttribute('data-staff-board');\n      var slot = root.querySelector('[data-staff-board-slot=\"' + name + '\"]');\n      if (!slot || !board.firstElementChild) return; /* already moved: keep what is there */\n      slot.innerHTML = '';\n      while (board.firstChild) slot.appendChild(board.firstChild);\n    });\n  }\n  mountBoards();\n\n  var rosterEl = root.querySelector('[data-staff-roster]');\n  var picker = root.querySelector('[data-staff-picker]');\n  var gateForm = root.querySelector('[data-staff-gate-form]');\n  var nameSelect = root.querySelector('[data-staff-select]');\n  var pinInput = root.querySelector('#azar-staff-pin');\n  var gateError = root.querySelector('[data-staff-gate-error]');\n  var bar = root.querySelector('[data-staff-bar]');\n  var whoLabel = root.querySelector('[data-staff-who]');\n  var switchBtn = root.querySelector('[data-staff-switch]');\n  var work = root.querySelector('[data-staff-work]');\n  var rowsList = root.querySelector('[data-staff-rows]');\n  var dayLine = root.querySelector('[data-staff-day]');\n  var progress = root.querySelector('[data-staff-progress]');\n  var thanks = root.querySelector('[data-staff-thanks]');\n  var wasComplete = null; /* null until the first render, so reopening a finished day does not scroll */\n  var approve = root.querySelector('[data-staff-approve]');\n  var approveLink = root.querySelector('[data-staff-approve-link]');\n  var formArea = root.querySelector('[data-staff-form]');\n  var dateLabel = root.querySelector('[data-staff-date]');\n  var nextLine = root.querySelector('[data-staff-next]');\n  var deskNote = root.querySelector('[data-staff-desk]');\n  var todoBadge = root.querySelector('[data-staff-todo]');\n  var newsDot = root.querySelector('[data-staff-newsdot]');\n  var deskSoon = root.querySelector('[data-staff-desk-soon]');\n  var deskBox = root.querySelector('[data-staff-desk-tasks]');\n  var sparkBox = root.querySelector('[data-staff-spark]');\n  var deskTasks = null; /* this person's weekly tasks from the Sheet script, kept in memory only */\n  var deskUpdated = '';\n  (function () {\n    var tasksPanel = root.querySelector('[data-staff-panel=\"tasks\"]');\n    var attPanel = root.querySelector('[data-staff-panel=\"myatt\"]');\n    var shelfPanel = root.querySelector('[data-staff-panel=\"shelves\"]');\n    if (tasksPanel && attPanel) tasksPanel.parentNode.insertBefore(attPanel, tasksPanel);\n    if (tasksPanel && shelfPanel) tasksPanel.parentNode.insertBefore(shelfPanel, tasksPanel.nextSibling);\n  })();\n  var tabButtons = Array.prototype.slice.call(root.querySelectorAll('[data-staff-tab]'));\n  var tabPanels = Array.prototype.slice.call(root.querySelectorAll('[data-staff-panel]'));\n  var tabChosen = false; /* the first tab is picked once per sign-in, then the man decides */\n  var currentTab = ''; /* the tab on screen, for the visit log */\n\n  var roster = [];\n  try {\n    roster = JSON.parse(rosterEl.textContent) || [];\n  } catch (e) {\n    roster = [];\n  }\n  roster = roster.filter(function (p) {\n    return p && p.name;\n  });\n\n  var ordersBox = root.querySelector('[data-staff-orders]');\n  var gateButton = gateForm.querySelector('button[type=\"submit\"]');\n\n  var data = null;\n  var person = null;\n  /* The PIN typed at sign-in, sent with every answer so the Sheet script can check\n     it (version 5). Kept on this phone for the day, cleared by \"Not you?\". */\n  var sessionPin = null;\n  /* Stay signed in for 30 days (Elio 31/10/2026: \"make the employee if he is logged in,\n     to stay logged in till 30 days ... after 30 days they log in again\"). The script\n     hands staff a token for this device; the phone keeps only {id, token}, never the\n     PIN, and every call carries the token. Owners are not given one. */\n  var sessionToken = null;\n  var SESSION_KEY = 'azar-staff:session';\n  var loggingIn = false;\n  var hasOrderList = false;\n  var listDay = null; /* the day the list was opened for; keys stay on it past midnight */\n\n  /* localStorage throws in a private window; never let that stop the page. */\n  function store(key, value) {\n    try {\n      if (value === undefined) return window.localStorage.getItem(key);\n      window.localStorage.setItem(key, value);\n    } catch (e) {\n      /* nothing remembered between screens, everything still works */\n    }\n    return null;\n  }\n\n  function today() {\n    var d = new Date();\n    return d.getFullYear() + '-' + String(d.getMonth() + 1).padStart(2, '0') + '-' + String(d.getDate()).padStart(2, '0');\n  }\n\n  function answerKey(code) {\n    return 'azar-staff:' + (listDay || today()) + ':' + (person ? person.id : '?') + ':' + code;\n  }\n\n  function waLink(text) {\n    return 'https://wa.me/' + WA + '?text=' + encodeURIComponent(text);\n  }\n\n  /* One answer to the sheet. A text/plain body keeps it a \"simple\" request with\n     no CORS preflight (Apps Script cannot answer one); the reply is readable\n     after Google's redirect. A dead connection gives up after 20 seconds; if\n     that request still lands later, the sheet keeps whichever count was sent\n     last from the phone (it compares \"Sent at\"), so a retry always wins. */\n  function post(payload, done) {\n    call(payload, function (j) {\n      if (j && j.error === 'pin') pinRefused();\n      done(!!(j && j.ok));\n    });\n  }\n\n  /* The script no longer accepts this phone's PIN (it was changed, or a man signed\n     in offline with a wrong one): sign out and ask for the PIN again, instead of\n     letting every send fail with \"press again\". */\n  function pinRefused() {\n    if (!person) return;\n    switchBtn.click();\n    showError(gateError.dataset.wrongPin || '\u0627\u0644\u0631\u0645\u0632 \u063A\u064A\u0631 \u0635\u062D\u064A\u062D. \u0627\u0633\u0623\u0644 \u0627\u0644\u0645\u062F\u064A\u0631\u0629 \u0633\u062A\u064A\u0641\u0627\u0646\u064A.');\n  }\n\n  /* The same request, handing back the script's whole reply (null on no reply).\n     The signed-in PIN rides along, so the script can check every answer. */\n  /* One login, one phone (Elio 31/10/2026, \"Yes, everyone\"): a random key made on this\n     browser's first sign-in rides along with every call. A sign-in from a phone the\n     script does not know waits until Elio approves it. Clearing the browser's data\n     makes a new key, which then needs approval again. */\n  /* The key lives in three places so one blocked store cannot create a new device (Elio\n     02/11/2026, Rihab stuck on \"approve new device\"): memory for this page, localStorage,\n     and a first-party cookie (1 year, SameSite=Lax). Before this, a phone whose storage\n     refused the write made a NEW key on every call. All places are kept in step. */\n  var devMem = '';\n  var DEV_KEY = 'azar-staff:device';\n\n  function devCookieGet() {\n    try {\n      var m = /(?:^|;\\s*)azar_dev=([0-9a-f]{32})/.exec(document.cookie || '');\n      return m ? m[1] : '';\n    } catch (e) {\n      return '';\n    }\n  }\n\n  function devCookieSet(k) {\n    try {\n      document.cookie = 'azar_dev=' + k + '; max-age=31536000; path=/; SameSite=Lax' + (location.protocol === 'https:' ? '; Secure' : '');\n    } catch (e) {\n      /* cookies blocked: the other two places still hold it */\n    }\n  }\n\n  function deviceKey() {\n    var k = devMem || store(DEV_KEY) || devCookieGet();\n    if (!/^[0-9a-f]{32}$/.test(k || '')) {\n      var a = new Uint8Array(16);\n      try {\n        (window.crypto || window.msCrypto).getRandomValues(a);\n      } catch (e) {\n        for (var i = 0; i < 16; i++) a[i] = Math.floor(Math.random() * 256);\n      }\n      k = Array.prototype.map.call(a, function (b) { return ('0' + b.toString(16)).slice(-2); }).join('');\n    }\n    if (k !== devMem) {\n      devMem = k;\n      if (store(DEV_KEY) !== k) store(DEV_KEY, k);\n      if (devCookieGet() !== k) devCookieSet(k);\n    }\n    return k;\n  }\n\n  /* Under the master PIN the page is read only (Elio 31/10/2026: \"view as\" should be\n     read-only). These calls change something, so they never leave the phone then. */\n  var WRITE_TYPES = ['approval_decide', 'pin_help', 'approve', 'attendance', 'attendance_review', 'count', 'daily_cash_receive',\n    'device_decide', 'order', 'set_master_pin', 'set_pin', 'shelf_decide', 'shelf_save', 'shelf_undo', 'shelf_check'];\n\n  function call(payload, done, waitMs) {\n    if (DEMO) return demoCall(payload, done);\n    if (viewAs && WRITE_TYPES.indexOf(payload && payload.type) !== -1) {\n      viewOnlyNote();\n      setTimeout(function () { done({ ok: false, error: 'view_only' }); }, 0);\n      return;\n    }\n    var body = Object.assign({ sentAt: new Date().toISOString() }, payload);\n    if (body.pin == null && sessionPin) body.pin = sessionPin;\n    if (body.token == null && sessionToken && !viewAs) body.token = sessionToken;\n    if (body.device_id == null) body.device_id = deviceKey();\n    /* the phone's name (\"Android 14 \u00B7 Chrome\") is what Elio sees on a new-phone request; it\n       rides on EVERY call, so the Devices log can fill it in even when the call that bound the\n       device did not carry it (Elio 02/11/2026: a bound phone showed \"?\") */\n    if (body.device == null) body.device = device();\n    var ctrl = typeof AbortController === 'function' ? new AbortController() : null;\n    var finished = false;\n    function finish(reply) {\n      if (finished) return;\n      finished = true;\n      clearTimeout(timer);\n      done(reply);\n    }\n    var timer = setTimeout(function () {\n      if (ctrl) ctrl.abort();\n      finish(null);\n    }, waitMs || 20000);\n    fetch(SHEET, {\n      method: 'POST',\n      headers: { 'Content-Type': 'text/plain;charset=utf-8' },\n      body: JSON.stringify(body),\n      signal: ctrl ? ctrl.signal : undefined\n    })\n      .then(function (r) {\n        return r.json();\n      })\n      .then(function (j) {\n        /* everyone sets a 6+ digit PIN first (Team v27): any call can answer pin_change */\n        if (j && j.error === 'pin_change' && person) setPinGate({ pin_change: j.pin_change || { min: 6 } });\n        if (j && j.error === 'view_only') viewOnlyNote();\n        /* this phone is no longer the approved one: sign out to the waiting screen */\n        if (j && (j.error === 'device' || j.error === 'device_refused') && person) {\n          var who = person;\n          var pin = sessionPin;\n          switchBtn.click();\n          showDeviceWait(who, pin, j);\n        }\n        /* the 30-day sign-in ended (expired, PIN reset, device replaced): ask for the PIN */\n        if (j && j.error === 'token' && person && payload.type !== 'login') sessionEnded(person);\n        finish(j || null);\n      })\n      .catch(function () {\n        finish(null);\n      });\n  }\n\n  /* ---------- Activity: visits, fire and forget ----------\n     Never waits, never retries, never shows anything: a lost visit costs nothing.\n     sendBeacon (or a keepalive fetch) still goes out while the page is closing. */\n  function isViewer(p) {\n    return !!p && VIEWER_IDS.indexOf(p.id) !== -1;\n  }\n\n  function isOwner(p) {\n    return !!p && (OWNER_IDS.indexOf(p.id) !== -1 || p.role === 'owner');\n  }\n\n  function device() {\n    var ua = navigator.userAgent || '';\n    var os = /iPhone|iPad|iPod/.test(ua) ? 'iOS ' + ((ua.match(/OS (\\d+)/) || [])[1] || '') :\n      /Android/.test(ua) ? 'Android ' + ((ua.match(/Android (\\d+)/) || [])[1] || '') :\n      /Windows/.test(ua) ? 'Windows' : /Mac OS X/.test(ua) ? 'Mac' : /Linux/.test(ua) ? 'Linux' : 'other';\n    var br = /SamsungBrowser/.test(ua) ? 'Samsung' : /Edg\\//.test(ua) ? 'Edge' : /OPR\\//.test(ua) ? 'Opera' :\n      /CriOS|Chrome\\//.test(ua) ? 'Chrome' : /FxiOS|Firefox\\//.test(ua) ? 'Firefox' : /Safari\\//.test(ua) ? 'Safari' : '';\n    return (os.trim() + (br ? ' \u00B7 ' + br : '')).slice(0, 60);\n  }\n\n  function track(event, tab, detail) {\n    if (!SHEET || !ACTIVITY_ON || !person || !(sessionPin || sessionToken) || isOwner(person) || viewAs) return;\n    var body = JSON.stringify({\n      type: 'visit',\n      person: person.id,\n      staff_id: person.id,\n      name: person.name,\n      pin: sessionPin || undefined,\n      token: sessionToken || undefined,\n      device_id: deviceKey(),\n      event: event,\n      tab: tab || '',\n      detail: String(detail || '').slice(0, 120),\n      device: device(),\n      ts: new Date().toISOString()\n    });\n    try {\n      if (navigator.sendBeacon && navigator.sendBeacon(SHEET, new Blob([body], { type: 'text/plain;charset=UTF-8' }))) return;\n    } catch (e) {\n      /* fall through to fetch */\n    }\n    try {\n      fetch(SHEET, { method: 'POST', mode: 'no-cors', keepalive: true, headers: { 'Content-Type': 'text/plain;charset=utf-8' }, body: body })\n        .catch(function () {});\n    } catch (e) {\n      /* nothing to do: a visit is never worth an error */\n    }\n  }\n\n  /* A phone keyboard set to Arabic types \u0660-\u0669 (or \u06F0-\u06F9); PINs and counts are\n     compared and sent as 0-9, so translate before anything else looks at them. */\n  function westernDigits(text) {\n    return String(text || '')\n      .replace(/[\u0660-\u0669]/g, function (d) {\n        return String(d.charCodeAt(0) - 0x0660);\n      })\n      .replace(/[\u06F0-\u06F9]/g, function (d) {\n        return String(d.charCodeAt(0) - 0x06f0);\n      });\n  }\n\n  /* ---------- Sign in: name from a dropdown, PIN under it ---------- */\n  /* The name list is grouped by team (Elio 17/10/2026: everyone, desk staff too,\n     signs in here). The roster's \"team\" is English for the WhatsApp message; the\n     picker shows it in Arabic, and any team not listed here shows as typed. */\n  var TEAM_AR = {\n    'warehouse': '\u0627\u0644\u0645\u0633\u062A\u0648\u062F\u0639',\n    'warehouse & tools': '\u0627\u0644\u0645\u0633\u062A\u0648\u062F\u0639',\n    'warehouse & painting': '\u0627\u0644\u062F\u0647\u0627\u0646\u0627\u062A',\n    'painting': '\u0627\u0644\u062F\u0647\u0627\u0646\u0627\u062A',\n    'tools': '\u0627\u0644\u0639\u062F\u0651\u0629',\n    'lighting showroom': '\u0635\u0627\u0644\u0629 \u0627\u0644\u0625\u0646\u0627\u0631\u0629',\n    'electrical showroom': '\u0635\u0627\u0644\u0629 \u0627\u0644\u0643\u0647\u0631\u0628\u0627\u0621',\n    'electrical showroom lead': '\u0635\u0627\u0644\u0629 \u0627\u0644\u0643\u0647\u0631\u0628\u0627\u0621',\n    'stock & purchasing': '\u0627\u0644\u0645\u062E\u0632\u0648\u0646 \u0648\u0627\u0644\u0645\u0634\u062A\u0631\u064A\u0627\u062A',\n    'management': '\u0627\u0644\u0625\u062F\u0627\u0631\u0629',\n    'finance': '\u0627\u0644\u0645\u0627\u0644\u064A\u0629',\n    'azar family': '\u0639\u0627\u0626\u0644\u0629 \u0639\u0627\u0632\u0627\u0631',\n    'test': '\u062A\u062C\u0631\u0628\u0629'\n  };\n\n  function teamLabel(p) {\n    var t = String(p.team || '').trim();\n    return TEAM_AR[t.toLowerCase()] || t || '\u2014';\n  }\n\n  function renderNames() {\n    var groups = {};\n    var order = [];\n    roster.forEach(function (p) {\n      var label = teamLabel(p);\n      if (!groups[label]) {\n        groups[label] = [];\n        order.push(label);\n      }\n      groups[label].push(p);\n    });\n    order.forEach(function (label) {\n      var parent = nameSelect;\n      if (order.length > 1) {\n        parent = document.createElement('optgroup');\n        parent.label = label;\n        nameSelect.appendChild(parent);\n      }\n      groups[label].forEach(function (p) {\n        var option = document.createElement('option');\n        option.value = p.id;\n        option.textContent = p.name;\n        parent.appendChild(option);\n      });\n    });\n    /* on someone's own phone, the last name used is already chosen */\n    var last = store('azar-staff:last');\n    if (last && roster.some(function (p) {\n      return p.id === last;\n    })) nameSelect.value = last;\n    nameSelect.disabled = !roster.length;\n  }\n\n  function showError(text) {\n    gateError.textContent = text;\n    gateError.hidden = false;\n  }\n\n  /* Show the PIN while typing (Elio 01/11/2026); the phone's own number keyboard stays. */\n  var eyeBtn = root.querySelector('[data-staff-eye]');\n  if (eyeBtn) {\n    eyeBtn.addEventListener('click', function () {\n      var show = pinInput.type === 'password';\n      pinInput.type = show ? 'text' : 'password';\n      eyeBtn.setAttribute('aria-pressed', show ? 'true' : 'false');\n      eyeBtn.textContent = show ? eyeBtn.dataset.hide : eyeBtn.dataset.show;\n    });\n  }\n\n  nameSelect.addEventListener('change', function () {\n    gateError.hidden = true;\n    if (typeof hideDeviceWait === 'function') hideDeviceWait();\n    if (nameSelect.value) pinInput.focus();\n  });\n\n  gateForm.addEventListener('submit', function (event) {\n    event.preventDefault();\n    var chosen = roster.filter(function (p) {\n      return p.id === nameSelect.value;\n    })[0];\n    if (!chosen) {\n      showError(gateError.dataset.pickFirst || '\u0627\u062E\u062A\u0631 \u0627\u0633\u0645\u0643 \u0623\u0648\u0644\u0627\u064B.');\n      nameSelect.focus();\n      return;\n    }\n    var typed = westernDigits(pinInput.value).trim();\n    var wrong = gateError.dataset.wrongPin || '\u0627\u0644\u0631\u0645\u0632 \u063A\u064A\u0631 \u0635\u062D\u064A\u062D. \u0627\u0633\u0623\u0644 \u0627\u0644\u0645\u062F\u064A\u0631\u0629 \u0633\u062A\u064A\u0641\u0627\u0646\u064A.';\n    if (typed === '') {\n      showError(wrong);\n      pinInput.focus();\n      return;\n    }\n    /* WhatsApp mode (no Sheet script): the PINs are in the page, checked here. */\n    if (!SHEET) {\n      if (String(chosen.pin || '').trim() === typed) signedIn(chosen, typed, null);\n      else {\n        showError(wrong);\n        pinInput.select();\n      }\n      return;\n    }\n    /* Sheet mode: the script checks the PIN and hands back any order list. */\n    if (loggingIn) return;\n    loggingIn = true;\n    var label = gateButton ? gateButton.textContent : '';\n    if (gateButton) {\n      gateButton.disabled = true;\n      gateButton.textContent = T.checking;\n    }\n    call({ type: 'login', person: chosen.id, pin: typed }, function (reply) {\n      loggingIn = false;\n      if (gateButton) {\n        gateButton.disabled = false;\n        gateButton.textContent = label;\n      }\n      if (!reply) {\n        /* No signal, or the script did not answer: the counts still open, as they\n           always did offline. The PIN is checked when the answers are sent, and the\n           order list arrives once the script can be reached. */\n        signedIn(chosen, typed, null);\n        retryOrders(chosen, typed);\n        return;\n      }\n      if (!reply.ok) {\n        if (reply.error === 'device' || reply.error === 'device_refused') {\n          showDeviceWait(chosen, typed, reply);\n          return;\n        }\n        if (reply.error === 'locked' || reply.error === 'paused') {\n          showError(lockText(reply));\n          return;\n        }\n        if (reply.error === 'unknown person') {\n          /* on the page but not yet on the Sheet's Roster tab (a new login) */\n          showError(T.unknown);\n          return;\n        }\n        showError(reply.error === 'pin' ? wrong : T.offline);\n        pinInput.select();\n        return;\n      }\n      signedIn(chosen, typed, reply);\n    });\n  });\n\n  /* 5 wrong tries in 15 minutes lock a person for 30 (Elio 31/10/2026); the script\n     says until when, as HH:MM Beirut time. An older script gives no time. */\n  function lockText(reply) {\n    var t = reply && reply.until ? String(reply.until) : '';\n    if (reply && reply.error === 'paused') return t ? T.pausedUntil.split('{t}').join(t) : T.pausedUntil.split('{t}').join('\u2026');\n    return t ? T.lockedUntil.split('{t}').join(t) : T.locked;\n  }\n\n  /* This phone is not the person's approved phone: say so, and let them ask again\n     once Elio has approved it. The PIN stays in memory only while this screen shows. */\n  var devWait = root.querySelector('[data-staff-devwait]');\n  var devPending = null;\n\n  function showDeviceWait(chosen, pin, reply) {\n    if (!devWait) return showError(gateError.dataset.wrongPin);\n    gateError.hidden = true;\n    devPending = { chosen: chosen, pin: pin };\n    var refused = reply.error === 'device_refused';\n    devWait.querySelector('[data-devwait-text]').textContent = refused ? devWait.dataset.refused : devWait.dataset.waiting;\n    /* desk staff, Stephanie and the owners may have two devices, floor workers one\n       (Elio 31/10/2026, \"2 for desk + owners\"); the script says which as max */\n    var two = Number(reply.max) >= 2;\n    devWait.querySelector('[data-devwait-why]').hidden = refused || two;\n    devWait.querySelector('[data-devwait-why2]').hidden = refused || !two;\n    var since = devWait.querySelector('[data-devwait-since]');\n    since.textContent = reply.since ? devWait.dataset.since + ' ' + reply.since : '';\n    since.hidden = !reply.since || refused;\n    devWait.querySelector('[data-devwait-again]').hidden = refused;\n    devWait.classList.toggle('is-refused', refused);\n    devWait.hidden = false;\n  }\n\n  function hideDeviceWait() {\n    devPending = null;\n    if (devWait) devWait.hidden = true;\n  }\n\n  if (devWait) {\n    var devAgain = devWait.querySelector('[data-devwait-again]');\n    devAgain.addEventListener('click', function () {\n      if (!devPending || devAgain.disabled) return;\n      var p = devPending;\n      var label = devAgain.textContent;\n      devAgain.disabled = true;\n      devAgain.textContent = T.checking;\n      call({ type: 'login', person: p.chosen.id, pin: p.pin || undefined }, function (reply) {\n        devAgain.disabled = false;\n        devAgain.textContent = label;\n        if (devPending !== p) return;\n        if (reply && reply.ok) {\n          hideDeviceWait();\n          return signedIn(p.chosen, p.pin, reply);\n        }\n        if (reply && (reply.error === 'device' || reply.error === 'device_refused')) return showDeviceWait(p.chosen, p.pin, reply);\n        hideDeviceWait();\n        if (reply && reply.error === 'locked') return showError(lockText(reply));\n        showError(reply && reply.error === 'pin' ? gateError.dataset.wrongPin : T.offline);\n      });\n    });\n    devWait.querySelector('[data-devwait-cancel]').addEventListener('click', function () {\n      hideDeviceWait();\n      pinInput.value = '';\n      pinInput.focus();\n    });\n  }\n\n  /* Ask the script again every minute until it answers, then show the order list. */\n  function retryOrders(owner, pin) {\n    setTimeout(function () {\n      if (person !== owner || sessionPin !== pin) return;\n      call({ type: 'login', person: owner.id, pin: pin }, function (reply) {\n        if (person !== owner) return;\n        if (!reply || reply.error === 'locked' || reply.error === 'paused') {\n          noData(reply && (reply.error === 'paused' || reply.error === 'locked') ? lockText(reply) : T.noDataOffline);\n          return retryOrders(owner, pin);\n        }\n        if (reply.ok) useReply(reply);\n        else if (reply.error === 'pin') pinRefused();\n        else noData(T.noDataOther);\n      });\n    }, 60000);\n  }\n\n  /* The page opens by itself on a phone that signed in before, and asks for the data a\n     moment later. If the script refuses (sign-in paused, locked, no signal), the person\n     must see why nothing is there instead of an empty page (Elio 02/11/2026). */\n  function noData(text) {\n    var b = root.querySelector('[data-staff-nodata]');\n    if (!b) return;\n    b.textContent = text || '';\n    b.hidden = !text;\n  }\n\n  function takeSession(who, reply) {\n    var ses = reply && reply.session;\n    if (!SHEET || !who || !ses || typeof ses !== 'object' || !ses.token) return;\n    sessionToken = String(ses.token);\n    store(SESSION_KEY, JSON.stringify({ id: who.id, token: sessionToken }));\n    store('azar-staff:pin', ''); /* with a token the phone keeps no PIN */\n  }\n\n  function dropSession() {\n    if (sessionToken && SHEET) {\n      var body = JSON.stringify({ type: 'logout', token: sessionToken, device_id: deviceKey() });\n      try {\n        if (!(navigator.sendBeacon && navigator.sendBeacon(SHEET, new Blob([body], { type: 'text/plain;charset=UTF-8' })))) {\n          fetch(SHEET, { method: 'POST', mode: 'no-cors', keepalive: true, headers: { 'Content-Type': 'text/plain;charset=utf-8' }, body: body }).catch(function () {});\n        }\n      } catch (e) {\n        /* the token dies on its own after 30 days */\n      }\n    }\n    sessionToken = null;\n    store(SESSION_KEY, '');\n  }\n\n  /* The script no longer takes this phone's token: back to the PIN screen, name kept. */\n  function sessionEnded(who) {\n    sessionToken = null;\n    store(SESSION_KEY, '');\n    if (person) switchBtn.click();\n    if (who) {\n      nameSelect.value = who.id;\n      store('azar-staff:last', who.id);\n    }\n    showError(T.sessionExpired);\n    try { pinInput.focus(); } catch (e) { /* no focus on some phones */ }\n  }\n\n  function signedIn(chosen, pin, reply) {\n    gateError.hidden = true;\n    pinInput.value = '';\n    sessionPin = pin;\n    store('azar-staff:last', chosen.id);\n    store('azar-staff:person', chosen.id);\n    store('azar-staff:day', today());\n    if (SHEET) store('azar-staff:pin', pin);\n    takeSession(chosen, reply);\n    var p = reply && reply.role ? Object.assign({}, chosen, { role: reply.role }) : chosen;\n    openFor(p);\n    useReply(reply);\n  }\n\n  /* Everything the Sheet script hands back after the PIN check. */\n  /* A master-PIN sign-in shows the page exactly as that person sees it (Elio 31/10/2026:\n     \"let me see exactly what stephanie sees from her profile\"); the script marks it view_as\n     and refuses stamps. The page says so at the top and hides what cannot be done. */\n  var viewAs = false;\n  var viewAsBox = root.querySelector('[data-staff-viewas]');\n\n  function setViewAs(reply) {\n    viewAs = !!(reply && reply.view_as === true);\n    root.classList.toggle('azar-staff--viewonly', viewAs);\n    if (!viewAsBox) return;\n    viewAsBox.textContent = viewAs && person ? viewAsBox.dataset.text.split('{name}').join(person.name) : '';\n    viewAsBox.hidden = !viewAs;\n  }\n\n  /* A tap on something that would save: say why nothing happened. */\n  var viewOnlyTimer = 0;\n  function viewOnlyNote() {\n    if (!viewAsBox) return;\n    viewAsBox.hidden = false;\n    viewAsBox.classList.add('is-flash');\n    viewAsBox.textContent = viewAsBox.dataset.only;\n    clearTimeout(viewOnlyTimer);\n    viewOnlyTimer = setTimeout(function () {\n      viewAsBox.classList.remove('is-flash');\n      setViewAs({ view_as: viewAs });\n    }, 3000);\n  }\n\n  function useReply(reply) {\n    noData('');\n    holdTabs(false);\n    applySeen();\n    if (reply && reply.session && reply.session.token && person && !reply.view_as) takeSession(person, reply);\n    setViewAs(reply);\n    setPinGate(reply);\n    setDeviceRequests(reply);\n    setApprovals(reply);\n    setPinHelp();\n    drawPinHelpStatus(reply);\n    setMasterForm();\n    tabColumns();\n    renderOrders(reply && reply.orders);\n    renderDesk(reply);\n    renderSpark(reply && reply.spark);\n    setShelfAccess(reply);\n    setCashAccess(reply);\n    setTeamAccess(reply);\n    setAttendance(reply);\n    setAttReview(reply);\n    setSalaries(reply);\n  }\n\n  switchBtn.addEventListener('click', function () {\n    track('signout', currentTab, '');\n    currentTab = '';\n    stopActivity();\n    if (person) clearFiles(person.id);\n    showOwnerTab(false);\n    person = null;\n    wasComplete = null;\n    tabChosen = false;\n    sessionPin = null;\n    store('azar-staff:pin', '');\n    dropSession();\n    pinInput.type = 'password';\n    renderOrders(null);\n    renderSpark(null);\n    clearShelves();\n    clearCash();\n    clearTeam();\n    clearAtt();\n    clearAttReview();\n    clearSalaries();\n    clearPinGate();\n    clearDeviceRequests();\n    clearApprovals();\n    clearMasterForm();\n    setViewAs(null);\n    deskTasks = null;\n    deskUpdated = '';\n    if (deskBox) {\n      deskBox.innerHTML = '';\n      deskBox.hidden = true;\n    }\n    if (deskSoon) deskSoon.hidden = true;\n    if (newsDot) newsDot.hidden = true;\n    store('azar-staff:person', '');\n    whoLabel.textContent = '';\n    bar.hidden = true;\n    work.hidden = true;\n    gateError.hidden = true;\n    pinInput.value = '';\n    nameSelect.value = ''; /* someone else is taking the phone: they choose their own name */\n    picker.hidden = false;\n  });\n\n  /* ---------- Step 3: the day's work ---------- */\n  function openFor(p, resumed) {\n    person = p;\n    holdTabs(!!SHEET);\n    /* the sign-in is logged before the first tab is chosen */\n    track('signin', '', resumed ? 'resume' : '');\n    showOwnerTab(isViewer(p));\n    loadFiles();\n    whoLabel.textContent = p.name;\n    if (dateLabel) dateLabel.textContent = arabicDate(new Date(), false);\n    showNextCount();\n    picker.hidden = true;\n    bar.hidden = false;\n    work.hidden = false;\n    if (deskNote) deskNote.hidden = true;\n    refreshNotices();\n    loadContainers();\n\n    if (p.role === 'approver') {\n      rowsList.innerHTML = '';\n      progress.hidden = true;\n      if (thanks) thanks.hidden = true;\n      if (formArea) formArea.hidden = true;\n      if (todoBadge) todoBadge.hidden = true;\n      approve.hidden = false;\n      /* Khaled: the Tasks tab first on a count day until he has approved */\n      chooseTab(isCountDay(new Date()) && store(approvedKey()) !== '1');\n      if (SHEET) {\n        approveLink.removeAttribute('href');\n        approveLink.removeAttribute('target');\n        approveLink.textContent = store(approvedKey()) === '1' ? T.approved : approveLabel;\n      } else {\n        approveLink.href = waLink('Azar approval ' + today() + '\\n' + p.name + ' approves the team counts for today.');\n      }\n      return;\n    }\n\n    approve.hidden = true;\n    progress.hidden = false;\n    if (formArea) formArea.hidden = false;\n    loadTasks();\n  }\n\n  /* ---------- Approval (sheet mode): one tap, once a day ---------- */\n  var approveLabel = approveLink.textContent.trim();\n  var approving = false;\n\n  function approvedKey() {\n    return 'azar-staff:' + today() + ':' + (person ? person.id : '?') + ':approved';\n  }\n\n  approveLink.addEventListener('click', function (event) {\n    if (!SHEET) return;\n    event.preventDefault();\n    if (!person || approving || store(approvedKey()) === '1') return;\n    var owner = person;\n    var key = approvedKey();\n    approving = true;\n    approveLink.textContent = T.saving;\n    post({ type: 'approve', date: today(), person: owner.id, name: owner.name, pin: sessionPin || undefined }, function (ok) {\n      approving = false;\n      if (ok) store(key, '1');\n      if (person !== owner) return;\n      approveLink.textContent = ok ? T.approved : T.failed;\n    });\n  });\n\n  /* The morning list arrives inline from the shop metafield. A list dated\n     another day is treated as empty, so a missed update never sends the men\n     back to yesterday's items. */\n  function useList(json) {\n    data = json || {};\n    listDay = today();\n    if (data.date && data.date !== listDay) data = { date: '', people: [] };\n    if (dayLine) dayLine.textContent = data.date || '';\n    renderRows();\n  }\n\n  function loadTasks() {\n    if (data) return renderRows();\n    var inline = root.querySelector('[data-staff-tasks]');\n    if (inline) {\n      try {\n        return useList(JSON.parse(inline.textContent));\n      } catch (e) {\n        /* fall through to the theme file */\n      }\n    }\n    fetch(TASKS_URL, { cache: 'no-store' })\n      .then(function (r) {\n        return r.json();\n      })\n      .then(useList)\n      .catch(function () {\n        rowsList.innerHTML = '<li class=\"azar-staff__empty\">' + T.error + '</li>';\n        chooseTab(false);\n      });\n  }\n\n  function myTasks() {\n    /* A test account (Elio) gets a copy of the first real list of the day, or\n       three demo items when there is none, so there is always something to try.\n       The sheet files its answers on the Test tab. */\n    if (person.role === 'tester') {\n      var sample = (data.people || []).filter(function (p) {\n        return (p.count || []).length;\n      })[0];\n      if (sample) return { count: sample.count, display: sample.display || [] };\n      return {\n        count: [\n          {\n            code: 'DEMO-ING-CKLI2059',\n            name: 'INGCO 20V 2Batt 4Ah \u0645\u062C\u0645\u0648\u0639\u0629 \u0645\u0642\u0627\u062F\u062D+\u0635\u0627\u0631\u0648\u062E+\u0627\u0646\u062A\u0631\u064A\u0643+\u0634\u0646\u0637\u0629 \u062A\u0644\u0633\u0643\u0648\u0628\u064A\u0643+\u0627\u0643\u0633\u0633\u0648\u0627\u0631',\n            family: 'Tool Sets',\n            brand: 'INGCO',\n            place: 'Tools',\n            image: 'https://cdn.shopify.com/s/files/1/0790/4952/3518/files/CKLI2059.jpg?v=1782214339'\n          },\n          {\n            code: 'DEMO-ING-FBLI2128',\n            name: 'INGCO 20V 8.0Ah \u0628\u0637\u0627\u0631\u064A\u0629 \u0644\u064A\u062B\u064A\u0648\u0645 \u0641\u062F\u0627\u0631',\n            family: 'Power Tool Batteries',\n            brand: 'INGCO',\n            place: 'Tools',\n            image: 'https://cdn.shopify.com/s/files/1/0790/4952/3518/files/0034156_fbli2128_550.jpg?v=1787813867'\n          },\n          { code: 'DEMO-NO-PHOTO', name: '\u0635\u0646\u0641 \u062A\u062C\u0631\u0628\u0629 \u0628\u0644\u0627 \u0635\u0648\u0631\u0629', family: '\u062A\u062C\u0631\u0628\u0629', brand: 'Azar', place: '\u062A\u062C\u0631\u0628\u0629' }\n        ],\n        display: []\n      };\n    }\n    var mine = (data.people || []).filter(function (p) {\n      return p.id === person.id;\n    })[0];\n    return mine || { count: [], display: [] };\n  }\n\n  function renderRows() {\n    var mine = myTasks();\n    rowsList.innerHTML = '';\n    (mine.count || []).forEach(function (item) {\n      rowsList.appendChild(countRow(item));\n    });\n    (mine.display || []).forEach(function (item) {\n      rowsList.appendChild(displayRow(item));\n    });\n    var nothing = !(mine.count || []).length && !(mine.display || []).length;\n    var desk = person.role === 'desk';\n    /* A day with an order list but nothing to count: no \"nothing on your list\" box\n       and no \"0 of 0\" above the order list, whichever of the two arrived first.\n       Office (desk) staff with nothing to count are pointed to their weekly file. */\n    if (deskNote) deskNote.hidden = !(nothing && desk);\n    showDeskSoon();\n    if (nothing && !hasOrderList && !desk) {\n      var li = el('li', 'azar-staff__calm azar-staff__calm--empty', T.empty);\n      rowsList.appendChild(li);\n    }\n    progress.hidden = nothing;\n    updateProgress();\n    /* Tasks first when a count is waiting; otherwise the last tab used here. */\n    var total = (mine.count || []).length;\n    chooseTab(total > 0 && countDone(mine) < total);\n  }\n\n  function countDone(mine) {\n    /* With the sheet, an item is done once the sheet has its number; with\n       WhatsApp the page cannot know, so a typed number counts. */\n    return (mine.count || []).filter(function (item) {\n      var typed = store(answerKey(item.code)) || '';\n      if (typed === '') return false;\n      return SHEET ? store(answerKey(item.code) + ':sent') === typed : true;\n    }).length;\n  }\n\n  /* ---------- Tabs: Offers | Tasks | Guides (Elio 17/10/2026) ---------- */\n  /* A tab's number disappears once it is opened, and comes back only when something new\n     is released (Elio 01/11/2026): a new offer, or a new task list for this person. */\n  function offersSig() {\n    return Array.prototype.map.call(root.querySelectorAll('[data-staff-panel=\"offers\"] .azar-staff__offer-title, [data-staff-panel=\"offers\"] h2, [data-staff-panel=\"offers\"] h3'), function (h) {\n      return h.textContent.trim();\n    }).join('|');\n  }\n\n  function tasksSig() {\n    if (!person || !data) return '';\n    try {\n      var mine = myTasks();\n      return listDay + ':' + (mine.count || []).map(function (i) { return i.code; }).join(',');\n    } catch (e) {\n      return '';\n    }\n  }\n\n  function seenKey(tab) {\n    return 'azar-staff:seen:' + tab + ':' + (person ? person.id : '');\n  }\n\n  function markSeen(tab) {\n    var sig = tab === 'offers' ? offersSig() : tasksSig();\n    if (!sig) return;\n    store(seenKey(tab), sig);\n    applySeen();\n  }\n\n  function applySeen() {\n    var ob = root.querySelector('[data-staff-tab=\"offers\"] .azar-staff__badge');\n    if (ob && person) ob.hidden = store(seenKey('offers')) === offersSig();\n    if (todoBadge && person && !todoBadge.hidden && store(seenKey('tasks')) === tasksSig()) todoBadge.hidden = true;\n  }\n\n  function showTab(name, focus) {\n    if (!tabButtons.length) return;\n    tabButtons.forEach(function (b) {\n      var on = b.getAttribute('data-staff-tab') === name;\n      b.setAttribute('aria-selected', on ? 'true' : 'false');\n      b.tabIndex = on ? 0 : -1;\n      b.classList.toggle('is-active', on);\n      if (on && focus) b.focus();\n    });\n    tabPanels.forEach(function (p) {\n      p.hidden = p.getAttribute('data-staff-panel') !== name;\n    });\n    root.setAttribute('data-tab', name);\n    if (person && name !== currentTab) {\n      currentTab = name;\n      track('tab', name, '');\n    }\n    if (name === 'shelves') openShelves();\n    if (name === 'offers' || name === 'tasks') markSeen(name);\n    if (name === 'cash') openCash();\n    if (name === 'team') renderTeam();\n    if (name !== 'myatt' && attStream) attStopCamera(); /* no camera left running behind another tab */\n    if (name === 'attrev') renderAttReview();\n    if (name === 'approvals') renderApprovals();\n    else clearResetCode();\n    if (name === 'manage' || name === 'more' || name === 'taskhub') tabColumns();\n    else markHub();\n    if (name === 'sal') renderSalaries();\n    if (name === 'cash') startCashWatch();\n    else stopCashWatch();\n    if (name === 'activity') startActivity();\n    else stopActivity();\n    /* the offer row measures its cards; tell it they are on screen now */\n    if (name === 'offers') {\n      try {\n        window.dispatchEvent(new Event('resize'));\n      } catch (e) {\n        /* very old browser: the counter catches up on the first swipe */\n      }\n    }\n  }\n\n  function chooseTab(countWaiting) {\n    if (tabChosen || !tabButtons.length) return;\n    tabChosen = true;\n    var saved = store('azar-staff:tab');\n    if (saved === 'myatt' || saved === 'shelves') saved = 'taskhub';\n    if (saved === 'guides') saved = 'info'; /* the datasheets tab became Info (17/10/2026) */\n    var known = ['offers', 'tasks', 'news', 'info'].indexOf(saved) !== -1 || (saved === 'activity' && isViewer(person)) ||\n      (saved === 'files' && !!filesTabBtn && !filesTabBtn.hidden) ||\n      (saved === 'shelves' && !!shelvesTabBtn && !shelvesTabBtn.hidden) ||\n      (saved === 'cash' && !!cashTabBtn && !cashTabBtn.hidden) ||\n      (saved === 'myatt' && !!attTabBtn && !attTabBtn.hidden) ||\n      (saved === 'approvals' && !!apTabBtn && !apTabBtn.hidden) ||\n      ((saved === 'manage' || saved === 'more' || saved === 'taskhub') && tabAvail(saved));\n    showTab(countWaiting ? 'taskhub' : known ? saved : 'offers');\n  }\n\n  tabButtons.forEach(function (b, i) {\n    b.addEventListener('click', function () {\n      var name = b.getAttribute('data-staff-tab');\n      store('azar-staff:tab', name);\n      showTab(name);\n    });\n    /* arrow keys follow the reading direction: in Arabic, left is \"next\" */\n    b.addEventListener('keydown', function (e) {\n      var step = { ArrowLeft: 1, ArrowRight: -1, Home: -99, End: 99 }[e.key];\n      if (!step) return;\n      e.preventDefault();\n      /* only the tabs this person can see (the Activity tab is hidden for staff) */\n      var shown = tabButtons.filter(function (t) {\n        return !t.hidden;\n      });\n      var at = shown.indexOf(b);\n      var j = Math.max(0, Math.min(shown.length - 1, at + step));\n      shown[j].click();\n      shown[j].focus();\n    });\n  });\n\n  /* ---------- Dates in Arabic, and the next count day (Monday and Thursday) ---------- */\n  var COUNT_WEEKDAYS = [1, 4]; /* JS getDay(): Monday = 1, Thursday = 4 (build_staff_list.py COUNT_DAYS) */\n\n  function isCountDay(d) {\n    return COUNT_WEEKDAYS.indexOf(d.getDay()) !== -1;\n  }\n\n  function arabicDate(d, withYear) {\n    var opts = { weekday: 'long', day: 'numeric', month: 'long' };\n    if (withYear) opts.year = 'numeric';\n    try {\n      return d.toLocaleDateString('ar-LB-u-nu-latn', opts);\n    } catch (e) {\n      return d.getDate() + '/' + (d.getMonth() + 1) + '/' + d.getFullYear();\n    }\n  }\n\n  function showNextCount() {\n    if (!nextLine) return;\n    var d = new Date();\n    if (isCountDay(d)) {\n      nextLine.textContent = nextLine.getAttribute('data-today') || '\u0627\u0644\u064A\u0648\u0645 \u064A\u0648\u0645 \u062C\u0631\u062F';\n      nextLine.classList.add('is-today');\n      return;\n    }\n    for (var i = 1; i <= 7; i++) {\n      d = new Date();\n      d.setDate(d.getDate() + i);\n      if (isCountDay(d)) break;\n    }\n    nextLine.classList.remove('is-today');\n    nextLine.textContent = (nextLine.getAttribute('data-next') || '\u0627\u0644\u062C\u0631\u062F \u0627\u0644\u0642\u0627\u062F\u0645: [day]').replace('[day]', arabicDate(d, false));\n  }\n\n  /* ---------- The item card: photo, description, family, brand, code, place ----------\n     Built with textContent only: names come from Wizard and may hold < or &. */\n  function el(tag, className, text) {\n    var node = document.createElement(tag);\n    if (className) node.className = className;\n    if (text != null && text !== '') node.textContent = text;\n    return node;\n  }\n\n  /* Only https images; Shopify's CDN is asked for a copy the right size. */\n  function imageUrl(src, width) {\n    if (!/^https:\\/\\//.test(src || '')) return '';\n    if (!/cdn\\.shopify\\.com|\\/cdn\\/shop\\//.test(src)) return src;\n    return src + (src.indexOf('?') === -1 ? '?' : '&') + 'width=' + width;\n  }\n\n  var BOX_ICON =\n    '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M21 7.5 12 3 3 7.5v9L12 21l9-4.5v-9zM12 5.2l6.2 3.1L12 11.4 5.8 8.3 12 5.2zM5 10l6 3v5.8l-6-3V10zm8 8.8V13l6-3v5.8l-6 3z\"/></svg>';\n\n  function fact(list, label, value, ltr) {\n    if (!value) return;\n    var row = el('div', 'azar-staff__fact');\n    row.appendChild(el('dt', '', label));\n    var dd = el('dd');\n    var text = el('bdi', '', value);\n    if (ltr) text.dir = 'ltr';\n    dd.appendChild(text);\n    row.appendChild(dd);\n    list.appendChild(row);\n  }\n\n  function itemCard(item) {\n    var card = el('div', 'azar-staff__card');\n\n    var src = imageUrl(item.image, 240);\n    var thumb = el(src ? 'button' : 'div', 'azar-staff__thumb');\n    if (src) {\n      thumb.type = 'button';\n      thumb.setAttribute('aria-label', T.zoom);\n      var img = el('img');\n      img.alt = item.name || item.code || '';\n      img.loading = 'lazy';\n      img.decoding = 'async';\n      img.addEventListener('error', function () {\n        /* a dead link shows the box, never a broken-image icon */\n        thumb.classList.add('is-empty');\n        thumb.disabled = true;\n        thumb.innerHTML = BOX_ICON;\n      });\n      img.src = src;\n      thumb.appendChild(img);\n      thumb.addEventListener('click', function () {\n        zoom(src, imageUrl(item.image, 1000), img.alt, thumb);\n      });\n    } else {\n      thumb.classList.add('is-empty');\n      thumb.innerHTML = BOX_ICON;\n    }\n    card.appendChild(thumb);\n\n    /* photo and description side by side; the details get the full width\n       under them, so codes and families stay on one line on a phone */\n    /* Wizard joins words with + and no space; allow a line break after each +\n       so a long name never splits in the middle of an Arabic word */\n    card.appendChild(el('p', 'azar-staff__item', String(item.name || item.code || '').replace(/\\+/g, '+\\u200b')));\n    var facts = el('dl', 'azar-staff__facts');\n    fact(facts, T.family, item.family);\n    fact(facts, T.brand, item.brand);\n    fact(facts, T.code, item.code, true);\n    fact(facts, T.place, item.place);\n    card.appendChild(facts);\n    return card;\n  }\n\n  /* One full-screen viewer for every photo; a tap anywhere closes it. It opens\n     at once with the small photo already on the phone and swaps in the sharp one\n     when it arrives: on a weak signal the man never stares at an empty screen, and\n     if the big one fails the small one simply stays. */\n  var viewer = null;\n  var viewerClose = null;\n  var viewerOpener = null;\n  var viewerToken = 0;\n\n  function unzoom() {\n    if (!viewer || viewer.hidden) return;\n    viewer.hidden = true;\n    if (viewerOpener) viewerOpener.focus();\n    viewerOpener = null;\n  }\n\n  function zoom(smallSrc, bigSrc, alt, opener) {\n    if (!viewer) {\n      viewer = el('div', 'azar-staff__zoom');\n      viewer.setAttribute('role', 'dialog');\n      viewer.setAttribute('aria-modal', 'true');\n      viewer.appendChild(el('img'));\n      viewerClose = el('button', 'azar-staff__zoom-close', T.close);\n      viewerClose.type = 'button';\n      viewer.appendChild(viewerClose);\n      viewer.addEventListener('click', unzoom);\n      document.addEventListener('keydown', function (event) {\n        if (!viewer || viewer.hidden) return;\n        if (event.key === 'Escape') unzoom();\n        if (event.key === 'Tab') {\n          /* the close button is the only thing to reach while the photo is open */\n          event.preventDefault();\n          viewerClose.focus();\n        }\n      });\n      root.appendChild(viewer);\n    }\n    var shown = viewer.querySelector('img');\n    var token = ++viewerToken;\n    shown.src = smallSrc;\n    shown.alt = alt || '';\n    viewerOpener = opener || null;\n    viewer.hidden = false;\n    viewerClose.focus();\n\n    if (bigSrc && bigSrc !== smallSrc) {\n      var sharp = new Image();\n      sharp.onload = function () {\n        if (token === viewerToken) shown.src = bigSrc;\n      };\n      sharp.src = bigSrc;\n    }\n  }\n\n  function countRow(item) {\n    var li = document.createElement('li');\n    li.className = 'azar-staff__row';\n\n    li.appendChild(itemCard(item));\n\n    var controls = document.createElement('div');\n    controls.className = 'azar-staff__controls';\n\n    /* type=text, not number: a number field silently drops \u0660-\u0669, leaving an\n       empty box the man thinks he filled. inputMode still brings up the keypad. */\n    var input = document.createElement('input');\n    input.type = 'text';\n    input.inputMode = 'numeric';\n    input.pattern = '[0-9]*';\n    input.autocomplete = 'off';\n    input.className = 'azar-staff__number';\n    input.placeholder = T.count;\n\n    /* Frozen for this row: a reply that lands after someone else has taken the\n       phone, or after midnight, still writes to the man and day it belongs to. */\n    var owner = person;\n    var ownerPin = sessionPin;\n    var ansKey = answerKey(item.code);\n    input.value = store(ansKey) || '';\n\n    var send = document.createElement(SHEET ? 'button' : 'a');\n    send.className = 'azar-staff__btn azar-staff__btn--send';\n    if (SHEET) {\n      send.type = 'button';\n    } else {\n      send.target = '_blank';\n      send.rel = 'noopener';\n    }\n\n    /* The count last confirmed by the sheet. The row shows a tick only while the\n       box still holds that number; change it and the button asks to send again. */\n    var sentKey = ansKey + ':sent';\n    var sending = false;\n\n    function setState(state) {\n      send.classList.toggle('is-disabled', state === 'empty');\n      send.classList.toggle('is-sending', state === 'sending');\n      send.classList.toggle('is-sent', state === 'sent');\n      send.classList.toggle('is-failed', state === 'failed');\n      if (state === 'empty') send.setAttribute('aria-disabled', 'true');\n      else send.removeAttribute('aria-disabled');\n      send.textContent =\n        state === 'sending' ? T.saving : state === 'sent' ? T.sent : state === 'failed' ? T.failed : T.send;\n    }\n\n    function refresh() {\n      var clean = westernDigits(input.value).replace(/[^0-9]/g, '');\n      if (clean !== input.value) input.value = clean;\n      store(ansKey, clean);\n\n      /* No number, no send: an empty box would reach WhatsApp as \"?\" and look\n         like a finished task. Without an href the link cannot open anything. */\n      if (clean === '') {\n        li.classList.remove('is-answered');\n        if (!SHEET) send.removeAttribute('href');\n        if (!sending) setState('empty');\n        updateProgress();\n        return;\n      }\n      if (SHEET) {\n        var isSent = store(sentKey) === clean;\n        li.classList.toggle('is-answered', isSent);\n        if (!sending) setState(isSent ? 'sent' : 'ready');\n        updateProgress();\n        return;\n      }\n      li.classList.add('is-answered');\n      setState('ready');\n      send.href = waLink(\n        'Azar count ' + (data.date || today()) + '\\n' +\n          person.name + ' (' + (person.team || '') + ')\\n' +\n          item.code + ' \u2014 ' + (item.name || '') + '\\n' +\n          'Counted: ' + clean + '\\n' +\n          'Photo attached.'\n      );\n      updateProgress();\n    }\n\n    input.addEventListener('input', refresh);\n    send.addEventListener('click', function (event) {\n      var value = input.value;\n      if (value === '') {\n        event.preventDefault();\n        input.focus();\n        return;\n      }\n      if (!SHEET || sending || person !== owner || store(sentKey) === value) return;\n      sending = true;\n      setState('sending');\n      post(\n        {\n          type: 'count',\n          date: data.date || today(),\n          person: owner.id,\n          name: owner.name,\n          code: item.code,\n          item: item.name || '',\n          place: item.place || '',\n          count: value,\n          pin: ownerPin || undefined\n        },\n        function (ok) {\n          sending = false;\n          if (ok) store(sentKey, value);\n          if (person !== owner) return; /* someone else is on the phone; their rows are rebuilt */\n          refresh();\n          if (!ok && input.value === value) setState('failed');\n        }\n      );\n    });\n    refresh();\n\n    controls.appendChild(input);\n    controls.appendChild(send);\n    li.appendChild(controls);\n    return li;\n  }\n\n  function displayRow(item) {\n    var li = document.createElement('li');\n    li.className = 'azar-staff__row azar-staff__row--display';\n    li.innerHTML =\n      '<div class=\"azar-staff__row-head\">' +\n      '<span class=\"azar-staff__code-tag azar-staff__code-tag--check\">' + T.display + '</span>' +\n      '<span class=\"azar-staff__item\">' + (item.area || '') + '</span>' +\n      '<span class=\"azar-staff__place\">' + (item.check || '') + '</span>' +\n      '</div>';\n    var send = document.createElement('a');\n    send.className = 'azar-staff__btn azar-staff__btn--send';\n    send.textContent = T.photos;\n    send.target = '_blank';\n    send.rel = 'noopener';\n    send.href = waLink(\n      'Azar display check ' + (data.date || today()) + '\\n' + person.name + '\\n' + (item.area || '') + '\\nPhotos attached.'\n    );\n    li.appendChild(send);\n    return li;\n  }\n\n  function updateProgress() {\n    var mine = myTasks();\n    var total = (mine.count || []).length;\n    var done = countDone(mine);\n    progress.textContent = '';\n    progress.appendChild(el('span', 'azar-staff__done-text', T.progress.replace('[done]', done).replace('[total]', total)));\n    var meter = el('span', 'azar-staff__meter');\n    var fill = el('span', 'azar-staff__meter-fill');\n    fill.style.width = (total ? Math.round((100 * done) / total) : 0) + '%';\n    meter.appendChild(fill);\n    progress.appendChild(meter);\n    var complete = total > 0 && done === total;\n    progress.classList.toggle('is-complete', complete);\n    /* the Tasks tab shows how many items are still waiting */\n    if (todoBadge) {\n      todoBadge.hidden = !(total - done > 0);\n      todoBadge.textContent = String(total - done);\n      applySeen();\n    }\n\n    /* Every item sent: say thank you, and bring it into view the moment it happens. */\n    if (thanks) {\n      thanks.hidden = !complete;\n      if (complete && wasComplete === false && thanks.scrollIntoView) {\n        thanks.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    }\n    wasComplete = complete;\n  }\n\n  /* ---------- Order lists (version 5): a monthly list to order from ----------\n     Each item shows its photo, code, name and the recommended quantity; the man\n     keeps or changes the quantity, adds a note if he wants, and sends the whole\n     list at once. What he types is kept on the phone until it is sent, and a\n     second send replaces the first on the sheet. */\n  function renderOrders(orders) {\n    if (!ordersBox) return;\n    ordersBox.innerHTML = '';\n    var lists = (orders || []).filter(function (l) {\n      return l && l.items && l.items.length;\n    });\n    ordersBox.hidden = !lists.length || !person;\n    var had = hasOrderList;\n    hasOrderList = !!person && lists.length > 0;\n    if (!person) return;\n    /* redraw the counts only when a list appears or goes (with one, an empty count day\n       shows nothing above it); an unchanged answer must not rebuild the rows while a\n       man is typing a count */\n    if (had !== hasOrderList && data && person.role !== 'approver') renderRows();\n    lists.forEach(function (list) {\n      ordersBox.appendChild(orderList(list, person, sessionPin));\n    });\n  }\n\n  function orderList(list, owner, ownerPin) {\n    var wrap = el('section', 'azar-staff__order');\n    /* the line title is Latin inside an Arabic page: isolate it so \"(AURA MT26)\" keeps its brackets */\n    var heading = el('h2', 'azar-staff__h2', T.orders + ' \u2014 ');\n    heading.appendChild(el('bdi', '', list.title || list.line));\n    wrap.appendChild(heading);\n    var hint = el('p', 'azar-staff__hint', T.listHint);\n    wrap.appendChild(hint);\n\n    var ol = el('ol', 'azar-staff__rows');\n    ol.setAttribute('role', 'list');\n    var draft = 'azar-staff:order:' + owner.id + ':' + list.month + ':' + list.line + ':';\n    var rows = [];\n    var status = el('p', 'azar-staff__order-status');\n    status.setAttribute('role', 'status');\n    var sendBtn = el('button', 'azar-staff__btn azar-staff__btn--primary azar-staff__order-send', T.sendList);\n    sendBtn.type = 'button';\n\n    function changed() {\n      status.textContent = '';\n      sendBtn.textContent = T.sendList;\n      sendBtn.classList.remove('is-failed');\n    }\n\n    list.items.forEach(function (item) {\n      var li = el('li', 'azar-staff__row azar-staff__row--order');\n      li.appendChild(itemCard({ code: item.code, name: item.name, image: item.image }));\n\n      var rec = el('p', 'azar-staff__rec');\n      rec.appendChild(el('span', '', T.recommended + ': '));\n      rec.appendChild(el('strong', '', String(item.recommended || 0)));\n      li.appendChild(rec);\n\n      var controls = el('div', 'azar-staff__controls azar-staff__controls--order');\n      var qty = document.createElement('input');\n      qty.type = 'text';\n      qty.inputMode = 'numeric';\n      qty.pattern = '[0-9]*';\n      qty.autocomplete = 'off';\n      qty.maxLength = 6; /* the sheet takes up to 6 digits */\n      qty.className = 'azar-staff__number';\n      qty.placeholder = T.qty;\n      qty.setAttribute('aria-label', T.qty + ' ' + item.code);\n      var kept = store(draft + item.code + ':qty');\n      if (kept != null && kept !== '') qty.value = kept;\n      else if (item.qty != null && item.qty !== '') qty.value = String(item.qty);\n      else qty.value = String(item.recommended || 0);\n\n      var note = document.createElement('input');\n      note.type = 'text';\n      note.className = 'azar-staff__note';\n      note.placeholder = T.note;\n      note.maxLength = 300;\n      note.setAttribute('aria-label', T.note + ' ' + item.code);\n      var keptNote = store(draft + item.code + ':note');\n      note.value = keptNote != null ? keptNote : item.note || '';\n\n      qty.addEventListener('input', function () {\n        var clean = westernDigits(qty.value).replace(/[^0-9]/g, '');\n        if (clean !== qty.value) qty.value = clean;\n        store(draft + item.code + ':qty', clean);\n        changed();\n      });\n      /* most boxes start at 0: select it, so a typed 5 replaces it instead of making 05 */\n      qty.addEventListener('focus', function () {\n        /* after the tap has placed the caret, or iPhone Safari drops the selection */\n        setTimeout(function () {\n          try {\n            qty.setSelectionRange(0, qty.value.length);\n          } catch (e) {\n            qty.select();\n          }\n        }, 0);\n      });\n      note.addEventListener('input', function () {\n        store(draft + item.code + ':note', note.value);\n        changed();\n      });\n\n      controls.appendChild(qty);\n      controls.appendChild(note);\n      li.appendChild(controls);\n      ol.appendChild(li);\n      rows.push({ code: item.code, qty: qty, note: note });\n    });\n    wrap.appendChild(ol);\n\n    function snapshot() {\n      return rows.map(function (r) {\n        return { code: r.code, qty: westernDigits(r.qty.value).replace(/[^0-9]/g, '') || '0', note: r.note.value };\n      });\n    }\n    function hasDrafts() {\n      return rows.some(function (r) {\n        return store(draft + r.code + ':qty') != null || store(draft + r.code + ':note') != null;\n      });\n    }\n    function clearDrafts() {\n      rows.forEach(function (r) {\n        try {\n          window.localStorage.removeItem(draft + r.code + ':qty');\n          window.localStorage.removeItem(draft + r.code + ':note');\n        } catch (e) {\n          /* nothing stored */\n        }\n      });\n    }\n\n    /* \"sent\" only when the sheet has the list and nothing on the phone is newer */\n    if (!hasDrafts() && list.items.some(function (i) {\n      return i.sentAt;\n    })) status.textContent = T.listSent;\n\n    var sending = false;\n    sendBtn.addEventListener('click', function () {\n      if (sending || person !== owner) return;\n      var items = snapshot();\n      var sentJson = JSON.stringify(items);\n      sending = true;\n      sendBtn.disabled = true;\n      sendBtn.textContent = T.saving;\n      sendBtn.classList.remove('is-failed');\n      status.textContent = '';\n      call(\n        { type: 'order', person: owner.id, name: owner.name, month: list.month, line: list.line, items: items, pin: ownerPin },\n        function (reply) {\n          sending = false;\n          sendBtn.disabled = false;\n          if (person !== owner) return;\n          if (reply && reply.error === 'pin') return pinRefused();\n          if (reply && reply.error === 'no such list') {\n            /* a new month's list was published while this one was open */\n            sendBtn.textContent = T.sendList;\n            status.textContent = T.listChanged;\n            return;\n          }\n          var complete = reply && reply.ok && reply.saved + (reply.late || 0) === items.length;\n          if (complete) {\n            sendBtn.textContent = T.sendList;\n            /* edits typed while it was sending stay on the phone, unsent */\n            if (JSON.stringify(snapshot()) === sentJson) {\n              clearDrafts();\n              status.textContent = T.listSent;\n            }\n          } else {\n            sendBtn.textContent = T.listFailed;\n            sendBtn.classList.add('is-failed');\n          }\n        },\n        60000 /* a whole list may wait behind other sends for the sheet */\n      );\n    });\n    wrap.appendChild(sendBtn);\n    wrap.appendChild(status);\n    return wrap;\n  }\n\n  /* ---------- Company notices: \u00AB\u0642\u0631\u0623\u062A\u00BB (Elio 17/10/2026) ----------\n     The read mark is kept on this phone, per person and notice id: the Sheet\n     script cannot take a \"read\" record without a change (see\n     staff-page-tabs\\READ_RECEIPTS_SPEC.md). The News tab shows a dot while the\n     signed-in person has a notice left unread. */\n  function readKey(id) {\n    return 'azar-staff:read:' + (person ? person.id : '?') + ':' + id;\n  }\n\n  function refreshNotices() {\n    var unread = 0;\n    Array.prototype.forEach.call(root.querySelectorAll('[data-notice]'), function (card) {\n      var id = card.getAttribute('data-notice');\n      var btn = card.querySelector('[data-notice-read]');\n      var done = !!store(readKey(id));\n      if (!done) unread++;\n      card.classList.toggle('is-read', done);\n      if (btn) {\n        if (!btn.hasAttribute('data-label')) btn.setAttribute('data-label', btn.textContent.trim());\n        btn.textContent = done ? btn.getAttribute('data-done') || '\u2713' : btn.getAttribute('data-label');\n        btn.setAttribute('aria-pressed', done ? 'true' : 'false');\n      }\n    });\n    if (newsDot) newsDot.hidden = !person || unread === 0;\n  }\n\n  root.addEventListener('click', function (e) {\n    var btn = e.target.closest ? e.target.closest('[data-notice-read]') : null;\n    if (!btn || !person) return;\n    var card = btn.closest('[data-notice]');\n    if (!card) return;\n    var key = readKey(card.getAttribute('data-notice'));\n    if (store(key)) return;\n    store(key, new Date().toISOString());\n    refreshNotices();\n  });\n\n  /* Opening an offer story or a datasheet is a visit too. */\n  root.addEventListener('click', function (e) {\n    if (!person || !e.target.closest) return;\n    var story = e.target.closest('.azar-staff__offer-btn');\n    if (story) {\n      var card = story.closest('[aria-label]');\n      track('open_story', currentTab, card ? card.getAttribute('aria-label') : story.getAttribute('href'));\n      return;\n    }\n    var sheet = e.target.closest('.azar-staff__gopen');\n    if (sheet) {\n      var row = sheet.closest('.azar-staff__guide');\n      var title = row && row.querySelector('.azar-staff__gtitle');\n      track('open_datasheet', currentTab, title ? title.textContent.trim() : sheet.getAttribute('href'));\n    }\n  });\n\n  /* ---------- Activity tab (owners only) ----------\n     Reads the Sheet script's \"activity\" answer (version 10). People come from this\n     page's roster (Arabic names), the owners left out; the script adds last seen,\n     last tab, visits today and in 7 days. Refreshed on opening, by the button, and\n     every minute while the tab is on screen. */\n  var actPanel = root.querySelector('[data-staff-activity]');\n  var actTabBtn = root.querySelector('[data-staff-owner-only]');\n  var actTimer = null;\n  var actBusy = false;\n  var A = {\n    needsUpdate: '\u064A\u062A\u0637\u0644\u0628 \u062A\u062D\u062F\u064A\u062B \u0627\u0644\u0633\u0643\u0631\u0628\u062A',\n    needsUpdateMore: '\u064A\u062A\u0637\u0644\u0628 \u062A\u062D\u062F\u064A\u062B \u0627\u0644\u0633\u0643\u0631\u0628\u062A \u0625\u0644\u0649 \u0627\u0644\u0625\u0635\u062F\u0627\u0631 10. \u0628\u0639\u062F \u0627\u0644\u062A\u062D\u062F\u064A\u062B \u062A\u0638\u0647\u0631 \u0647\u0646\u0627 \u0632\u064A\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u0648\u0638\u0641\u064A\u0646.',\n    off: '\u062A\u0633\u062C\u064A\u0644 \u0627\u0644\u0632\u064A\u0627\u0631\u0627\u062A \u0645\u062A\u0648\u0642\u0641 \u0645\u0646 \u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0627\u0644\u0635\u0641\u062D\u0629.',\n    notOwner: '\u0647\u0630\u0647 \u0627\u0644\u0635\u0641\u062D\u0629 \u0644\u0644\u0625\u062F\u0627\u0631\u0629 \u0641\u0642\u0637.',\n    loading: '\u062C\u0627\u0631\u064D \u0627\u0644\u062A\u062D\u0645\u064A\u0644\u2026',\n    updated: '\u0622\u062E\u0631 \u062A\u062D\u062F\u064A\u062B',\n    never: '\u0644\u0645 \u064A\u062F\u062E\u0644 \u062E\u0644\u0627\u0644 7 \u0623\u064A\u0627\u0645',\n    now: '\u0627\u0644\u0622\u0646',\n    minutes: '\u0642\u0628\u0644 [n] \u062F',\n    today: '\u0627\u0644\u064A\u0648\u0645',\n    yesterday: '\u0623\u0645\u0633',\n    lastTab: '\u0622\u062E\u0631 \u0635\u0641\u062D\u0629',\n    visitsToday: '\u0627\u0644\u064A\u0648\u0645',\n    visitsWeek: '7 \u0623\u064A\u0627\u0645',\n    tasksToday: '\u0641\u062A\u062D \u0627\u0644\u0645\u0647\u0627\u0645 \u0627\u0644\u064A\u0648\u0645',\n    active: '\u0646\u0634\u0637 \u0627\u0644\u0622\u0646',\n    noEvents: '\u0644\u0627 \u062A\u0648\u062C\u062F \u0623\u062D\u062F\u0627\u062B \u0628\u0639\u062F.',\n    ev: {\n      signin: '\u062F\u062E\u0644',\n      tab: '\u0641\u062A\u062D',\n      open_story: '\u0641\u062A\u062D \u0627\u0644\u0633\u062A\u0648\u0631\u064A',\n      open_datasheet: '\u0641\u062A\u062D \u0627\u0644\u0646\u0634\u0631\u0629',\n      open_file: '\u0641\u062A\u062D \u0645\u0644\u0641',\n      signout: '\u062E\u0631\u062C'\n    }\n  };\n\n  function showOwnerTab(on) {\n    if (actTabBtn) actTabBtn.hidden = !on;\n    if (!on && actPanel) actPanel.hidden = true;\n    tabColumns();\n  }\n\n  /* The tab bar (Elio 01/11/2026: \"Ok\" to the bottom bar): one row of at most five at the\n     bottom of the screen - \u0627\u0644\u0645\u0647\u0627\u0645, \u062D\u0636\u0648\u0631\u064A, \u0627\u0644\u0639\u0631\u0648\u0636, then \u0627\u0644\u0625\u062F\u0627\u0631\u0629 for the people who have\n     owner tools (or \u0627\u0644\u0623\u062E\u0628\u0627\u0631), then \u0627\u0644\u0645\u0632\u064A\u062F. The other tabs open from the \u0627\u0644\u0625\u062F\u0627\u0631\u0629 and \u0627\u0644\u0645\u0632\u064A\u062F\n     grids. The bar is drawn once the sign-in reply is in, so it never jumps. */\n  var MANAGE_TABS = ['approvals', 'cash', 'sal', 'attrev', 'team', 'activity'];\n  /* Elio 01/11/2026: \u0627\u0644\u0645\u0647\u0627\u0645 opens three cards - \u0627\u0644\u062D\u0636\u0648\u0631, \u0627\u0644\u062C\u0631\u062F, \u0627\u0644\u0623\u0645\u0627\u0643\u0646 */\n  var TASK_TABS = ['myatt', 'tasks', 'shelves'];\n  var TILE_NAMES = { myatt: '\u0627\u0644\u062D\u0636\u0648\u0631', tasks: '\u0627\u0644\u062C\u0631\u062F', shelves: '\u0627\u0644\u0623\u0645\u0627\u0643\u0646' };\n  var HUBS = ['taskhub', 'manage', 'more'];\n  var hubOf = {};\n\n  function tabAvail(name) {\n    var b = root.querySelector('[data-staff-tab=\"' + name + '\"]');\n    return !!b && !b.hidden;\n  }\n\n  function tabColumns() {\n    var bar = root.querySelector('[data-staff-tabs]');\n    if (!bar) return;\n    var real = tabButtons.filter(function (b) {\n      var n = b.getAttribute('data-staff-tab');\n      return HUBS.indexOf(n) === -1 && !b.hidden;\n    }).map(function (b) { return b.getAttribute('data-staff-tab'); });\n    var taskItems = TASK_TABS.filter(function (n) { return real.indexOf(n) !== -1; });\n    real = real.filter(function (n) { return TASK_TABS.indexOf(n) === -1; });\n    var manageItems = real.filter(function (n) { return MANAGE_TABS.indexOf(n) !== -1; });\n    var isManager = manageItems.length > 0;\n    var slots = ['taskhub', 'offers'];\n    if (real.indexOf('news') !== -1) slots.push('news');\n    if (isManager) slots.push('manage');\n    var rest = real.filter(function (n) { return slots.indexOf(n) === -1 && manageItems.indexOf(n) === -1; });\n    if (slots.length < 4 && rest.length) slots.push(rest.shift());\n    var moreItems = rest;\n    /* Elio always has \u0627\u0644\u0645\u0632\u064A\u062F: his \"View as\" and master PIN live there */\n    var forceMore = !!person && person.id === 'elio-test' && !viewAs;\n    if (moreItems.length === 1 && !forceMore) {\n      slots.push(moreItems[0]);\n      moreItems = [];\n    } else if (moreItems.length || forceMore) {\n      slots.push('more');\n    }\n    hubOf = {};\n    taskItems.forEach(function (n) { hubOf[n] = 'taskhub'; });\n    manageItems.forEach(function (n) { hubOf[n] = 'manage'; });\n    moreItems.forEach(function (n) { hubOf[n] = 'more'; });\n    tabButtons.forEach(function (b) {\n      var n = b.getAttribute('data-staff-tab');\n      if (n === 'manage') b.hidden = !isManager;\n      if (n === 'taskhub') b.hidden = false;\n      if (n === 'more') b.hidden = !moreItems.length && !forceMore;\n      var i = slots.indexOf(n);\n      b.classList.toggle('is-hubbed', i === -1);\n      b.style.order = i === -1 ? '' : String(i);\n    });\n    bar.style.gridTemplateColumns = 'repeat(' + slots.length + ', minmax(0, 1fr))';\n    hubBadge('taskhub', taskItems);\n    hubBadge('manage', manageItems);\n    hubBadge('more', moreItems);\n    drawHub('taskhub', taskItems);\n    drawHub('manage', manageItems);\n    drawHub('more', moreItems);\n    markHub();\n  }\n\n  /* the hub tab shows the sum of its tabs' number badges (approvals, tasks) */\n  function hubBadge(hub, items) {\n    var b = root.querySelector('[data-hub-badge=\"' + hub + '\"]');\n    if (!b) return;\n    var n = 0;\n    items.forEach(function (name) {\n      var nb = root.querySelector('[data-staff-tab=\"' + name + '\"] .azar-staff__badge');\n      if (nb && !nb.hidden) n += parseInt(nb.textContent, 10) || 0;\n    });\n    b.textContent = n ? String(n) : '';\n    b.hidden = !n;\n  }\n\n  function drawHub(hub, items) {\n    var grid = root.querySelector('[data-hub-grid=\"' + hub + '\"]');\n    if (!grid) return;\n    grid.textContent = '';\n    items.forEach(function (name) {\n      var src = root.querySelector('[data-staff-tab=\"' + name + '\"]');\n      var t = el('button', 'azar-hub__tile');\n      t.type = 'button';\n      t.appendChild(el('span', 'azar-hub__name', TILE_NAMES[name] || tabName(name)));\n      var nb = src && src.querySelector('.azar-staff__badge');\n      if (nb && !nb.hidden && nb.textContent) t.appendChild(el('span', 'azar-staff__badge azar-staff__badge--todo', nb.textContent));\n      var dot = src && src.querySelector('.azar-staff__tabdot');\n      if (dot && !dot.hidden) t.appendChild(el('span', 'azar-staff__tabdot'));\n      t.addEventListener('click', function () {\n        store('azar-staff:tab', name);\n        showTab(name);\n        try { window.scrollTo(0, 0); } catch (e) { /* old browsers */ }\n      });\n      grid.appendChild(t);\n    });\n  }\n\n  /* a tab opened from a hub lights up that hub in the bar */\n  function markHub() {\n    var hub = hubOf[currentTab];\n    HUBS.forEach(function (h) {\n      var b = root.querySelector('[data-staff-tab=\"' + h + '\"]');\n      if (!b || !hub) return;\n      if (h === hub) {\n        b.classList.add('is-active');\n        b.setAttribute('aria-selected', 'true');\n      }\n    });\n  }\n\n  /* hold the bar until the sign-in reply has said which tabs this person has */\n  var tabsWaitTimer = 0;\n  function holdTabs(on) {\n    var bar = root.querySelector('[data-staff-tabs]');\n    if (!bar) return;\n    clearTimeout(tabsWaitTimer);\n    bar.classList.toggle('is-loading', !!on);\n    if (on) tabsWaitTimer = setTimeout(function () { holdTabs(false); }, 4000);\n  }\n\n  function tabName(id) {\n    var b = root.querySelector('[data-staff-tab=\"' + id + '\"] span');\n    return b ? b.textContent.trim() : id || '';\n  }\n\n  function nameOf(id, fallback) {\n    var p = roster.filter(function (r) {\n      return r.id === id;\n    })[0];\n    return p ? p.name : fallback || id;\n  }\n\n  function two(n) {\n    return (n < 10 ? '0' : '') + n;\n  }\n\n  function when(iso, nowMs) {\n    var d = new Date(iso);\n    if (isNaN(d.getTime())) return '';\n    var mins = Math.floor((nowMs - d.getTime()) / 60000);\n    if (mins < 1) return A.now;\n    if (mins < 60) return A.minutes.replace('[n]', mins);\n    var hm = two(d.getHours()) + ':' + two(d.getMinutes());\n    var day = new Date(nowMs);\n    if (d.toDateString() === day.toDateString()) return A.today + ' ' + hm;\n    day.setDate(day.getDate() - 1);\n    if (d.toDateString() === day.toDateString()) return A.yesterday + ' ' + hm;\n    return two(d.getDate()) + '/' + two(d.getMonth() + 1) + ' ' + hm;\n  }\n\n  function actMessage(text) {\n    var box = actPanel.querySelector('[data-act-message]');\n    box.textContent = text || '';\n    box.hidden = !text;\n  }\n\n  function actStatus(text) {\n    var st = actPanel.querySelector('[data-act-status]');\n    if (st) st.textContent = text || '';\n  }\n\n  function startActivity() {\n    if (!actPanel || !isViewer(person)) return;\n    loadActivity();\n    if (!actTimer) actTimer = setInterval(function () {\n      if (!document.hidden) loadActivity();\n    }, 60000);\n  }\n\n  function stopActivity() {\n    if (actTimer) clearInterval(actTimer);\n    actTimer = null;\n  }\n\n  function loadActivity() {\n    if (!actPanel || !isViewer(person) || actBusy) return;\n    if (!SHEET) {\n      actMessage(A.needsUpdateMore);\n      actStatus(A.needsUpdate);\n      return;\n    }\n    var owner = person;\n    actBusy = true;\n    actStatus(A.loading);\n    call({ type: 'activity', person: owner.id }, function (reply) {\n      actBusy = false;\n      if (person !== owner) return;\n      if (!reply) {\n        actStatus(T.offline);\n        return;\n      }\n      if (!reply.ok) {\n        if (reply.error === 'pin') return pinRefused();\n        actMessage(reply.error === 'not owner' ? A.notOwner : reply.error === 'locked' ? T.locked : A.needsUpdateMore);\n        actStatus(reply.error === 'not owner' || reply.error === 'locked' ? '' : A.needsUpdate);\n        actPanel.querySelector('[data-act-people]').textContent = '';\n        actPanel.querySelector('[data-act-feedbox]').hidden = true;\n        return;\n      }\n      drawActivity(reply);\n    }, 20000);\n  }\n\n  function drawActivity(reply) {\n    var nowMs = Date.now();\n    actMessage(ACTIVITY_ON ? '' : A.off);\n    var seen = {};\n    (reply.people || []).forEach(function (p) {\n      if (p && p.id) seen[p.id] = p;\n    });\n    var people = roster.filter(function (r) {\n      return !isOwner(r);\n    }).map(function (r) {\n      return { id: r.id, name: r.name, s: seen[r.id] || null };\n    });\n    people.sort(function (a, b) {\n      var ta = a.s ? Date.parse(a.s.last_seen) || 0 : 0;\n      var tb = b.s ? Date.parse(b.s.last_seen) || 0 : 0;\n      return tb - ta;\n    });\n    var ul = actPanel.querySelector('[data-act-people]');\n    ul.textContent = '';\n    people.forEach(function (p) {\n      var s = p.s;\n      var active = !!s && nowMs - (Date.parse(s.last_seen) || 0) < 10 * 60000;\n      var li = el('li', 'azar-staff__actperson' + (active ? ' is-active' : '') + (s ? '' : ' is-never'));\n      var dot = el('span', 'azar-staff__actdot');\n      dot.setAttribute('aria-hidden', 'true');\n      li.appendChild(dot);\n      var body = el('span', 'azar-staff__actbody');\n      var top = el('span', 'azar-staff__actname', p.name);\n      if (active) top.appendChild(el('span', 'azar-staff__sr', ' (' + A.active + ')'));\n      body.appendChild(top);\n      var meta = el('span', 'azar-staff__actmeta');\n      if (s) {\n        meta.appendChild(el('span', '', when(s.last_seen, nowMs)));\n        if (s.last_tab) meta.appendChild(el('span', '', A.lastTab + ': ' + tabName(s.last_tab)));\n        if (s.last_device) {\n          var dv = el('bdi', 'azar-staff__actdev', s.last_device);\n          dv.dir = 'ltr';\n          meta.appendChild(dv);\n        }\n      } else {\n        meta.appendChild(el('span', '', A.never));\n      }\n      body.appendChild(meta);\n      li.appendChild(body);\n      if (s) {\n        var nums = el('span', 'azar-staff__actnums');\n        nums.appendChild(el('span', 'azar-staff__actnum', A.visitsToday + ' ' + (s.visits_today || 0)));\n        nums.appendChild(el('span', 'azar-staff__actnum azar-staff__actnum--soft', A.visitsWeek + ' ' + (s.visits_7d || 0)));\n        if (s.tasks_today) nums.appendChild(el('span', 'azar-staff__chip azar-staff__chip--doing', A.tasksToday + ' \u2713'));\n        li.appendChild(nums);\n      }\n      ul.appendChild(li);\n    });\n    var feed = actPanel.querySelector('[data-act-feed]');\n    var feedBox = actPanel.querySelector('[data-act-feedbox]');\n    feed.textContent = '';\n    var events = (reply.events || []).filter(function (ev) {\n      return ev && !isOwner({ id: ev.id });\n    }).slice(0, 50);\n    events.forEach(function (ev) {\n      var li = el('li', 'azar-staff__actev');\n      var t = el('bdi', 'azar-staff__acttime', when(ev.at, nowMs));\n      li.appendChild(t);\n      var line = el('span', 'azar-staff__actline');\n      line.appendChild(el('strong', '', nameOf(ev.id, ev.name)));\n      var what = (A.ev[ev.event] || ev.event) + (ev.tab && (ev.event === 'tab' || ev.event === 'signin') ? ' ' + tabName(ev.tab) : '');\n      line.appendChild(document.createTextNode(' ' + what));\n      if (ev.detail && ev.detail !== 'resume') line.appendChild(el('span', 'azar-staff__actdetail', ' \u00AB' + ev.detail + '\u00BB'));\n      li.appendChild(line);\n      feed.appendChild(li);\n    });\n    if (!events.length) feed.appendChild(el('li', 'azar-staff__actev azar-staff__actev--empty', A.noEvents));\n    feedBox.hidden = false;\n    actStatus(A.updated + ': ' + when(reply.now || new Date().toISOString(), nowMs + 1));\n  }\n\n  if (actPanel) {\n    var refreshBtn = actPanel.querySelector('[data-act-refresh]');\n    if (refreshBtn) refreshBtn.addEventListener('click', loadActivity);\n  }\n\n  /* ---------- My files (Elio 22/10/2026) ----------\n     The same agenda and training files as the person's own Z: folder. The admin\n     chat copies them daily to Elio's private Drive; the Sheet script (version 11)\n     lists them after the PIN check (\"my_files\") and hands one file at a time\n     (\"file\", base64). The file is opened from memory as a Blob, never stored on\n     the phone; only the list is kept, per person, and cleared on sign-out. The tab\n     shows only when the list has files. Before version 11 is deployed the script\n     refuses \"my_files\": Elio (elio-test) sees \u00AB\u064A\u062A\u0637\u0644\u0628 \u062A\u062D\u062F\u064A\u062B \u0627\u0644\u0633\u0643\u0631\u0628\u062A\u00BB, staff see no tab. */\n  var filesPanel = root.querySelector('[data-staff-files]');\n  var filesTabBtn = root.querySelector('[data-staff-files-tab]');\n  var FD = filesPanel ? filesPanel.dataset : {};\n  var filesSeq = 0; /* a newer load (or a sign-out) wins over an older answer */\n  var fileUrls = {}; /* file id -> object URL, in memory only, revoked after 15 minutes */\n\n  var FILE_ICONS = {\n    pdf: '<svg viewBox=\"0 0 24 24\" focusable=\"false\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6zm4 18H6V4h7v5h5v11zM8 12h8v2H8zm0 4h8v2H8z\"/></svg>',\n    html: '<svg viewBox=\"0 0 24 24\" focusable=\"false\"><path d=\"M9.4 16.6 4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0 4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z\"/></svg>',\n    file: '<svg viewBox=\"0 0 24 24\" focusable=\"false\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6zm4 18H6V4h7v5h5v11z\"/></svg>'\n  };\n\n  function filesKey(id) {\n    return 'azar-staff:files:' + id;\n  }\n\n  /* the cached list is removed outright, not left as an empty value */\n  function dropFiles(id) {\n    try {\n      window.localStorage.removeItem(filesKey(id));\n    } catch (e) {\n      /* private window: nothing was stored */\n    }\n  }\n\n  function showFilesTab(on) {\n    if (!filesTabBtn) return;\n    filesTabBtn.hidden = !on;\n    if (!on && filesPanel) filesPanel.hidden = true;\n    if (!on && currentTab === 'files') showTab('offers');\n    tabColumns();\n  }\n\n  function clearFiles(id) {\n    filesSeq++;\n    if (id) dropFiles(id);\n    Object.keys(fileUrls).forEach(function (k) {\n      try {\n        URL.revokeObjectURL(fileUrls[k]);\n      } catch (e) {\n        /* already gone */\n      }\n    });\n    fileUrls = {};\n    if (filesPanel) {\n      filesPanel.querySelector('[data-files-agenda]').textContent = '';\n      filesPanel.querySelector('[data-files-training]').textContent = '';\n    }\n    showFilesTab(false);\n  }\n\n  function loadFiles(retried) {\n    if (!filesPanel || !filesTabBtn) return;\n    if (!SHEET || !person) return showFilesTab(false);\n    var owner = person;\n    var seq = ++filesSeq;\n    var cached = null;\n    try {\n      cached = JSON.parse(store(filesKey(owner.id)) || 'null');\n    } catch (e) {\n      cached = null;\n    }\n    if (cached && Array.isArray(cached.files) && cached.files.length) drawFiles(cached.files);\n    else showFilesTab(false);\n    call({ type: 'my_files', person: owner.id }, function (reply) {\n      if (seq !== filesSeq || person !== owner) return;\n      if (!reply) {\n        /* no signal: keep the list this phone already has, and ask once more later */\n        if (!retried) setTimeout(function () {\n          if (seq === filesSeq && person === owner) loadFiles(true);\n        }, 60000);\n        return;\n      }\n      if (reply.ok && Array.isArray(reply.files)) {\n        var files = reply.files.filter(function (f) {\n          return f && f.id && f.name && (f.folder === 'agenda' || f.folder === 'training');\n        });\n        if (files.length) store(filesKey(owner.id), JSON.stringify({ files: files, at: Date.now() }));\n        else dropFiles(owner.id);\n        if (files.length) drawFiles(files);\n        else showFilesTab(false); /* no folder (ground team, owners) or nothing in it */\n        return;\n      }\n      dropFiles(owner.id);\n      /* a wrong PIN or a lockout is the sign-in's business; here the tab just stays away */\n      if (reply.error === 'pin' || reply.error === 'locked' || reply.error === 'unknown person') return showFilesTab(false);\n      /* the live script (version 10) does not know \"my_files\" yet */\n      if (isViewer(owner)) filesNeedsUpdate();\n      else showFilesTab(false);\n    }, 30000);\n  }\n\n  function filesMessage(text) {\n    var box = filesPanel.querySelector('[data-files-message]');\n    box.textContent = text || '';\n    box.hidden = !text;\n    Array.prototype.forEach.call(filesPanel.querySelectorAll('.azar-staff__files, .azar-staff__filesnote'), function (c) {\n      c.hidden = !!text;\n    });\n  }\n\n  function filesNeedsUpdate() {\n    filesMessage(FD.needsUpdate || '\u064A\u062A\u0637\u0644\u0628 \u062A\u062D\u062F\u064A\u062B \u0627\u0644\u0633\u0643\u0631\u0628\u062A');\n    showFilesTab(true);\n  }\n\n  /* \"Agenda 22-10-2026.pdf\" -> that day, or null */\n  function agendaDay(name) {\n    var m = String(name || '').match(/(\\d{1,2})-(\\d{1,2})-(\\d{4})/);\n    if (!m) return null;\n    var d = new Date(Number(m[3]), Number(m[2]) - 1, Number(m[1]));\n    return isNaN(d.getTime()) ? null : d;\n  }\n\n  function fileKind(f) {\n    var mime = String(f.mime || '').toLowerCase();\n    var ext = (String(f.name || '').match(/\\.([a-z0-9]{1,5})$/i) || [])[1] || '';\n    if (mime === 'application/pdf' || /^pdf$/i.test(ext)) return 'pdf';\n    if (/html/.test(mime) || /^html?$/i.test(ext)) return 'html';\n    return 'file';\n  }\n\n  function fileSize(n) {\n    n = Number(n) || 0;\n    if (!n) return '';\n    if (n < 1024 * 1024) return Math.max(1, Math.round(n / 1024)) + ' KB';\n    return (n / (1024 * 1024)).toFixed(1).replace(/\\.0$/, '') + ' MB';\n  }\n\n  function drawFiles(files) {\n    filesMessage('');\n    var agenda = files.filter(function (f) {\n      return f.folder === 'agenda';\n    });\n    agenda.sort(function (a, b) {\n      return ((agendaDay(b.name) || 0) - (agendaDay(a.name) || 0));\n    });\n    var training = weeklyShuffle(files.filter(function (f) {\n      return f.folder === 'training';\n    }));\n\n    var aList = filesPanel.querySelector('[data-files-agenda]');\n    var aDate = filesPanel.querySelector('[data-files-agenda-date]');\n    aList.textContent = '';\n    aDate.textContent = '';\n    if (agenda.length) {\n      var day = agendaDay(agenda[0].name) || (agenda[0].updated ? new Date(agenda[0].updated) : null);\n      if (day && !isNaN(day.getTime())) {\n        aDate.appendChild(document.createTextNode(arabicDate(day, true)));\n        if (day.toDateString() !== new Date().toDateString()) {\n          aDate.appendChild(document.createTextNode(' '));\n          aDate.appendChild(el('span', 'azar-staff__chip azar-staff__chip--old', FD.oldAgenda || '\u062C\u062F\u0648\u0644 \u064A\u0648\u0645 \u0633\u0627\u0628\u0642'));\n        }\n      }\n      agenda.forEach(function (f) {\n        aList.appendChild(fileRow(f));\n      });\n    } else {\n      aList.appendChild(el('li', 'azar-staff__filenone', FD.noAgenda || '\u0644\u0627 \u064A\u0648\u062C\u062F \u062C\u062F\u0648\u0644 \u0644\u0644\u064A\u0648\u0645 \u0628\u0639\u062F.'));\n    }\n\n    var tList = filesPanel.querySelector('[data-files-training]');\n    var tMeta = filesPanel.querySelector('[data-files-training-meta]');\n    tList.textContent = '';\n    tMeta.textContent = training.length ? '\u0639\u062F\u062F \u0627\u0644\u0645\u0644\u0641\u0627\u062A: ' + training.length : '';\n    training.forEach(function (f, i) {\n      var row = fileRow(f);\n      if (i === 0 && training.length > 1) {\n        var name = row.querySelector('.azar-staff__gtitle') || row;\n        name.appendChild(document.createTextNode(' '));\n        name.appendChild(el('span', 'azar-staff__chip', FD.weekTraining || '\u062A\u062F\u0631\u064A\u0628 \u0647\u0630\u0627 \u0627\u0644\u0623\u0633\u0628\u0648\u0639'));\n      }\n      tList.appendChild(row);\n    });\n    if (!training.length) tList.appendChild(el('li', 'azar-staff__filenone', FD.noTraining || '\u0644\u0627 \u062A\u0648\u062C\u062F \u0645\u0644\u0641\u0627\u062A \u062A\u062F\u0631\u064A\u0628 \u0628\u0639\u062F.'));\n    showFilesTab(true);\n  }\n\n  /* Training files in a new order every week (Elio 22/10/2026: \"the training files should shuffle every once per week\").\n     Same order all week for a person; the first one is marked as this week's training. */\n  function weeklyShuffle(list) {\n    var d = new Date(); var day = (d.getDay() + 6) % 7; d.setHours(0, 0, 0, 0); d.setDate(d.getDate() - day);\n    var seed = Math.floor(d.getTime() / 86400000) + ':' + ((person && person.id) || '');\n    var h = 2166136261;\n    for (var i = 0; i < seed.length; i++) { h ^= seed.charCodeAt(i); h = Math.imul(h, 16777619) >>> 0; }\n    var rnd = function () { h ^= h << 13; h >>>= 0; h ^= h >>> 17; h ^= h << 5; h >>>= 0; return h / 4294967296; };\n    var a = list.slice().sort(function (x, y) { return String(x.name).localeCompare(String(y.name)); });\n    for (var j = a.length - 1; j > 0; j--) { var k = Math.floor(rnd() * (j + 1)); var t = a[j]; a[j] = a[k]; a[k] = t; }\n    return a;\n  }\n\n  function fileRow(f) {\n    var kind = fileKind(f);\n    var li = el('li', 'azar-staff__guide azar-staff__file');\n    var icon = el('span', 'azar-staff__gicon azar-staff__gicon--' + kind);\n    icon.setAttribute('aria-hidden', 'true');\n    icon.innerHTML = FILE_ICONS[kind];\n    icon.appendChild(el('span', 'azar-staff__gicon-tag', kind === 'file' ? ((String(f.name).match(/\\.([a-z0-9]{1,5})$/i) || [])[1] || '').toUpperCase() : kind.toUpperCase()));\n    li.appendChild(icon);\n    var text = el('span', 'azar-staff__gtext');\n    var title = el('span', 'azar-staff__gtitle', String(f.name).replace(/\\.[a-z0-9]{1,5}$/i, '').replace(/_+/g, ' '));\n    title.setAttribute('dir', 'auto');\n    text.appendChild(title);\n    var bits = [];\n    var size = fileSize(f.size);\n    if (size) bits.push(size);\n    if (f.path) bits.push(String(f.path));\n    if (bits.length) {\n      var note = el('bdi', 'azar-staff__gnote', bits.join(' \u00B7 '));\n      text.appendChild(note);\n    }\n    li.appendChild(text);\n    var btn = el('button', 'azar-staff__gopen', FD.open || '\u0641\u062A\u062D');\n    btn.type = 'button';\n    btn.setAttribute('aria-label', (FD.open || '\u0641\u062A\u062D') + ': ' + f.name);\n    li.appendChild(btn);\n    var status = el('p', 'azar-staff__filestatus');\n    status.setAttribute('role', 'status');\n    status.hidden = true;\n    li.appendChild(status);\n    btn.addEventListener('click', function () {\n      openFile(f, btn, status, li);\n    });\n    return li;\n  }\n\n  /* base64 -> Blob. A web page (.html) opens as text/html, the way it would from Z:. */\n  function toBlob(b64, mime) {\n    var bin = atob(b64);\n    var bytes = new Uint8Array(bin.length);\n    for (var i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);\n    return new Blob([bytes], { type: mime });\n  }\n\n  function fileMime(f, replyMime) {\n    var kind = fileKind({ name: f.name, mime: replyMime || f.mime });\n    if (kind === 'pdf') return 'application/pdf';\n    if (kind === 'html') return 'text/html;charset=utf-8';\n    return replyMime || f.mime || 'application/octet-stream';\n  }\n\n  /* \"Opened? If not, tap here\" \u2014 a tap is always allowed to open a tab, so this\n     works on the phones that blocked the automatic one. */\n  function fileLinks(status, url, name, opened) {\n    status.textContent = '';\n    var a = el('a', 'azar-staff__filelink', opened ? '\u0644\u0645 \u064A\u0638\u0647\u0631 \u0627\u0644\u0645\u0644\u0641\u061F \u0627\u0636\u063A\u0637 \u0647\u0646\u0627' : FD.tap || '\u0627\u0644\u0645\u0644\u0641 \u062C\u0627\u0647\u0632: \u0627\u0636\u063A\u0637 \u0647\u0646\u0627 \u0644\u0641\u062A\u062D\u0647');\n    a.href = url;\n    a.target = '_blank';\n    a.rel = 'noopener';\n    status.appendChild(a);\n    var d = el('a', 'azar-staff__filelink azar-staff__filelink--soft', FD.save || '\u062A\u0646\u0632\u064A\u0644');\n    d.href = url;\n    d.download = name;\n    status.appendChild(d);\n    status.hidden = false;\n  }\n\n  function fileError(status, text) {\n    status.textContent = text;\n    status.hidden = false;\n  }\n\n  function openFile(f, btn, status, li) {\n    if (!person || btn.disabled) return;\n    var owner = person;\n    track('open_file', 'files', f.name);\n    /* the same file again within 15 minutes: straight from memory */\n    if (fileUrls[f.id]) {\n      var again = null;\n      try {\n        again = window.open(fileUrls[f.id], '_blank');\n      } catch (e) {\n        again = null;\n      }\n      fileLinks(status, fileUrls[f.id], f.name, !!again);\n      return;\n    }\n    /* The tab is opened now, inside the tap, or a phone blocks it as a pop-up;\n       the file is put into it when it arrives. */\n    var win = null;\n    try {\n      win = window.open('', '_blank');\n    } catch (e) {\n      win = null;\n    }\n    if (win) {\n      try {\n        win.opener = null;\n        win.document.title = f.name;\n        win.document.body.innerHTML = '<p style=\"font:600 18px/1.5 system-ui,sans-serif;padding:32px 20px;text-align:center;color:#0e1b4d\" dir=\"rtl\">' +\n          (FD.opening || '\u062C\u0627\u0631\u064D \u0627\u0644\u0641\u062A\u062D\u2026') + '</p>';\n      } catch (e) {\n        /* the blank tab is enough */\n      }\n    }\n    /* loading: the button keeps its width (a spinner only), the words go under it */\n    var label = btn.textContent;\n    btn.disabled = true;\n    btn.classList.add('is-busy');\n    btn.style.minWidth = btn.offsetWidth + 'px';\n    btn.textContent = '';\n    li.setAttribute('aria-busy', 'true');\n    status.textContent = FD.opening || '\u062C\u0627\u0631\u064D \u0627\u0644\u0641\u062A\u062D\u2026';\n    status.hidden = false;\n    call({ type: 'file', person: owner.id, id: f.id }, function (reply) {\n      btn.disabled = false;\n      btn.classList.remove('is-busy');\n      btn.textContent = label;\n      btn.style.minWidth = '';\n      li.removeAttribute('aria-busy');\n      status.hidden = true;\n      if (person !== owner) {\n        if (win) win.close();\n        return;\n      }\n      if (!reply || !reply.ok || !reply.data) {\n        if (win) win.close();\n        if (reply && reply.error === 'pin') return pinRefused();\n        fileError(status, reply && reply.error === 'too big' ? FD.tooBig || '\u0627\u0644\u0645\u0644\u0641 \u0643\u0628\u064A\u0631 \u062C\u062F\u0627\u064B.' : FD.failed || T.offline);\n        return;\n      }\n      var url;\n      try {\n        url = URL.createObjectURL(toBlob(reply.data, fileMime(f, reply.mime)));\n      } catch (e) {\n        if (win) win.close();\n        fileError(status, FD.failed || T.offline);\n        return;\n      }\n      fileUrls[f.id] = url;\n      setTimeout(function () {\n        if (fileUrls[f.id] !== url) return;\n        delete fileUrls[f.id];\n        try {\n          URL.revokeObjectURL(url);\n        } catch (e) {\n          /* already gone */\n        }\n        status.hidden = true;\n        status.textContent = '';\n      }, 15 * 60000);\n      var opened = false;\n      if (win && !win.closed) {\n        try {\n          win.location.href = url;\n          opened = true;\n        } catch (e) {\n          opened = false;\n        }\n      }\n      fileLinks(status, url, reply.name || f.name, opened);\n    }, 90000);\n  }\n\n  /* ---------- Container card: the item list from a JSON theme asset ----------\n     Loaded once, after sign-in; drawn as collapsible family groups. Names and\n     notes go in with textContent only. */\n  function loadContainers() {\n    Array.prototype.forEach.call(root.querySelectorAll('[data-staff-container]'), function (card) {\n      if (card.getAttribute('data-loaded')) return;\n      card.setAttribute('data-loaded', '1');\n      var box = card.querySelector('[data-box-groups]');\n      fetch(card.getAttribute('data-src'), { cache: 'no-store' })\n        .then(function (r) {\n          if (!r.ok) throw new Error('http');\n          return r.json();\n        })\n        .then(function (json) {\n          drawContainer(card, box, json || {});\n        })\n        .catch(function () {\n          card.removeAttribute('data-loaded');\n          box.textContent = '';\n          box.appendChild(el('p', 'azar-staff__boxwait', card.getAttribute('data-error') || ''));\n        });\n    });\n  }\n\n  function drawContainer(card, box, json) {\n    box.textContent = '';\n    (json.groups || []).forEach(function (g, gi) {\n      var items = (g.items || []).filter(function (i) {\n        return i && i.name;\n      });\n      if (!items.length) return;\n      var det = el('details', 'azar-staff__boxgroup');\n      if (gi === 0) det.open = true;\n      var sum = el('summary', 'azar-staff__boxsum');\n      sum.appendChild(el('span', 'azar-staff__boxsum-name', g.name || ''));\n      sum.appendChild(el('span', 'azar-staff__sgroup-n', String(items.length)));\n      det.appendChild(sum);\n      var ul = el('ul', 'azar-staff__boxlist');\n      ul.setAttribute('role', 'list');\n      items.forEach(function (i) {\n        var li = el('li', 'azar-staff__boxitem');\n        var th = el('span', 'azar-staff__boxthumb');\n        var src = imageUrl(i.image, 128);\n        if (src) {\n          var img = el('img');\n          img.alt = '';\n          img.width = 64;\n          img.height = 64;\n          img.loading = 'lazy';\n          img.decoding = 'async';\n          img.addEventListener('error', function () {\n            th.innerHTML = BOX_ICON;\n          });\n          img.src = src;\n          th.appendChild(img);\n          /* Stand-in photo of the nearest product: say so, so staff don't promise the look. */\n          if (i.image_sub) th.appendChild(el('span', 'azar-staff__subcap', card.getAttribute('data-sub-caption') || ''));\n        } else {\n          th.innerHTML = BOX_ICON;\n        }\n        li.appendChild(th);\n        var body = el('span', 'azar-staff__boxbody');\n        body.appendChild(el('span', 'azar-staff__boxname', i.name));\n        var meta = el('span', 'azar-staff__boxmeta');\n        if (i.code) {\n          var code = el('bdi', 'azar-staff__scode', i.code);\n          code.dir = 'ltr';\n          meta.appendChild(code);\n        }\n        if (i.note) meta.appendChild(el('span', 'azar-staff__snote', i.note));\n        if (meta.childNodes.length) body.appendChild(meta);\n        li.appendChild(body);\n        /* No quantities on the card (Elio 17/10/2026): photo and description only. */\n        ul.appendChild(li);\n      });\n      det.appendChild(ul);\n      box.appendChild(det);\n    });\n  }\n\n  /* ---------- Shelves \u2013 \u0627\u0644\u0623\u0645\u0627\u0643\u0646 (Elio 27/10/2026, HQ brief) ----------\n     Chris, Rihab and Mohammad (reply.shelves) pick items by code or name, pick one\n     shelf, photograph it (required on a shelf's first fill) and save; Stephanie\n     (reply.shelves_review) approves or rejects, and HQ writes the approved batch into\n     Wizard. Script calls (Team chat): shelf_items, shelf_save, shelf_review,\n     shelf_decide. Items stay in memory only and are cleared on sign-out. */\n  var shelvesPanel = root.querySelector('[data-staff-shelves]');\n  var shelvesTabBtn = root.querySelector('[data-staff-shelves-tab]');\n  var SH = shelvesPanel ? shelvesPanel.dataset : {};\n  var shelfMode = ''; /* 'entry', 'review' or '' (no tab) */\n  var shelfSeq = 0; /* a newer load (or a sign-out) wins over an older answer */\n  var shelfItems = null; /* [{c, n, f, s, q}] */\n  var shelfByCode = {};\n  var shelfCodes = []; /* every valid shelf code */\n  var photoShelves = {};\n  var shelfChips = [];\n  var shelfPhoto = ''; /* the shrunk photo as a data URL, until saved */\n  var shelfSaving = false;\n  var shelfFamilyUsed = false; /* sent as family:true when the family button added items */\n  var SHELF_MAX = 30; /* suggestions shown at once */\n  var shelfSumOn = false;\n  var shelfSum = null; /* the sign-in reply's shelf_summary, until sign-out */\n  var shelfMulti = false; /* \"select several\": checkboxes in the item suggestions (Elio 03/11/2026) */\n  var shelfPick = {}; /* code -> true, ticked in the suggestions and not yet added to the list */\n  var lastShelf = ''; /* the shelf this person saved last, for \"same shelf again\" (memory only, cleared on sign-out) */\n  var hideDone = true; /* hide items already placed today (Team's pd / placed_today); the person can untick it */\n  var shelfProg = null; /* {placed, left}: this person's day, from shelf_items.progress */\n  var lastUndo = null; /* {id, at}: the last save, undoable for 10 minutes */\n  var shelfPhotoHash = ''; /* perceptual hash of the shrunk photo, sent so the script can spot a reused picture */\n  var undoTimer = 0;\n  var UNDO_MS = 10 * 60 * 1000;\n  var scanStream = null;\n  var scanTimer = 0;\n  var shelfLoc = null; /* {code, ar, en}: the Wizard location these shelves belong to, from shelf_items */\n\n  /* ---------- Shelf summary \u2013 \u0645\u0644\u062E\u0635 \u0627\u0644\u0631\u0641\u0648\u0641 (Elio 29/10/2026, via HQ: \"publish the excel file\n     resume of the item locations to stephanie staff page\") ----------\n     Read only, for Stephanie and the owners: the sign-in reply carries shelf_summary =\n     {updated, totals {entered, approved, loaded, waiting, rejected}, rows [{code, item,\n     warehouse, old_shelf, shelf, entered, approved, loaded}]}, newest first, all text\n     (Team v23). Nothing is kept on the phone; the Excel itself stays in her Z: folder. */\n  var SUM_LABELS = {\n    code: 'Code', item: 'Item', warehouse: 'Warehouse', old_shelf: 'Old shelf', shelf: 'Shelf',\n    entered: 'Entered', approved: 'Approved', loaded: 'In Wizard', state: 'Wizard load', reason: 'Reason'\n  };\n  var SUM_TOTALS = {\n    entered: '\u0623\u064F\u062F\u062E\u0644 \u00B7 Entered', approved: '\u0648\u0627\u0641\u0642\u062A \u00B7 Approved', loaded: '\u0641\u064A \u0648\u064A\u0632\u0627\u0631\u062F \u00B7 In Wizard',\n    waiting: '\u0628\u0627\u0644\u0627\u0646\u062A\u0638\u0627\u0631 \u00B7 Waiting', rejected: '\u0645\u0631\u0641\u0648\u0636 \u00B7 Rejected', held: '\u0645\u0639\u0644\u0651\u0642 \u00B7 Held', failed: '\u0641\u0634\u0644 \u00B7 Failed'\n  };\n  var sumBox = null;\n  var sumOpener = null;\n\n  function closeShelfSum() {\n    if (!sumBox || sumBox.hidden) return;\n    sumBox.hidden = true;\n    sumBox.querySelector('.azar-sheet__body').textContent = '';\n    if (sumOpener) sumOpener.focus();\n    sumOpener = null;\n  }\n\n  function sumText(v) {\n    if (v === true) return '\u2713';\n    if (v === false) return '\u2717';\n    return v == null ? '' : String(v);\n  }\n\n  /* the Wizard load state of a row (script v57): loaded / held / waiting / failed */\n  function stateText(v) {\n    var k = String(v == null ? '' : v).toLowerCase();\n    return { loaded: '\u2713 \u062A\u0645 \u00B7 Loaded', held: '\u0645\u0639\u0644\u0651\u0642 \u00B7 Held', waiting: '\u0628\u0627\u0646\u062A\u0638\u0627\u0631 \u00B7 Waiting', failed: '\u2715 \u0641\u0634\u0644 \u00B7 Failed' }[k] || sumText(v);\n  }\n\n  function sumColumns(reply, rows) {\n    if (Array.isArray(reply.columns) && reply.columns.length) {\n      return reply.columns.map(function (c) {\n        return typeof c === 'string' ? { key: c, label: SUM_LABELS[c] || c } : { key: c.key, label: c.label || SUM_LABELS[c.key] || c.key };\n      });\n    }\n    var keys = [];\n    rows.slice(0, 50).forEach(function (r) {\n      Object.keys(r || {}).forEach(function (k) { if (keys.indexOf(k) === -1) keys.push(k); });\n    });\n    var order = Object.keys(SUM_LABELS);\n    keys.sort(function (a, b) {\n      var ia = order.indexOf(a), ib = order.indexOf(b);\n      return (ia === -1 ? 99 : ia) - (ib === -1 ? 99 : ib);\n    });\n    return keys.map(function (k) { return { key: k, label: SUM_LABELS[k] || k }; });\n  }\n\n  function openShelfSum(opener) {\n    if (!shelfSumOn || !shelfSum) return;\n    drawShelfSum({ rows: Array.isArray(shelfSum.rows) ? shelfSum.rows : [], totals: shelfSum.totals, updated: shelfSum.updated }, opener);\n  }\n\n  function drawShelfSum(reply, opener) {\n    if (!sumBox) {\n      sumBox = el('div', 'azar-sheet');\n      sumBox.setAttribute('role', 'dialog');\n      sumBox.setAttribute('aria-modal', 'true');\n      var panel = el('div', 'azar-sheet__panel');\n      var bar = el('div', 'azar-sheet__bar');\n      bar.appendChild(el('h3', 'azar-sheet__title', SH.sumTitle));\n      var x = el('button', 'azar-sheet__close', T.close);\n      x.type = 'button';\n      x.addEventListener('click', closeShelfSum);\n      bar.appendChild(x);\n      panel.appendChild(bar);\n      panel.appendChild(el('div', 'azar-sheet__body'));\n      sumBox.appendChild(panel);\n      sumBox.addEventListener('click', function (event) {\n        if (event.target === sumBox) closeShelfSum();\n      });\n      document.addEventListener('keydown', function (event) {\n        if (sumBox && !sumBox.hidden && event.key === 'Escape') closeShelfSum();\n      });\n      root.appendChild(sumBox);\n    }\n    var rows = reply.rows.filter(function (r) { return r && typeof r === 'object'; });\n    var cols = sumColumns(reply, rows);\n    var codeKey = cols.map(function (c) { return c.key; }).filter(function (k) { return /^(code|item_code)$/i.test(k); })[0] || (cols[0] && cols[0].key);\n    var body = sumBox.querySelector('.azar-sheet__body');\n    body.textContent = '';\n    var meta = el('p', 'azar-sheet__meta', SH.sumReadonly + (reply.updated || reply.as_of ? ' \u00B7 ' : ''));\n    if (reply.updated || reply.as_of) {\n      var u = el('bdi', '', String(reply.updated || reply.as_of));\n      u.dir = 'ltr';\n      meta.appendChild(u);\n    }\n    body.appendChild(meta);\n\n    /* totals on top: an object of label \u2192 value, or a list of {label, value} */\n    var tot = reply.totals;\n    var tlist = Array.isArray(tot) ? tot : tot && typeof tot === 'object' ? Object.keys(tot).map(function (k) {\n      return { label: SUM_TOTALS[k] || SUM_LABELS[k] || k.replace(/_/g, ' '), value: tot[k] };\n    }) : [];\n    if (tlist.length) {\n      var tb = el('div', 'azar-shelf__sumtotals');\n      tlist.forEach(function (t) {\n        var cell = el('div', 'azar-shelf__sumtotal');\n        var v = el('bdi', 'azar-shelf__sumval', sumText(t.value));\n        v.dir = 'ltr';\n        cell.appendChild(v);\n        cell.appendChild(el('span', 'azar-cash__label', String(t.label || '')));\n        tb.appendChild(cell);\n      });\n      body.appendChild(tb);\n    }\n\n    var search = el('input', 'azar-shelf__input azar-shelf__sumq');\n    search.type = 'search';\n    search.dir = 'ltr';\n    search.autocomplete = 'off';\n    search.setAttribute('autocapitalize', 'characters');\n    search.spellcheck = false;\n    search.placeholder = SH.sumSearch;\n    search.setAttribute('aria-label', SH.sumSearch);\n    body.appendChild(search);\n    var count = el('p', 'azar-sheet__cut');\n    body.appendChild(count);\n\n    if (!rows.length) {\n      body.appendChild(el('p', 'azar-staff__calm', SH.sumEmpty));\n    } else {\n      var wrap = el('div', 'azar-sheet__scroll');\n      wrap.dir = 'ltr';\n      var table = el('table', 'azar-sheet__table');\n      var thead = el('thead');\n      var hr = el('tr');\n      cols.forEach(function (c) { hr.appendChild(el('th', '', c.label)); });\n      thead.appendChild(hr);\n      table.appendChild(thead);\n      var tbody = el('tbody');\n      var trs = rows.map(function (r) {\n        var tr = el('tr');\n        cols.forEach(function (c) {\n          var v = r[c.key];\n          var notYet = c.key === 'loaded' && /^\\s*(not yet|no|)\\s*$/i.test(sumText(v));\n          var bad = c.key === 'state' && /^(failed|held)$/i.test(String(v));\n          var td = el('td', v === false || notYet || bad ? 'is-off' : v === true || (c.key === 'state' && /^loaded$/i.test(String(v))) ? 'is-on' : '');\n          var t = c.key === 'state' ? stateText(v) : sumText(v);\n          if (t) {\n            var b = el('bdi', '', t);\n            b.dir = 'auto';\n            td.appendChild(b);\n          }\n          tr.appendChild(td);\n        });\n        tbody.appendChild(tr);\n        return { tr: tr, k: (sumText(r[codeKey]) + ' ' + sumText(r.item || r.name)).toLowerCase() };\n      });\n      table.appendChild(tbody);\n      wrap.appendChild(table);\n      body.appendChild(wrap);\n      var showCount = function () {\n        var q = search.value.trim().toLowerCase();\n        var n = 0;\n        trs.forEach(function (x) {\n          var on = !q || x.k.indexOf(q) !== -1;\n          x.tr.hidden = !on;\n          if (on) n++;\n        });\n        count.textContent = SH.sumCount.replace(/\\[n\\]/g, n).replace(/\\[t\\]/g, trs.length);\n      };\n      search.addEventListener('input', showCount);\n      showCount();\n    }\n    sumOpener = opener || null;\n    sumBox.hidden = false;\n    sumBox.querySelector('.azar-sheet__close').focus();\n  }\n\n  function shelfQ(sel) {\n    return shelvesPanel.querySelector(sel);\n  }\n\n  function shelfMsg(text) {\n    var m = shelfQ('[data-shelf-msg]');\n    m.textContent = text || '';\n    m.hidden = !text;\n  }\n\n  function setShelfAccess(reply) {\n    if (!shelvesPanel || !shelvesTabBtn || !reply) return;\n    shelfMode = reply.shelves_review ? 'review' : reply.shelves ? 'entry' : reply.shelf_summary ? 'summary' : '';\n    shelfSum = reply.shelf_summary && typeof reply.shelf_summary === 'object' ? reply.shelf_summary : null;\n    shelfSumOn = !!shelfSum;\n    var sb = shelfQ('[data-shelf-sum-btn]');\n    sb.textContent = SH.sumBtn;\n    sb.hidden = !shelfSumOn;\n    shelvesTabBtn.hidden = !shelfMode;\n    if (!shelfMode) {\n      shelvesPanel.hidden = true;\n      if (currentTab === 'shelves') showTab('offers');\n    }\n    tabColumns();\n  }\n\n  function clearShelves() {\n    shelfSeq++;\n    shelfMode = '';\n    shelfSumOn = false;\n    shelfSum = null;\n    closeShelfSum();\n    shelfItems = null;\n    shelfByCode = {};\n    shelfCodes = [];\n    photoShelves = {};\n    shelfChips = [];\n    shelfPhoto = '';\n    shelfFamilyUsed = false;\n    shelfMulti = false;\n    shelfPick = {};\n    shelfLoc = null;\n    lastShelf = '';\n    reviewRows = [];\n    reviewSel = {};\n    reviewPhotos = {};\n    spotOn = false;\n    reviewReminder = null;\n    reviewCanOwner = null;\n    hideDone = true;\n    shelfProg = null;\n    lastUndo = null;\n    shelfPhotoHash = '';\n    clearTimeout(undoTimer);\n    stopScan();\n    if (!shelvesPanel) return;\n    shelfQ('[data-shelf-hidedone]').checked = true;\n    shelfQ('[data-shelf-spot]').checked = false;\n    shelfQ('[data-shelf-spotbox]').hidden = true;\n    shelfQ('[data-shelf-reviewbar]').hidden = true;\n    shelfQ('[data-shelf-waiting]').hidden = true;\n    shelfQ('[data-shelf-rejected]').hidden = true;\n    renderProgress();\n    renderUndo();\n    shelfQ('[data-shelf-multi]').checked = false;\n    shelfQ('[data-shelf-q]').value = '';\n    shelfQ('[data-shelf-s]').value = '';\n    shelfQ('[data-shelf-rows]').textContent = '';\n    shelfQ('[data-shelf-entry]').hidden = true;\n    shelfQ('[data-shelf-review]').hidden = true;\n    shelfQ('[data-shelf-done]').hidden = true;\n    shelfMsg('');\n    renderShelfForm();\n    if (shelvesTabBtn) shelvesTabBtn.hidden = true;\n    shelvesPanel.hidden = true;\n    tabColumns();\n  }\n\n  function shelfFailed(reply) {\n    if (reply && reply.error === 'pin') return pinRefused();\n    shelfMsg(reply && /unknown|type/i.test(String(reply.error || '')) ? SH.needsUpdate : SH.failed);\n  }\n\n  function openShelves() {\n    if (!shelvesPanel || !shelfMode || !SHEET || !person) return;\n    if (shelfMode === 'summary') return shelfMsg('');\n    if (shelfMode === 'review') return loadShelfReview();\n    if (shelfItems) return;\n    var seq = ++shelfSeq;\n    shelfMsg(SH.loading);\n    call({ type: 'shelf_items', person: person.id }, function (reply) {\n      if (seq !== shelfSeq) return;\n      if (!reply || !reply.ok || !Array.isArray(reply.items)) return shelfFailed(reply);\n      shelfItems = reply.items.filter(function (it) {\n        return it && it.c;\n      });\n      shelfByCode = {};\n      shelfItems.forEach(function (it) {\n        it.c = String(it.c);\n        it.n = String(it.n || '');\n        it.f = String(it.f || '');\n        it.s = String(it.s || '');\n        it.b = String(it.b || '');\n        it._k = (it.c + ' ' + it.n + ' ' + it.b.replace(/,/g, ' ')).toLowerCase();\n        if (!it.pd || typeof it.pd !== 'object') it.pd = null;\n        shelfByCode[it.c.toUpperCase()] = it;\n      });\n      var placedToday = reply.placed_today && typeof reply.placed_today === 'object' ? reply.placed_today : {};\n      Object.keys(placedToday).forEach(function (c) {\n        var it = shelfByCode[String(c).toUpperCase()];\n        if (it && !it.pd) it.pd = { by: '', at: '' };\n      });\n      shelfProg = reply.progress && typeof reply.progress === 'object' && !Array.isArray(reply.progress) ? { placed: +reply.progress.placed || 0, left: +reply.progress.left || 0 } : null;\n      if (!lastShelf && reply.last_shelf) lastShelf = String(reply.last_shelf).toUpperCase();\n      var lastId = reply.last_batch || reply.last_id;\n      var lastAt = Date.parse(reply.last_at || '');\n      lastUndo = lastId && lastAt && Date.now() - lastAt < UNDO_MS ? { id: lastId, at: lastAt } : null;\n      renderProgress();\n      renderUndo();\n      shelfQ('[data-shelf-scan]').hidden = !scanSupported();\n      shelfCodes = (reply.shelves || []).map(function (x) {\n        return String(x).toUpperCase();\n      });\n      photoShelves = {};\n      (reply.photo_shelves || []).forEach(function (x) {\n        photoShelves[String(x).toUpperCase()] = true;\n      });\n      shelfMsg(shelfCodes.length ? '' : SH.noShelves);\n      shelfLoc = reply.location && typeof reply.location === 'object' ? reply.location : null;\n      var locBox = shelfQ('[data-shelf-loc]');\n      locBox.textContent = '';\n      locBox.hidden = !(shelfLoc && (shelfLoc.ar || shelfLoc.en));\n      if (!locBox.hidden) {\n        locBox.appendChild(document.createTextNode((SH.location || '\u0627\u0644\u0645\u0648\u0642\u0639') + ': '));\n        locBox.appendChild(el('strong', '', [shelfLoc.ar, shelfLoc.en].filter(Boolean).join(' \u00B7 ')));\n      }\n      var rj = Array.isArray(reply.rejected) ? reply.rejected.filter(function (x) { return x && x.shelf; }) : [];\n      var rjBox = shelfQ('[data-shelf-rejected]');\n      rjBox.textContent = '';\n      rjBox.hidden = !rj.length;\n      if (rj.length) {\n        rjBox.appendChild(el('p', 'azar-shelf__onshelf-head', SH.rejectedHead || ''));\n        rj.slice(0, 10).forEach(function (x) {\n          var li = el('p', 'azar-shelf__rejrow');\n          var sb = el('bdi', 'azar-staff__scode', String(x.shelf));\n          sb.dir = 'ltr';\n          li.appendChild(sb);\n          li.appendChild(el('span', '', (Array.isArray(x.codes) ? x.codes.join(', ') : '') + (x.reason ? ' \u00B7 ' + reasonLabel(x.reason) : '') + (x.note ? ' \u00B7 ' + x.note : '') + (x.at ? ' \u00B7 ' + x.at : '')));\n          rjBox.appendChild(li);\n        });\n      }\n      shelfFloorChips();\n      shelfQ('[data-shelf-entry]').hidden = false;\n      renderShelfForm();\n    }, 45000);\n  }\n\n  function itemByCode(c) {\n    return shelfByCode[String(c).toUpperCase()];\n  }\n\n  /* Code prefix first (\"AUR\" finds AUR-\u2026), then every word of the query in the code or name. */\n  function findItems(q) {\n    q = q.trim().toLowerCase();\n    if (!q || !shelfItems) return [];\n    var words = q.split(/\\s+/);\n    var flat = q.replace(/\\s+/g, '');\n    var first = [];\n    var rest = [];\n    for (var i = 0; i < shelfItems.length && first.length < SHELF_MAX; i++) {\n      var it = shelfItems[i];\n      if (shelfChips.indexOf(it.c) !== -1) continue;\n      if (hideDone && it.pd) continue;\n      if (it.c.toLowerCase().indexOf(flat) === 0 || (it.b && it.b.split(',').indexOf(flat) !== -1)) first.push(it);\n      else if (rest.length < SHELF_MAX && words.every(function (w) { return it._k.indexOf(w) !== -1; })) rest.push(it);\n    }\n    return first.concat(rest).slice(0, SHELF_MAX);\n  }\n\n  function suggest(list, input, items, render, pick, sayNone) {\n    list.textContent = '';\n    items.forEach(function (x, i) {\n      var li = el('li', 'azar-shelf__opt');\n      li.setAttribute('role', 'option');\n      li.id = list.id + '-' + i;\n      render(li, x);\n      /* mousedown, not click: the input keeps focus and the list does not vanish first */\n      li.addEventListener('mousedown', function (e) {\n        e.preventDefault();\n        pick(x);\n      });\n      list.appendChild(li);\n    });\n    var none = !items.length && sayNone && input.value.trim() !== '';\n    if (none) list.appendChild(el('li', 'azar-shelf__none', SH.none));\n    var open = items.length > 0 || none;\n    list.hidden = !open;\n    input.setAttribute('aria-expanded', open ? 'true' : 'false');\n  }\n\n  function itemOption(li, it) {\n    var top = el('span', 'azar-shelf__opt-top');\n    if (shelfMulti) {\n      var picked = !!shelfPick[it.c];\n      li.classList.add('is-multi');\n      li.classList.toggle('is-picked', picked);\n      li.setAttribute('aria-selected', picked ? 'true' : 'false');\n      top.appendChild(el('span', 'azar-shelf__box', picked ? '\u2713' : ''));\n    }\n    var code = el('bdi', 'azar-staff__scode', it.c);\n    code.dir = 'ltr';\n    top.appendChild(code);\n    var where = el('bdi', 'azar-shelf__opt-shelf' + (it.s ? '' : ' is-empty'), it.s || SH.noShelf);\n    where.dir = it.s ? 'ltr' : 'rtl';\n    top.appendChild(where);\n    li.appendChild(top);\n    if (it.pd) li.appendChild(el('span', 'azar-shelf__opt-done', (SH.doneMark || 'Placed today') + (it.pd.by ? ' \u00B7 ' + it.pd.by : '') + (it.pd.at ? ' \u00B7 ' + it.pd.at : '')));\n    li.appendChild(el('span', 'azar-shelf__opt-name', it.n));\n    if (it.q != null && it.q !== '') li.appendChild(el('span', 'azar-shelf__opt-qty', (SH.qty || '\u0627\u0644\u0643\u0645\u064A\u0629') + ': ' + it.q));\n  }\n\n  function renderProgress() {\n    var p = shelfQ('[data-shelf-progress]');\n    if (!p) return;\n    p.hidden = !shelfProg;\n    if (shelfProg) p.textContent = (SH.progress || '[p] / [l]').replace('[p]', shelfProg.placed).replace('[l]', shelfProg.left);\n  }\n\n  /* Undo the last save for 10 minutes (the script refuses later, or once Stephanie has decided). */\n  function renderUndo() {\n    var b = shelfQ('[data-shelf-undo]');\n    if (!b) return;\n    clearTimeout(undoTimer);\n    var left = lastUndo ? UNDO_MS - (Date.now() - lastUndo.at) : 0;\n    b.hidden = left <= 0;\n    b.disabled = false;\n    if (left > 0) undoTimer = setTimeout(renderUndo, left + 500);\n  }\n\n  function undoLast() {\n    var u = lastUndo;\n    var b = shelfQ('[data-shelf-undo]');\n    if (!u || b.disabled) return;\n    b.disabled = true;\n    var done = shelfQ('[data-shelf-done]');\n    done.className = 'azar-shelf__done';\n    done.hidden = false;\n    var seq = shelfSeq;\n    call({ type: 'shelf_undo', person: person.id, id: u.id, batch: u.id }, function (reply) {\n      if (seq !== shelfSeq) return;\n      if (reply && reply.ok) {\n        lastUndo = null;\n        renderUndo();\n        done.textContent = (SH.undone || 'Undone: [n]').replace('[n]', reply.restored != null ? reply.restored : reply.undone != null ? reply.undone : '');\n        done.classList.add('is-ok');\n        shelfItems = null; /* load the true shelves again */\n        shelfByCode = {};\n        openShelves();\n        return;\n      }\n      if (reply && reply.error === 'pin') return pinRefused();\n      b.disabled = false;\n      var why = reply && { late: SH.undoLate, decided: SH.undoDecided }[reply.error];\n      if (reply && (reply.error === 'late' || reply.error === 'decided')) {\n        lastUndo = null;\n        renderUndo();\n      }\n      done.textContent = why || SH.saveFailed;\n      done.classList.add('is-failed');\n    }, 45000);\n  }\n\n  /* Barcode scan of an item (Android Chrome has BarcodeDetector; elsewhere the button stays hidden and the\n     person types). Found by item code or by the item's barcodes (item.b, comma separated). */\n  function scanSupported() {\n    return typeof window.BarcodeDetector === 'function' && !!(navigator.mediaDevices && navigator.mediaDevices.getUserMedia);\n  }\n\n  function stopScan() {\n    clearTimeout(scanTimer);\n    scanTimer = 0;\n    if (scanStream) scanStream.getTracks().forEach(function (t) { t.stop(); });\n    scanStream = null;\n    var box = shelvesPanel && shelfQ('[data-shelf-scanbox]');\n    if (box) {\n      box.hidden = true;\n      var v = box.querySelector('video');\n      if (v) v.srcObject = null;\n    }\n  }\n\n  function itemByScan(text) {\n    var v = String(text || '').trim();\n    var hit = itemByCode(v);\n    if (hit) return hit;\n    for (var i = 0; shelfItems && i < shelfItems.length; i++) {\n      if (shelfItems[i].b && shelfItems[i].b.split(',').indexOf(v) !== -1) return shelfItems[i];\n    }\n    return null;\n  }\n\n  function startScan() {\n    if (!scanSupported() || scanStream) return;\n    var box = shelfQ('[data-shelf-scanbox]');\n    var msg = shelfQ('[data-shelf-scanmsg]');\n    var video = box.querySelector('video');\n    msg.textContent = SH.scanHint || '';\n    var detector;\n    try {\n      detector = new window.BarcodeDetector({ formats: ['ean_13', 'ean_8', 'code_128', 'code_39', 'upc_a', 'upc_e', 'qr_code'] });\n    } catch (e) {\n      detector = new window.BarcodeDetector();\n    }\n    navigator.mediaDevices.getUserMedia({ video: { facingMode: 'environment' }, audio: false }).then(function (stream) {\n      scanStream = stream;\n      video.srcObject = stream;\n      box.hidden = false;\n      var lastText = '';\n      var lastAt = 0;\n      function tick() {\n        if (!scanStream) return;\n        detector.detect(video).then(function (found) {\n          var txt = found && found[0] && found[0].rawValue;\n          if (txt && (txt !== lastText || Date.now() - lastAt > 2500)) {\n            lastText = txt;\n            lastAt = Date.now();\n            var it = itemByScan(txt);\n            if (it && shelfChips.indexOf(it.c) === -1) {\n              shelfChips.push(it.c);\n              renderShelfForm();\n              msg.textContent = (SH.scanAdded || '[c]').replace('[c]', it.c);\n              if (navigator.vibrate) navigator.vibrate(60);\n            } else if (it) {\n              msg.textContent = (SH.scanAdded || '[c]').replace('[c]', it.c);\n            } else {\n              msg.textContent = (SH.scanNone || '[c]').replace('[c]', txt);\n            }\n          }\n        }).catch(function () { /* a frame that cannot be read */ }).then(function () {\n          if (scanStream) scanTimer = setTimeout(tick, 300);\n        });\n      }\n      tick();\n    }).catch(function () {\n      shelfMsg(SH.scanDenied);\n    });\n  }\n\n  /* dHash: 9x8 grey picture, one bit per neighbour pair, 16 hex digits. */\n  function dHash(img) {\n    try {\n      var c = document.createElement('canvas');\n      c.width = 9;\n      c.height = 8;\n      var x = c.getContext('2d');\n      x.drawImage(img, 0, 0, 9, 8);\n      var d = x.getImageData(0, 0, 9, 8).data;\n      var g = function (px, py) {\n        var i = (py * 9 + px) * 4;\n        return 0.299 * d[i] + 0.587 * d[i + 1] + 0.114 * d[i + 2];\n      };\n      var hex = '';\n      for (var row = 0; row < 8; row++) {\n        var a = 0;\n        var b = 0;\n        for (var col = 0; col < 8; col++) {\n          var bit = g(col, row) > g(col + 1, row) ? 1 : 0;\n          if (col < 4) a = a * 2 + bit;\n          else b = b * 2 + bit;\n        }\n        hex += a.toString(16) + b.toString(16);\n      }\n      return hex;\n    } catch (e) {\n      return '';\n    }\n  }\n\n  function pickCount() {\n    return Object.keys(shelfPick).length;\n  }\n\n  /* The item suggestions. Normal: a tap adds the item to the list. \"Select several\": a tap\n     ticks or unticks the row IN PLACE (the list is not redrawn under the finger) and the list\n     stays open; a bar at the bottom adds every ticked item to the list at once (the ticks\n     survive a new search). Rows use click, not mousedown: on a phone the synthetic mouse\n     events fired twice and the redraw moved buttons under the finger. */\n  var lastPick = { c: '', t: 0 };\n  function drawItems() {\n    var inp = shelfQ('[data-shelf-q]');\n    var list = shelfQ('[data-shelf-sugg]');\n    var items = findItems(inp.value);\n    if (!shelfMulti) {\n      suggest(list, inp, items, itemOption, function (it) { addChip(it.c); }, true);\n      return;\n    }\n    list.textContent = '';\n    var bar = null;\n    var addBtn = null;\n    var noneBtn = null;\n    function refreshBar() {\n      var n = pickCount();\n      addBtn.textContent = (SH.pickAdd || 'Add selected') + (n ? ' (' + n + ')' : '');\n      addBtn.disabled = !n;\n      noneBtn.disabled = !n;\n    }\n    items.forEach(function (it, i) {\n      var li = el('li', 'azar-shelf__opt');\n      li.setAttribute('role', 'option');\n      li.id = list.id + '-' + i;\n      itemOption(li, it);\n      li.addEventListener('click', function (e) {\n        e.preventDefault();\n        var now = Date.now();\n        if (lastPick.c === it.c && now - lastPick.t < 400) return; /* a doubled tap */\n        lastPick = { c: it.c, t: now };\n        if (shelfPick[it.c]) delete shelfPick[it.c];\n        else shelfPick[it.c] = true;\n        var on = !!shelfPick[it.c];\n        li.classList.toggle('is-picked', on);\n        li.setAttribute('aria-selected', on ? 'true' : 'false');\n        var box = li.querySelector('.azar-shelf__box');\n        if (box) box.textContent = on ? '\u2713' : '';\n        refreshBar();\n      });\n      list.appendChild(li);\n    });\n    if (!items.length && inp.value.trim()) list.appendChild(el('li', 'azar-shelf__none', SH.none));\n    if (items.length || pickCount()) {\n      bar = el('li', 'azar-shelf__pickbar');\n      addBtn = el('button', 'azar-shelf__pickadd');\n      addBtn.type = 'button';\n      var all = el('button', 'azar-shelf__pickmini', SH.pickAll || 'Select all shown');\n      all.type = 'button';\n      noneBtn = el('button', 'azar-shelf__pickmini', SH.pickNone || 'Clear');\n      noneBtn.type = 'button';\n      all.addEventListener('click', function () {\n        items.forEach(function (it) { shelfPick[it.c] = true; });\n        drawItems();\n      });\n      noneBtn.addEventListener('click', function () {\n        shelfPick = {};\n        drawItems();\n      });\n      addBtn.addEventListener('click', function () {\n        Object.keys(shelfPick).forEach(function (c) {\n          if (shelfChips.indexOf(c) === -1) shelfChips.push(c);\n        });\n        shelfPick = {};\n        inp.value = '';\n        list.hidden = true;\n        inp.setAttribute('aria-expanded', 'false');\n        shelfQ('[data-shelf-done]').hidden = true;\n        renderShelfForm();\n        var ch = shelfQ('[data-shelf-chipsbox]');\n        if (ch && ch.scrollIntoView) ch.scrollIntoView({ block: 'center', behavior: 'smooth' });\n      });\n      [addBtn, all, noneBtn].forEach(function (b) { bar.appendChild(b); });\n      list.appendChild(bar);\n      refreshBar();\n    }\n    list.hidden = !list.children.length;\n    inp.setAttribute('aria-expanded', list.hidden ? 'false' : 'true');\n  }\n\n  function addChip(code) {\n    if (shelfChips.indexOf(code) === -1) shelfChips.push(code);\n    var q = shelfQ('[data-shelf-q]');\n    q.value = '';\n    suggest(shelfQ('[data-shelf-sugg]'), q, [], itemOption, null, false);\n    shelfQ('[data-shelf-done]').hidden = true;\n    renderShelfForm();\n    q.focus();\n  }\n\n  /* Floors 3 and 4 are split LEFT / RIGHT (Elio 02/11/2026: \"the location should be 4L-B01\n     and 4R-A02\"): codes are <floor><L|R>-<aisle><rack> there and \"<floor>-<aisle><rack>\" on\n     floors 1, 2 and 5. The code still starts with the floor digit.\n     The picker offers one chip per floor (and side) built from the codes the script sent,\n     so the person chooses the side first and then types or picks the aisle and rack. */\n  function shelfFloorChips() {\n    var box = shelfQ('[data-shelf-floors]');\n    if (!box) return;\n    box.textContent = '';\n    var groups = {};\n    shelfCodes.forEach(function (c) {\n      var m = /^(\\d)([LR]?)-/.exec(c);\n      if (m) groups[m[1] + m[2]] = { side: m[2], floor: m[1] };\n      /* showroom codes: SR-A01 (main showroom), TL-A01 (tools showroom) */\n      var w = /^([A-Z]{2,3})-/.exec(c);\n      if (w) groups[w[1]] = { side: '', floor: '', pre: w[1] };\n    });\n    var list = Object.keys(groups).map(function (k) { return groups[k]; }).sort(function (a, b) {\n      return (a.pre ? 1 : 0) - (b.pre ? 1 : 0) || (a.pre || '').localeCompare(b.pre || '') || a.floor.localeCompare(b.floor) || a.side.localeCompare(b.side);\n    });\n    box.hidden = !list.length;\n    list.forEach(function (g) {\n      var label = g.pre ? g.pre : g.side === 'L' ? g.floor + ' \u00B7 ' + SH.left : g.side === 'R' ? g.floor + ' \u00B7 ' + SH.right : g.floor;\n      var b = el('button', 'azar-shelf__chipbtn' + (g.side ? ' is-side' : ''), label);\n      b.type = 'button';\n      b.addEventListener('click', function () {\n        var inp = shelfQ('[data-shelf-s]');\n        inp.value = (g.pre || g.floor + g.side) + '-';\n        inp.dispatchEvent(new Event('input', { bubbles: true }));\n        inp.focus();\n      });\n      box.appendChild(b);\n    });\n  }\n\n  /* Second row of chips: the aisle letters that exist after the typed prefix (\"SR-\" -> A B C ...,\n     \"4L-\" -> A B ...), so a showroom person taps SR, then the aisle, then picks the rack. */\n  function shelfAisleChips(v) {\n    var box = shelfQ('[data-shelf-aisles]');\n    if (!box) return;\n    box.textContent = '';\n    var m = /^([A-Z0-9]+)-([A-Z]?)$/.exec(String(v || '').trim().toUpperCase());\n    var seen = {};\n    var letters = [];\n    if (m) {\n      shelfCodes.forEach(function (c) {\n        if (c.indexOf(m[1] + '-') !== 0) return;\n        var a = c.charAt(m[1].length + 1);\n        if (/[A-Z]/.test(a) && !seen[a]) {\n          seen[a] = true;\n          letters.push(a);\n        }\n      });\n      letters.sort();\n    }\n    box.hidden = !m || letters.length < 2 || !!m[2];\n    if (box.hidden) return;\n    letters.forEach(function (a) {\n      var b = el('button', 'azar-shelf__chipbtn is-aisle', a);\n      b.type = 'button';\n      b.addEventListener('click', function () {\n        var inp = shelfQ('[data-shelf-s]');\n        inp.value = m[1] + '-' + a;\n        inp.dispatchEvent(new Event('input', { bubbles: true }));\n        inp.focus();\n      });\n      box.appendChild(b);\n    });\n  }\n\n  /* an old-style 3-\u2026 or 4-\u2026 code: say what changed */\n  function shelfSideHint(v) {\n    var h = shelfQ('[data-shelf-sidehint]');\n    if (!h) return;\n    h.hidden = !/^([34]-|[LR][34]-)/.test(String(v || '').trim());\n  }\n\n  function currentShelf() {\n    return shelfQ('[data-shelf-s]').value.trim().toUpperCase();\n  }\n\n  function shelfValid(s) {\n    return !!s && shelfCodes.indexOf(s) !== -1;\n  }\n\n  function shelfMoves(s) {\n    return shelfChips.map(itemByCode).filter(function (it) {\n      return it && it.s && it.s.toUpperCase() !== s;\n    });\n  }\n\n  /* Shelf view: what the system says is on the chosen shelf now. A tap adds an item to the list\n     (to confirm it is still there); \"add all\" takes them all. Items already on the list are hidden. */\n  function renderOnShelf(s) {\n    var box = shelfQ('[data-shelf-onshelf]');\n    var ul = shelfQ('[data-shelf-onshelf-list]');\n    ul.textContent = '';\n    var here = s && shelfItems ? shelfItems.filter(function (it) {\n      return it.s && it.s.toUpperCase() === s && shelfChips.indexOf(it.c) === -1;\n    }) : [];\n    box.hidden = !here.length;\n    if (!here.length) return;\n    shelfQ('[data-shelf-onshelf-head]').textContent = (SH.onShelfHead || '[n] on [s]').replace('[n]', here.length).replace('[s]', s);\n    here.slice(0, SHELF_MAX).forEach(function (it) {\n      var li = el('li', 'azar-shelf__here');\n      var code = el('bdi', 'azar-staff__scode', it.c);\n      code.dir = 'ltr';\n      li.appendChild(code);\n      li.appendChild(el('span', 'azar-shelf__here-name', it.n));\n      var b = el('button', 'azar-shelf__here-add', '+');\n      b.type = 'button';\n      b.setAttribute('aria-label', (SH.addOne || 'Add') + ' ' + it.c);\n      b.addEventListener('click', function () {\n        if (shelfChips.indexOf(it.c) === -1) shelfChips.push(it.c);\n        renderShelfForm();\n      });\n      li.appendChild(b);\n      ul.appendChild(li);\n    });\n    var all = shelfQ('[data-shelf-onshelf-all]');\n    all.textContent = SH.addAllHere || 'Add all';\n    all.onclick = function () {\n      here.forEach(function (it) { if (shelfChips.indexOf(it.c) === -1) shelfChips.push(it.c); });\n      renderShelfForm();\n    };\n  }\n\n  function renderShelfForm() {\n    if (!shelvesPanel) return;\n    var chips = shelfQ('[data-shelf-chips]');\n    chips.textContent = '';\n    shelfChips.forEach(function (c) {\n      var it = itemByCode(c) || { c: c, n: '' };\n      var li = el('li', 'azar-shelf__chip');\n      li.title = it.n;\n      var code = el('bdi', '', c);\n      code.dir = 'ltr';\n      li.appendChild(code);\n      var x = el('button', 'azar-shelf__chip-x', '\u2715');\n      x.type = 'button';\n      x.setAttribute('aria-label', (SH.remove || '\u0625\u0632\u0627\u0644\u0629') + ' ' + c);\n      x.addEventListener('click', function () {\n        shelfChips = shelfChips.filter(function (k) { return k !== c; });\n        if (!shelfChips.length) shelfFamilyUsed = false;\n        renderShelfForm();\n      });\n      li.appendChild(x);\n      chips.appendChild(li);\n    });\n\n    /* \"Whole family\": every item in the family of the last chip */\n    var fam = shelfQ('[data-shelf-family]');\n    var last = itemByCode(shelfChips[shelfChips.length - 1] || '');\n    var famItems = last && last.f && shelfItems ? shelfItems.filter(function (it) {\n      return it.f === last.f && shelfChips.indexOf(it.c) === -1;\n    }) : [];\n    fam.hidden = !famItems.length;\n    if (famItems.length) {\n      fam.textContent = (SH.family || 'Whole family') + ' \u2013 ' + last.f + ' (+' + famItems.length + ')';\n      fam.onclick = function () {\n        var ask = (SH.familyConfirm || 'Add [n] from [f]?').replace('[n]', famItems.length).replace('[f]', last.f);\n        if (famItems.length > 10 && !window.confirm(ask)) return;\n        famItems.forEach(function (it) { shelfChips.push(it.c); });\n        shelfFamilyUsed = true;\n        renderShelfForm();\n      };\n    }\n\n    var sInput = shelfQ('[data-shelf-s]');\n    var s = currentShelf();\n    var serr = shelfQ('[data-shelf-serr]');\n    var bad = !!s && !shelfValid(s) && sInput !== document.activeElement;\n    serr.textContent = bad ? SH.badShelf : '';\n    serr.hidden = !bad;\n\n    var again = shelfQ('[data-shelf-again]');\n    again.hidden = !lastShelf || s === lastShelf;\n    if (!again.hidden) again.textContent = (SH.again || 'Same shelf again') + ': ' + lastShelf;\n    renderOnShelf(shelfValid(s) ? s : '');\n\n    var moves = shelfValid(s) ? shelfMoves(s) : [];\n    var warn = shelfQ('[data-shelf-warn]');\n    var wl = shelfQ('[data-shelf-warn-list]');\n    wl.textContent = '';\n    moves.forEach(function (it) {\n      var li = el('li');\n      (SH.move || '[c] on [from] \u2013 move to [to]?').split(/(\\[c\\]|\\[from\\]|\\[to\\])/).forEach(function (part) {\n        var v = part === '[c]' ? it.c : part === '[from]' ? it.s : part === '[to]' ? s : null;\n        if (v == null) {\n          if (part) li.appendChild(document.createTextNode(part));\n          return;\n        }\n        var b = el('bdi', '', v);\n        b.dir = 'ltr';\n        li.appendChild(b);\n      });\n      wl.appendChild(li);\n    });\n    warn.hidden = !moves.length;\n    var moveOk = shelfQ('[data-shelf-move-ok]');\n    shelfQ('[data-shelf-move-label]').textContent = SH.moveOk;\n    if (!moves.length) moveOk.checked = false;\n\n    /* before / after in one line, and a clear-all button for the list */\n    var sum = shelfQ('[data-shelf-summary]');\n    var n = shelfChips.length;\n    sum.hidden = !n;\n    if (n) {\n      var line = shelfValid(s)\n        ? (SH.summary || '[n] \u2192 [s]').replace('[n]', n).replace('[s]', s) + (moves.length ? ' \u00B7 ' + (SH.summaryMoved || '[m]').replace('[m]', moves.length) : '')\n        : (SH.summaryPick || '[n]').replace('[n]', n);\n      sum.textContent = line;\n    }\n    shelfQ('[data-shelf-clear]').hidden = n < 2;\n    var head = shelfQ('[data-shelf-chipsbox]');\n    head.hidden = !n;\n    head.textContent = (SH.listHead || '[n]').replace('[n]', n);\n\n    var needPhoto = shelfValid(s) && !photoShelves[s];\n    var note = shelfQ('[data-shelf-photo-note]');\n    note.textContent = needPhoto ? SH.photoNeeded : SH.photoOptional;\n    note.classList.toggle('is-needed', needPhoto && !shelfPhoto);\n    var prev = shelfQ('[data-shelf-preview]');\n    prev.hidden = !shelfPhoto;\n    if (shelfPhoto) prev.src = shelfPhoto;\n    else prev.removeAttribute('src');\n\n    shelfQ('[data-shelf-s]').disabled = !shelfCodes.length;\n    shelfQ('[data-shelf-save]').disabled = shelfSaving || !shelfChips.length || !shelfValid(s) ||\n      (moves.length > 0 && !moveOk.checked) || (needPhoto && !shelfPhoto);\n  }\n\n  /* Shrink on the phone: at most 1280 px on the long side, JPEG 0.7 (about 150\u2013300 KB). */\n  function shrinkPhoto(file, done) {\n    var url = URL.createObjectURL(file);\n    var img = new Image();\n    img.onload = function () {\n      var k = Math.min(1, 1280 / Math.max(img.naturalWidth, img.naturalHeight));\n      var c = document.createElement('canvas');\n      c.width = Math.round(img.naturalWidth * k);\n      c.height = Math.round(img.naturalHeight * k);\n      c.getContext('2d').drawImage(img, 0, 0, c.width, c.height);\n      var hash = dHash(c);\n      URL.revokeObjectURL(url);\n      done(c.toDataURL('image/jpeg', 0.7), hash);\n    };\n    img.onerror = function () {\n      URL.revokeObjectURL(url);\n      done('');\n    };\n    img.src = url;\n  }\n\n  function saveShelf() {\n    var s = currentShelf();\n    var btn = shelfQ('[data-shelf-save]');\n    if (btn.disabled || shelfSaving) return;\n    var codes = shelfChips.slice();\n    var moves = shelfMoves(s).map(function (it) {\n      return { c: it.c, from: it.s };\n    });\n    /* replace: the new shelf REPLACES the old one in that Wizard location (Elio 03/11/2026) */\n    var payload = { type: 'shelf_save', person: person.id, shelf: s, codes: codes, moves: moves, replace: true };\n    if (shelfLoc && shelfLoc.code != null) payload.location = shelfLoc.code;\n    if (shelfPhoto) payload.photo = shelfPhoto;\n    if (shelfPhoto && shelfPhotoHash) payload.photo_hash = shelfPhotoHash;\n    if (shelfFamilyUsed) payload.family = true;\n    shelfSaving = true;\n    btn.disabled = true;\n    var done = shelfQ('[data-shelf-done]');\n    done.className = 'azar-shelf__done';\n    done.textContent = SH.saving;\n    done.hidden = false;\n    var seq = shelfSeq;\n    call(payload, function (reply) {\n      if (seq !== shelfSeq) return;\n      shelfSaving = false;\n      if (!reply || !reply.ok) {\n        if (reply && reply.error === 'pin') return pinRefused();\n        var why = reply && { shelf: SH.errShelf, codes: SH.errCodes, photo: SH.errPhoto, 'not allowed': SH.errAllowed, locked: SH.errLocked }[reply.error];\n        done.textContent = why || SH.saveFailed;\n        done.classList.add('is-failed');\n        renderShelfForm();\n        return;\n      }\n      var newly = 0;\n      var stamp = new Date().toTimeString().slice(0, 5);\n      codes.forEach(function (c) {\n        var it = itemByCode(c);\n        if (!it) return;\n        if (!it.s && !it.pd) newly++;\n        it.s = s;\n        it.pd = { by: person ? person.name : '', at: stamp };\n      });\n      if (shelfProg) {\n        shelfProg.placed += codes.length;\n        shelfProg.left = Math.max(0, shelfProg.left - newly);\n        renderProgress();\n      }\n      var batchId = reply.id || reply.batch;\n      lastUndo = batchId ? { id: batchId, at: Date.now() } : null;\n      renderUndo();\n      if (shelfPhoto) photoShelves[s] = true;\n      lastShelf = s;\n      track('shelf', 'shelves', s + ' x' + codes.length);\n      shelfChips = [];\n      shelfPhoto = '';\n      shelfPhotoHash = '';\n      shelfFamilyUsed = false;\n      shelfQ('[data-shelf-s]').value = '';\n      shelfQ('[data-shelf-photo]').value = '';\n      var st = reply.status === 'pending' ? SH.pending : reply.status === 'test' ? SH.testSaved : '';\n      done.textContent = (SH.saved || 'Saved').replace('[n]', reply.saved || codes.length).replace('[s]', s) + (st ? ' \u2013 ' + st : '');\n      done.classList.add('is-ok');\n      var re = reply.photo_reused && typeof reply.photo_reused === 'object' ? reply.photo_reused : null;\n      var warnText = re ? (SH.photoReused || '[s]').replace('[s]', re.shelf || '') + (re.by ? ' \u00B7 ' + re.by : '') + (re.at ? ' \u00B7 ' + re.at : '') : reply.photo_warning ? (SH.photoReused || '[s]').replace('[s]', String(reply.photo_warning)) : '';\n      if (warnText) {\n        done.appendChild(document.createElement('br'));\n        done.appendChild(el('span', 'azar-shelf__reused', warnText));\n      }\n      if (reply.needs_owner > 0) {\n        done.appendChild(document.createElement('br'));\n        done.appendChild(el('span', 'azar-shelf__reused', (SH.ownerHeld || '[n]').replace('[n]', reply.needs_owner)));\n      }\n      renderShelfForm();\n    }, 90000);\n  }\n\n  /* ---------- Review side of the location page (Elio 04/11/2026, \"all 8 enhancements\", via HQ) ----------\n     Stephanie, Elio and Juan decide batches. Script v57 keys (Team chat), all optional:\n     shelf_review: rows[] {id, shelf, by, at, codes[], photo_id, moves[], conflicts[], multi,\n       photo_reused, needs_owner, owner_codes[]}, reminder {waiting, since, due, text},\n       can_decide_owner (Elio/Juan only), progress[], loads[]; rows come sorted by place, then shelf.\n     shelf_decide {id | ids[], codes[] (only these items), decision approve|reject,\n       reason wrong_shelf|photo_unclear|wrong_item|other, note} -> {ok, decided, held_for_owner}; error 'reason'.\n     shelf_spot -> {rows[{code,name,shelf,w,place,by,at,batch,photo_id}], people[{person,checked,failed,fail_rate,flag}]};\n     shelf_check {code,w,batch,result ok|fail,note} -> {ok, people}. */\n  var reviewRows = [];\n  var reviewSel = {};\n  var reviewPhotos = {};\n  var spotOn = false;\n  var reviewReminder = null;\n  var reviewCanOwner = null;\n\n  /* Elio and Juan decide moves off another person's earlier shelf; the script says so (can_decide_owner). */\n  function canOwnerDecide() {\n    if (reviewCanOwner !== null) return reviewCanOwner;\n    return !!person && ['elio-test', 'juan'].indexOf(person.id) !== -1;\n  }\n\n  function ownerCodesOf(r) {\n    return Array.isArray(r.owner_codes) ? r.owner_codes : [];\n  }\n\n  /* a batch only holds items that wait for Elio/Juan: nothing for Stephanie to approve */\n  function rowBlocked(r) {\n    if (!r.needs_owner || canOwnerDecide()) return false;\n    var oc = ownerCodesOf(r);\n    return !oc.length || oc.length >= (r.codes || []).length;\n  }\n\n  function reviewReasons() {\n    return String(SH.reasons || '').split('|').map(function (x) {\n      var i = x.indexOf('=');\n      return i === -1 ? { k: x.trim(), label: x.trim() } : { k: x.slice(0, i).trim(), label: x.slice(i + 1).trim() };\n    }).filter(function (x) { return x.k; });\n  }\n\n  function reasonLabel(key) {\n    var hit = reviewReasons().filter(function (x) { return x.k === key; })[0];\n    return hit ? hit.label : String(key || '');\n  }\n\n  function loadShelfReview() {\n    var seq = ++shelfSeq;\n    shelfMsg(SH.loading);\n    call({ type: 'shelf_review', person: person.id }, function (reply) {\n      if (seq !== shelfSeq) return;\n      if (!reply || !reply.ok || !Array.isArray(reply.rows)) return shelfFailed(reply);\n      reviewRows = reply.rows.filter(function (r) { return r && r.id; });\n      reviewRows.forEach(function (r) { if (!r.shelf && r.shelf_code) r.shelf = r.shelf_code; });\n      reviewSel = {};\n      reviewCanOwner = typeof reply.can_decide_owner === 'boolean' ? reply.can_decide_owner : null;\n      var prog = Array.isArray(reply.progress) ? reply.progress.filter(function (p) { return p && p.person; }) : [];\n      var pl = shelfQ('[data-shelf-progress-list]');\n      pl.textContent = '';\n      prog.forEach(function (p) {\n        var li = el('li', 'azar-shelf__progrow');\n        li.appendChild(el('span', '', String(p.person) + (p.w ? ' \u00B7 ' + p.w : '')));\n        var parts = [(p.placed_today != null ? p.placed_today : 0) + ' / ' + (p.left != null ? p.left : '')];\n        if (p.approved != null) parts.push('\u2713 ' + p.approved);\n        if (p.rejected != null) parts.push('\u2715 ' + p.rejected);\n        li.appendChild(el('bdi', '', parts.join(' \u00B7 ')));\n        pl.appendChild(li);\n      });\n      pl.hidden = !prog.length;\n      /* what happened to approved batches in Wizard (after the 17:00 load) */\n      var loads = Array.isArray(reply.loads) ? reply.loads.filter(function (x) { return x && x.state; }) : [];\n      reviewRows.forEach(function (r) {\n        if (r.load && r.load.state && !loads.some(function (x) { return x.id && x.id === r.id; })) loads.push(Object.assign({ shelf: r.shelf, by: r.by, id: r.id }, r.load));\n      });\n      var ll = shelfQ('[data-shelf-loads]');\n      ll.textContent = '';\n      if (loads.length) ll.appendChild(el('li', 'azar-shelf__group', SH.loadsHead || ''));\n      loads.forEach(function (x) {\n        var li = el('li', 'azar-shelf__loadrow is-' + x.state);\n        var name = { loaded: SH.loadLoaded, held: SH.loadHeld, failed: SH.loadFailed, waiting: SH.loadWaiting }[x.state] || x.state;\n        var sh = el('bdi', '', String(x.shelf || ''));\n        sh.dir = 'ltr';\n        li.appendChild(sh);\n        li.appendChild(el('span', '', name + (x.reason ? ' \u00B7 ' + x.reason : '') + (x.at ? ' \u00B7 ' + x.at : '')));\n        ll.appendChild(li);\n      });\n      ll.hidden = !loads.length;\n      reviewReminder = reply.reminder && typeof reply.reminder === 'object' ? reply.reminder : reply.reminder ? { due: true } : null;\n      drawReview();\n    }, 45000);\n  }\n\n  function drawReview() {\n    var box = shelfQ('[data-shelf-review]');\n    var ol = shelfQ('[data-shelf-rows]');\n    ol.textContent = '';\n    ol.hidden = spotOn;\n    var shown = reviewRows.slice();\n    shown.sort(function (a, b) {\n      return String(a.shelf || '').localeCompare(String(b.shelf || '')) || String(b.at || '').localeCompare(String(a.at || ''));\n    });\n    shelfMsg(reviewRows.length || spotOn ? '' : SH.reviewEmpty);\n    var prog = !shelfQ('[data-shelf-progress-list]').hidden || !shelfQ('[data-shelf-loads]').hidden;\n    box.hidden = !reviewRows.length && !prog;\n    shelfQ('[data-shelf-reviewbar]').hidden = !reviewRows.length;\n    var wait = shelfQ('[data-shelf-waiting]');\n    var due = reviewReminder && reviewReminder.due != null ? !!reviewReminder.due : !!reviewReminder || new Date().getHours() >= 16;\n    wait.hidden = !reviewRows.length || !due || spotOn;\n    wait.textContent = (reviewReminder && reviewReminder.text) || (SH.waiting || '[n]').replace('[n]', (reviewReminder && reviewReminder.waiting) || reviewRows.length);\n    var sel = reviewRows.filter(function (r) { return reviewSel[r.id] && !rowBlocked(r); });\n    var bulk = shelfQ('[data-shelf-bulk]');\n    bulk.hidden = spotOn;\n    bulk.disabled = !sel.length;\n    bulk.textContent = (SH.bulk || 'Approve selected ([n])').replace('[n]', sel.length);\n    bulk.onclick = function () {\n      if (sel.length) approveMany(sel);\n    };\n    shelfQ('[data-shelf-selall]').hidden = spotOn;\n    shelfQ('[data-shelf-selall]').onclick = function () {\n      var every = shown.filter(function (r) { return !rowBlocked(r); });\n      var allOn = every.length && every.every(function (r) { return reviewSel[r.id]; });\n      every.forEach(function (r) { if (allOn) delete reviewSel[r.id]; else reviewSel[r.id] = true; });\n      drawReview();\n    };\n    var lastGroup = null;\n    shown.forEach(function (r) {\n      var g = String(r.shelf || '');\n      if (g !== lastGroup) {\n        lastGroup = g;\n        var n = shown.filter(function (x) { return String(x.shelf || '') === g; }).length;\n        var h = el('li', 'azar-shelf__group');\n        var hb = el('bdi', '', g + ' \u00B7 ' + n);\n        hb.dir = 'ltr';\n        h.appendChild(hb);\n        ol.appendChild(h);\n      }\n      ol.appendChild(reviewRow(r));\n    });\n  }\n\n  function dropReviewed(ids) {\n    reviewRows = reviewRows.filter(function (r) { return ids.indexOf(r.id) === -1; });\n    ids.forEach(function (id) { delete reviewSel[id]; });\n  }\n\n  /* several batches in one call (script v57: ids[]); the list is reloaded to show what really happened */\n  function approveMany(list) {\n    shelfMsg(SH.saving);\n    var seq = shelfSeq;\n    call({ type: 'shelf_decide', person: person.id, ids: list.map(function (r) { return r.id; }), decision: 'approve', note: '' }, function (reply) {\n      if (seq !== shelfSeq) return;\n      if (reply && reply.ok) {\n        loadShelfReview();\n        if (reply.held_for_owner) shelfMsg((SH.heldMsg || '[n]').replace('[n]', reply.held_for_owner));\n        return;\n      }\n      if (reply && reply.error === 'pin') return pinRefused();\n      shelfMsg(SH.saveFailed);\n    }, 60000);\n  }\n\n  function reviewPhotoInto(photoId, alt, li) {\n    if (!photoId) {\n      li.appendChild(el('p', 'azar-shelf__row-note', SH.noPhoto));\n      return;\n    }\n    var img = el('img', 'azar-shelf__row-photo');\n    img.alt = alt || '';\n    img.hidden = true;\n    var wait = el('p', 'azar-shelf__row-note', SH.loadingPhoto);\n    li.appendChild(wait);\n    li.appendChild(img);\n    function show(src) {\n      img.src = src;\n      img.hidden = false;\n      wait.remove();\n    }\n    if (reviewPhotos[photoId]) return show(reviewPhotos[photoId]);\n    var seq = shelfSeq;\n    /* the photo is not public: fetched through the script, for review users only */\n    call({ type: 'shelf_photo', person: person.id, id: photoId }, function (reply) {\n      if (seq !== shelfSeq) return;\n      if (reply && reply.ok && reply.data) {\n        reviewPhotos[photoId] = /^data:/.test(reply.data) ? reply.data : 'data:image/jpeg;base64,' + reply.data;\n        show(reviewPhotos[photoId]);\n      } else {\n        wait.textContent = SH.photoDrive;\n      }\n    }, 45000);\n  }\n\n  function reviewRow(r) {\n    var struck = r._struck || (r._struck = {});\n    var ownerCodes = ownerCodesOf(r);\n    var blocked = rowBlocked(r);\n    var li = el('li', 'azar-shelf__row' + ((r.moves || []).length || (r.conflicts || []).length ? ' has-moves' : '') + (r.needs_owner ? ' needs-owner' : ''));\n    var head = el('p', 'azar-shelf__row-head');\n    if (!blocked) {\n      var pick = el('input', 'azar-shelf__rowpick');\n      pick.type = 'checkbox';\n      pick.checked = !!reviewSel[r.id];\n      pick.setAttribute('aria-label', SH.selectRow || 'select');\n      pick.addEventListener('change', function () {\n        if (pick.checked) reviewSel[r.id] = true;\n        else delete reviewSel[r.id];\n        drawReviewBar();\n      });\n      head.appendChild(pick);\n    }\n    var sh = el('bdi', 'azar-shelf__row-shelf', r.shelf || '');\n    sh.dir = 'ltr';\n    head.appendChild(sh);\n    head.appendChild(el('span', 'azar-shelf__row-meta', (r.by || '') + (r.at ? ' \u00B7 ' + r.at : '')));\n    if (r.multi === 'multi' || r.multi === 'yes') head.appendChild(el('span', 'azar-shelf__badge', SH.multiBadge || 'multi'));\n    li.appendChild(head);\n    if (r.needs_owner) li.appendChild(el('p', 'azar-shelf__reused', canOwnerDecide() ? SH.needOwnerYou : SH.needOwner));\n    if (r.photo_reused) li.appendChild(el('p', 'azar-shelf__reused', (SH.photoReused || '[s]').replace('[s]', typeof r.photo_reused === 'string' ? r.photo_reused : r.photo_reused.shelf || '')));\n    reviewPhotoInto(r.photo_id, r.shelf, li);\n\n    /* the items: tap one to refuse just that item (the others are approved) */\n    var codes = el('p', 'azar-shelf__row-codes');\n    var decidable = (r.codes || []).filter(function (c) { return canOwnerDecide() || ownerCodes.indexOf(c) === -1; });\n    var many = decidable.length > 1;\n    (r.codes || []).forEach(function (c) {\n      var locked = !canOwnerDecide() && ownerCodes.indexOf(c) !== -1;\n      var b = el(many && !locked ? 'button' : 'bdi', 'azar-staff__scode' + (many && !locked ? ' azar-shelf__codebtn' : '') + (struck[c] ? ' is-struck' : '') + (locked ? ' is-owner' : ''), (locked ? '\uD83D\uDD12 ' : '') + c);\n      b.dir = 'ltr';\n      if (many && !locked) {\n        b.type = 'button';\n        b.addEventListener('click', function () {\n          if (struck[c]) delete struck[c];\n          else struck[c] = true;\n          b.classList.toggle('is-struck', !!struck[c]);\n          refresh();\n        });\n      }\n      codes.appendChild(b);\n      codes.appendChild(document.createTextNode(' '));\n    });\n    li.appendChild(codes);\n    if (many) li.appendChild(el('p', 'azar-shelf__row-note', SH.itemHint || ''));\n    if (ownerCodes.length && !canOwnerDecide()) li.appendChild(el('p', 'azar-shelf__row-note', SH.ownerWaits || ''));\n    if ((r.moves || []).length) {\n      var mv = el('ul', 'azar-shelf__row-moves');\n      mv.setAttribute('aria-label', SH.moves || '');\n      r.moves.forEach(function (m) {\n        var x = el('li');\n        var t = el('bdi', '', m.c + ': ' + m.from + ' \u2192 ' + (r.shelf || ''));\n        t.dir = 'ltr';\n        x.appendChild(t);\n        mv.appendChild(x);\n      });\n      li.appendChild(mv);\n    }\n    if ((r.conflicts || []).length) {\n      var cf = el('ul', 'azar-shelf__row-moves azar-shelf__row-conflicts');\n      cf.setAttribute('aria-label', SH.conflicts || '');\n      r.conflicts.forEach(function (m) {\n        var x = el('li');\n        x.appendChild(document.createTextNode((SH.conflicts || '') + ': '));\n        var t = el('bdi', '', m.c + ' \u2013 ' + m.other);\n        t.dir = 'ltr';\n        x.appendChild(t);\n        cf.appendChild(x);\n      });\n      li.appendChild(cf);\n    }\n\n    /* quick reasons: shown for a rejection and when single items are refused; the person sees the reason */\n    var reasons = el('div', 'azar-shelf__reasons');\n    reasons.hidden = true;\n    reasons.appendChild(el('p', 'azar-shelf__row-note', SH.reasonPick || ''));\n    var chosen = null;\n    var wantReject = false;\n    var rbtns = [];\n    reviewReasons().forEach(function (rs) {\n      var b = el('button', 'azar-shelf__reason', rs.label);\n      b.type = 'button';\n      b.addEventListener('click', function () {\n        chosen = rs;\n        rbtns.forEach(function (x) { x.classList.toggle('is-on', x === b); });\n        if (wantReject) go('reject');\n        else refresh();\n      });\n      rbtns.push(b);\n      reasons.appendChild(b);\n    });\n    li.appendChild(reasons);\n\n    var acts = el('p', 'azar-shelf__row-acts');\n    var approveBtn = el('button', 'azar-shelf__decide azar-shelf__decide--approve', SH.approve);\n    var rejectBtn = el('button', 'azar-shelf__decide azar-shelf__decide--reject', SH.reject);\n    approveBtn.type = 'button';\n    rejectBtn.type = 'button';\n    approveBtn.hidden = blocked;\n    acts.appendChild(approveBtn);\n    acts.appendChild(rejectBtn);\n    li.appendChild(acts);\n\n    function refresh() {\n      var refused = Object.keys(struck).length;\n      var total = decidable.length;\n      reasons.hidden = !(wantReject || refused);\n      approveBtn.textContent = refused && total ? (SH.approveN || SH.approve).replace('[n]', total - refused).replace('[t]', total) : SH.approve;\n      approveBtn.disabled = refused > 0 && !chosen;\n    }\n\n    function send(payload, done) {\n      call(payload, function (reply) {\n        if (reply && reply.ok) return done(reply);\n        if (reply && reply.error === 'pin') return pinRefused();\n        refresh();\n        rejectBtn.disabled = false;\n        shelfMsg(reply && reply.error === 'reason' ? SH.reasonPick : SH.saveFailed);\n      });\n    }\n\n    function go(decision) {\n      var refused = Object.keys(struck);\n      var base = { type: 'shelf_decide', person: person.id, id: r.id };\n      acts.querySelectorAll('button').forEach(function (x) { x.disabled = true; });\n      function finish(reply) {\n        dropReviewed([r.id]);\n        drawReview();\n        if (reply && reply.held_for_owner) shelfMsg((SH.heldMsg || '[n]').replace('[n]', reply.held_for_owner));\n      }\n      function reject(codesList) {\n        var p = Object.assign({}, base, { decision: 'reject', reason: chosen ? chosen.k : '', note: chosen ? chosen.label : '' });\n        if (codesList) p.codes = codesList;\n        return p;\n      }\n      if (decision === 'reject') return send(reject(null), finish);\n      if (!refused.length) return send(Object.assign({}, base, { decision: 'approve', note: '' }), finish);\n      /* some items refused: approve the rest, then reject those items with the reason */\n      var rest = decidable.filter(function (c) { return !struck[c]; });\n      if (!rest.length) return send(reject(refused), finish);\n      send(Object.assign({}, base, { decision: 'approve', codes: rest, note: '' }), function () {\n        send(reject(refused), finish);\n      });\n    }\n\n    approveBtn.addEventListener('click', function () { go('approve'); });\n    rejectBtn.addEventListener('click', function () {\n      if (!wantReject) {\n        wantReject = true;\n        refresh();\n        return;\n      }\n      if (chosen) go('reject');\n    });\n    refresh();\n    return li;\n  }\n\n  /* the bulk button follows the ticks without redrawing the rows */\n  function drawReviewBar() {\n    var sel = reviewRows.filter(function (x) { return reviewSel[x.id] && !rowBlocked(x); });\n    var bulk = shelfQ('[data-shelf-bulk]');\n    bulk.disabled = !sel.length;\n    bulk.textContent = (SH.bulk || '[n]').replace('[n]', sel.length);\n    bulk.onclick = function () { if (sel.length) approveMany(sel); };\n  }\n\n  /* ---------- Spot check (script v57: shelf_spot / shelf_check) ----------\n     A random handful of items already placed, with the photo: the checker says ok or wrong. The\n     script keeps a fail rate per person and flags it. */\n  function drawSpotPeople(people) {\n    var ul = shelfQ('[data-shelf-spotpeople]');\n    ul.textContent = '';\n    (Array.isArray(people) ? people : []).forEach(function (p) {\n      if (!p || !p.person) return;\n      var li = el('li', 'azar-shelf__progrow' + (p.flag ? ' is-flag' : ''));\n      li.appendChild(el('span', '', (p.flag ? '\u26A0 ' : '') + String(p.person)));\n      var rate = p.fail_rate != null ? ' \u00B7 ' + (p.fail_rate <= 1 ? Math.round(p.fail_rate * 100) : Math.round(p.fail_rate)) + '%' : '';\n      li.appendChild(el('bdi', '', (p.checked != null ? p.checked : 0) + ' / \u2715 ' + (p.failed != null ? p.failed : 0) + rate));\n      ul.appendChild(li);\n    });\n    ul.hidden = !ul.children.length;\n  }\n\n  function loadSpot() {\n    var box = shelfQ('[data-shelf-spotbox]');\n    var ol = shelfQ('[data-shelf-spotrows]');\n    ol.textContent = '';\n    box.hidden = false;\n    shelfMsg(SH.loading);\n    var seq = shelfSeq;\n    call({ type: 'shelf_spot', person: person.id }, function (reply) {\n      if (seq !== shelfSeq || !spotOn) return;\n      if (!reply || !reply.ok || !Array.isArray(reply.rows)) return shelfFailed(reply);\n      shelfMsg(reply.rows.length ? '' : SH.spotEmpty);\n      drawSpotPeople(reply.people);\n      reply.rows.forEach(function (r) {\n        if (!r || !r.code) return;\n        var li = el('li', 'azar-shelf__row');\n        var head = el('p', 'azar-shelf__row-head');\n        var code = el('bdi', 'azar-staff__scode', String(r.code));\n        code.dir = 'ltr';\n        head.appendChild(code);\n        var sh = el('bdi', 'azar-shelf__row-shelf', String(r.shelf || ''));\n        sh.dir = 'ltr';\n        head.appendChild(sh);\n        head.appendChild(el('span', 'azar-shelf__row-meta', [r.by, r.at, r.place].filter(Boolean).join(' \u00B7 ')));\n        li.appendChild(head);\n        if (r.name) li.appendChild(el('p', 'azar-shelf__row-note', String(r.name)));\n        reviewPhotoInto(r.photo_id, r.shelf, li);\n        var note = el('input', 'azar-shelf__input azar-shelf__spotnote');\n        note.type = 'text';\n        note.placeholder = SH.spotNote || '';\n        li.appendChild(note);\n        var acts = el('p', 'azar-shelf__row-acts');\n        [['ok', SH.spotOk, 'approve'], ['fail', SH.spotFail, 'reject']].forEach(function (d) {\n          var b = el('button', 'azar-shelf__decide azar-shelf__decide--' + d[2], d[1]);\n          b.type = 'button';\n          b.addEventListener('click', function () {\n            acts.querySelectorAll('button').forEach(function (x) { x.disabled = true; });\n            call({ type: 'shelf_check', person: person.id, code: r.code, w: r.w, batch: r.batch, result: d[0], note: note.value.trim() }, function (res) {\n              if (res && res.ok) {\n                li.remove();\n                drawSpotPeople(res.people);\n                if (!ol.children.length) shelfMsg(SH.spotDone);\n                return;\n              }\n              if (res && res.error === 'pin') return pinRefused();\n              acts.querySelectorAll('button').forEach(function (x) { x.disabled = false; });\n              shelfMsg(SH.saveFailed);\n            });\n          });\n          acts.appendChild(b);\n        });\n        li.appendChild(acts);\n        ol.appendChild(li);\n      });\n    }, 45000);\n  }\n\n  if (shelvesPanel) {\n    var shelfIn = shelfQ('[data-shelf-q]');\n    var shelfIn2 = shelfQ('[data-shelf-s]');\n    var shelfSugg = shelfQ('[data-shelf-sugg]');\n    var shelfSugg2 = shelfQ('[data-shelf-ssugg]');\n    shelfIn.addEventListener('input', function () {\n      drawItems();\n    });\n    shelfQ('[data-shelf-multi]').addEventListener('change', function (e) {\n      shelfMulti = e.target.checked;\n      shelfPick = {};\n      shelfSugg.hidden = true;\n      if (shelfIn.value.trim()) drawItems();\n      shelfIn.focus();\n    });\n    document.addEventListener('pointerdown', function (e) {\n      if (!shelfMulti || shelfSugg.hidden || shelfSugg.parentNode.contains(e.target)) return;\n      shelfSugg.hidden = true;\n      shelfIn.setAttribute('aria-expanded', 'false');\n    });\n    shelfQ('[data-shelf-hidedone]').addEventListener('change', function (e) {\n      hideDone = e.target.checked;\n      if (shelfIn.value.trim()) drawItems();\n    });\n    shelfQ('[data-shelf-spot]').addEventListener('change', function (e) {\n      spotOn = e.target.checked;\n      shelfQ('[data-shelf-spotbox]').hidden = !spotOn;\n      drawReview();\n      if (spotOn) loadSpot();\n    });\n    shelfQ('[data-shelf-undo]').addEventListener('click', undoLast);\n    shelfQ('[data-shelf-scan]').addEventListener('click', startScan);\n    shelfQ('[data-shelf-scanclose]').addEventListener('click', stopScan);\n    shelfQ('[data-shelf-again]').addEventListener('click', function () {\n      if (!lastShelf) return;\n      shelfIn2.value = lastShelf;\n      shelfAisleChips('');\n      renderShelfForm();\n    });\n    shelfQ('[data-shelf-clear]').addEventListener('click', function () {\n      shelfChips = [];\n      shelfFamilyUsed = false;\n      shelfQ('[data-shelf-done]').hidden = true;\n      renderShelfForm();\n    });\n    shelfIn.addEventListener('keydown', function (e) {\n      if (e.key !== 'Enter' || shelfMulti) return;\n      e.preventDefault();\n      var first = itemByCode(shelfIn.value.trim()) || findItems(shelfIn.value)[0];\n      if (first) addChip(first.c);\n    });\n    shelfIn.addEventListener('blur', function () {\n      if (shelfMulti) return; /* closed by a tap outside, see below */\n      shelfSugg.hidden = true;\n      shelfIn.setAttribute('aria-expanded', 'false');\n    });\n    shelfIn2.addEventListener('input', function () {\n      var v = shelfIn2.value.trim().toUpperCase();\n      shelfSideHint(v);\n      shelfAisleChips(v);\n      var list = v ? shelfCodes.filter(function (c) { return c.indexOf(v) === 0; }).slice(0, SHELF_MAX) : [];\n      if (list.length === 1 && list[0] === v) list = [];\n      suggest(shelfSugg2, shelfIn2, list, function (li, c) {\n        var b = el('bdi', 'azar-shelf__opt-code', c);\n        b.dir = 'ltr';\n        li.appendChild(b);\n        if (photoShelves[c]) li.appendChild(el('span', 'azar-shelf__opt-cam', '\uD83D\uDCF7'));\n      }, function (c) {\n        shelfIn2.value = c;\n        shelfSugg2.hidden = true;\n        shelfIn2.setAttribute('aria-expanded', 'false');\n        shelfIn2.blur();\n        renderShelfForm();\n      }, !shelfValid(v));\n      renderShelfForm();\n    });\n    shelfIn2.addEventListener('blur', function () {\n      shelfSugg2.hidden = true;\n      shelfIn2.setAttribute('aria-expanded', 'false');\n      shelfIn2.value = shelfIn2.value.trim().toUpperCase();\n      renderShelfForm();\n    });\n    shelfQ('[data-shelf-move-ok]').addEventListener('change', renderShelfForm);\n    shelfQ('[data-shelf-photo]').addEventListener('change', function (e) {\n      var f = e.target.files && e.target.files[0];\n      if (!f) return;\n      shrinkPhoto(f, function (data, hash) {\n        shelfPhoto = data;\n        shelfPhotoHash = hash || '';\n        renderShelfForm();\n      });\n    });\n    shelfQ('[data-shelf-save]').addEventListener('click', saveShelf);\n  }\n\n  /* ---------- Demo of the location page: /pages/staff?demo=shelves ----------\n     Invented items and shelves, answered here in the browser. Nothing is read from or sent to\n     the Sheet script and nobody signs in, so screenshots for the Arabic guide need no PIN. */\n  function demoCall(payload, done) {\n    var type = payload && payload.type;\n    var reply = { ok: false, error: 'demo' };\n    if (type === 'shelf_items') {\n      var tools = /[?&]place=tools(&|$)/.test(location.search); /* ?demo=shelves&place=tools shows a Tools (9) user */\n      var names = [\n        ['AUR-FL-50W', '\u0643\u0634\u0627\u0641 LED 50 \u0648\u0627\u0637 \u062E\u0627\u0631\u062C\u064A', 'AUR-FL', '', 12],\n        ['AUR-FL-100W', '\u0643\u0634\u0627\u0641 LED 100 \u0648\u0627\u0637 \u062E\u0627\u0631\u062C\u064A', 'AUR-FL', 'SR-A02', 7],\n        ['AUR-FL-200W', '\u0643\u0634\u0627\u0641 LED 200 \u0648\u0627\u0637 \u062E\u0627\u0631\u062C\u064A', 'AUR-FL', 'SR-A02', 3],\n        ['AUR-LAN-01', '\u0641\u0627\u0646\u0648\u0633 \u062D\u062F\u064A\u0642\u0629 \u0643\u0644\u0627\u0633\u064A\u0643', 'AUR-LAN', '', 9],\n        ['AUR-LAN-02', '\u0641\u0627\u0646\u0648\u0633 \u062D\u062F\u064A\u0642\u0629 \u0623\u0633\u0648\u062F', 'AUR-LAN', 'SR-B01', 5],\n        ['COSLI230702', '\u0637\u0642\u0645 \u0645\u0641\u0643\u0627\u062A 32 \u0642\u0637\u0639\u0629 INGCO', 'INGCO-SET', 'SR-C03', 14],\n        ['HPWR20018', '\u0645\u062B\u0642\u0627\u0628 \u0643\u0647\u0631\u0628\u0627\u0626\u064A 20 \u0641\u0648\u0644\u062A INGCO', 'INGCO-DRILL', '', 4],\n        ['HPWR16008', '\u0645\u062B\u0642\u0627\u0628 \u0643\u0647\u0631\u0628\u0627\u0626\u064A 16 \u0641\u0648\u0644\u062A INGCO', 'INGCO-DRILL', 'SR-C01', 6],\n        ['CKLI2059', '\u0635\u0646\u062F\u0648\u0642 \u0639\u062F\u0629 59 \u0642\u0637\u0639\u0629', 'INGCO-BOX', 'SR-C02', 8],\n        ['WAD-PL-10', '\u0643\u0645\u0627\u0634\u0629 10 \u0625\u0646\u0634 WADFOW', 'WAD-PL', '', 20],\n        ['WAD-PL-8', '\u0643\u0645\u0627\u0634\u0629 8 \u0625\u0646\u0634 WADFOW', 'WAD-PL', 'SR-D01', 11],\n        ['EUR-PIPE-20', '\u0645\u0627\u0633\u0648\u0631\u0629 PVC 20 \u0645\u0645', 'EUR-PIPE', '', 40]\n      ];\n      reply = {\n        ok: true,\n        items: names.map(function (x) { return { c: x[0], n: x[1], f: x[2], s: x[3], q: x[4] }; }),\n        shelves: ['SR-A01', 'SR-A02', 'SR-A03', 'SR-B01', 'SR-B02', 'SR-C01', 'SR-C02', 'SR-C03', 'SR-D01', 'SR-D02'],\n        photo_shelves: ['SR-A02', 'SR-C01'],\n        location: { code: '7', ar: '\u0627\u0644\u0645\u0639\u0631\u0636', en: 'Show Room' },\n        progress: { placed: 3, left: 8, goal: 11 },\n        rejected: [{ batch: 'b0', shelf: 'SR-B02', codes: ['CKLI2059'], reason: 'photo_unclear', note: '', at: '09:50' }]\n      };\n      reply.items[10].pd = { by: 'Rachid', at: '09:12' };\n      reply.items[2].b = '5901234123457,6291041500213';\n      if (tools) {\n        reply.shelves = reply.shelves.map(function (c) { return c.replace('SR-', 'TW-'); });\n        reply.photo_shelves = reply.photo_shelves.map(function (c) { return c.replace('SR-', 'TW-'); });\n        reply.items.forEach(function (it) { it.s = it.s.replace('SR-', 'TW-'); });\n        reply.location = { code: '9', ar: '\u0627\u0644\u0623\u062F\u0648\u0627\u062A', en: 'Tools' };\n      }\n    } else if (type === 'shelf_save') {\n      reply = { ok: true, saved: (payload.codes || []).length, status: 'test', id: 'demo-batch' };\n      if (payload.photo_hash) reply.photo_reused = { shelf: 'SR-A01', by: 'Rachid', at: '09:40' };\n    } else if (type === 'shelf_undo') {\n      reply = { ok: true, restored: 3 };\n    } else if (type === 'shelf_review') {\n      var mk = function (id, shelf, by, at, codes, extra) {\n        return Object.assign({ id: id, shelf: shelf, by: by, at: at, codes: codes, photo_id: 'p-' + id }, extra || {});\n      };\n      reply = {\n        ok: true,\n        reminder: { waiting: 9, due: true, text: '\u0628\u0627\u0646\u062A\u0638\u0627\u0631 \u0645\u0648\u0627\u0641\u0642\u062A\u0643: 9 \u062F\u0641\u0639\u0629 \u00B7 \u0623\u0642\u062F\u0645\u0647\u0627 \u0645\u0646\u0630 09:12' },\n        can_decide_owner: /[?&]owner=1(&|$)/.test(location.search),\n        rows: [\n          mk('a1', 'SR-A02', 'Rachid', '09:12', ['AUR-FL-100W', 'AUR-FL-200W', 'AUR-FL-50W'], { moves: [{ c: 'AUR-FL-100W', from: 'SR-B01' }], needs_owner: true, owner_codes: ['AUR-FL-100W'] }),\n          mk('a2', 'SR-C01', 'Sami', '09:40', ['COSLI230702', 'HPWR20018', 'HPWR16008', 'CKLI2059'], { multi: 'multi' }),\n          mk('a3', 'SR-C02', 'Alain', '10:05', ['WAD-PL-10', 'WAD-PL-8'], { photo_reused: 'SR-A01' }),\n          mk('a4', 'SR-D01', 'Mohammad', '10:30', ['EUR-PIPE-20']),\n          mk('a5', 'SR-D02', 'Bilal', '10:41', ['AUR-LAN-01', 'AUR-LAN-02']),\n          mk('a6', 'SR-A03', 'Christelle', '11:02', ['AUR-FL-50W']),\n          mk('a7', 'SR-B02', 'Rachid', '11:20', ['CKLI2059']),\n          mk('a8', 'SR-B01', 'Sami', '11:45', ['HPWR16008', 'HPWR20018']),\n          mk('a9', 'SR-A01', 'Alain', '12:03', ['WAD-PL-8'])\n        ],\n        progress: [\n          { person: 'Rachid', w: '7', placed_today: 42, approved: 30, rejected: 2, left: 18 },\n          { person: 'Sami', w: '7', placed_today: 35, approved: 28, rejected: 0, left: 25 },\n          { person: 'Alain', w: '7', placed_today: 20, approved: 12, rejected: 1, left: 40 }\n        ],\n        loads: [\n          { id: 'z1', shelf: 'SR-A01', state: 'loaded', at: '17:03' },\n          { id: 'z2', shelf: 'SR-B02', state: 'held', reason: '\u0628\u0627\u0646\u062A\u0638\u0627\u0631 \u0645\u0648\u0627\u0641\u0642\u0629 \u0625\u064A\u0644\u064A\u0648', at: '17:03' },\n          { id: 'z3', shelf: 'SR-D01', state: 'failed', reason: '\u0631\u0645\u0632 \u063A\u064A\u0631 \u0645\u0648\u062C\u0648\u062F \u0641\u064A Wizard', at: '17:03' }\n        ]\n      };\n    } else if (type === 'shelf_spot') {\n      reply = {\n        ok: true,\n        rows: [\n          { code: 'AUR-FL-100W', name: '\u0643\u0634\u0627\u0641 LED 100 \u0648\u0627\u0637 \u062E\u0627\u0631\u062C\u064A', shelf: 'SR-A02', w: '7', place: 'Show Room', by: 'Rachid', at: '09:12', batch: 'a1', photo_id: 'p-a1' },\n          { code: 'WAD-PL-10', name: '\u0643\u0645\u0627\u0634\u0629 10 \u0625\u0646\u0634 WADFOW', shelf: 'SR-C02', w: '7', place: 'Show Room', by: 'Alain', at: '10:05', batch: 'a3', photo_id: 'p-a3' },\n          { code: 'EUR-PIPE-20', name: '\u0645\u0627\u0633\u0648\u0631\u0629 PVC 20 \u0645\u0645', shelf: 'SR-D01', w: '7', place: 'Show Room', by: 'Mohammad', at: '10:30', batch: 'a4', photo_id: 'p-a4' }\n        ],\n        people: [\n          { person: 'Rachid', checked: 10, failed: 1, fail_rate: 0.1, flag: false },\n          { person: 'Alain', checked: 8, failed: 3, fail_rate: 0.375, flag: true }\n        ]\n      };\n    } else if (type === 'shelf_check') {\n      reply = { ok: true, people: [{ person: 'Rachid', checked: 11, failed: payload.result === 'fail' ? 2 : 1, fail_rate: 0.1, flag: false }] };\n    } else if (type === 'shelf_decide') {\n      reply = { ok: true, decided: (payload.ids || [payload.id]).length, held_for_owner: 0 };\n    } else if (type === 'shelf_photo') {\n      var cv = document.createElement('canvas');\n      cv.width = 360;\n      cv.height = 240;\n      var cx = cv.getContext('2d');\n      var gr = cx.createLinearGradient(0, 0, 360, 240);\n      gr.addColorStop(0, '#42506b');\n      gr.addColorStop(1, '#a9b6cf');\n      cx.fillStyle = gr;\n      cx.fillRect(0, 0, 360, 240);\n      cx.fillStyle = '#fff';\n      cx.font = '28px sans-serif';\n      cx.fillText('shelf photo (demo)', 70, 125);\n      reply = { ok: true, data: cv.toDataURL('image/jpeg', 0.7) };\n    }\n    setTimeout(function () { done(reply); }, 150);\n  }\n\n  if (DEMO && shelvesPanel) {\n    person = { id: 'demo', name: '\u0639\u0631\u0636 \u062A\u062C\u0631\u064A\u0628\u064A \u00B7 Demo' };\n    root.classList.add('azar-staff--demo');\n    picker.hidden = true;\n    bar.hidden = false;\n    work.hidden = false;\n    whoLabel.textContent = person.name;\n    root.querySelectorAll('[data-staff-panel]').forEach(function (p) { p.hidden = true; });\n    var demoTabs = root.querySelector('[data-staff-tabs]');\n    if (demoTabs) demoTabs.hidden = true;\n    var demoNote = el('p', 'azar-staff__calm azar-shelf__demo', SH.demo || 'Demo \u2013 sample data');\n    shelvesPanel.insertBefore(demoNote, shelvesPanel.firstChild);\n    if (DEMO_REVIEW) {\n      if (/[?&]owner=1(&|$)/.test(location.search)) person = { id: 'elio-test', name: '\u0639\u0631\u0636 \u062A\u062C\u0631\u064A\u0628\u064A \u00B7 Demo (owner)' };\n      setShelfAccess({ shelves_review: true });\n    } else {\n      setShelfAccess({ shelves: true });\n    }\n    shelvesPanel.hidden = false;\n    openShelves();\n  }\n\n  /* ---------- Spark: product of the day (Elio 26/10/2026) ----------\n     reply.spark = {date, product_of_day: {name, code, price_usd, where,\n     points_ar[], points_en[], handle}} from the Sheet script (Team chat).\n     Shown only on its own date; Arabic first, English on request. */\n  function renderSpark(spark) {\n    if (!sparkBox) return;\n    var body = sparkBox.querySelector('[data-staff-spark-body]');\n    var p = spark && spark.product_of_day;\n    body.textContent = '';\n    sparkBox.hidden = true;\n    if (!p || !p.name || String(spark.date || '') !== today()) return;\n    var d = sparkBox.dataset;\n    body.appendChild(el('h3', 'azar-staff__spark-name', p.name));\n    var meta = el('p', 'azar-staff__spark-meta');\n    if (p.code) {\n      var code = el('bdi', 'azar-staff__scode', p.code);\n      code.dir = 'ltr';\n      meta.appendChild(code);\n    }\n    var price = parseFloat(p.price_usd);\n    if (price > 0) {\n      var pr = el('bdi', 'azar-staff__spark-price', '$' + price.toFixed(2));\n      pr.dir = 'ltr';\n      meta.appendChild(pr);\n    }\n    if (meta.childNodes.length) body.appendChild(meta);\n    if (p.where) body.appendChild(el('p', 'azar-staff__spark-where', p.where));\n    function points(list) {\n      return (Array.isArray(list) ? list : []).filter(function (t) { return t && String(t).trim(); }).slice(0, 3);\n    }\n    var ar = points(p.points_ar);\n    var en = points(p.points_en);\n    var ul = el('ul', 'azar-staff__spark-points');\n    function fill(list, lang) {\n      ul.textContent = '';\n      ul.lang = lang;\n      ul.dir = lang === 'en' ? 'ltr' : 'rtl';\n      list.forEach(function (t) { ul.appendChild(el('li', '', t)); });\n    }\n    fill(ar.length ? ar : en, ar.length ? 'ar' : 'en');\n    if (ul.childNodes.length) body.appendChild(ul);\n    var foot = el('p', 'azar-staff__spark-foot');\n    if (ar.length && en.length) {\n      var btn = el('button', 'azar-staff__spark-lang', d.en || 'English');\n      btn.type = 'button';\n      btn.addEventListener('click', function () {\n        var toEn = ul.lang !== 'en';\n        fill(toEn ? en : ar, toEn ? 'en' : 'ar');\n        btn.textContent = toEn ? d.ar || '\u0639\u0631\u0628\u064A' : d.en || 'English';\n      });\n      foot.appendChild(btn);\n    }\n    if (p.handle && /^[a-z0-9-]+$/i.test(p.handle)) {\n      var a = el('a', 'azar-staff__spark-link', d.web || '\u0639\u0631\u0636 \u0639\u0644\u0649 \u0627\u0644\u0645\u0648\u0642\u0639');\n      a.href = '/products/' + p.handle;\n      a.target = '_blank';\n      a.rel = 'noopener';\n      foot.appendChild(a);\n    }\n    if (foot.childNodes.length) body.appendChild(foot);\n    sparkBox.hidden = false;\n  }\n\n  /* ---------- Desk staff: weekly tasks from the Sheet script ----------\n     Only after the PIN check, only the signed-in person's own tasks, kept in\n     memory (never in the page source or on the phone). Shape in\n     staff-page-tabs\\DESK_TASKS_SPEC.md. Without them, a placeholder. */\n  function showDeskSoon() {\n    var desk = !!person && person.role === 'desk';\n    var has = !!(deskTasks && deskTasks.length);\n    if (deskSoon) deskSoon.hidden = !desk || has;\n    if (deskBox) deskBox.hidden = !desk || !has;\n  }\n\n  function renderDesk(reply) {\n    if (!deskBox) return;\n    if (reply && Array.isArray(reply.desk_tasks)) {\n      deskTasks = reply.desk_tasks.filter(function (t) {\n        return t && (t.title_ar || t.title_en);\n      });\n      deskUpdated = String(reply.desk_tasks_updated || '');\n    }\n    deskBox.textContent = '';\n    if (person && person.role === 'desk' && deskTasks && deskTasks.length) {\n      var d = deskBox.dataset;\n      deskTasks.forEach(function (t) {\n        var card = el('article', 'azar-staff__dtask');\n        var head = el('div', 'azar-staff__dtask-head');\n        head.appendChild(el('h3', 'azar-staff__dtask-title', t.title_ar || t.title_en));\n        var doing = /progress/i.test(t.status || '');\n        if (t.status) head.appendChild(el('span', 'azar-staff__chip' + (doing ? ' azar-staff__chip--doing' : ''), doing ? d.doing || t.status : d.todo || t.status));\n        card.appendChild(head);\n        var details = t.details_ar || t.details_en;\n        if (details) card.appendChild(el('p', 'azar-staff__dtask-text', details));\n        var meta = el('p', 'azar-staff__dtask-meta');\n        if (t.due) {\n          meta.appendChild(el('span', '', (d.due || '\u0627\u0644\u0645\u0648\u0639\u062F') + ': '));\n          var due = el('bdi', '', t.due);\n          due.dir = 'ltr';\n          meta.appendChild(due);\n        }\n        if (meta.childNodes.length) card.appendChild(meta);\n        if (t.file) {\n          var f = el('p', 'azar-staff__dtask-file');\n          f.appendChild(el('span', '', (d.inFile || '\u0641\u064A \u0645\u0644\u0641\u0643') + ': '));\n          var fn = el('bdi', '', t.file + (t.sheet ? ' \u2190 ' + t.sheet : ''));\n          f.appendChild(fn);\n          card.appendChild(f);\n        }\n        var rows = (t.open_rows || []).filter(function (r) {\n          return r && (r.line_ar || r.line_en);\n        }).slice(0, 15);\n        if (rows.length) {\n          var det = el('details', 'azar-staff__dtask-rows');\n          det.appendChild(el('summary', '', (d.rows || '\u0627\u0644\u0623\u0633\u0637\u0631 \u0627\u0644\u0645\u0641\u062A\u0648\u062D\u0629 ([n])').replace('[n]', rows.length)));\n          var ul = el('ul');\n          rows.forEach(function (r) {\n            var li = el('li');\n            if (r.key) {\n              var k = el('bdi', 'azar-staff__scode', r.key);\n              k.dir = 'ltr';\n              li.appendChild(k);\n              li.appendChild(document.createTextNode(' '));\n            }\n            li.appendChild(el('bdi', '', r.line_ar || r.line_en));\n            ul.appendChild(li);\n          });\n          det.appendChild(ul);\n          card.appendChild(det);\n        }\n        deskBox.appendChild(card);\n      });\n      if (deskUpdated) deskBox.appendChild(el('p', 'azar-staff__dtask-updated', (d.updated || '\u0622\u062E\u0631 \u062A\u062D\u062F\u064A\u062B') + ': ' + deskUpdated));\n    }\n    showDeskSoon();\n  }\n\n  /* Theme editor: a re-rendered News/Info section lands back in its own place. */\n  document.addEventListener('shopify:section:load', function () {\n    mountBoards();\n    if (person) {\n      refreshNotices();\n      loadContainers();\n    }\n  });\n\n  /* ---------- Attendance \u2013 \u0627\u0644\u062F\u0648\u0627\u0645 (Elio 31/10/2026) ----------\n     \"a sheet that an employee would sign, mention which time he got in and got out ...\n     how can we verify that they ticked that they arrived at 8 while in fact they arrived\n     at 8:30\". Proof since 31/10 (Elio: \"disable the location and the selfie, make the\n     staff scan the QR code\"): a QR on the entrance screen that changes every 30 seconds.\n     The sign-in reply carries attendance = {today: {date, in: {at, flags} | null,\n     out: {at} | null, status, day}, month: [...], start, need_qr} (Team). The phone\n     never sends a time: the script stamps it and the page shows the time it hands back.\n     When the screen is off, the time can still be recorded without the QR; the script\n     flags it for Stephanie. Nothing is kept on the phone. */\n  var attBox = root.querySelector('[data-staff-att]');\n  var attTabBtn = root.querySelector('[data-staff-att-tab]');\n  var AT = attBox ? attBox.dataset : {};\n  var attData = null;\n  var attBusy = false;\n  var attStream = null;\n  var attScanning = null;  /* the running scan, so Cancel and sign-out can stop it */\n  var attPendingQr = null; /* {token, at}: the QR the phone's own camera opened the page with */\n\n  function attQ(sel) {\n    return attBox.querySelector(sel);\n  }\n\n  function setAttendance(reply) {\n    if (!attBox || !reply) return;\n    var a = reply.attendance;\n    attData = a && typeof a === 'object' ? a : null;\n    attBox.hidden = !attData;\n    if (attTabBtn) attTabBtn.hidden = !attData;\n    if (attData) renderAtt();\n    if (!attData && currentTab === 'myatt') showTab('taskhub');\n    /* opened from the entrance QR with the phone's camera: straight to this tab */\n    if (attData && attQrReady() && currentTab !== 'myatt') {\n      tabChosen = true;\n      showTab('myatt');\n    }\n    tabColumns();\n  }\n\n  function clearAtt() {\n    attData = null;\n    attBusy = false;\n    attPendingQr = null;\n    attStopCamera();\n    if (attTabBtn) attTabBtn.hidden = true;\n    var ab0 = root.querySelector('[data-att-badge]');\n    if (ab0) ab0.hidden = true;\n    if (!attBox) return;\n    attBox.hidden = true;\n    attQ('[data-att-noqr]').hidden = true;\n    attMsg('');\n  }\n\n  function attMsg(text, bad) {\n    var m = attQ('[data-att-msg]');\n    m.textContent = text || '';\n    m.classList.toggle('is-bad', !!bad);\n    m.hidden = !text;\n  }\n\n  function attFlagText(f) {\n    var map = {\n      late: AT.fLate, no_out: AT.fNoOut, no_in: AT.fNoIn, no_check_in: AT.fNoCheckIn,\n      no_qr: AT.fNoQr, out_no_qr: AT.fOutNoQr, qr_kiosk_down: AT.fKioskDown, out_qr_kiosk_down: AT.fOutKioskDown,\n      wizard_gap: AT.fWizard, wizard_no_check_in: AT.fWizardNoCheckIn,\n      no_paper: AT.fNoPaper, paper_no_qr: AT.fPaperNoQr,\n      extra_in: AT.fExtraIn, extra_out: AT.fExtraOut, in_after_out: AT.fInAfterOut,\n      absent: AT.fAbsent, edited: AT.fEdited\n    };\n    return map[f] || f;\n  }\n\n  /* A QR scanned with the phone's own camera app is good for about a minute. */\n  function attQrReady() {\n    return attPendingQr && Date.now() - attPendingQr.at < 60000 ? attPendingQr.token : '';\n  }\n\n  function renderAtt() {\n    if (!attBox || !attData) return;\n    var t = attData.today || {};\n    var inBtn = attQ('[data-att-in]');\n    var outBtn = attQ('[data-att-out]');\n    function stamp(btn, label, done, at) {\n      btn.textContent = '';\n      btn.appendChild(el('span', 'azar-att__blab', label));\n      if (done) btn.appendChild(teamLtr(at || ''));\n      btn.classList.toggle('is-done', done);\n      /* always available, in any order and again after a stamp (Elio 31/10/2026: \"The\n         check in and check out should always be available for the team\"); the script\n         flags anything unusual for Stephanie */\n      btn.disabled = attBusy;\n    }\n    stamp(inBtn, t.in ? AT.arrived : AT.arrive, !!t.in, t.in && t.in.at);\n    stamp(outBtn, t.out ? AT.left : AT.leave, !!t.out, t.out && t.out.at);\n    /* \"I left\" works without a check-in the same day (the script flags it no_in): on\n       the first day attendance started at 14:00, when everyone was leaving */\n    attQ('.azar-att__btns').hidden = !!attData.notStarted || viewAs;\n    var ab = root.querySelector('[data-att-badge]');\n    if (ab) {\n      ab.textContent = '1';\n      ab.hidden = !!attData.notStarted || viewAs || !!t.in;\n    }\n    attQ('[data-att-qrready]').hidden = !attQrReady() || !!attData.notStarted;\n    var flags = attQ('[data-att-flags]');\n    flags.textContent = '';\n    ((t.in && t.in.flags) || []).forEach(function (f) {\n      flags.appendChild(el('span', 'azar-att__flag is-' + f, attFlagText(f)));\n    });\n    flags.hidden = !flags.childNodes.length;\n    var start = attQ('[data-att-start]');\n    start.textContent = '';\n    if (attData.start) {\n      start.appendChild(document.createTextNode(AT.start + ' '));\n      start.appendChild(teamLtr(attData.start));\n    }\n    start.hidden = !attData.start;\n    /* no month history on the card (Elio 31/10/2026: \"remove for all staff the\n       \\\"\u062F\u0648\u0627\u0645\u064A \u0647\u0630\u0627 \u0627\u0644\u0634\u0647\u0631 \u00B7 My month\\\"\") */\n  }\n\n  /* One copy of each library, loaded the first time it is needed (theme assets,\n     added with Elio's OK 31/10/2026: jsQR 1.4.0, qrcode-generator 1.4.4). */\n  var libWaits = {};\n  function loadLib(src, ready, done) {\n    if (ready()) return done(true);\n    if (!src) return done(false);\n    if (libWaits[src]) return libWaits[src].push(done);\n    libWaits[src] = [done];\n    var s = document.createElement('script');\n    s.src = src;\n    s.async = true;\n    function end() {\n      var ok = !!ready();\n      var waiting = libWaits[src];\n      if (!ok) delete libWaits[src];\n      waiting.forEach(function (fn) { fn(ok); });\n      if (ok) libWaits[src] = { push: function (fn) { fn(true); } };\n    }\n    s.onload = end;\n    s.onerror = end;\n    document.head.appendChild(s);\n  }\n\n  /* The token in a scanned QR: the entrance screen shows a staff-page link with ?qr=. */\n  function qrToken(text) {\n    var s = String(text || '').trim();\n    var m = /[?&]qr=([^&#\\s]+)/.exec(s);\n    if (m) {\n      try {\n        return decodeURIComponent(m[1]);\n      } catch (e) {\n        return m[1];\n      }\n    }\n    return /^AZQ\\d+\\.[A-Za-z0-9._-]+$/.test(s) ? s : '';\n  }\n\n  function attStopCamera() {\n    if (attScanning) {\n      clearTimeout(attScanning.timer);\n      attScanning.stopped = true;\n      attScanning = null;\n    }\n    if (attStream) {\n      attStream.getTracks().forEach(function (t) { t.stop(); });\n      attStream = null;\n    }\n    if (!attBox) return;\n    attQ('[data-att-cam]').hidden = true;\n    attQ('[data-att-video]').srcObject = null;\n  }\n\n  /* Scan the entrance QR with the back camera, inside the card.\n     done(token) on a good scan, or done('', why): 'cancel', 'screen' (the person says\n     the entrance screen is not working), 'nocam' (no camera or not allowed). */\n  function attScan(done) {\n    attStopCamera();\n    var cam = attQ('[data-att-cam]');\n    var video = attQ('[data-att-video]');\n    var hint = attQ('[data-att-hint]');\n    var run = { stopped: false, timer: 0 };\n    attScanning = run;\n    var finished = false;\n    function finish(token, why) {\n      if (finished) return;\n      finished = true;\n      attStopCamera();\n      attQ('[data-att-cancel]').onclick = attQ('[data-att-screen]').onclick = null;\n      done(token || '', why || '');\n    }\n    attQ('[data-att-cancel]').onclick = function () { finish('', 'cancel'); };\n    attQ('[data-att-screen]').onclick = function () { finish('', 'screen'); };\n    hint.textContent = AT.scanHint;\n    hint.classList.remove('is-bad');\n    if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) return finish('', 'nocam');\n    loadLib(AT.jsqr, function () { return typeof window.jsQR === 'function'; }, function (ok) {\n      if (run.stopped) return;\n      if (!ok) return finish('', 'nocam');\n      navigator.mediaDevices.getUserMedia({ video: { facingMode: { ideal: 'environment' }, width: { ideal: 1280 } }, audio: false })\n        .then(function (stream) {\n          if (run.stopped) {\n            stream.getTracks().forEach(function (t) { t.stop(); });\n            return;\n          }\n          attStream = stream;\n          video.srcObject = stream;\n          cam.hidden = false;\n          try { video.play(); } catch (e) { /* muted + playsinline plays on its own */ }\n          var canvas = document.createElement('canvas');\n          var ctx = canvas.getContext('2d', { willReadFrequently: true }) || canvas.getContext('2d');\n          var wrongShown = false;\n          (function look() {\n            if (run.stopped) return;\n            if (video.videoWidth) {\n              var w = Math.min(720, video.videoWidth);\n              var h = Math.round(w * video.videoHeight / video.videoWidth);\n              canvas.width = w;\n              canvas.height = h;\n              ctx.drawImage(video, 0, 0, w, h);\n              var code = null;\n              try {\n                code = window.jsQR(ctx.getImageData(0, 0, w, h).data, w, h, { inversionAttempts: 'attemptBoth' });\n              } catch (e) {\n                code = null;\n              }\n              if (code && code.data) {\n                var token = qrToken(code.data);\n                if (token) return finish(token);\n                if (!wrongShown) {\n                  wrongShown = true;\n                  hint.textContent = AT.qrNotOurs;\n                  hint.classList.add('is-bad');\n                }\n              }\n            }\n            run.timer = setTimeout(look, 180);\n          })();\n        })\n        .catch(function () { finish('', 'nocam'); });\n    });\n  }\n\n  function attSend(action, token, noQr) {\n    if (!attData || attBusy || !person) return;\n    var who = person;\n    attBusy = true;\n    renderAtt();\n    attMsg(AT.sending);\n    var body = { type: 'attendance', action: action, person: who.id, qr: token || '', device: device() };\n    if (noQr) {\n      body.no_qr = true;\n      body.reason = 'kiosk_offline';\n    }\n    call(body, function (reply) {\n      attBusy = false;\n      if (person !== who) return;\n      if (reply && reply.error === 'pin') return pinRefused();\n      if (reply && reply.error === 'not started') {\n        /* attendance has a start date set by Elio (Team v31) */\n        attData.notStarted = true;\n        attMsg(AT.notStarted);\n        renderAtt();\n        return;\n      }\n      if (reply && reply.error === 'view_only') {\n        attMsg(AT.viewOnly, true);\n        renderAtt();\n        return;\n      }\n      if (reply && reply.error === 'not tracked') {\n        attData = null;\n        attBox.hidden = true;\n        return;\n      }\n      if (token && attPendingQr && attPendingQr.token === token) attPendingQr = null;\n      if (reply && reply.today) attData.today = reply.today;\n      if (reply && reply.ok) {\n        attQ('[data-att-noqr]').hidden = true;\n        attMsg((action === 'in' ? AT.savedIn : AT.savedOut) + ' ' + (reply.at || '') + (noQr ? ' \u00B7 ' + AT.savedNoQr : ''));\n      } else if (reply && reply.error === 'qr_expired') {\n        attMsg(AT.qrExpired, true);\n      } else if (reply && reply.error === 'qr_invalid') {\n        attMsg(AT.qrInvalid, true);\n      } else if (reply && reply.error === 'qr_used') {\n        attMsg(AT.qrUsed, true);\n      } else if (reply && reply.error === 'already') {\n        attMsg(AT.already);\n      } else if (reply && reply.error === 'locked') {\n        attMsg(lockText(reply), true);\n      } else {\n        attMsg(AT.failed, true);\n      }\n      renderAtt();\n    }, 30000);\n  }\n\n  /* I arrived / I left: scan the entrance QR (or use the one the phone's camera\n     already opened the page with), then send. */\n  function attStart(action) {\n    if (!attData || attBusy || !person) return;\n    if (action === 'out' && !window.confirm(AT.confirmOut)) return;\n    var ready = attQrReady();\n    if (ready) return attSend(action, ready);\n    attMsg('');\n    attScan(function (token, why) {\n      if (token) return attSend(action, token);\n      if (why === 'screen') {\n        if (window.confirm(AT.noQrConfirm)) attSend(action, '', true);\n        return;\n      }\n      if (why === 'nocam') {\n        attMsg(AT.noCamera, true);\n        var b = attQ('[data-att-noqr]');\n        b.hidden = false;\n        b.onclick = function () {\n          if (window.confirm(AT.noQrConfirm)) attSend(action, '', true);\n        };\n      }\n    });\n  }\n\n  if (attBox) {\n    attQ('[data-att-in]').addEventListener('click', function () { attStart('in'); });\n    attQ('[data-att-out]').addEventListener('click', function () { attStart('out'); });\n    /* the phone's own camera app opened the page from the entrance QR: keep the token\n       for a minute and take it out of the address bar */\n    var qrParam = /[?&]qr=([^&#]+)/.exec(location.search);\n    if (qrParam) {\n      var tok = qrToken('?qr=' + qrParam[1]);\n      if (tok) attPendingQr = { token: tok, at: Date.now() };\n      try {\n        var u = new URL(location.href);\n        u.searchParams.delete('qr');\n        history.replaceState(null, '', u.pathname + u.search + u.hash);\n      } catch (e) {\n        /* the address keeps the code; it is useless after a minute anyway */\n      }\n    }\n  }\n\n  /* ---------- Entrance screen \u2013 \u0634\u0627\u0634\u0629 \u0627\u0644\u0645\u062F\u062E\u0644 (Elio 31/10/2026) ----------\n     /pages/staff?kiosk=1 on the one device Elio approves (picks: \"Changing QR on a\n     screen\", \"One, main entrance\"). It asks the script for a new token on every\n     30-second slot and shows it as a QR of a staff-page link, with the time and the\n     date. An unknown screen shows its code until Elio approves it on his New devices\n     card. Nobody signs in here. */\n  var kioskBox = root.querySelector('[data-staff-kiosk]');\n  var KS = kioskBox ? kioskBox.dataset : {};\n  var kioskTimer = 0;\n  var kioskLastOk = 0;\n  var kioskLock = null;\n  var kioskShown = '';  /* the token on screen: redraw only when it changes */\n  function kioskQ(sel) {\n    return kioskBox.querySelector(sel);\n  }\n\n  function kioskState(name, text) {\n    kioskBox.setAttribute('data-state', name);\n    var m = kioskQ('[data-kiosk-msg]');\n    m.textContent = text || '';\n    m.hidden = !text;\n  }\n\n  function kioskDraw(token) {\n    var url = location.origin + '/pages/staff?qr=' + encodeURIComponent(token);\n    var qr = window.qrcode(0, 'M');\n    qr.addData(url);\n    qr.make();\n    var n = qr.getModuleCount();\n    var quiet = 3;\n    var canvas = kioskQ('[data-kiosk-qr]');\n    var cell = Math.max(4, Math.floor(720 / (n + quiet * 2)));\n    var size = cell * (n + quiet * 2);\n    canvas.width = size;\n    canvas.height = size;\n    var ctx = canvas.getContext('2d');\n    ctx.fillStyle = '#fff';\n    ctx.fillRect(0, 0, size, size);\n    ctx.fillStyle = '#000';\n    for (var r = 0; r < n; r++) {\n      for (var c = 0; c < n; c++) {\n        if (qr.isDark(r, c)) ctx.fillRect((c + quiet) * cell, (r + quiet) * cell, cell, cell);\n      }\n    }\n    canvas.hidden = false;\n  }\n\n  function kioskTick() {\n    clearTimeout(kioskTimer);\n    /* the screen stays tied to its own device (Team v42): no token of its own */\n    call({ type: 'kiosk', device: device() }, function (reply) {\n      var next = 10000;\n      if (reply && reply.ok && reply.token) {\n        kioskLastOk = Date.now();\n        /* a new token after every check-in (single use) or every 30 seconds */\n        if (String(reply.token) !== kioskShown || kioskQ('[data-kiosk-qr]').hidden) {\n          try {\n            kioskDraw(String(reply.token));\n            kioskShown = String(reply.token);\n            kioskState('ok', '');\n          } catch (e) {\n            kioskState('error', KS.failed);\n          }\n        } else {\n          kioskState('ok', '');\n        }\n        if (reply.now) kioskQ('[data-kiosk-time]').textContent = String(reply.now);\n        kioskQ('[data-kiosk-date]').textContent = arabicDate(new Date(), true);\n        next = Math.min(60000, Math.max(1000, Number(reply.poll_ms) || Number(reply.refresh_ms) || 30000));\n      } else if (reply && reply.error === 'kiosk_unregistered') {\n        kioskQ('[data-kiosk-qr]').hidden = true;\n        kioskQ('[data-kiosk-code]').textContent = String(reply.code || '');\n        kioskState('unregistered', KS.unregistered);\n        next = 30000;\n      } else {\n        /* no answer: the QR stays while it can still be accepted, then goes */\n        if (Date.now() - kioskLastOk > 55000) kioskQ('[data-kiosk-qr]').hidden = true;\n        kioskState('offline', KS.offline);\n      }\n      kioskTimer = setTimeout(kioskTick, next);\n    }, 15000);\n  }\n\n  function kioskAwake() {\n    try {\n      if (navigator.wakeLock && !kioskLock && document.visibilityState === 'visible') {\n        navigator.wakeLock.request('screen').then(function (l) {\n          kioskLock = l;\n          l.addEventListener('release', function () { kioskLock = null; });\n        }).catch(function () {});\n      }\n    } catch (e) {\n      /* a screen that sleeps is set to \"never\" in the device's own settings */\n    }\n  }\n\n  if (kioskBox && /[?&]kiosk=1(&|$)/.test(location.search)) {\n    root.classList.add('azar-staff--kiosk');\n    document.documentElement.classList.add('azar-kiosk-on');\n    picker.hidden = true;\n    bar.hidden = true;\n    work.hidden = true;\n    kioskBox.hidden = false;\n    kioskState('loading', KS.loading);\n    kioskQ('[data-kiosk-full]').addEventListener('click', function () {\n      var d = document.documentElement;\n      var go = d.requestFullscreen || d.webkitRequestFullscreen;\n      if (go) {\n        try { go.call(d); } catch (e) { /* not allowed on this browser */ }\n      }\n      kioskAwake();\n    });\n    document.addEventListener('visibilitychange', function () {\n      if (document.visibilityState === 'visible') {\n        kioskAwake();\n        kioskTick();\n      }\n    });\n    loadLib(KS.qrlib, function () { return typeof window.qrcode === 'function'; }, function (ok) {\n      if (!ok) return kioskState('error', KS.failed);\n      kioskAwake();\n      kioskTick();\n    });\n  }\n\n  /* ---------- Attendance review \u2013 \u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u062F\u0648\u0627\u0645 (Elio 31/10/2026) ----------\n     Stephanie (and the owners): attendance_review = {read_at, days, rows: [{id, person,\n     date, in, out, late_min, flags, distance_m, accuracy_m, selfie, wizard: {first, last},\n     status, reviewed_by, note}]}. She accepts a row or corrects its times with a note;\n     the script keeps who did it. Counts double as filters, as on the Team tab. */\n  var arPanel = root.querySelector('[data-staff-attrev]');\n  var arTabBtn = root.querySelector('[data-staff-attrev-tab]');\n  var AR = arPanel ? arPanel.dataset : {};\n  var arData = null;\n  var arFilter = 'open';  /* open, flagged, all */\n  var arDay = '';\n  var arEditing = '';\n\n  function arQ(sel) {\n    return arPanel.querySelector(sel);\n  }\n\n  function setAttReview(reply) {\n    if (!arPanel || !arTabBtn || !reply) return;\n    var v = reply.attendance_review;\n    arData = v && typeof v === 'object' && Array.isArray(v.rows) ? v : null;\n    arTabBtn.hidden = !arData;\n    if (arData && currentTab === 'attrev') renderAttReview();\n    if (!arData) {\n      arPanel.hidden = true;\n      if (currentTab === 'attrev') showTab('offers');\n    }\n    tabColumns();\n  }\n\n  function clearAttReview() {\n    arData = null;\n    arFilter = 'open';\n    arDay = '';\n    arEditing = '';\n    if (!arPanel) return;\n    if (arTabBtn) arTabBtn.hidden = true;\n    arPanel.hidden = true;\n    arQ('[data-ar-list]').textContent = '';\n    arQ('[data-ar-counts]').textContent = '';\n  }\n\n  function arFlags(r) {\n    return Array.isArray(r.flags) ? r.flags : [];\n  }\n\n  function renderAttReview() {\n    if (!arPanel || !arData) return;\n    var meta = arQ('[data-ar-meta]');\n    meta.textContent = '';\n    if (arData.read_at) {\n      meta.appendChild(document.createTextNode(AR.readAt + ' '));\n      meta.appendChild(teamLtr(arData.read_at));\n    }\n    meta.hidden = !meta.childNodes.length;\n\n    var days = Array.isArray(arData.days) && arData.days.length ? arData.days : [];\n    if (!arDay || days.indexOf(arDay) === -1) arDay = days[0] || '';\n    var daysBox = arQ('[data-ar-days]');\n    daysBox.textContent = '';\n    days.forEach(function (d) {\n      var b = el('button', 'azar-cash__day' + (d === arDay ? ' is-active' : ''));\n      b.type = 'button';\n      b.appendChild(teamLtr(d));\n      b.addEventListener('click', function () {\n        arDay = d;\n        arEditing = '';\n        renderAttReview();\n      });\n      daysBox.appendChild(b);\n    });\n    daysBox.hidden = days.length < 2;\n\n    var rows = arData.rows.filter(function (r) { return r && r.person && (!arDay || r.date === arDay); });\n    var n = { open: 0, flagged: 0, all: rows.length };\n    rows.forEach(function (r) {\n      if (r.status === 'open' || !r.status) n.open++;\n      if (arFlags(r).length) n.flagged++;\n    });\n    var counts = arQ('[data-ar-counts]');\n    counts.textContent = '';\n    [['open', AR.open], ['flagged', AR.flagged], ['all', AR.all]].forEach(function (f) {\n      var b = el('button', 'azar-team__count is-' + f[0] + (arFilter === f[0] ? ' is-active' : ''));\n      b.type = 'button';\n      b.setAttribute('aria-pressed', arFilter === f[0] ? 'true' : 'false');\n      b.appendChild(el('span', 'azar-team__num', String(n[f[0]])));\n      b.appendChild(el('span', 'azar-team__lab', f[1]));\n      b.addEventListener('click', function () {\n        arFilter = f[0];\n        renderAttReview();\n      });\n      counts.appendChild(b);\n    });\n\n    var list = arQ('[data-ar-list]');\n    list.textContent = '';\n    var shown = 0;\n    rows.forEach(function (r) {\n      var reviewed = r.status === 'accepted' || r.status === 'edited';\n      if (arFilter === 'open' && reviewed) return;\n      if (arFilter === 'flagged' && !arFlags(r).length) return;\n      shown++;\n      list.appendChild(arCard(r, reviewed));\n    });\n    var msg = arQ('[data-ar-msg]');\n    msg.textContent = shown ? '' : AR.empty;\n    msg.hidden = !!shown;\n  }\n\n  function arCard(r, reviewed) {\n    var li = el('article', 'azar-staff__ncard azar-ar__card' + (reviewed ? ' is-reviewed' : ''));\n    var head = el('div', 'azar-ar__head');\n    /* the check-in proof since 31/10/2026: the entrance QR */\n    if (r.qr === true || r.qr === false) head.appendChild(el('span', 'azar-ar__qr' + (r.qr ? ' is-ok' : ''), r.qr ? AR.qrOk : AR.noQr));\n    var who = el('div', 'azar-ar__who');\n    who.appendChild(el('p', 'azar-team__name', String(r.name || r.person)));\n    var times = el('p', 'azar-ar__times');\n    function t(label, v, cls) {\n      var s = el('span', 'azar-ar__time' + (cls ? ' ' + cls : ''));\n      s.appendChild(el('span', 'azar-cash__label', label + ' '));\n      s.appendChild(teamLtr(v || '\u2014'));\n      times.appendChild(s);\n    }\n    var fl = arFlags(r);\n    /* after an edit the final times count; the stamped ones stay visible beside them */\n    var fin = r.final_in != null && r.final_in !== '' ? r.final_in : r.in;\n    var fout = r.final_out != null && r.final_out !== '' ? r.final_out : r.out;\n    t(AR.in, fin, fl.indexOf('late') !== -1 ? 'is-late' : '');\n    t(AR.out, fout, fl.indexOf('no_out') !== -1 ? 'is-late' : '');\n    if (r.status === 'edited' && (fin !== r.in || fout !== r.out)) {\n      t(AR.stamped, (r.in || '\u2014') + ' \u2192 ' + (r.out || '\u2014'), 'is-was');\n    }\n    who.appendChild(times);\n    head.appendChild(who);\n    if (reviewed) {\n      var verdict = (r.status === 'edited' ? AR.edited : AR.accepted) + (arDayText(r.day) ? ' \u00B7 ' + arDayText(r.day) : '') + (r.reviewed_by ? ' \u00B7 ' + r.reviewed_by : '');\n      head.appendChild(el('span', 'azar-team__status is-done', verdict));\n    }\n    li.appendChild(head);\n\n    var facts = el('div', 'azar-team__facts');\n    function fact(label, value, cls) {\n      if (value == null || value === '') return;\n      var f = el('span', 'azar-team__fact' + (cls ? ' ' + cls : ''));\n      f.appendChild(el('span', 'azar-cash__label', label + ' '));\n      f.appendChild(teamLtr(value));\n      facts.appendChild(f);\n    }\n    if (r.late_min) fact(AR.lateBy, r.late_min + ' min', 'is-late');\n    if (r.wizard) fact(AR.wizard, (r.wizard.first || '\u2014') + ' \u2192 ' + (r.wizard.last || '\u2014'), fl.indexOf('wizard_gap') !== -1 ? 'is-late' : '');\n    if (facts.childNodes.length) li.appendChild(facts);\n    /* every stamp of the day, small (Team v43): the first in and the last out count */\n    if (r.stamps) {\n      var st = el('p', 'azar-ar__stamps');\n      st.appendChild(el('span', 'azar-cash__label', AR.stamps + ' '));\n      st.appendChild(teamLtr(String(r.stamps)));\n      li.appendChild(st);\n    }\n\n    if (fl.length) {\n      var fb = el('div', 'azar-att__flags');\n      fl.forEach(function (f) { fb.appendChild(el('span', 'azar-att__flag is-' + f, attFlagText(f))); });\n      li.appendChild(fb);\n    }\n    if (r.note) {\n      var note = el('p', 'azar-team__answer', String(r.note));\n      note.dir = 'auto';\n      li.appendChild(note);\n    }\n\n    var msg = el('p', 'azar-ar__msg');\n    msg.hidden = true;\n\n    /* the paper sheet at the entrance (Elio 31/10/2026: \"scan QR, and sign on the list\n       paper that stephany prints everyday\"): Stephanie marks it on its own */\n    var paper = el('div', 'azar-ar__paper');\n    paper.appendChild(el('span', 'azar-cash__label', AR.paper));\n    [['yes', AR.paperYes], ['no', AR.paperNo]].forEach(function (o) {\n      var on = r.paper === o[0];\n      var b = el('button', 'azar-ar__pbtn is-' + o[0] + (on ? ' is-on' : ''), o[1]);\n      b.type = 'button';\n      b.setAttribute('aria-pressed', on ? 'true' : 'false');\n      b.addEventListener('click', function () {\n        if (r.paper === o[0]) return;\n        arSend(r, 'paper', { paper: o[0] }, b, msg);\n      });\n      paper.appendChild(b);\n    });\n    li.appendChild(paper);\n\n    if (arEditing === r.id) {\n      var form = el('form', 'azar-ar__form');\n      function field(label, value, name, type) {\n        var lab = el('label', 'azar-ar__field');\n        lab.appendChild(el('span', 'azar-cash__label', label));\n        var inp = el('input', 'azar-cash__input');\n        inp.type = type;\n        inp.name = name;\n        inp.value = value || '';\n        if (type === 'time') inp.dir = 'ltr';\n        lab.appendChild(inp);\n        form.appendChild(lab);\n        return inp;\n      }\n      var fin = field(AR.in, r.final_in || r.in, 'in', 'time');\n      var fout = field(AR.out, r.final_out || r.out, 'out', 'time');\n      var dlab = el('label', 'azar-ar__field');\n      dlab.appendChild(el('span', 'azar-cash__label', AR.day));\n      var fday = el('select', 'azar-ar__day');\n      fday.name = 'day';\n      ['full', 'half', 'absent', 'off'].forEach(function (k) {\n        var o = el('option', '', arDayText(k));\n        o.value = k;\n        fday.appendChild(o);\n      });\n      fday.value = r.day || (fl.indexOf('no_check_in') !== -1 && !r.in ? 'absent' : 'full');\n      dlab.appendChild(fday);\n      form.appendChild(dlab);\n      var fnote = field(AR.note, r.note, 'note', 'text');\n      fnote.required = true;\n      var row = el('div', 'azar-ar__btns');\n      var save = el('button', 'azar-staff__btn azar-staff__btn--primary', AR.save);\n      save.type = 'submit';\n      var cancel = el('button', 'azar-staff__btn', AR.cancel);\n      cancel.type = 'button';\n      cancel.addEventListener('click', function () {\n        arEditing = '';\n        renderAttReview();\n      });\n      row.appendChild(save);\n      row.appendChild(cancel);\n      form.appendChild(row);\n      form.addEventListener('submit', function (e) {\n        e.preventDefault();\n        if (!fnote.value.trim()) {\n          msg.textContent = AR.needNote;\n          msg.hidden = false;\n          return;\n        }\n        arSend(r, 'edit', { in: fin.value, out: fout.value, day: fday.value, note: fnote.value.trim() }, save, msg);\n      });\n      li.appendChild(form);\n    } else {\n      var btns = el('div', 'azar-ar__btns');\n      if (!reviewed) {\n        var ok = el('button', 'azar-staff__btn azar-staff__btn--primary', AR.accept);\n        ok.type = 'button';\n        ok.addEventListener('click', function () { arSend(r, 'accept', {}, ok, msg); });\n        btns.appendChild(ok);\n      }\n      var ed = el('button', 'azar-staff__btn', AR.edit);\n      ed.type = 'button';\n      ed.addEventListener('click', function () {\n        arEditing = r.id;\n        renderAttReview();\n      });\n      btns.appendChild(ed);\n      li.appendChild(btns);\n    }\n    li.appendChild(msg);\n    return li;\n  }\n\n  function arSend(r, action, extra, btn, msg) {\n    if (!person || btn.disabled) return;\n    var who = person;\n    btn.disabled = true;\n    msg.hidden = false;\n    msg.textContent = AR.saving;\n    call(Object.assign({ type: 'attendance_review', id: r.id, action: action, person: who.id }, extra), function (reply) {\n      if (person !== who) return;\n      btn.disabled = false;\n      if (reply && reply.error === 'pin') return pinRefused();\n      if (reply && reply.ok) {\n        var fresh = reply.row && typeof reply.row === 'object' ? reply.row :\n          action === 'paper' ? Object.assign({}, r, extra) :\n          Object.assign({}, r, extra, { status: action === 'edit' ? 'edited' : 'accepted', reviewed_by: who.name });\n        arData.rows = arData.rows.map(function (x) { return x.id === r.id ? fresh : x; });\n        arEditing = '';\n        renderAttReview();\n      } else {\n        msg.textContent = reply && reply.error === 'not allowed' ? AR.notAllowed : AR.failed;\n      }\n    });\n  }\n\n  function arDayText(d) {\n    return { full: AR.dFull, half: AR.dHalf, absent: AR.dAbsent, off: AR.dOff }[d] || '';\n  }\n\n  /* ---------- New phones \u2013 \u0647\u0648\u0627\u062A\u0641 \u062C\u062F\u064A\u062F\u0629 (Elio 31/10/2026) ----------\n     Owners' view: the sign-in reply carries device_requests = [{id, person, name,\n     device, at, old_device}] for Elio only (Team). Approving moves that login to the\n     new phone (the old one stops); refusing keeps the old phone. */\n  var dvBox = root.querySelector('[data-staff-devreq]');\n  var DV = dvBox ? dvBox.dataset : {};\n  var dvRows = null;\n\n  function setDeviceRequests(reply) {\n    if (!dvBox || !reply) return;\n    var r = reply.device_requests;\n    if (reply.approvals && typeof reply.approvals === 'object') r = null; /* shown in the Approvals tab */\n    dvRows = Array.isArray(r) ? r.filter(function (x) { return x && x.id; }) : null;\n    renderDeviceRequests();\n  }\n\n  function clearDeviceRequests() {\n    dvRows = null;\n    if (!dvBox) return;\n    dvBox.hidden = true;\n    dvBox.querySelector('[data-devreq-list]').textContent = '';\n  }\n\n  function renderDeviceRequests() {\n    if (!dvBox) return;\n    var list = dvBox.querySelector('[data-devreq-list]');\n    list.textContent = '';\n    dvBox.hidden = !dvRows || !dvRows.length;\n    if (dvBox.hidden) return;\n    dvRows.forEach(function (r) {\n      var li = el('li', 'azar-staff__ncard azar-dev__req');\n      li.appendChild(el('p', 'azar-dev__q', DV.ask.split('{name}').join(String(r.name || r.person))));\n      var facts = el('div', 'azar-team__facts');\n      function fact(label, value) {\n        if (value == null || value === '') return;\n        var f = el('span', 'azar-team__fact');\n        f.appendChild(el('span', 'azar-cash__label', label + ' '));\n        f.appendChild(teamLtr(value));\n        facts.appendChild(f);\n      }\n      fact(DV.phone, r.device);\n      fact(DV.at, r.at);\n      fact(DV.code, r.code);\n      /* current = the person's approved devices [{id, device, at}], max = 1 or 2.\n         Below the limit the new one is simply added; at the limit Elio picks which\n         one it replaces (the oldest is chosen by default). */\n      var cur = Array.isArray(r.current) ? r.current.filter(function (c) { return c && c.id; }) : [];\n      var max = Number(r.max) || 1;\n      if (!cur.length) fact(DV.old, r.old_device);\n      li.appendChild(facts);\n      var pick = null;\n      if (cur.length && cur.length < max) {\n        li.appendChild(el('p', 'azar-dev__add', DV.adds));\n      } else if (cur.length) {\n        pick = el('fieldset', 'azar-dev__pick');\n        pick.appendChild(el('legend', 'azar-cash__label', DV.replaces));\n        cur.forEach(function (c, i) {\n          var lab = el('label', 'azar-dev__opt');\n          var rb = el('input');\n          rb.type = 'radio';\n          rb.name = 'dev-' + r.id;\n          rb.value = c.id;\n          rb.checked = i === 0;\n          lab.appendChild(rb);\n          lab.appendChild(teamLtr(String(c.device || c.id) + (c.at ? ' \u00B7 ' + c.at : '')));\n          pick.appendChild(lab);\n        });\n        li.appendChild(pick);\n      }\n      /* asked with the master PIN, not the person's own (Team v28) */\n      if (r.via_master) li.appendChild(el('p', 'azar-dev__master', DV.viaMaster.split('{name}').join(nameOf(r.via_master, String(r.via_master)))));\n      var btns = el('div', 'azar-ar__btns');\n      var msg = el('p', 'azar-ar__msg');\n      msg.hidden = true;\n      [['approve', DV.approve, ' azar-staff__btn--primary'], ['refuse', DV.refuse, '']].forEach(function (b) {\n        var btn = el('button', 'azar-staff__btn' + b[2], b[1]);\n        btn.type = 'button';\n        btn.addEventListener('click', function () {\n          var chosen = pick && pick.querySelector('input:checked');\n          dvDecide(r, b[0], btns, msg, chosen ? chosen.value : '');\n        });\n        btns.appendChild(btn);\n      });\n      li.appendChild(btns);\n      li.appendChild(msg);\n      list.appendChild(li);\n    });\n  }\n\n  function dvDecide(r, action, btns, msg, replace) {\n    if (!person) return;\n    var who = person;\n    var all = btns.querySelectorAll('button');\n    Array.prototype.forEach.call(all, function (b) { b.disabled = true; });\n    msg.textContent = DV.saving;\n    msg.hidden = false;\n    var body = { type: 'device_decide', person: who.id, id: r.id, action: action };\n    if (action === 'approve' && replace) body.replace = replace;\n    call(body, function (reply) {\n      if (person !== who) return;\n      if (reply && reply.error === 'pin') return pinRefused();\n      if (reply && reply.ok) {\n        if (Array.isArray(reply.device_requests)) dvRows = reply.device_requests;\n        else dvRows = dvRows.filter(function (x) { return x.id !== r.id; });\n        return renderDeviceRequests();\n      }\n      Array.prototype.forEach.call(all, function (b) { b.disabled = false; });\n      msg.textContent = reply && reply.error === 'not allowed' ? DV.notAllowed : DV.failed;\n    });\n  }\n\n  /* ---------- Approvals \u2013 \u0627\u0644\u0645\u0648\u0627\u0641\u0642\u0627\u062A (Elio 31/10/2026) ----------\n     \"Open approvals tab for me and juan in order to see everything that needs approvals.\n     From the excel files, the logins, everything ... Everything should render back to it.\"\n     The sign-in reply carries approvals = {read_at, items: [{id, kind, title, requester,\n     at, details, link, status, answered_by, answered_at, comment, + the device fields for\n     kind device/kiosk}]} for Elio and Juan only (Team). One list, newest first; Approve, or\n     Deny with a comment; answered items fade with who answered. Nothing is kept on the\n     phone. */\n  var apPanel = root.querySelector('[data-staff-approvals]');\n  var apTabBtn = root.querySelector('[data-staff-approvals-tab]');\n  var AP = apPanel ? apPanel.dataset : {};\n  var APPROVER_IDS = ['elio-test', 'juan'];\n  var apData = null;\n  var apFilter = 'all';  /* all, devices, staff */\n\n  function apQ(sel) {\n    return apPanel.querySelector(sel);\n  }\n\n  function apIsDevice(it) {\n    return it.kind === 'device' || it.kind === 'kiosk';\n  }\n\n  function apOpen(it) {\n    return !it.status || it.status === 'open';\n  }\n\n  function setApprovals(reply) {\n    if (!apPanel || !apTabBtn || !reply) return;\n    var a = reply.approvals;\n    apData = a && typeof a === 'object' && Array.isArray(a.items) && person && APPROVER_IDS.indexOf(person.id) !== -1 ? a : null;\n    apTabBtn.hidden = !apData;\n    apBadge();\n    if (apData && currentTab === 'approvals') renderApprovals();\n    if (!apData) {\n      apPanel.hidden = true;\n      if (currentTab === 'approvals') showTab('offers');\n    }\n    tabColumns();\n  }\n\n  function clearApprovals() {\n    apData = null;\n    apFilter = 'all';\n    if (!apPanel) return;\n    if (apTabBtn) apTabBtn.hidden = true;\n    apPanel.hidden = true;\n    apQ('[data-ap-list]').textContent = '';\n    clearResetCode();\n    apBadge();\n  }\n\n  function apBadge() {\n    if (!apTabBtn) return;\n    var b = apTabBtn.querySelector('[data-ap-badge]');\n    var n = !apData ? 0 : Number(apData.count) >= 0 && apData.count !== '' && apData.count != null ? Number(apData.count) :\n      apData.items.filter(function (it) { return it && apOpen(it); }).length;\n    b.textContent = n ? String(n) : '';\n    b.hidden = !n;\n  }\n\n  function apKindText(k) {\n    var map = {\n      price: AP.kPrice, stock: AP.kStock, escalation: AP.kEscalation, device: AP.kDevice, kiosk: AP.kKiosk,\n      pin_reset: AP.kPinReset, unlock: AP.kUnlock, draft: AP.kDraft, alert: AP.kAlert\n    };\n    return map[k] || AP.kOther;\n  }\n\n  function renderApprovals() {\n    if (!apPanel || !apData) return;\n    var meta = apQ('[data-ap-meta]');\n    meta.textContent = '';\n    if (apData.read_at) {\n      meta.appendChild(document.createTextNode(AP.readAt + ' '));\n      meta.appendChild(teamLtr(apData.read_at));\n    }\n    meta.hidden = !meta.childNodes.length;\n\n    var items = apData.items.filter(function (it) { return it && it.id; });\n    var n = { all: 0, devices: 0, staff: 0 };\n    items.forEach(function (it) {\n      if (!apOpen(it)) return;\n      n.all++;\n      if (apIsDevice(it)) n.devices++;\n      else n.staff++;\n    });\n    var counts = apQ('[data-ap-counts]');\n    counts.textContent = '';\n    [['all', AP.all], ['devices', AP.devices], ['staff', AP.staff]].forEach(function (f) {\n      var b = el('button', 'azar-team__count is-' + f[0] + (apFilter === f[0] ? ' is-active' : ''));\n      b.type = 'button';\n      b.setAttribute('aria-pressed', apFilter === f[0] ? 'true' : 'false');\n      b.appendChild(el('span', 'azar-team__num', String(n[f[0]])));\n      b.appendChild(el('span', 'azar-team__lab', f[1]));\n      b.addEventListener('click', function () {\n        apFilter = f[0];\n        renderApprovals();\n      });\n      counts.appendChild(b);\n    });\n\n    var list = apQ('[data-ap-list]');\n    list.textContent = '';\n    var shown = 0;\n    items.forEach(function (it) {\n      if (apFilter === 'devices' && !apIsDevice(it)) return;\n      if (apFilter === 'staff' && apIsDevice(it)) return;\n      shown++;\n      list.appendChild(apCard(it));\n    });\n    var msg = apQ('[data-ap-msg]');\n    msg.textContent = shown ? '' : AP.empty;\n    msg.hidden = !!shown;\n    apBadge();\n  }\n\n  function apCard(it) {\n    var open = apOpen(it);\n    var li = el('article', 'azar-staff__ncard azar-ap__card is-' + (it.kind || 'other') + (open ? '' : ' is-answered'));\n    var head = el('div', 'azar-ap__head');\n    head.appendChild(el('span', 'azar-ap__kind', apKindText(it.kind)));\n    var when = el('span', 'azar-ap__when');\n    when.appendChild(teamLtr(String(it.at || '')));\n    head.appendChild(when);\n    li.appendChild(head);\n    if (it.title) li.appendChild(el('p', 'azar-ap__title', String(it.title)));\n    if (it.requester) {\n      var who = el('p', 'azar-ap__who');\n      who.appendChild(el('span', 'azar-cash__label', AP.requester + ' '));\n      who.appendChild(document.createTextNode(String(it.requester)));\n      li.appendChild(who);\n    }\n    if (it.details) {\n      var d = el('p', 'azar-ap__details', String(it.details));\n      d.dir = 'auto';\n      li.appendChild(d);\n    }\n    if (it.link && /^https:\\/\\//.test(String(it.link))) {\n      var a = el('a', 'azar-staff__btn azar-ap__link', AP.openLink);\n      a.href = String(it.link);\n      a.target = '_blank';\n      a.rel = 'noopener';\n      li.appendChild(a);\n    }\n    /* the file on the office server: it cannot open on a phone, so it can be copied */\n    if (it.path) {\n      var pathRow = el('div', 'azar-ap__path');\n      var pathText = el('bdi', 'azar-ap__pathtext', String(it.path));\n      pathText.dir = 'ltr';\n      pathRow.appendChild(pathText);\n      var cp = el('button', 'azar-ap__copy', AP.copyPath);\n      cp.type = 'button';\n      cp.addEventListener('click', function () {\n        var text = String(it.path);\n        function done(ok) {\n          cp.textContent = ok ? AP.copied : AP.copyPath;\n        }\n        try {\n          navigator.clipboard.writeText(text).then(function () { done(true); }, function () { done(false); });\n        } catch (e) {\n          var r = document.createRange();\n          r.selectNodeContents(pathText);\n          var s = window.getSelection();\n          s.removeAllRanges();\n          s.addRange(r);\n          done(false);\n        }\n      });\n      pathRow.appendChild(cp);\n      li.appendChild(pathRow);\n    }\n\n    /* devices and the entrance screen: the same facts and replace choice as before */\n    var pick = null;\n    if (apIsDevice(it)) {\n      var facts = el('div', 'azar-team__facts');\n      function fact(label, value) {\n        if (value == null || value === '') return;\n        var f = el('span', 'azar-team__fact');\n        f.appendChild(el('span', 'azar-cash__label', label + ' '));\n        f.appendChild(teamLtr(value));\n        facts.appendChild(f);\n      }\n      fact(DV.phone, it.device);\n      fact(DV.code, it.code);\n      var cur = Array.isArray(it.current) ? it.current.filter(function (c) { return c && c.id; }) : [];\n      var max = Number(it.max) || 1;\n      if (!cur.length) fact(DV.old, it.old_device);\n      if (facts.childNodes.length) li.appendChild(facts);\n      if (it.via_master) li.appendChild(el('p', 'azar-dev__master', DV.viaMaster.split('{name}').join(nameOf(it.via_master, String(it.via_master)))));\n      if (open && cur.length && cur.length < max) {\n        li.appendChild(el('p', 'azar-dev__add', DV.adds));\n      } else if (open && cur.length) {\n        pick = el('fieldset', 'azar-dev__pick');\n        pick.appendChild(el('legend', 'azar-cash__label', DV.replaces));\n        cur.forEach(function (c, i) {\n          var lab = el('label', 'azar-dev__opt');\n          var rb = el('input');\n          rb.type = 'radio';\n          rb.name = 'ap-' + it.id;\n          rb.value = c.id;\n          rb.checked = i === 0;\n          lab.appendChild(rb);\n          lab.appendChild(teamLtr(String(c.device || c.id) + (c.at ? ' \u00B7 ' + c.at : '')));\n          pick.appendChild(lab);\n        });\n        li.appendChild(pick);\n      }\n    }\n\n    if (!open) {\n      var done = el('p', 'azar-ap__done is-' + it.status);\n      var verdict = (it.status === 'denied' ? AP.denied : AP.approved) + (it.answered_by ? ' \u00B7 ' + AP.by.split('{name}').join(String(it.answered_by)) : '') + (it.answered_at ? ' ' : '');\n      done.appendChild(document.createTextNode(verdict));\n      if (it.answered_at) done.appendChild(teamLtr(String(it.answered_at)));\n      li.appendChild(done);\n      if (it.comment) {\n        var c = el('p', 'azar-team__answer', String(it.comment));\n        c.dir = 'auto';\n        li.appendChild(c);\n      }\n      return li;\n    }\n\n    var note = el('textarea', 'azar-ap__comment');\n    note.hidden = it.kind === 'alert';\n    note.rows = 2;\n    note.placeholder = AP.commentHint;\n    li.appendChild(note);\n    var btns = el('div', 'azar-ar__btns');\n    var msg = el('p', 'azar-ar__msg');\n    msg.hidden = true;\n    var isAlert = it.kind === 'alert';\n    (isAlert ? [['approve', AP.seen, ' azar-staff__btn--primary']] : [['approve', AP.approve, ' azar-staff__btn--primary'], ['deny', AP.deny, '']]).forEach(function (b) {\n      var btn = el('button', 'azar-staff__btn' + b[2], b[1]);\n      btn.type = 'button';\n      btn.addEventListener('click', function () {\n        var comment = note.value.trim();\n        if (b[0] === 'deny' && !comment) {\n          msg.textContent = AP.needComment;\n          msg.hidden = false;\n          note.focus();\n          return;\n        }\n        var chosen = pick && pick.querySelector('input:checked');\n        apDecide(it, b[0], comment, chosen ? chosen.value : '', btns, msg);\n      });\n      btns.appendChild(btn);\n    });\n    li.appendChild(btns);\n    li.appendChild(msg);\n    return li;\n  }\n\n  /* A one-time PIN reset code (Elio 01/11/2026, option B): after he or Juan approves a\n     reset, the script returns reset_code once in the decision reply. It is shown here,\n     once, and lives in memory only: Hide, leaving the tab, leaving the page or signing out\n     clears it. It is never stored on the phone. */\n  function clearResetCode() {\n    if (!apPanel) return;\n    var box = apQ('[data-ap-code]');\n    box.hidden = true;\n    apQ('[data-ap-code-value]').textContent = '';\n    apQ('[data-ap-code-text]').textContent = '';\n  }\n\n  function showResetCode(rc) {\n    if (!apPanel || !rc || !rc.code) return;\n    var box = apQ('[data-ap-code]');\n    apQ('[data-ap-code-value]').textContent = String(rc.code);\n    var hours = Number(rc.valid_hours) || 24;\n    var until = new Date(Date.now() + hours * 3600000);\n    var two = function (n) { return ('0' + n).slice(-2); };\n    var untilText = two(until.getDate()) + '/' + two(until.getMonth() + 1) + ' ' + two(until.getHours()) + ':' + two(until.getMinutes());\n    apQ('[data-ap-code-text]').textContent = AP.codeFor.split('{name}').join(String(rc.person || rc.name || '')) + ' \u00B7 ' + AP.codeUntil + ' ' + untilText;\n    box.hidden = false;\n    try { box.scrollIntoView({ block: 'start' }); } catch (e) { /* old browsers */ }\n  }\n\n  if (apPanel) {\n    apQ('[data-ap-code-hide]').addEventListener('click', clearResetCode);\n    document.addEventListener('visibilitychange', function () {\n      if (document.hidden) clearResetCode();\n    });\n  }\n\n  function apDecide(it, action, comment, replace, btns, msg) {\n    if (!person) return;\n    var who = person;\n    var all = btns.querySelectorAll('button');\n    Array.prototype.forEach.call(all, function (b) { b.disabled = true; });\n    msg.textContent = AP.saving;\n    msg.hidden = false;\n    var body = { type: 'approval_decide', person: who.id, id: it.id, action: action, comment: comment };\n    if (action === 'approve' && replace) body.replace = replace;\n    call(body, function (reply) {\n      if (person !== who) return;\n      if (reply && reply.error === 'pin') return pinRefused();\n      if (reply && reply.ok && reply.one_time_code) showResetCode(reply.one_time_code);\n      /* the script sends the whole fresh list back (Team v44): draw that */\n      if (reply && reply.approvals && typeof reply.approvals === 'object' && Array.isArray(reply.approvals.items)) {\n        apData = reply.approvals;\n        renderApprovals();\n        if (!reply.ok && reply.error !== 'done') msg.textContent = AP.failed;\n        return;\n      }\n      var fresh = reply && reply.item && typeof reply.item === 'object' ? reply.item : null;\n      if (reply && reply.ok) {\n        if (!fresh) fresh = Object.assign({}, it, { status: action === 'deny' ? 'denied' : 'approved', answered_by: who.name, comment: comment });\n      } else if (reply && reply.error === 'done' && fresh) {\n        /* the other owner answered first: show what they decided */\n      } else {\n        Array.prototype.forEach.call(all, function (b) { b.disabled = false; });\n        var why = reply && { comment: AP.needComment, 'not allowed': AP.notAllowed, view_only: AP.viewOnly,\n          replace: AP.needReplace, 'nothing waiting': AP.nothingWaiting }[reply.error];\n        msg.textContent = why || AP.failed;\n        return;\n      }\n      apData.items = apData.items.map(function (x) { return x.id === it.id ? fresh : x; });\n      renderApprovals();\n    });\n  }\n\n  /* ---------- Ask for a PIN reset / unlock (Team v44) ----------\n     On Stephanie's Team tab: she picks a person, reset or unlock, adds a note; it lands\n     on Elio's and Juan's Approvals tab, and their approval does it. */\n  var phBox = root.querySelector('[data-staff-pinhelp]');\n  var PH = phBox ? phBox.dataset : {};\n\n  function drawPinHelpStatus(reply) {\n    if (!phBox) return;\n    var box = phBox.querySelector('[data-ph-status]');\n    box.textContent = '';\n    var rows = reply && Array.isArray(reply.pin_help_status) ? reply.pin_help_status : [];\n    rows.forEach(function (r) {\n      if (!r || !r.person) return;\n      var li = el('li', 'azar-ph__row is-' + (r.status || 'open'));\n      var who = nameOf(r.person, String(r.person));\n      var head = el('p', 'azar-ph__head');\n      head.appendChild(document.createTextNode(who + ' \u00B7 ' + (r.kind === 'unlock' ? PH.kUnlock : PH.kReset) + ' \u00B7 '));\n      head.appendChild(el('strong', '', r.status === 'approved' ? PH.approved : r.status === 'denied' ? PH.denied : PH.open));\n      li.appendChild(head);\n      var bits = [];\n      if (r.by) bits.push(String(r.by));\n      if (r.at) bits.push(String(r.at));\n      if (bits.length) li.appendChild(el('p', 'azar-ph__meta', bits.join(' \u00B7 ')));\n      if (r.note) li.appendChild(el('p', 'azar-ph__meta', String(r.note)));\n      if (r.comment) li.appendChild(el('p', 'azar-ph__meta', String(r.comment)));\n      box.appendChild(li);\n    });\n    box.hidden = !box.childNodes.length;\n    phBox.hidden = phBox.hidden && !box.childNodes.length;\n  }\n\n  function setPinHelp() {\n    if (!phBox) return;\n    var sel = phBox.querySelector('[data-ph-person]');\n    if (!sel.options.length) {\n      var o0 = el('option', '', PH.choose);\n      o0.value = '';\n      sel.appendChild(o0);\n      roster.filter(function (p) { return p.role !== 'tester' && OWNER_IDS.indexOf(p.id) === -1 && p.id !== 'juan' && p.id !== 'georges'; })\n        .forEach(function (p) {\n          var o = el('option', '', p.name);\n          o.value = p.id;\n          sel.appendChild(o);\n        });\n    }\n  }\n\n  if (phBox) {\n    phBox.querySelector('[data-ph-form]').addEventListener('submit', function (event) {\n      event.preventDefault();\n      if (!person) return;\n      var who = person;\n      var target = phBox.querySelector('[data-ph-person]').value;\n      var kind = (phBox.querySelector('[data-ph-kind]:checked') || {}).value || 'reset';\n      var note = phBox.querySelector('[data-ph-note]').value.trim();\n      var msg = phBox.querySelector('[data-ph-msg]');\n      var btn = phBox.querySelector('[data-ph-send]');\n      msg.classList.remove('is-good');\n      if (!target) {\n        msg.textContent = PH.pickFirst;\n        msg.hidden = false;\n        return;\n      }\n      btn.disabled = true;\n      msg.textContent = PH.sending;\n      msg.hidden = false;\n      call({ type: 'pin_help', person: who.id, target: target, kind: kind, note: note }, function (reply) {\n        btn.disabled = false;\n        if (person !== who) return;\n        if (reply && reply.error === 'pin') return pinRefused();\n        if (reply && reply.ok) {\n          phBox.querySelector('[data-ph-note]').value = '';\n          phBox.querySelector('[data-ph-person]').value = '';\n          msg.textContent = PH.sent;\n          msg.classList.add('is-good');\n          return;\n        }\n        msg.textContent = (reply && { 'not allowed': PH.notAllowed, invalid: PH.invalid }[reply.error]) || PH.failed;\n      });\n    });\n  }\n\n  /* ---------- Master PIN \u2013 \u0631\u0645\u0632 \u0627\u0644\u0645\u062F\u064A\u0631 (Elio 31/10/2026) ----------\n     Elio sets the master PIN himself, on his own page only: his own current PIN, then\n     the new master PIN twice (6-12 digits). Team v27+: set_master_pin. The PINs go\n     straight to the script; nothing is kept on the phone. */\n  var mpBox = root.querySelector('[data-staff-master]');\n  var MP = mpBox ? mpBox.dataset : {};\n  var mpBusy = false;\n\n  function mpQ(sel) {\n    return mpBox.querySelector(sel);\n  }\n\n  function setMasterForm() {\n    var mine = !!person && person.id === 'elio-test' && !viewAs;\n    if (vaBox) {\n      vaBox.hidden = !mine;\n      var sel = vaBox.querySelector('[data-va-person]');\n      if (mine && !sel.options.length) {\n        var o0 = el('option', '', VA.choose);\n        o0.value = '';\n        sel.appendChild(o0);\n        roster.filter(function (r) { return r.id !== 'elio-test'; }).forEach(function (r) {\n          var o = el('option', '', r.name);\n          o.value = r.id;\n          sel.appendChild(o);\n        });\n      }\n    }\n    if (!mpBox) return;\n    mpBox.hidden = !mine;\n  }\n\n  /* View as (Elio 01/11/2026: \"add a view as section (only i can see the view as)\"): he picks a\n     person and types the master PIN; the page then opens exactly as that person sees it, read\n     only, with the yellow banner. Nothing of it is kept on the phone; \u0644\u0633\u062A \u0623\u0646\u062A\u061F brings him back\n     to sign in as himself. */\n  var vaBox = root.querySelector('[data-staff-viewas-form]');\n  var VA = vaBox ? vaBox.dataset : {};\n  if (vaBox) {\n    vaBox.querySelector('[data-va-form]').addEventListener('submit', function (event) {\n      event.preventDefault();\n      if (!person || person.id !== 'elio-test' || viewAs) return;\n      var target = vaBox.querySelector('[data-va-person]').value;\n      var master = westernDigits(vaBox.querySelector('[data-va-pin]').value).trim();\n      var msg = vaBox.querySelector('[data-va-msg]');\n      var btn = vaBox.querySelector('[data-va-open]');\n      var chosen = roster.filter(function (r) { return r.id === target; })[0];\n      msg.classList.remove('is-good');\n      msg.hidden = false;\n      if (!chosen) return (msg.textContent = VA.pickFirst);\n      if (!master) return (msg.textContent = VA.needPin);\n      btn.disabled = true;\n      msg.textContent = VA.opening;\n      call({ type: 'login', person: chosen.id, pin: master, token: undefined }, function (reply) {\n        btn.disabled = false;\n        vaBox.querySelector('[data-va-pin]').value = '';\n        if (reply && reply.ok && reply.view_as === true) {\n          msg.hidden = true;\n          switchBtn.click();\n          viewAsOpen(chosen, master, reply);\n          return;\n        }\n        if (reply && reply.error === 'locked') return (msg.textContent = lockText(reply));\n        msg.textContent = reply && reply.ok ? VA.notMaster : reply ? VA.wrong : VA.failed;\n      });\n    });\n  }\n\n  /* like signedIn, but nothing is remembered on the phone */\n  function viewAsOpen(chosen, master, reply) {\n    gateError.hidden = true;\n    sessionPin = master;\n    viewAs = true;\n    var p = reply.role ? Object.assign({}, chosen, { role: reply.role }) : chosen;\n    openFor(p);\n    useReply(reply);\n  }\n\n  function clearMasterForm() {\n    if (!mpBox) return;\n    mpBox.hidden = true;\n    mpBox.open = false;\n    ['[data-mp-own]', '[data-mp-pin1]', '[data-mp-pin2]'].forEach(function (k) { mpQ(k).value = ''; });\n    mpMsg('');\n  }\n\n  function mpMsg(text, good) {\n    var m = mpQ('[data-mp-msg]');\n    m.textContent = text || '';\n    m.classList.toggle('is-good', !!good);\n    m.hidden = !text;\n  }\n\n  if (mpBox) {\n    mpQ('[data-mp-form]').addEventListener('submit', function (event) {\n      event.preventDefault();\n      if (!person || person.id !== 'elio-test' || viewAs || mpBusy) return;\n      var own = westernDigits(mpQ('[data-mp-own]').value).trim();\n      var a = westernDigits(mpQ('[data-mp-pin1]').value).trim();\n      var b = westernDigits(mpQ('[data-mp-pin2]').value).trim();\n      var shortText = MP.short;\n      if (!own) return mpMsg(MP.needOwn);\n      if (!/^\\d+$/.test(a) || a.length < 6 || a.length > 12) return mpMsg(shortText);\n      if (a !== b) return mpMsg(MP.mismatch);\n      if (a === own) return mpMsg(MP.same);\n      if (weakPin(a)) return mpMsg(MP.weak);\n      var who = person;\n      var btn = mpQ('[data-mp-save]');\n      mpBusy = true;\n      btn.disabled = true;\n      mpMsg(MP.saving, true);\n      call({ type: 'set_master_pin', person: who.id, pin: own, new_pin: a }, function (reply) {\n        mpBusy = false;\n        btn.disabled = false;\n        if (person !== who) return;\n        if (reply && reply.ok) {\n          ['[data-mp-own]', '[data-mp-pin1]', '[data-mp-pin2]'].forEach(function (k) { mpQ(k).value = ''; });\n          return mpMsg(MP.saved, true);\n        }\n        var e = reply && reply.error;\n        if (e === 'locked') return mpMsg(lockText(reply));\n        var why = { device: MP.device, pin: MP.wrongOwn, pin_change: MP.ownFirst, short: shortText, weak: MP.weak, same: MP.same, 'not allowed': MP.notAllowed }[e];\n        mpMsg(why || MP.failed);\n      });\n    });\n  }\n\n  /* ---------- New PIN \u2013 \u0631\u0645\u0632 \u062C\u062F\u064A\u062F (Elio 31/10/2026) ----------\n     \"everyone should change their pins to 6 digits.\" When the sign-in reply carries\n     pin_change = {min}, the page stays closed behind this one screen until the person\n     has set a PIN of 6-12 digits (Team v26). The new PIN goes to the script with the\n     current one (call() adds it); once it is taken the page signs in again with it and\n     opens. Nothing about the PIN is kept on the phone beyond the usual sign-in. */\n  var npBox = root.querySelector('[data-staff-newpin]');\n  var NP = npBox ? npBox.dataset : {};\n  var npNeed = null;\n  var npBusy = false;\n\n  function npQ(sel) {\n    return npBox.querySelector(sel);\n  }\n\n  /* true while the page must stay closed */\n  function setPinGate(reply) {\n    if (!npBox) return false;\n    var pc = reply && reply.pin_change;\n    var was = !!npNeed;\n    npNeed = pc && typeof pc === 'object' ? pc : null;\n    npBox.hidden = !npNeed;\n    if (npNeed) {\n      npQ('[data-np-min]').textContent = String(npNeed.min || 6);\n      work.hidden = true;\n      if (!was) {\n        npMsg('');\n        try { npQ('[data-np-pin1]').focus(); } catch (e) { /* no focus on some phones */ }\n      }\n    } else if (was && person) {\n      work.hidden = false;\n    }\n    return !!npNeed;\n  }\n\n  function clearPinGate() {\n    npNeed = null;\n    npBusy = false;\n    if (!npBox) return;\n    npBox.hidden = true;\n    npQ('[data-np-pin1]').value = '';\n    npQ('[data-np-pin2]').value = '';\n    npMsg('');\n  }\n\n  function npMsg(text, good) {\n    var m = npQ('[data-np-msg]');\n    m.textContent = text || '';\n    m.classList.toggle('is-good', !!good);\n    m.hidden = !text;\n  }\n\n  /* A PIN nobody guesses: no 111111, no 123456 or 654321. */\n  function weakPin(pin) {\n    if (/^(\\d)\\1+$/.test(pin)) return true;\n    var up = true;\n    var down = true;\n    for (var i = 1; i < pin.length; i++) {\n      var d = pin.charCodeAt(i) - pin.charCodeAt(i - 1);\n      if (d !== 1 && d !== -9) up = false;\n      if (d !== -1 && d !== 9) down = false;\n    }\n    return up || down;\n  }\n\n  function npSetPin(event) {\n    event.preventDefault();\n    if (!person || npBusy || !npNeed) return;\n    var min = Number(npNeed.min) || 6;\n    var shortText = NP.short.split('{n}').join(String(min));\n    var a = westernDigits(npQ('[data-np-pin1]').value).trim();\n    var b = westernDigits(npQ('[data-np-pin2]').value).trim();\n    if (!/^\\d+$/.test(a) || a.length < min || a.length > 12) return npMsg(shortText);\n    if (a !== b) return npMsg(NP.mismatch);\n    if (a === sessionPin) return npMsg(NP.same);\n    if (weakPin(a)) return npMsg(NP.weak);\n    var who = person;\n    var btn = npQ('[data-np-save]');\n    npBusy = true;\n    btn.disabled = true;\n    npMsg(NP.saving, true);\n    call({ type: 'set_pin', person: who.id, new_pin: a }, function (reply) {\n      if (person !== who) return;\n      if (!reply || !reply.ok) {\n        npBusy = false;\n        btn.disabled = false;\n        if (reply && reply.error === 'pin') return pinRefused();\n        if (reply && reply.error === 'locked') return npMsg(lockText(reply));\n        var why = reply && { 'not allowed': NP.notAllowed, weak: NP.weak, same: NP.same, short: shortText }[reply.error];\n        return npMsg(why || NP.failed);\n      }\n      sessionPin = a;\n      if (SHEET) store('azar-staff:pin', a);\n      npQ('[data-np-pin1]').value = '';\n      npQ('[data-np-pin2]').value = '';\n      npMsg(NP.saved, true);\n      call({ type: 'login', person: who.id, pin: a }, function (r2) {\n        npBusy = false;\n        btn.disabled = false;\n        if (person !== who) return;\n        if (r2 && r2.ok) {\n          useReply(r2);\n          if (!npNeed) npMsg('');\n        } else {\n          /* the PIN is saved; the page opens and fills in once the script answers */\n          setPinGate(null);\n        }\n      });\n    });\n  }\n\n  if (npBox) npQ('[data-np-form]').addEventListener('submit', npSetPin);\n\n  /* ---------- Salaries \u2013 \u0627\u0644\u0631\u0648\u0627\u062A\u0628 (Elio 31/10/2026) ----------\n     Owners only (Elio, Juan, Georges; not Samar, Elio 31/10/2026): \"Owners tab on his phone\". The sign-in\n     reply carries salaries = {month, months, read_at, currency, rows: [{person, base,\n     days_worked, days_absent, late_min, deductions, advances, net, note}], totals}\n     only for them, after the PIN check; for anyone else the key is missing and the tab\n     stays hidden. The figures are in memory only and stay covered until \"Show\" is\n     tapped, and are covered again when the phone leaves the page. */\n  var salPanel = root.querySelector('[data-staff-sal]');\n  var salTabBtn = root.querySelector('[data-staff-sal-tab]');\n  var SA = salPanel ? salPanel.dataset : {};\n  var salData = null;\n  var salSeq = 0;\n\n  function salQ(sel) {\n    return salPanel.querySelector(sel);\n  }\n\n  function salValid(s) {\n    return s && typeof s === 'object' && Array.isArray(s.rows) ? s : null;\n  }\n\n  /* Elio 31/10/2026: salaries for Elio, Juan and Georges only (not Samar). The script\n     sends them only to them; the page also refuses to show them to anyone else. */\n  var SAL_IDS = ['elio-test', 'juan', 'georges'];\n\n  function setSalaries(reply) {\n    if (!salPanel || !salTabBtn || !reply) return;\n    salData = person && SAL_IDS.indexOf(person.id) !== -1 ? salValid(reply.salaries) : null;\n    var on = !!salData;\n    salTabBtn.hidden = !on;\n    if (on && currentTab === 'sal') renderSalaries();\n    if (!on) {\n      salPanel.hidden = true;\n      if (currentTab === 'sal') showTab('offers');\n    }\n    tabColumns();\n  }\n\n  function clearSalaries() {\n    salSeq++;\n    salData = null;\n    if (!salPanel) return;\n    if (salTabBtn) salTabBtn.hidden = true;\n    salPanel.hidden = true;\n    salQ('[data-sal-table]').textContent = '';\n  }\n\n  function renderSalaries() {\n    if (!salPanel || !salData) return;\n    function curOf(c) {\n      return c === 'LL' || c === 'LBP' ? 'LL' : 'USD';\n    }\n    var meta = salQ('[data-sal-meta]');\n    meta.textContent = '';\n    if (salData.read_at) {\n      meta.appendChild(document.createTextNode(SA.readAt + ' '));\n      meta.appendChild(teamLtr(salData.read_at));\n    }\n    meta.hidden = !meta.childNodes.length;\n\n    var sel = salQ('[data-sal-month]');\n    var months = Array.isArray(salData.months) && salData.months.length ? salData.months : (salData.month ? [salData.month] : []);\n    sel.textContent = '';\n    months.forEach(function (m) {\n      var o = el('option', '', m);\n      o.value = m;\n      sel.appendChild(o);\n    });\n    sel.value = salData.month || '';\n    sel.parentNode.hidden = months.length < 2;\n    sel.onchange = function () { salMonth(sel.value); };\n\n\n    var box = salQ('[data-sal-table]');\n    box.textContent = '';\n    var msg = salQ('[data-sal-msg]');\n    msg.textContent = salData.rows.length ? '' : SA.empty;\n    msg.hidden = !!salData.rows.length;\n    if (!salData.rows.length) return;\n    /* HQ's payroll columns; a column only shows when some row has it */\n    var cols = [\n      ['person', SA.hPerson], ['base', SA.hBase, 1], ['days_worked', SA.hDays], ['days_absent', SA.hAbsent],\n      ['late_min', SA.hLate], ['advances', SA.hAdvance, 1], ['deductions', SA.hDeduct, 1], ['net', SA.hNet, 1]\n    ].filter(function (c) {\n      return c[0] === 'person' || salData.rows.some(function (r) { return r[c[0]] != null && r[c[0]] !== ''; });\n    });\n    var table = el('table', 'azar-sheet__table azar-sal__table');\n    var hr = el('tr');\n    cols.forEach(function (c) { hr.appendChild(el('th', '', c[1])); });\n    table.appendChild(el('thead')).appendChild(hr);\n    var tb = el('tbody');\n    salData.rows.forEach(function (r) {\n      var tr = el('tr');\n      cols.forEach(function (c) {\n        var td = el('td', c[0] === 'net' ? 'is-net' : '');\n        var v = r[c[0]];\n        if (c[0] === 'person') {\n          td.textContent = String(r.name || v || '');\n          if (r.note) td.title = String(r.note);\n        } else if (c[2]) {\n          if (v != null && v !== '') td.appendChild(money(v, curOf(r.currency || salData.currency)));\n          td.classList.add('azar-sal__money');\n        } else if (v != null && v !== '') {\n          td.appendChild(teamLtr(v));\n        }\n        tr.appendChild(td);\n      });\n      tb.appendChild(tr);\n    });\n    table.appendChild(tb);\n    /* totals: {USD: {...}, LBP: {...}} (one line per currency), or one flat object */\n    var tot = salData.totals;\n    if (tot && typeof tot === 'object') {\n      var groups = tot.net != null || tot.base != null ? [[salData.currency, tot]] :\n        Object.keys(tot).filter(function (k) { return tot[k] && typeof tot[k] === 'object'; }).map(function (k) { return [k, tot[k]]; });\n      var tf = el('tfoot');\n      groups.forEach(function (g) {\n        var tr = el('tr');\n        cols.forEach(function (c) {\n          var td = el('td', c[0] === 'net' ? 'is-net' : '');\n          if (c[0] === 'person') td.textContent = SA.total + (groups.length > 1 ? ' ' + (curOf(g[0]) === 'LL' ? 'LL' : 'USD') : '');\n          else if (c[2] && g[1][c[0]] != null) {\n            td.appendChild(money(g[1][c[0]], curOf(g[0])));\n            td.classList.add('azar-sal__money');\n          }\n          tr.appendChild(td);\n        });\n        tf.appendChild(tr);\n      });\n      if (groups.length) table.appendChild(tf);\n    }\n    var wrap = el('div', 'azar-sheet__scroll');\n    wrap.appendChild(table);\n    box.appendChild(wrap);\n  }\n\n  /* Another month: asked from the script with the same PIN; only an owner gets it. */\n  function salMonth(m) {\n    if (!person || !salData || m === salData.month) return;\n    var who = person;\n    var seq = ++salSeq;\n    var msg = salQ('[data-sal-msg]');\n    msg.textContent = SA.loading;\n    msg.hidden = false;\n    call({ type: 'salaries', person: who.id, month: m }, function (reply) {\n      if (seq !== salSeq || person !== who) return;\n      if (reply && reply.error === 'pin') return pinRefused();\n      var s = reply && SAL_IDS.indexOf(who.id) !== -1 && salValid(reply.salaries);\n      if (s) {\n        salData = s;\n        renderSalaries();\n      } else {\n        msg.textContent = SA.failed;\n        salQ('[data-sal-month]').value = salData.month || '';\n      }\n    });\n  }\n\n  /* ---------- Team \u2013 \u0627\u0644\u0641\u0631\u064A\u0642 (Elio 30/10/2026) ----------\n     Stephanie's desktop Team sheet on her phone, read only. The sign-in reply carries\n     team_view = {manager, read_at, rows: [{person, task, due, status, late, rows, answer,\n     saved}]} (or {person, error} for a file that could not be read), grouped by person\n     then due date, only for her (Team v24). Late due dates and Blocked in red, Done in\n     green, as on her desktop. Nothing is kept on the phone. */\n  var teamPanel = root.querySelector('[data-staff-team]');\n  var teamTabBtn = root.querySelector('[data-staff-team-tab]');\n  var TV = teamPanel ? teamPanel.dataset : {};\n  var teamData = null;\n  var teamFilter = 'all';   /* all, late, blocked, open */\n  var teamPerson = '';      /* '' = everyone */\n\n  function teamQ(sel) {\n    return teamPanel.querySelector(sel);\n  }\n\n  function setTeamAccess(reply) {\n    if (!teamPanel || !teamTabBtn || !reply) return;\n    var tv = reply.team_view;\n    teamData = tv && typeof tv === 'object' && Array.isArray(tv.rows) ? tv : null;\n    teamTabBtn.hidden = !teamData;\n    if (teamData && currentTab === 'team') renderTeam();\n    if (!teamData) {\n      teamPanel.hidden = true;\n      if (currentTab === 'team') showTab('offers');\n    }\n    tabColumns();\n  }\n\n  function clearTeam() {\n    teamData = null;\n    teamFilter = 'all';\n    teamPerson = '';\n    if (!teamPanel) return;\n    if (teamTabBtn) teamTabBtn.hidden = true;\n    teamPanel.hidden = true;\n    teamQ('[data-team-list]').textContent = '';\n    teamQ('[data-team-counts]').textContent = '';\n  }\n\n  function teamKind(r) {\n    var s = String(r.status || '');\n    if (/block|\u0645\u062A\u0648\u0642\u0641/i.test(s)) return 'blocked';\n    /* \"Done / \u062A\u0645\" as whole words only, so \"Not done\" or \"\u0644\u0645 \u064A\u062A\u0645\" stay open */\n    if (/(^|\\/)\\s*done\\b/i.test(s) || /(^|[\\s\\/])\u062A\u0645($|[\\s\\/])/.test(s)) return 'done';\n    return 'open';\n  }\n\n  function teamLtr(text) {\n    var b = el('bdi', '', String(text));\n    b.dir = 'ltr';\n    return b;\n  }\n\n  function renderTeam() {\n    if (!teamPanel || !teamData) return;\n    var rows = teamData.rows.filter(function (r) { return r && r.person; });\n    var meta = teamQ('[data-team-meta]');\n    meta.textContent = '';\n    if (teamData.read_at) {\n      meta.appendChild(document.createTextNode(TV.readAt + ' '));\n      meta.appendChild(teamLtr(teamData.read_at));\n    }\n    meta.hidden = !meta.childNodes.length;\n\n    /* counts double as filters */\n    var n = { all: 0, late: 0, blocked: 0, open: 0 };\n    rows.forEach(function (r) {\n      if (r.error) return;\n      n.all++;\n      if (r.late === true) n.late++;\n      var k = teamKind(r);\n      if (k === 'blocked') n.blocked++;\n      if (k !== 'done') n.open++;\n    });\n    var counts = teamQ('[data-team-counts]');\n    counts.textContent = '';\n    [['all', TV.all], ['late', TV.late], ['blocked', TV.blocked], ['open', TV.open]].forEach(function (f) {\n      var b = el('button', 'azar-team__count is-' + f[0] + (teamFilter === f[0] ? ' is-active' : ''));\n      b.type = 'button';\n      b.setAttribute('aria-pressed', teamFilter === f[0] ? 'true' : 'false');\n      b.appendChild(el('span', 'azar-team__num', String(n[f[0]])));\n      b.appendChild(el('span', 'azar-team__lab', f[1]));\n      b.addEventListener('click', function () {\n        teamFilter = f[0];\n        renderTeam();\n      });\n      counts.appendChild(b);\n    });\n\n    /* one person or everyone */\n    var people = [];\n    rows.forEach(function (r) { if (people.indexOf(r.person) === -1) people.push(r.person); });\n    if (teamPerson && people.indexOf(teamPerson) === -1) teamPerson = '';\n    var sel = teamQ('[data-team-person]');\n    sel.textContent = '';\n    var o0 = el('option', '', TV.everyone);\n    o0.value = '';\n    sel.appendChild(o0);\n    people.forEach(function (p) {\n      var o = el('option', '', p);\n      o.value = p;\n      sel.appendChild(o);\n    });\n    sel.value = teamPerson;\n    sel.onchange = function () {\n      teamPerson = sel.value;\n      renderTeam();\n    };\n\n    var list = teamQ('[data-team-list]');\n    list.textContent = '';\n    var shown = 0;\n    people.forEach(function (p) {\n      if (teamPerson && p !== teamPerson) return;\n      var mine = rows.filter(function (r) {\n        if (r.person !== p) return false;\n        if (r.error) return teamFilter === 'all';\n        if (teamFilter === 'late') return r.late === true;\n        if (teamFilter === 'blocked') return teamKind(r) === 'blocked';\n        if (teamFilter === 'open') return teamKind(r) !== 'done';\n        return true;\n      });\n      if (!mine.length) return;\n      var sec = el('section', 'azar-team__person');\n      sec.appendChild(el('h3', 'azar-team__name', p));\n      var ol = el('ol', 'azar-team__tasks');\n      mine.forEach(function (r) {\n        shown++;\n        var li = el('li', 'azar-staff__ncard azar-team__task');\n        if (r.error) {\n          li.classList.add('is-error');\n          li.appendChild(el('p', 'azar-team__err', TV.unreadable));\n          ol.appendChild(li);\n          return;\n        }\n        var k = teamKind(r);\n        var head = el('div', 'azar-team__thead');\n        head.appendChild(el('p', 'azar-team__tname', String(r.task || '')));\n        head.appendChild(el('span', 'azar-team__status is-' + k, String(r.status || '')));\n        li.appendChild(head);\n        var facts = el('div', 'azar-team__facts');\n        function fact(label, value, cls) {\n          if (value == null || value === '') return;\n          var f = el('span', 'azar-team__fact' + (cls ? ' ' + cls : ''));\n          f.appendChild(el('span', 'azar-cash__label', label + ' '));\n          f.appendChild(teamLtr(value));\n          facts.appendChild(f);\n        }\n        fact(TV.due, r.due, r.late === true ? 'is-late' : '');\n        fact(TV.rows, r.rows);\n        fact(TV.saved, r.saved);\n        li.appendChild(facts);\n        var ans = el('p', 'azar-team__answer' + (r.answer ? '' : ' is-empty'), r.answer ? String(r.answer) : TV.noAnswer);\n        ans.dir = 'auto';\n        li.appendChild(ans);\n        ol.appendChild(li);\n      });\n      sec.appendChild(ol);\n      list.appendChild(sec);\n    });\n    var msg = teamQ('[data-team-msg]');\n    msg.textContent = shown ? '' : TV.empty;\n    msg.hidden = !!shown;\n  }\n\n  /* ---------- Daily Cash \u2013 \u0627\u0644\u0635\u0646\u062F\u0648\u0642 (Elio 28/10/2026) ----------\n     Owners only: the sign-in reply carries daily_cash = {pushed_at, data: {today, days}}\n     only for them, after the PIN check (Team, 28/10/2026). today is Imports & Money's\n     daily_cash_today.json as written, days is daily_cash_days.json (last 7, keyed by\n     date). Nothing is kept on the phone: the figures live in memory only. */\n  var cashPanel = root.querySelector('[data-staff-cash]');\n  var cashTabBtn = root.querySelector('[data-staff-cash-tab]');\n  var CA = cashPanel ? cashPanel.dataset : {};\n  var cashOn = false;\n  var cashSeq = 0;\n  var cashDay = '';   /* '' = today; else a day picked from the last seven */\n  var cashDays = [];\n  var cashData = null; /* the reply's daily_cash, until sign-out */\n\n  function cashQ(sel) {\n    return cashPanel.querySelector(sel);\n  }\n\n  /* Elio 31/10/2026: \"the cash only shows to me and juan\", then \"I want the daily cash to\n     appear on georges azar staff page\" (view only: the script sends can_receive false).\n     The script sends the figures only to them; the page also refuses anyone else. */\n  var CASH_IDS = ['elio-test', 'juan', 'georges'];\n\n  function setCashAccess(reply) {\n    if (!cashPanel || !cashTabBtn || !reply) return;\n    var dc = reply.daily_cash;\n    cashOn = !!dc && typeof dc === 'object' && !!person && CASH_IDS.indexOf(person.id) !== -1;\n    cashData = cashOn ? dc : null;\n    cashTabBtn.hidden = !cashOn;\n    if (cashOn && currentTab === 'cash') openCash();\n    if (!cashOn) {\n      cashPanel.hidden = true;\n      if (currentTab === 'cash') showTab('offers');\n    }\n    tabColumns();\n  }\n\n  function clearCash() {\n    cashSeq++;\n    cashOn = false;\n    cashDay = '';\n    cashDays = [];\n    cashData = null;\n    stopCashWatch();\n    cashWatchBlocked = false;\n    closeSheet();\n    if (!cashPanel) return;\n    if (cashTabBtn) cashTabBtn.hidden = true;\n    cashPanel.hidden = true;\n    cashQ('[data-cash-points]').textContent = '';\n    cashQ('[data-cash-totals]').hidden = true;\n    cashQ('[data-cash-meta]').hidden = true;\n    cashQ('[data-cash-days]').hidden = true;\n  }\n\n  function cashMsg(text) {\n    var m = cashQ('[data-cash-msg]');\n    m.textContent = text || '';\n    m.hidden = !text;\n  }\n\n  function num(v) {\n    var n = parseFloat(v);\n    return isFinite(n) ? n : 0;\n  }\n\n  function money(v, cur) {\n    var n = num(v);\n    var a = Math.abs(n);\n    var s = (n < 0 ? '-' : '') + (cur === 'LL' ? Math.round(a).toLocaleString('en-US') + ' LL' :\n      '$' + a.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 }));\n    var b = el('bdi', 'azar-cash__amt', s);\n    b.dir = 'ltr';\n    return b;\n  }\n\n  /* \"$12.00 \u00B7 450,000 LL\" on one line, each amount isolated left-to-right */\n  function pair(usd, lbp, cls) {\n    var p = el('bdi', 'azar-cash__pair' + (cls ? ' ' + cls : ''));\n    p.dir = 'ltr';\n    p.appendChild(money(usd, '$'));\n    p.appendChild(document.createTextNode(' \u00B7 '));\n    p.appendChild(money(lbp, 'LL'));\n    return p;\n  }\n\n  function cashLine(label, value, cls) {\n    var row = el('div', 'azar-cash__line' + (cls ? ' ' + cls : ''));\n    row.appendChild(el('span', 'azar-cash__label', label));\n    row.appendChild(value);\n    return row;\n  }\n\n  function cashFailed(reply) {\n    if (reply && reply.error === 'pin') return pinRefused();\n    cashMsg(reply && /unknown|type/i.test(String(reply.error || '')) ? CA.needsUpdate : CA.failed);\n  }\n\n  /* One day of daily_cash_today.json, in the names the cards use. A cash point is\n     missing until its file carries that day's date; diff_* stay null until counted. */\n  /* Received in parts (Elio 29/10/2026: \"what if a cashier at the mid of the day handed juan\n     cash, and at the end of the day another portion\"). Each part has an amount:\n     data.received[date][place] = {parts: [{id, by, name, at, usd, lbp}]}, or the same list\n     merged into the row as received_parts. An older one-tap receipt ({by, at}, or\n     received_by / received_at on the row) counts as the whole amount, so nothing older breaks. */\n  var RECEIVER_NAMES = { juan: 'Juan', elio: 'Elio', 'elio-test': 'Elio' };\n\n  function partsFor(date, place, row) {\n    var all = cashData && cashData.data && cashData.data.received;\n    var day = all && all[String(date || '')];\n    var r = day && day[String(place || '')];\n    var list = row && Array.isArray(row.received_parts) ? row.received_parts : r && Array.isArray(r.parts) ? r.parts : null;\n    if (list) return { parts: list.filter(function (x) { return x && x.at; }), full: false };\n    var old = row && row.received_at ? { by: row.received_by_id, name: row.received_by, at: row.received_at } : r && r.at ? r : null;\n    if (old) return { parts: [{ by: old.by, name: old.name, at: old.at, usd: row && row.to_receive_usd, lbp: row && row.to_receive_lbp, whole: true }], full: true };\n    return { parts: [], full: false };\n  }\n\n  function whoName(x) {\n    return x.name || RECEIVER_NAMES[x.by_id || x.by] || x.by || '';\n  }\n\n  /* how much of a cash point is received and what is left, from its parts */\n  function partState(p) {\n    var rec = p.rec || { parts: [], full: false };\n    var u = 0;\n    var l = 0;\n    rec.parts.forEach(function (x) {\n      u += num(x.usd);\n      l += num(x.lbp);\n    });\n    if (rec.full) {\n      u = num(p.usd);\n      l = num(p.lbp);\n    }\n    var leftU = num(p.usd) - u;\n    var leftL = num(p.lbp) - l;\n    var any = rec.parts.length > 0;\n    var done = rec.full || (any && leftU < 0.005 && leftL < 0.5);\n    return { usd: u, lbp: l, leftU: leftU, leftL: leftL, any: any, done: done, last: any ? rec.parts[rec.parts.length - 1] : null };\n  }\n\n  /* View Excel (Elio 29/10/2026, via HQ: \"we also would like to see a preview of the excel\n     once checking the cash on the mobile link\"). Imports & Money adds row.sheet to each cash\n     point: every value is text exactly as Excel shows it (\"\" when empty). columns = 12\n     headers, lines = up to 60 rows of 12, totals = the TOTAL row, cut / cut_note when the\n     file is longer, then the bottom of the sheet: pos_whish, should, counted, diff (in $ and\n     LL) and money_counted \"\u2713\". Values only: no file, no path, nothing to download. */\n  function sheetFor(date, place, row) {\n    if (row && row.sheet && typeof row.sheet === 'object') return row.sheet;\n    var all = cashData && cashData.data && cashData.data.sheets;\n    var day = all && all[String(date || '')];\n    var s = day && day[String(place || '')];\n    return s && typeof s === 'object' ? s : null;\n  }\n\n  function txt(v) {\n    return v == null ? '' : String(v);\n  }\n\n  /* \"-1,250.00\" or \"(5)\" read as a number; \"\" or \"-\" read as zero */\n  function nonZero(v) {\n    var t = txt(v).replace(/[,\\s$]|LL|\u0644\\.\u0644/g, '');\n    if (/^\\(.*\\)$/.test(t)) t = '-' + t.slice(1, -1);\n    var n = parseFloat(t);\n    return isFinite(n) && n !== 0;\n  }\n\n  function sheetTd(v, cls) {\n    var td = el('td', cls || '');\n    var t = txt(v);\n    if (t) {\n      var b = el('bdi', '', t);\n      b.dir = 'auto';\n      td.appendChild(b);\n    }\n    return td;\n  }\n\n  /* Profit (Elio 31/10/2026: \"Show the profit in each invoice and total profit of the day\n     when previewing the daily cash on Elio and Georges staff page of each cashier\").\n     daily_cash.data.profit = {days: {'yyyy-mm-dd': {day_profit, rows: {<place>: {profit,\n     margin_pct, cost_missing}}, doc_profit: {'SA|6596': {...}}}}}, sent only to Elio and\n     Georges (Team v46); the page also shows it to no one else. */\n  var PROFIT_IDS = ['elio-test', 'georges', 'juan']; /* Juan too (Elio 31/10/2026: \"Also make the profit show for juan as well\") */\n\n  function profitDay(date) {\n    if (!person || PROFIT_IDS.indexOf(person.id) === -1 || viewAs) return null; /* never under the master PIN */\n    var pr = cashData && cashData.data && cashData.data.profit;\n    var days = pr && typeof pr === 'object' && pr.days;\n    if (!days || typeof days !== 'object') return null;\n    var d = txt(date).trim();\n    var m = /^(\\d{1,2})[\\/.-](\\d{1,2})[\\/.-](\\d{4})$/.exec(d);\n    var iso = m ? m[3] + '-' + ('0' + m[2]).slice(-2) + '-' + ('0' + m[1]).slice(-2) : d;\n    var day = days[iso] || days[d];\n    return day && typeof day === 'object' ? day : null;\n  }\n\n  /* {profit | usd, margin_pct, cost_missing (true or a count), note}; a receipt or POS-Whish\n     has no profit, only a note (\"collection, no profit\") and shows \"\u2014\" */\n  function profitOf(v) {\n    if (v == null || v === '') return null;\n    if (typeof v !== 'object') return { profit: v };\n    var amount = v.profit != null && v.profit !== '' ? v.profit : v.usd != null && v.usd !== '' ? v.usd : null;\n    if (amount == null && !txt(v.note)) return null;\n    return Object.assign({}, v, { profit: amount });\n  }\n\n  /* \"$1,234.00 \u00B7 23%\" (Elio 31/10/2026: no \"cost missing\" notice) */\n  function profitValue(pv) {\n    var box = el('span', 'azar-cash__profit');\n    if (pv.profit == null) {\n      box.classList.add('is-none');\n      box.appendChild(document.createTextNode('\u2014'));\n      if (txt(pv.note)) box.appendChild(el('span', 'azar-cash__pnote', ' ' + txt(pv.note)));\n      return box;\n    }\n    box.appendChild(money(pv.profit, '$'));\n    if (pv.margin_pct != null && pv.margin_pct !== '') {\n      box.appendChild(document.createTextNode(' \u00B7 '));\n      var mg = el('bdi', '', Math.round(num(pv.margin_pct) * 10) / 10 + '%');\n      mg.dir = 'ltr';\n      box.appendChild(mg);\n    }\n    return box;\n  }\n\n  function docProfitFor(type, no, sheet) {\n    var day = sheet && sheet.profitDay;\n    var map = day && day.doc_profit;\n    if (!map || typeof map !== 'object') return null;\n    var k = txt(type).trim() + '|' + txt(no).trim();\n    return profitOf(map[k] || map[k.toUpperCase()]);\n  }\n\n  /* Invoice preview (Elio 29/10/2026: \"if i click on an SA code, is it possible to open it\n     and preview the document ?\"). The push sends daily_cash.data.docs keyed by the Doc no.\n     (\"Type|Doc no.\"), read from Wizard: doc, type, date, customer, salesperson,\n     currency, rate, lines [{code, desc, qty, unit, price, disc, total}], subtotal, discount,\n     vat, total, paid_by, note, cut / cut_note. Text as Wizard shows it. A doc no. with no\n     entry stays plain text. Read only, owners only, nothing kept on the phone. */\n  /* keyed \"Type|Doc no.\" as the sheet shows them (e.g. \"SA|379\"): SA 379 and S2 379\n     are different documents, so the number alone never matches (Imports & Money). */\n  function docFor(type, no, sheet) {\n    var k = txt(type).trim() + '|' + txt(no).trim();\n    if (!txt(type).trim() || !txt(no).trim()) return null;\n    var maps = [cashData && cashData.data && cashData.data.docs, sheet && sheet.docs];\n    for (var i = 0; i < maps.length; i++) {\n      var m = maps[i];\n      var d = m && typeof m === 'object' ? m[k] || m[k.toUpperCase()] : null;\n      if (d && typeof d === 'object') return d;\n    }\n    return null;\n  }\n\n  var docBox = null;\n  var docOpener = null;\n\n  function closeDoc() {\n    if (!docBox || docBox.hidden) return false;\n    docBox.hidden = true;\n    docBox.querySelector('.azar-sheet__body').textContent = '';\n    if (docOpener) docOpener.focus();\n    docOpener = null;\n    return true;\n  }\n\n  function docMeta(box, label, value) {\n    if (!txt(value)) return;\n    var row = el('div', 'azar-doc__fact');\n    row.appendChild(el('span', 'azar-cash__label', label));\n    var v = el('bdi', '', txt(value));\n    v.dir = 'auto';\n    row.appendChild(v);\n    box.appendChild(row);\n  }\n\n  function openDoc(d, key, opener, profit) {\n    if (!docBox) {\n      docBox = el('div', 'azar-sheet azar-doc');\n      docBox.setAttribute('role', 'dialog');\n      docBox.setAttribute('aria-modal', 'true');\n      var panel = el('div', 'azar-sheet__panel');\n      var bar = el('div', 'azar-sheet__bar');\n      bar.appendChild(el('h3', 'azar-sheet__title'));\n      var back = el('button', 'azar-sheet__close', CA.docBack);\n      back.type = 'button';\n      back.addEventListener('click', closeDoc);\n      bar.appendChild(back);\n      panel.appendChild(bar);\n      panel.appendChild(el('div', 'azar-sheet__body'));\n      docBox.appendChild(panel);\n      docBox.addEventListener('click', function (event) {\n        if (event.target === docBox) closeDoc();\n      });\n      root.appendChild(docBox);\n    }\n    var title = docBox.querySelector('.azar-sheet__title');\n    title.textContent = '';\n    var t = el('bdi', '', txt(d.doc) || txt(key));\n    t.dir = 'ltr';\n    title.appendChild(t);\n    var body = docBox.querySelector('.azar-sheet__body');\n    body.textContent = '';\n\n    var facts = el('div', 'azar-doc__facts');\n    docMeta(facts, CA.docDate, d.date);\n    docMeta(facts, CA.docCustomer, d.customer);\n    docMeta(facts, CA.docSales, d.salesperson);\n    docMeta(facts, CA.docPaid, d.paid_by);\n    docMeta(facts, CA.docRate, d.rate);\n    body.appendChild(facts);\n\n    var lines = Array.isArray(d.lines) ? d.lines : [];\n    if (lines.length) {\n      var heads = [['code', CA.docCode, 0], ['desc', CA.docItem, 0], ['qty', CA.docQty, 1], ['price', CA.docPrice, 1], ['disc', CA.docDisc, 1], ['total', CA.docLineTotal, 1]];\n      /* drop a column that is empty on every line (often code or disc.) */\n      heads = heads.filter(function (h) {\n        return lines.some(function (l) { return l && txt(l[h[0]]); });\n      });\n      var wrap = el('div', 'azar-sheet__scroll');\n      wrap.dir = 'ltr';\n      var table = el('table', 'azar-sheet__table azar-doc__table');\n      var thead = el('thead');\n      var hr = el('tr');\n      heads.forEach(function (h) {\n        hr.appendChild(el('th', h[2] ? 'azar-sheet__num' : '', h[1]));\n      });\n      thead.appendChild(hr);\n      table.appendChild(thead);\n      var tbody = el('tbody');\n      lines.forEach(function (l) {\n        if (!l) return;\n        var tr = el('tr');\n        heads.forEach(function (h) {\n          var v = txt(l[h[0]]);\n          if (h[0] === 'qty' && txt(l.unit)) v += ' ' + txt(l.unit);\n          if (h[0] === 'disc' && /^-?[\\d.]+$/.test(v.trim()) && nonZero(v)) v = v.trim() + '%'; /* Wizard sends the line % bare */\n          if (h[0] === 'disc' && !nonZero(v)) v = '';\n          tr.appendChild(sheetTd(v, h[2] ? 'azar-sheet__num' : h[0] === 'desc' ? 'azar-doc__desc' : ''));\n        });\n        tbody.appendChild(tr);\n      });\n      table.appendChild(tbody);\n      wrap.appendChild(table);\n      body.appendChild(wrap);\n    }\n    if (d.cut === true && txt(d.cut_note)) body.appendChild(el('p', 'azar-sheet__cut', txt(d.cut_note)));\n\n    var sums = el('table', 'azar-sheet__sums');\n    var sb = el('tbody');\n    var cur = txt(d.currency);\n    [[CA.docSubtotal, d.subtotal, 'is-info'], [CA.docDiscount, d.discount, 'is-info'], [CA.docVat, d.vat, 'is-info'], [CA.docTotal, d.total, 'is-should']].forEach(function (s) {\n      if (!txt(s[1])) return;\n      var tr = el('tr', s[2]);\n      tr.appendChild(el('th', '', s[0]));\n      tr.appendChild(sheetTd(txt(s[1]) + (cur && s[2] === 'is-should' ? ' ' + cur : ''), 'azar-sheet__num'));\n      sb.appendChild(tr);\n    });\n    if (profit) {\n      var trp = el('tr', 'is-profit');\n      trp.appendChild(el('th', '', CA.profit));\n      var tdp = el('td', 'azar-sheet__num');\n      tdp.appendChild(profitValue(profit));\n      trp.appendChild(tdp);\n      sb.appendChild(trp);\n    }\n    sums.appendChild(sb);\n    if (sb.childNodes.length) body.appendChild(sums);\n    if (txt(d.note)) {\n      var n = el('p', 'azar-doc__note');\n      n.appendChild(el('span', 'azar-cash__label', CA.docNote + ': '));\n      n.appendChild(document.createTextNode(txt(d.note)));\n      body.appendChild(n);\n    }\n\n    docOpener = opener || null;\n    docBox.hidden = false;\n    docBox.querySelector('.azar-sheet__close').focus();\n  }\n\n  var sheetBox = null;\n  var sheetOpener = null;\n\n  function closeSheet() {\n    closeDoc();\n    if (!sheetBox || sheetBox.hidden) return;\n    sheetBox.hidden = true;\n    sheetBox.querySelector('.azar-sheet__body').textContent = '';\n    if (sheetOpener) sheetOpener.focus();\n    sheetOpener = null;\n  }\n\n  function sheetSum(label, usd, lbp, cls) {\n    var diff = /is-diff/.test(cls || '');\n    var tr = el('tr', cls || '');\n    tr.appendChild(el('th', '', label));\n    tr.appendChild(sheetTd(usd, 'azar-sheet__num' + (diff && nonZero(usd) ? ' is-off' : '')));\n    tr.appendChild(sheetTd(lbp, 'azar-sheet__num' + (diff && nonZero(lbp) ? ' is-off' : '')));\n    return tr;\n  }\n\n  function openSheet(p, date, opener) {\n    if (!sheetBox) {\n      sheetBox = el('div', 'azar-sheet');\n      sheetBox.setAttribute('role', 'dialog');\n      sheetBox.setAttribute('aria-modal', 'true');\n      var panel = el('div', 'azar-sheet__panel');\n      var bar = el('div', 'azar-sheet__bar');\n      bar.appendChild(el('h3', 'azar-sheet__title'));\n      var x = el('button', 'azar-sheet__close', T.close);\n      x.type = 'button';\n      x.addEventListener('click', closeSheet);\n      bar.appendChild(x);\n      panel.appendChild(bar);\n      panel.appendChild(el('div', 'azar-sheet__body'));\n      sheetBox.appendChild(panel);\n      sheetBox.addEventListener('click', function (event) {\n        if (event.target === sheetBox) closeSheet();\n      });\n      document.addEventListener('keydown', function (event) {\n        if (event.key !== 'Escape') return;\n        if (!closeDoc() && sheetBox && !sheetBox.hidden) closeSheet();\n      });\n      root.appendChild(sheetBox);\n    }\n    var sh = p.sheet || {};\n    var shp = { docs: sh.docs, profitDay: p.profitDay };\n    var who = txt(sh.cashier) || txt(p.cashier);\n    sheetBox.querySelector('.azar-sheet__title').textContent = String(p.name || '') + (who ? ' \u2013 ' + who : '');\n    var body = sheetBox.querySelector('.azar-sheet__body');\n    body.textContent = '';\n\n    var meta = el('p', 'azar-sheet__meta');\n    var d = el('bdi', '', txt(sh.date) || txt(date));\n    d.dir = 'ltr';\n    meta.appendChild(d);\n    var bits = [];\n    if (txt(sh.rate)) bits.push([CA.sheetRate, txt(sh.rate)]);\n    if (txt(sh.float_usd) || txt(sh.float_lbp)) bits.push([CA.sheetFloat, [txt(sh.float_usd), txt(sh.float_lbp)].filter(Boolean).join(' \u00B7 ')]);\n    bits.forEach(function (bit) {\n      meta.appendChild(document.createTextNode(' \u00B7 ' + bit[0] + ' '));\n      var v = el('bdi', '', bit[1]);\n      v.dir = 'ltr';\n      meta.appendChild(v);\n    });\n    meta.appendChild(document.createTextNode(' \u00B7 ' + CA.sheetReadonly));\n    body.appendChild(meta);\n\n    var chips = el('div', 'azar-sheet__chips');\n    var ticked = /\u2713|true|yes/i.test(txt(sh.money_counted));\n    chips.appendChild(el('span', 'azar-cash__state ' + (ticked ? 'is-counted' : 'is-estimate'), ticked ? CA.sheetTickYes : CA.sheetTickNo));\n    var ps = partState(p);\n    chips.appendChild(el('span', 'azar-cash__state ' + (ps.done ? 'is-received' : ps.any ? 'is-partly' : 'is-estimate'), ps.done ?\n      CA.receivedBy + ' ' + whoName(ps.last) + (hhmm(ps.last.at) ? ', ' + hhmm(ps.last.at) : '') :\n      ps.any ? CA.partly + ' ' + amountText(ps.usd, ps.lbp) : CA.notReceived.replace(/ \u2713/g, '')));\n    body.appendChild(chips);\n\n    var cols = Array.isArray(sh.columns) ? sh.columns : [];\n    var lines = Array.isArray(sh.lines) ? sh.lines : [];\n    var tot = Array.isArray(sh.totals) ? sh.totals : null;\n    /* money columns (\"$\" / \"LL\" in the header) line up to the right */\n    var isNum = cols.map(function (c) { return /\\$|LL/.test(txt(c)); });\n    if (!cols.length && !lines.length) {\n      body.appendChild(el('p', 'azar-staff__calm', CA.sheetNone));\n    } else {\n      var wrap = el('div', 'azar-sheet__scroll');\n      wrap.dir = 'ltr'; /* the sheet reads left to right, as in Excel */\n      var table = el('table', 'azar-sheet__table');\n      var thead = el('thead');\n      var hr = el('tr');\n      cols.forEach(function (c, i) {\n        hr.appendChild(el('th', isNum[i] ? 'azar-sheet__num' : '', txt(c)));\n      });\n      thead.appendChild(hr);\n      table.appendChild(thead);\n      var tbody = el('tbody');\n      var docCol = -1;\n      var typeCol = -1;\n      cols.forEach(function (c, i) {\n        if (docCol === -1 && /doc/i.test(txt(c))) docCol = i;\n        if (typeCol === -1 && /^\\s*type\\s*$/i.test(txt(c))) typeCol = i;\n      });\n      var anyDoc = false;\n      /* a Profit column when any invoice on this sheet has a profit */\n      var withProfit = typeCol !== -1 && docCol !== -1 && lines.some(function (line) {\n        return Array.isArray(line) && docProfitFor(line[typeCol], line[docCol], shp);\n      });\n      if (withProfit) hr.appendChild(el('th', 'azar-sheet__num azar-sheet__profit', CA.profit));\n      lines.forEach(function (line) {\n        var tr = el('tr');\n        (Array.isArray(line) ? line : []).forEach(function (v, i) {\n          var dd = i === docCol && typeCol !== -1 && Array.isArray(line) ? docFor(line[typeCol], v, sh) : null;\n          if (!dd) return tr.appendChild(sheetTd(v, isNum[i] ? 'azar-sheet__num' : ''));\n          anyDoc = true;\n          var td = el('td');\n          var b = el('button', 'azar-sheet__doc', txt(v));\n          b.type = 'button';\n          b.addEventListener('click', function () {\n            openDoc(dd, v, b, docProfitFor(line[typeCol], v, shp));\n          });\n          td.appendChild(b);\n          tr.appendChild(td);\n        });\n        if (withProfit) {\n          var pv = Array.isArray(line) ? docProfitFor(line[typeCol], line[docCol], shp) : null;\n          var ptd = el('td', 'azar-sheet__num azar-sheet__profit');\n          if (pv) ptd.appendChild(profitValue(pv));\n          tr.appendChild(ptd);\n        }\n        tbody.appendChild(tr);\n      });\n      if (tot) {\n        var trt = el('tr', 'azar-sheet__row--total');\n        tot.forEach(function (v, i) {\n          trt.appendChild(sheetTd(v, isNum[i] ? 'azar-sheet__num' : ''));\n        });\n        if (withProfit) {\n          var rowP = p.profit ? profitValue(p.profit) : null;\n          var ttd = el('td', 'azar-sheet__num azar-sheet__profit');\n          if (rowP) ttd.appendChild(rowP);\n          trt.appendChild(ttd);\n        }\n        tbody.appendChild(trt);\n      }\n      table.appendChild(tbody);\n      wrap.appendChild(table);\n      if (anyDoc) body.appendChild(el('p', 'azar-sheet__hint', CA.docHint));\n      body.appendChild(wrap);\n    }\n    if (sh.cut === true && txt(sh.cut_note)) body.appendChild(el('p', 'azar-sheet__cut', txt(sh.cut_note)));\n\n    var sums = el('table', 'azar-sheet__sums');\n    var sth = el('thead');\n    var shr = el('tr');\n    shr.appendChild(el('th', ''));\n    shr.appendChild(el('th', 'azar-sheet__num', '$'));\n    shr.appendChild(el('th', 'azar-sheet__num', 'LL'));\n    sth.appendChild(shr);\n    sums.appendChild(sth);\n    var sb = el('tbody');\n    if (txt(sh.pos_whish_usd) || txt(sh.pos_whish_lbp)) sb.appendChild(sheetSum(CA.sheetPosWhish, sh.pos_whish_usd, sh.pos_whish_lbp, 'is-info'));\n    if (txt(sh.cheque_usd) || txt(sh.cheque_lbp)) sb.appendChild(sheetSum(CA.sheetCheque, sh.cheque_usd, sh.cheque_lbp, 'is-info'));\n    if (txt(sh.expenses_usd) || txt(sh.expenses_lbp)) sb.appendChild(sheetSum(CA.sheetExpenses, sh.expenses_usd, sh.expenses_lbp, 'is-info'));\n    sb.appendChild(sheetSum(CA.sheetShould, sh.should_usd, sh.should_lbp, 'is-should'));\n    sb.appendChild(sheetSum(CA.sheetCounted, sh.counted_usd, sh.counted_lbp, 'is-counted'));\n    var off = nonZero(sh.diff_usd) || nonZero(sh.diff_lbp);\n    sb.appendChild(sheetSum(CA.sheetDiff, sh.diff_usd, sh.diff_lbp, 'is-diff' + (off ? ' is-off' : '')));\n    sums.appendChild(sb);\n    body.appendChild(sums);\n\n    sheetOpener = opener || null;\n    sheetBox.hidden = false;\n    sheetBox.querySelector('.azar-sheet__close').focus();\n  }\n\n  function cashDayView(day) {\n    day = day || {};\n    var t = day.totals || {};\n    var pd = profitDay(day.date);\n    return {\n      profitDay: pd,\n      date: day.date,\n      updated: day.saved_at,\n      rate: day.rate,\n      points: (Array.isArray(day.rows) ? day.rows : []).map(function (r) {\n        return {\n          name: r.place, cashier: r.cashier, usd: r.to_receive_usd, lbp: r.to_receive_lbp,\n          counted: r.counted, diff_usd: r.diff_usd, diff_lbp: r.diff_lbp,\n          whish_usd: r.whish_usd, whish_lbp: r.whish_lbp, saved: r.file_saved,\n          counted_tick: r.counted_tick, rec: partsFor(day.date, r.place, r), raw: r,\n          sheet: sheetFor(day.date, r.place, r),\n          profit: pd && pd.rows ? profitOf(pd.rows[r.place]) : null, profitDay: pd,\n          cheque_usd: r.cheque_usd, cheque_lbp: r.cheque_lbp,\n          /* the five new figures never show under the master PIN (Elio 02/11/2026) */\n          over_usd: viewAs ? null : r.over_usd, over_lbp: viewAs ? null : r.over_lbp,\n          dup_whish_usd: viewAs ? null : r.dup_whish_usd, dup_whish_lbp: viewAs ? null : r.dup_whish_lbp,\n          whish_check: viewAs ? '' : r.whish_check\n        };\n      }),\n      totals: { usd: t.usd, lbp: t.lbp, usd_at_rate: t.total_usd, cheque_usd: t.cheque_usd, cheque_lbp: t.cheque_lbp }\n    };\n  }\n\n  function openCash() {\n    if (!cashPanel || !cashOn) return;\n    var data = cashData && cashData.data;\n    var past = data && data.days && typeof data.days === 'object' ? data.days : {};\n    var todayDay = data && data.today;\n    var list = [];\n    if (todayDay && todayDay.date) list.push(String(todayDay.date));\n    Object.keys(past).sort().reverse().forEach(function (d) {\n      if (list.indexOf(d) === -1) list.push(d);\n    });\n    cashDays = list.slice(0, 7);\n    if (cashDays.indexOf(cashDay) === -1) cashDay = '';\n    var day = cashDay && cashDay !== String((todayDay || {}).date) ? past[cashDay] : todayDay;\n    if (!day) {\n      cashQ('[data-cash-points]').textContent = '';\n      cashQ('[data-cash-totals]').hidden = true;\n      cashQ('[data-cash-meta]').hidden = true;\n      cashQ('[data-cash-days]').hidden = true;\n      return cashMsg(CA.empty);\n    }\n    var view = cashDayView(day);\n    view.days = cashDays;\n    renderCash(view);\n  }\n\n  /* Self-refresh (Elio 30/10/2026, via Imports & Money: \"Juan's page refreshes itself: while\n     the Daily Cash tab is open on his phone, it fetches the figures every minute\"). Only while\n     the tab is open and the page visible, and only around hand-over (Mon-Fri 16:00-18:00,\n     Sat 13:00-15:00 Beirut) to spare script calls. Quiet: no loading text, the chosen day\n     and an open sheet stay put, and it waits while an amount form is open or a save runs. */\n  var cashTimer = null;\n  var cashWatchBlocked = false; /* set by a refused auto sign-in, cleared on sign-out */\n\n  function cashWindow() {\n    try {\n      var parts = {};\n      new Intl.DateTimeFormat('en-GB', { timeZone: 'Asia/Beirut', weekday: 'short', hour: '2-digit', hourCycle: 'h23' })\n        .formatToParts(new Date()).forEach(function (x) { parts[x.type] = x.value; });\n      var h = parseInt(parts.hour, 10);\n      if (parts.weekday === 'Sun') return false;\n      return parts.weekday === 'Sat' ? h >= 13 && h < 15 : h >= 16 && h < 18;\n    } catch (e) {\n      return true;\n    }\n  }\n\n  function startCashWatch() {\n    if (!cashOn || cashTimer || cashWatchBlocked) return;\n    cashTimer = setInterval(cashTick, 60000);\n  }\n\n  function stopCashWatch() {\n    if (cashTimer) clearInterval(cashTimer);\n    cashTimer = null;\n  }\n\n  function cashBusy() {\n    return !!cashPanel.querySelector('.azar-cash__form, button:disabled');\n  }\n\n  function cashTick() {\n    if (cashWatchBlocked || document.hidden || currentTab !== 'cash' || !cashOn || !SHEET || !person || !cashWindow() || cashBusy()) return;\n    var seq = ++cashSeq;\n    var who = person;\n    call({ type: 'login', person: who.id }, function (reply) {\n      if (seq !== cashSeq || person !== who) return;\n      /* Team 30/10/2026: never repeat a refused sign-in, or a stale PIN would lock the\n         person after ten minutes. A wrong PIN signs out; locked / unknown person stop the\n         timer until the next real sign-in. */\n      if (reply && reply.error === 'pin') return pinRefused();\n      if (reply && /^(locked|unknown person)$/.test(String(reply.error || ''))) {\n        cashWatchBlocked = true;\n        return stopCashWatch();\n      }\n      if (!reply || !reply.ok || !reply.daily_cash || typeof reply.daily_cash !== 'object') return; /* quiet: try again next minute */\n      if (cashBusy() || currentTab !== 'cash') {\n        cashData = reply.daily_cash; /* shown on the next draw, nothing jumps under his fingers */\n        return;\n      }\n      setCashAccess(reply);\n    }, 45000);\n  }\n\n  document.addEventListener('visibilitychange', function () {\n    if (!document.hidden && currentTab === 'cash' && cashOn) cashTick();\n  });\n\n  /* Refresh = sign in again with the PIN in memory: the script hands the latest push. */\n  function refreshCash() {\n    if (!SHEET || !person || !cashOn) return;\n    var seq = ++cashSeq;\n    var who = person;\n    cashMsg(CA.loading);\n    call({ type: 'login', person: who.id }, function (reply) {\n      if (seq !== cashSeq || person !== who) return;\n      if (!reply || !reply.ok) return cashFailed(reply);\n      useReply(reply);\n      openCash();\n    }, 45000);\n  }\n\n  function renderDays(reply) {\n    var box = cashQ('[data-cash-days]');\n    box.textContent = '';\n    box.hidden = cashDays.length < 2;\n    cashDays.forEach(function (d, i) {\n      var b = el('button', 'azar-cash__day', i === 0 ? '\u0627\u0644\u064A\u0648\u0645 \u00B7 Today' : d.slice(5).split('-').reverse().join('/'));\n      b.type = 'button';\n      var on = cashDay ? d === cashDay : i === 0;\n      b.classList.toggle('is-active', on);\n      b.setAttribute('aria-pressed', on ? 'true' : 'false');\n      b.addEventListener('click', function () {\n        cashDay = i === 0 ? '' : d;\n        openCash();\n      });\n      box.appendChild(b);\n    });\n  }\n\n  /* Received \u2013 \u0627\u0633\u062A\u0644\u0645\u062A (Elio 28/10/2026, via HQ: \"It is more preferable that me or juan mention\n     that we recieved the money as well along with the tick of the employees on the excel\").\n     Three steps per cash point: from the record \u2192 counted by the cashier \u2192 received by Elio\n     or Juan. Only they get the button (the script says can_receive and checks it again);\n     Georges sees the steps. The receipt is the script's record, never kept on the phone. */\n  var RECEIVERS = ['elio-test', 'juan'];\n\n  function canReceive() {\n    if (!person) return false;\n    if (cashData && cashData.can_receive != null) return !!cashData.can_receive;\n    return RECEIVERS.indexOf(person.id) !== -1;\n  }\n\n  function amountText(usd, lbp) {\n    var bits = [];\n    if (num(usd)) bits.push('$' + num(usd).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 }));\n    if (num(lbp)) bits.push(Math.round(num(lbp)).toLocaleString('en-US') + ' LL');\n    return '\\u2066' + (bits.join(' + ') || '$0.00') + '\\u2069';\n  }\n\n  function hhmm(stamp) {\n    var m = String(stamp || '').match(/(\\d{1,2}:\\d{2})/);\n    return m ? m[1] : '';\n  }\n\n  function plainAmount(n, lbp) {\n    if (!(n > 0)) return '';\n    return lbp ? String(Math.round(n)) : String(Math.round(n * 100) / 100);\n  }\n\n  function readAmount(input) {\n    var n = parseFloat(String(input.value || '').replace(/[,\\s]/g, ''));\n    return isFinite(n) && n > 0 ? n : 0;\n  }\n\n  /* undo = the part to take back; otherwise a new part of usd / lbp */\n  function sendPart(p, date, part, usd, lbp, busy, note) {\n    if (!SHEET || !person || !p.raw) return;\n    var who = person;\n    busy.forEach(function (b) { b.disabled = true; });\n    note.textContent = CA.saving;\n    note.hidden = false;\n    var payload = { type: 'daily_cash_receive', person: who.id, date: String(date || ''), place: String(p.name || ''), point: String(p.name || '') };\n    if (part) {\n      payload.undo = true;\n      if (part.id != null) payload.part_id = part.id;\n    } else {\n      payload.usd = usd;\n      payload.lbp = lbp;\n    }\n    call(payload, function (reply) {\n      if (person !== who) return;\n      busy.forEach(function (b) { b.disabled = false; });\n      if (reply && reply.error === 'pin') return pinRefused();\n      if (!reply || !reply.ok) {\n        note.textContent = reply && reply.error === 'undo not allowed' ? CA.undoRefused :\n          reply && reply.error === 'locked' ? T.locked :\n          reply && /unknown|type/i.test(String(reply.error || '')) ? CA.needsUpdate : CA.saveFailed;\n        return;\n      }\n      if (reply.daily_cash && typeof reply.daily_cash === 'object') {\n        cashData = reply.daily_cash;\n      } else if (cashData && cashData.data && reply.received && typeof reply.received === 'object') {\n        cashData.data.received = reply.received;\n      } else if (cashData && cashData.data) {\n        /* a reply with only the part: keep the list in memory until the next sign-in */\n        var all = cashData.data.received = cashData.data.received || {};\n        var day = all[String(date || '')] = all[String(date || '')] || {};\n        var rec = day[String(p.name || '')];\n        if (!rec || !Array.isArray(rec.parts)) rec = day[String(p.name || '')] = { parts: [] };\n        if (part) {\n          rec.parts = rec.parts.filter(function (x) { return x !== part && (part.id == null || x.id !== part.id); });\n        } else {\n          rec.parts.push(reply.part || { by: who.id, name: who.name, at: today() + ' ' + new Date().toTimeString().slice(0, 5), usd: usd, lbp: lbp });\n        }\n        delete p.raw.received_parts;\n      }\n      openCash();\n    }, 30000);\n  }\n\n  /* The Received button opens a small form, filled with what is still left */\n  function partForm(p, date, ps, act, btn, note) {\n    btn.hidden = true;\n    var form = el('div', 'azar-cash__form');\n    form.appendChild(el('p', 'azar-cash__hint', CA.amountHint));\n    var row = el('div', 'azar-cash__fields');\n    function field(label, value) {\n      var lab = el('label', 'azar-cash__field');\n      lab.appendChild(el('span', '', label));\n      var inp = el('input');\n      inp.type = 'text';\n      inp.inputMode = 'decimal';\n      inp.dir = 'ltr';\n      inp.autocomplete = 'off';\n      inp.value = value;\n      lab.appendChild(inp);\n      row.appendChild(lab);\n      return inp;\n    }\n    var inU = field('$', plainAmount(ps.leftU, false));\n    var inL = field('LL', plainAmount(ps.leftL, true));\n    form.appendChild(row);\n    var bar = el('div', 'azar-cash__formbar');\n    var save = el('button', 'azar-cash__recv', CA.save);\n    save.type = 'button';\n    var cancel = el('button', 'azar-cash__recv is-undo', CA.cancel);\n    cancel.type = 'button';\n    bar.appendChild(save);\n    bar.appendChild(cancel);\n    form.appendChild(bar);\n    act.insertBefore(form, note);\n    inU.focus();\n    cancel.addEventListener('click', function () {\n      act.removeChild(form);\n      btn.hidden = false;\n      note.hidden = true;\n    });\n    save.addEventListener('click', function () {\n      var u = readAmount(inU);\n      var l = readAmount(inL);\n      if (!u && !l) {\n        note.textContent = CA.zero;\n        note.hidden = false;\n        return;\n      }\n      var who = p.cashier || p.name || '';\n      var ask = CA.confirm.replace(/\\{amount\\}/g, amountText(u, l)).replace(/\\{cashier\\}/g, who);\n      if (u > Math.max(ps.leftU, 0) + 0.005 || l > Math.max(ps.leftL, 0) + 0.5) {\n        ask = CA.over.replace(/\\{left\\}/g, amountText(Math.max(ps.leftU, 0), Math.max(ps.leftL, 0))) + '\\n\\n' + ask;\n      }\n      var counted = p.counted === true || p.counted === 'yes' || p.counted_tick === true;\n      if (!counted) ask = CA.warnUncounted.replace(/\\{cashier\\}/g, who) + '\\n\\n' + ask;\n      if (!window.confirm(ask)) return;\n      sendPart(p, date, null, u, l, [save, cancel], note);\n    });\n  }\n\n  function renderCash(reply) {\n    renderDays(reply);\n    var points = (Array.isArray(reply.points) ? reply.points : []).filter(function (p) { return p && (p.name || p.cashier); });\n    var meta = cashQ('[data-cash-meta]');\n    meta.textContent = '';\n    if (reply.date) {\n      var d = el('bdi', '', String(reply.date));\n      d.dir = 'ltr';\n      meta.appendChild(d);\n    }\n    if (reply.updated) {\n      meta.appendChild(document.createTextNode(' \u00B7 ' + CA.updated + ' '));\n      var u = el('bdi', '', String(reply.updated));\n      u.dir = 'ltr';\n      meta.appendChild(u);\n    }\n    var rate = num(reply.rate);\n    if (rate > 0) {\n      meta.appendChild(document.createTextNode(' \u00B7 ' + CA.rate + ' '));\n      var r = el('bdi', '', Math.round(rate).toLocaleString('en-US'));\n      r.dir = 'ltr';\n      meta.appendChild(r);\n    }\n    meta.hidden = !meta.childNodes.length;\n\n    var ol = cashQ('[data-cash-points]');\n    ol.textContent = '';\n    cashMsg(points.length ? '' : CA.empty);\n    var sumUsd = 0;\n    var sumLbp = 0;\n    var recUsd = 0;\n    var recLbp = 0;\n    var chSumUsd = 0;\n    var chSumLbp = 0;\n    points.forEach(function (p) {\n      sumUsd += num(p.usd);\n      sumLbp += num(p.lbp);\n      chSumUsd += num(p.cheque_usd);\n      chSumLbp += num(p.cheque_lbp);\n      var li = el('li', 'azar-staff__ncard azar-cash__point');\n      var head = el('header', 'azar-cash__phead');\n      head.appendChild(el('h3', 'azar-cash__pname', String(p.name || '') + (p.cashier ? ' \u2013 ' + p.cashier : '')));\n      var counted = p.counted === true || p.counted === 'yes' || p.counted_tick === true;\n      var ps = partState(p);\n      recUsd += ps.usd;\n      recLbp += ps.lbp;\n      head.appendChild(el('span', 'azar-cash__state ' + (ps.done ? 'is-received' : ps.any ? 'is-partly' : counted ? 'is-counted' : 'is-estimate'),\n        ps.done ? CA.received : ps.any ? CA.partly : counted ? CA.counted : CA.estimate));\n      li.appendChild(head);\n      var steps = el('ol', 'azar-cash__steps');\n      steps.appendChild(el('li', 'is-done' + (counted ? '' : ' is-now'), CA.stepRecord));\n      steps.appendChild(el('li', counted ? 'is-done' : '', counted ? CA.countedBy + ' ' + (p.cashier || '') : CA.countedBy.replace(/ \u2713/g, '') + ' ' + (p.cashier || '')));\n      var recText = ps.done ? CA.receivedBy + ' ' + whoName(ps.last) + (hhmm(ps.last.at) ? ', ' + hhmm(ps.last.at) : '') :\n        ps.any ? CA.partly + ' ' + amountText(ps.usd, ps.lbp) : CA.notReceived.replace(/ \u2713/g, '');\n      steps.appendChild(el('li', ps.done ? 'is-done is-received' : ps.any ? 'is-partly' : '', recText));\n      li.appendChild(steps);\n      li.appendChild(cashLine(CA.receive, pair(p.usd, p.lbp), 'azar-cash__line--main'));\n      /* cheques are collected too, but are not in the cash above (Imports & Money, 29/10/2026) */\n      if (num(p.cheque_usd) || num(p.cheque_lbp)) li.appendChild(cashLine(CA.cheque, pair(p.cheque_usd, p.cheque_lbp), 'azar-cash__line--cheque'));\n      var off = num(p.diff_usd) !== 0 || num(p.diff_lbp) !== 0;\n      if (counted && (p.diff_usd != null || p.diff_lbp != null)) li.appendChild(cashLine(CA.diff, pair(p.diff_usd, p.diff_lbp, off ? 'is-off' : ''), off ? 'is-off' : ''));\n      /* counted MORE than expected: shown beside the difference, calm, not an error (Elio 02/11/2026) */\n      if (num(p.over_usd) || num(p.over_lbp)) li.appendChild(cashLine(CA.over, pair(p.over_usd, p.over_lbp), 'azar-cash__line--over'));\n      /* a small warning under the difference: the extra looks like Whish counted as cash */\n      if (txt(p.whish_check).trim()) {\n        var wc = el('p', 'azar-cash__whishcheck', txt(p.whish_check).trim());\n        wc.dir = 'auto';\n        li.appendChild(wc);\n      }\n      if (num(p.whish_usd) || num(p.whish_lbp)) li.appendChild(cashLine(CA.whish, pair(p.whish_usd, p.whish_lbp), 'azar-cash__line--info'));\n      /* Whish typed on a line that also has the same money in Cash in: taken off cash once */\n      if (num(p.dup_whish_usd) || num(p.dup_whish_lbp)) {\n        var dn = cashLine(CA.dupWhish, pair(p.dup_whish_usd, p.dup_whish_lbp), 'azar-cash__line--info azar-cash__line--dup');\n        li.appendChild(dn);\n        li.appendChild(el('p', 'azar-cash__dupnote', CA.dupNote));\n      }\n      if (p.profit) li.appendChild(cashLine(CA.profit, profitValue(p.profit), 'azar-cash__line--profit'));\n      if (p.saved) {\n        var sv = el('bdi', '', String(p.saved));\n        sv.dir = 'ltr';\n        li.appendChild(cashLine(CA.saved, sv, 'azar-cash__line--info'));\n      }\n      if (p.sheet) {\n        var sbtn = el('button', 'azar-cash__sheet', CA.sheetBtn);\n        sbtn.type = 'button';\n        (function (point, b) {\n          b.addEventListener('click', function () {\n            openSheet(point, reply.date, b);\n          });\n        })(p, sbtn);\n        li.appendChild(sbtn);\n      }\n      var mayAct = canReceive() && p.raw;\n      var note = el('p', 'azar-cash__note');\n      note.hidden = true;\n      /* each part on its own line; the one who took it may undo it the same day */\n      if (ps.any && !p.rec.full) {\n        var plist = el('ul', 'azar-cash__parts');\n        p.rec.parts.forEach(function (x) {\n          var pli = el('li', 'azar-cash__part');\n          var txtBox = el('span', '');\n          txtBox.appendChild(document.createTextNode(amountText(x.usd, x.lbp) + ' \u00B7 ' + whoName(x) + (hhmm(x.at) ? ' \u00B7 ' + hhmm(x.at) : '')));\n          pli.appendChild(txtBox);\n          var xb = x.by_id || x.by;\n          var mineX = mayAct && (xb === person.id || (xb === 'elio' && person.id === 'elio-test')) && String(x.at).indexOf(today()) === 0;\n          if (mineX) {\n            var ub = el('button', 'azar-cash__undo', CA.undo);\n            ub.type = 'button';\n            ub.addEventListener('click', function () {\n              if (!window.confirm(CA.undoConfirm.replace(/\\{amount\\}/g, amountText(x.usd, x.lbp)))) return;\n              sendPart(p, reply.date, x, 0, 0, [ub], note);\n            });\n            pli.appendChild(ub);\n          }\n          plist.appendChild(pli);\n        });\n        li.appendChild(plist);\n      }\n      if (ps.any && !ps.done) li.appendChild(cashLine(CA.left, pair(Math.max(ps.leftU, 0), Math.max(ps.leftL, 0)), 'azar-cash__line--left'));\n      if (mayAct) {\n        var act = el('div', 'azar-cash__act');\n        if (p.rec.full) {\n          /* an older one-tap receipt: undo it as before */\n          var old = p.rec.parts[0];\n          if ((old.by === person.id || (old.by === 'elio' && person.id === 'elio-test')) && String(old.at).indexOf(today()) === 0) {\n            var ob = el('button', 'azar-cash__recv is-undo', CA.undo);\n            ob.type = 'button';\n            ob.addEventListener('click', function () {\n              sendPart(p, reply.date, old, 0, 0, [ob], note);\n            });\n            act.appendChild(ob);\n          }\n        } else if (!ps.done) {\n          var btn = el('button', 'azar-cash__recv', CA.receiveBtn);\n          btn.type = 'button';\n          btn.addEventListener('click', function () {\n            partForm(p, reply.date, ps, act, btn, note);\n          });\n          act.appendChild(btn);\n        }\n        act.appendChild(note);\n        li.appendChild(act);\n      } else {\n        li.appendChild(note);\n      }\n      ol.appendChild(li);\n    });\n\n    var tot = reply.totals || {};\n    var tUsd = tot.usd != null ? num(tot.usd) : sumUsd;\n    var tLbp = tot.lbp != null ? num(tot.lbp) : sumLbp;\n    var tAt = tot.usd_at_rate != null ? num(tot.usd_at_rate) : rate > 0 ? tUsd + tLbp / rate : null;\n    var box = cashQ('[data-cash-totals]');\n    box.textContent = '';\n    box.hidden = !points.length;\n    if (points.length) {\n      box.appendChild(cashLine(CA.total, pair(tUsd, tLbp), 'azar-cash__line--main'));\n      var chUsd = tot.cheque_usd != null ? num(tot.cheque_usd) : chSumUsd;\n      var chLbp = tot.cheque_lbp != null ? num(tot.cheque_lbp) : chSumLbp;\n      if (chUsd || chLbp) box.appendChild(cashLine(CA.cheque, pair(chUsd, chLbp), 'azar-cash__line--cheque'));\n      if (tAt != null) box.appendChild(cashLine(CA.atRate, money(tAt, '$'), 'azar-cash__line--grand'));\n      box.appendChild(cashLine(CA.receivedTotal, pair(recUsd, recLbp), 'azar-cash__line--recv'));\n      box.appendChild(cashLine(CA.left, pair(sumUsd - recUsd, sumLbp - recLbp), 'azar-cash__line--left'));\n      var pdDay = reply.profitDay;\n      if (pdDay) {\n        var dp = profitOf(pdDay.day_profit);\n        if (!dp && pdDay.rows && typeof pdDay.rows === 'object') {\n          var any = false;\n          var sumP = 0;\n          Object.keys(pdDay.rows).forEach(function (k) {\n            var rp = profitOf(pdDay.rows[k]);\n            if (rp && rp.profit != null) {\n              any = true;\n              sumP += num(rp.profit);\n            }\n          });\n          dp = any ? { profit: sumP } : null;\n        }\n        if (dp) box.appendChild(cashLine(CA.dayProfit, profitValue(dp), 'azar-cash__line--profit'));\n      }\n    }\n  }\n\n  if (cashPanel) {\n    cashQ('[data-cash-refresh]').addEventListener('click', refreshCash);\n  }\n\n  if (shelvesPanel) {\n    shelfQ('[data-shelf-sum-btn]').addEventListener('click', function (event) {\n      openShelfSum(event.currentTarget);\n    });\n  }\n\n  /* ---------- Start ---------- */\n  renderNames();\n\n  /* Back on the same phone, same day: skip straight to the list. With the Sheet\n     script the PIN is needed again for sending, so a phone signed in before the\n     script checked PINs asks once more. */\n  var savedSession = null;\n  try {\n    savedSession = JSON.parse(store(SESSION_KEY) || 'null');\n  } catch (e) {\n    savedSession = null;\n  }\n  var sessionMatch = savedSession && savedSession.token && roster.filter(function (p) {\n    return p.id === savedSession.id;\n  })[0];\n  if (SHEET && sessionMatch && !root.classList.contains('azar-staff--kiosk')) {\n    sessionToken = String(savedSession.token);\n    store('azar-staff:pin', '');\n    openFor(sessionMatch, true);\n    (function tokenLogin() {\n      call({ type: 'login', person: sessionMatch.id }, function (reply) {\n        if (person !== sessionMatch) return;\n        if (reply && reply.ok) return useReply(reply);\n        if (reply && (reply.error === 'token' || reply.error === 'pin')) return sessionEnded(sessionMatch);\n        if (reply && reply.error === 'device') return; /* call() has shown the waiting screen */\n        if (!reply || reply.error === 'locked') setTimeout(tokenLogin, 60000); /* no signal: keep the session */\n      });\n    })();\n  }\n  var savedId = store('azar-staff:person');\n  var savedDay = store('azar-staff:day');\n  var savedPin = store('azar-staff:pin');\n  if (!sessionToken && savedId && savedDay === today() && !root.classList.contains('azar-staff--kiosk')) {\n    var match = roster.filter(function (p) {\n      return p.id === savedId;\n    })[0];\n    if (match && (!SHEET || savedPin)) {\n      sessionPin = savedPin || null;\n      openFor(match, true);\n      if (SHEET) {\n        call({ type: 'login', person: match.id, pin: savedPin }, function (reply) {\n          if (person !== match) return;\n          if (reply && reply.ok) useReply(reply);\n          else if (reply && reply.error === 'pin') pinRefused(); /* the PIN was changed: sign in again */\n          else if (!reply || reply.error === 'locked' || reply.error === 'paused') {\n            noData(reply ? lockText(reply) : T.noDataOffline);\n            retryOrders(match, savedPin); /* keep the session */\n          } else if (!reply.error || reply.error !== 'device') noData(T.noDataOther);\n        });\n      }\n    }\n  }\n})();\n\n/* Offer row (Elio 16/10/2026): keeps the \"1 / 4\" counter and the bars in step\n   with the card in view, and a tap on a bar slides to that card. Works in\n   either direction: the active card is the one whose start edge is nearest the\n   row's start edge (the right edge on this dir=rtl page), measured on screen,\n   so the browser's negative scrollLeft in RTL never matters. */\n(function () {\n  var box = document.querySelector('[data-staff-offers]');\n  if (!box) return;\n  var track = box.querySelector('[data-staff-offers-track]');\n  var dots = box.querySelectorAll('[data-staff-offers-dot]');\n  var count = box.querySelector('[data-staff-offers-count] span');\n  if (!track || !dots.length) return;\n  var cards = track.children;\n  var current = 0;\n\n  function isRtl() {\n    return getComputedStyle(track).direction === 'rtl';\n  }\n\n  function offsetOf(card) {\n    var t = track.getBoundingClientRect();\n    var c = card.getBoundingClientRect();\n    return isRtl() ? t.right - c.right : c.left - t.left;\n  }\n\n  function update() {\n    var best = 0;\n    var bestD = Infinity;\n    for (var i = 0; i < cards.length; i++) {\n      var d = Math.abs(offsetOf(cards[i]));\n      if (d < bestD) { bestD = d; best = i; }\n    }\n    if (best === current) return;\n    current = best;\n    for (var j = 0; j < dots.length; j++) {\n      dots[j].classList.toggle('is-active', j === best);\n      if (j === best) dots[j].setAttribute('aria-current', 'true');\n      else dots[j].removeAttribute('aria-current');\n    }\n    if (count) count.textContent = (best + 1) + ' / ' + cards.length;\n  }\n\n  var raf = 0;\n  track.addEventListener('scroll', function () {\n    if (raf) return;\n    raf = requestAnimationFrame(function () { raf = 0; update(); });\n  }, { passive: true });\n  track.addEventListener('scrollend', update);\n\n  function goTo(i) {\n    var card = cards[Math.max(0, Math.min(cards.length - 1, i))];\n    if (!card) return;\n    var d = offsetOf(card);\n    var left = isRtl() ? -d : d;\n    var before = track.scrollLeft;\n    track.scrollBy({ left: left, behavior: 'smooth' });\n    /* If the phone does not animate (battery saver, reduced motion), jump. */\n    setTimeout(function () {\n      if (Math.abs(d) > 2 && track.scrollLeft === before) track.scrollBy({ left: left });\n      update();\n    }, 700);\n  }\n\n  for (var k = 0; k < dots.length; k++) {\n    dots[k].addEventListener('click', (function (i) { return function () { goTo(i); }; })(k));\n  }\n\n  /* Arrow keys follow the reading direction: in Arabic, left is \"next\". */\n  track.addEventListener('keydown', function (e) {\n    if (e.key !== 'ArrowLeft' && e.key !== 'ArrowRight') return;\n    var forward = (e.key === 'ArrowRight') !== isRtl();\n    e.preventDefault();\n    goTo(current + (forward ? 1 : -1));\n  });\n\n  window.addEventListener('resize', update);\n})();\n"],
  "mappings": "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",
  "names": ["two", "bar", "u", "x", "txt", "data", "fact", "field", "when", "done", "c"]
}
