{"id":4862,"date":"2026-08-28T02:15:22","date_gmt":"2026-08-28T02:15:22","guid":{"rendered":"https:\/\/claimont.com\/?page_id=4862"},"modified":"2026-09-05T18:45:21","modified_gmt":"2026-09-05T18:45:21","slug":"order","status":"publish","type":"page","link":"https:\/\/claimont.com\/tr\/order\/","title":{"rendered":"Order Desk"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"4862\" class=\"elementor elementor-4862\">\n\t\t\t\t<div class=\"elementor-element elementor-element-779a075 e-con-full e-flex e-con e-parent\" data-id=\"779a075\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-41de27b elementor-widget elementor-widget-html\" data-id=\"41de27b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<meta charset=\"utf-8\">\n<title>Claimont Order Portal<\/title>\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n<link rel=\"stylesheet\" href=\"https:\/\/fonts.googleapis.com\/css2?family=Archivo:wght@500;600;700&family=IBM+Plex+Mono:wght@400;500&family=Source+Sans+3:wght@400;600&display=swap\">\n\n<style>\n:root{\n  --ground:#F4F3EF; --surface:#FFFFFF; --surface-2:#FAF9F6; --sunken:#EDEBE5;\n  --ink:#191A16; --ink-2:#54564D; --ink-3:#82857A;\n  --line:#DFDDD4; --line-strong:#C7C4B8;\n  --accent:#1E4E8C; --accent-soft:#DEE7F4; --accent-ink:#173C6D;\n  --good:#2E6E3A; --warn:#9A6206; --crit:#A32C22; --warn-soft:#F7EBD4;\n  --save:#1F7A43; --save-soft:#E2F1E7; --save-ink:#14562F; --save-deep:#12522C; --save-lift:#38A163;\n  --on-accent:#FFFFFF;\n  --shadow:0 1px 2px rgba(25,26,22,.06),0 8px 24px -12px rgba(25,26,22,.18);\n  --r:6px;\n}\n@media (prefers-color-scheme: dark){\n  :root:not([data-theme=\"light\"]){\n    --ground:#14150F; --surface:#1D1F19; --surface-2:#232520; --sunken:#191B15;\n    --ink:#EDEBE3; --ink-2:#A9AC9F; --ink-3:#7D8175;\n    --line:#32352C; --line-strong:#464A3E;\n    --accent:#7FB2E8; --accent-soft:#16304F; --accent-ink:#A9CDF3;\n    --good:#7EBB86; --warn:#DFAE5B; --crit:#E2887C; --warn-soft:#3A2E17;\n    --save:#2E8B52; --save-soft:#16321F; --save-ink:#95DCAC; --save-deep:#124026; --save-lift:#49A96C;\n    --on-accent:#0C1B2E;\n    --shadow:0 1px 2px rgba(0,0,0,.4),0 8px 24px -12px rgba(0,0,0,.6);\n  }\n}\n:root[data-theme=\"dark\"]{\n  --ground:#14150F; --surface:#1D1F19; --surface-2:#232520; --sunken:#191B15;\n  --ink:#EDEBE3; --ink-2:#A9AC9F; --ink-3:#7D8175;\n  --line:#32352C; --line-strong:#464A3E;\n  --accent:#7FB2E8; --accent-soft:#16304F; --accent-ink:#A9CDF3;\n  --good:#7EBB86; --warn:#DFAE5B; --crit:#E2887C; --warn-soft:#3A2E17;\n  --save:#2E8B52; --save-soft:#16321F; --save-ink:#95DCAC; --save-deep:#124026; --save-lift:#49A96C;\n  --on-accent:#0C1B2E;\n  --shadow:0 1px 2px rgba(0,0,0,.4),0 8px 24px -12px rgba(0,0,0,.6);\n}\n*{box-sizing:border-box}\n[hidden]{display:none!important}\nbody{margin:0;background:var(--ground);color:var(--ink);\n  font-family:\"Source Sans 3\",system-ui,-apple-system,\"Segoe UI\",sans-serif;font-size:15px;line-height:1.45;-webkit-font-smoothing:antialiased}\nh1,h2,h3{font-family:Archivo,\"Arial Narrow\",system-ui,sans-serif;font-weight:600;letter-spacing:-.015em;margin:0}\n.mono{font-family:\"IBM Plex Mono\",ui-monospace,Menlo,monospace}\nbutton,input,select,textarea{font:inherit;color:inherit}\n:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:3px}\n.wrap{max-width:1680px;margin:0 auto;padding:0 clamp(12px,2vw,28px)}\n\n\/* ---------- gate ---------- *\/\n\/* Calm, branded sign-in: the site's blue, a crisp card, one thing to do. *\/\n.gate{min-height:92vh;display:flex;align-items:center;justify-content:center;padding:28px 18px;\n  background:linear-gradient(170deg, color-mix(in srgb, var(--accent) 8%, var(--ground)) 0%, var(--ground) 55%)}\n.gatebox{max-width:430px;width:100%;background:var(--surface);border:1px solid var(--line);\n  border-radius:16px;overflow:hidden;box-shadow:0 18px 50px -18px rgba(16,42,84,.30);\n  animation:gaterise .5s cubic-bezier(.2,.8,.3,1) both;padding:0}\n@keyframes gaterise{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}\n.gatehead{background:linear-gradient(120deg,var(--accent-ink),var(--accent) 85%);color:#fff;\n  padding:26px 30px 22px;text-align:left}\n.gatelogo{height:34px;width:auto;display:block;margin-bottom:10px;filter:brightness(0) invert(1)}\n.gatehead .bn{font-family:Archivo,sans-serif;font-weight:700;font-size:22px;letter-spacing:-.02em;color:#fff}\n.gatehead .bs{font-size:11px;color:rgba(255,255,255,.75);letter-spacing:.14em;text-transform:uppercase;margin-top:2px}\n.gatebody{padding:24px 30px 28px}\n.gatetag{display:inline-block;font-size:12px;font-weight:700;letter-spacing:.03em;\n  color:var(--accent-ink);background:color-mix(in srgb, var(--accent) 9%, transparent);\n  border:1px solid color-mix(in srgb, var(--accent) 28%, transparent);border-radius:99px;padding:4px 11px;margin-bottom:6px}\n\n.gatebox h1{font-size:19px;margin:22px 0 6px}\n.gatebox p{color:var(--ink-2);font-size:14px;margin:0 0 18px}\n.gatebox input{width:100%;padding:11px 13px;background:var(--surface-2);border:1px solid var(--line-strong);border-radius:var(--r);\n  font-family:\"IBM Plex Mono\",monospace;font-size:16px;letter-spacing:.08em;text-transform:uppercase}\n.gatebox .row{display:flex;gap:8px;margin-top:12px}\n.gatebox .row .btn{flex:1;justify-content:center}\n.gateerr{color:var(--crit);font-size:13.5px;font-weight:600;margin-top:10px;min-height:20px}\n.gatefoot{margin-top:22px;padding-top:16px;border-top:1px solid var(--line);font-size:12.5px;color:var(--ink-3)}\n.langmini{display:flex;gap:6px;margin-top:14px}\n.langmini button{background:none;border:0;color:var(--ink-3);font-size:12.5px;font-weight:600;cursor:pointer;padding:2px 4px;border-radius:3px}\n.langmini button[aria-pressed=\"true\"]{color:var(--accent-ink);text-decoration:underline}\n\n\/* ---------- chrome ---------- *\/\n.mast{background:var(--surface);border-bottom:1px solid var(--line);position:sticky;top:0;z-index:40}\n.mast-in{display:flex;align-items:center;gap:14px;flex-wrap:wrap;padding-block:12px}\n.brandmark{display:flex;align-items:center;gap:11px;margin-right:auto}\n\/* The logo sits on its own light chip so the artwork reads the same in both\n   themes, whatever colour the file itself is. *\/\n.brandmark .logo{height:30px;width:auto;display:block;flex:none;\n  background:#fff;border-radius:5px;padding:3px 7px;box-shadow:0 1px 0 rgba(0,0,0,.06)}\n.brandmark .logo[hidden]{display:none}\n.brandmark .txt{display:flex;align-items:baseline;gap:10px}\n.brandmark .bn{font-family:Archivo,sans-serif;font-weight:700;font-size:19px;letter-spacing:-.02em}\n.brandmark .bs{font-size:12px;color:var(--ink-3);letter-spacing:.09em;text-transform:uppercase}\n.brandmark .bs::before{content:\"\";display:inline-block;width:6px;height:6px;border-radius:2px;background:var(--accent);margin-right:7px;vertical-align:1px}\n.who{display:flex;align-items:center;gap:7px;background:var(--accent-soft);border:1px solid var(--accent);color:var(--accent-ink);\n  border-radius:100px;padding:4px 12px;font-size:12.5px;font-weight:600}\n.fx{display:flex;align-items:center;gap:8px;background:var(--surface-2);border:1px solid var(--line);border-radius:var(--r);padding:5px 10px;font-size:12.5px;color:var(--ink-2)}\n.fx .dot{width:7px;height:7px;border-radius:50%;background:var(--ink-3);flex:none}\n.fx.live .dot{background:var(--good)} .fx.fallback .dot{background:var(--warn)}\n.iconbtn{background:var(--surface-2);border:1px solid var(--line-strong);border-radius:var(--r);\n  padding:6px 11px;font-size:12.5px;font-weight:600;color:var(--ink-2);cursor:pointer;display:inline-flex;align-items:center;gap:6px}\n.iconbtn:hover{border-color:var(--crit);color:var(--crit)}\n.oldver{margin:14px 0 0;padding:12px 16px;border-radius:var(--r);background:var(--warn-soft);\n  border:1px solid var(--warn);color:var(--warn);font-size:13.5px;line-height:1.5}\n.oldver b{display:block;font-family:Archivo,sans-serif;font-size:14px;margin-bottom:3px}\n.seg{display:flex;border:1px solid var(--line-strong);border-radius:var(--r);overflow:hidden}\n.seg button{background:var(--surface);border:0;padding:6px 12px;font-size:13px;font-weight:600;color:var(--ink-2);cursor:pointer}\n.seg button+button{border-left:1px solid var(--line-strong)}\n.seg button[aria-pressed=\"true\"]{background:var(--accent);color:var(--on-accent)}\n\n.controls{background:var(--surface);border-bottom:1px solid var(--line);position:sticky;top:57px;z-index:35}\n.controls-in{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding-block:10px}\n.search{position:relative;flex:1 1 230px;max-width:330px}\n.search input{width:100%;padding:7px 10px 7px 30px;background:var(--surface-2);border:1px solid var(--line-strong);border-radius:var(--r)}\n.search svg{position:absolute;left:9px;top:50%;transform:translateY(-50%);width:14px;height:14px;stroke:var(--ink-3);fill:none;stroke-width:2}\n.chips{display:flex;gap:6px;flex-wrap:wrap}\n.chip{background:var(--surface-2);border:1px solid var(--line-strong);border-radius:100px;padding:5px 10px;font-size:12.5px;font-weight:600;color:var(--ink-2);cursor:pointer;white-space:nowrap}\n.chip[aria-pressed=\"true\"]{background:var(--accent-soft);border-color:var(--accent);color:var(--accent-ink)}\n.chip .c{color:var(--ink-3);font-weight:400;margin-left:5px;font-variant-numeric:tabular-nums}\n.chip[aria-pressed=\"true\"] .c{color:var(--accent-ink);opacity:.7}\n.spacer{margin-left:auto}\n.btn{background:var(--surface-2);border:1px solid var(--line-strong);border-radius:var(--r);padding:6px 11px;font-size:12.5px;font-weight:600;color:var(--ink-2);cursor:pointer;display:inline-flex;align-items:center;gap:6px}\n.btn:hover{border-color:var(--accent);color:var(--accent-ink)}\n.btn-primary{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}\n.btn-primary:hover{opacity:.92;color:var(--on-accent);border-color:var(--accent)}\n.btn[disabled]{opacity:.45;cursor:not-allowed}\n.btn .n{background:var(--on-accent);color:var(--accent);border-radius:100px;padding:0 6px;font-size:11.5px;font-variant-numeric:tabular-nums}\n\n\/* ---------- table ---------- *\/\n\/* a matching bar above the table, with a label, so sideways scrolling is obvious *\/\n.scrollbar{display:flex;align-items:center;gap:10px;margin:16px 0 0;padding:5px 10px 0;\n  background:var(--surface);border:1px solid var(--line);border-bottom:0;border-radius:var(--r) var(--r) 0 0}\n.scrollbar .hint{flex:none;font-family:Archivo,sans-serif;font-size:10.5px;letter-spacing:.08em;text-transform:uppercase;\n  font-weight:600;color:var(--accent-ink);white-space:nowrap;padding-bottom:5px}\n.scrolltop{flex:1;overflow-x:auto;overflow-y:hidden;height:18px;\n  scrollbar-color:var(--accent) var(--sunken);scrollbar-width:auto}\n.scrolltop::-webkit-scrollbar{height:18px}\n.scrolltop::-webkit-scrollbar-track{background:var(--sunken);border-radius:9px}\n.scrolltop::-webkit-scrollbar-thumb{background:var(--accent);border-radius:9px;border:4px solid var(--sunken)}\n.scrolltop::-webkit-scrollbar-thumb:hover{background:var(--accent-ink)}\n.scrolltop div{height:1px}\n@media screen and (max-width:860px){.scrollbar{display:none}}\n@media print{\n  \/* The portal is embedded in a WordPress page. Its header, footer, chat bubble\n     and language widget are not ours to style, so we hide whatever is not on the\n     path from <body> down to the portal (marked up in JS on beforeprint). *\/\n  [data-clhide]{display:none!important}\n  html,body{margin:0!important;padding:0!important;background:#fff!important}\n  \/* and the table stays a table, whatever the page width works out to *\/\n  table{display:table!important}thead{display:table-header-group!important}\n  tbody{display:table-row-group!important}tr{display:table-row!important}\n  th,td{display:table-cell!important}\n.scrollbar{display:none!important}.tablewrap{border:0}}\n.tablewrap{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);margin:16px 0 0;\n  overflow-x:auto;box-shadow:var(--shadow);scrollbar-color:var(--accent) var(--sunken);scrollbar-width:auto}\n.tablewrap::-webkit-scrollbar{height:18px}\n.tablewrap::-webkit-scrollbar-track{background:var(--sunken);border-top:1px solid var(--line)}\n.tablewrap::-webkit-scrollbar-thumb{background:var(--accent);border-radius:9px;border:4px solid var(--sunken)}\n.tablewrap::-webkit-scrollbar-thumb:hover{background:var(--accent-ink)}\ntable{border-collapse:separate;border-spacing:0;width:100%;font-size:13.5px}\nthead th{position:sticky;top:0;z-index:10;background:var(--sunken);text-align:left;\n  font-family:Archivo,sans-serif;font-weight:600;font-size:11px;letter-spacing:.06em;text-transform:uppercase;\n  color:var(--ink-2);padding:9px 10px;border-bottom:1px solid var(--line-strong);white-space:nowrap;vertical-align:bottom}\ntbody td{padding:8px 10px;border-bottom:1px solid var(--line);vertical-align:middle;white-space:nowrap}\ntbody tr:hover td{background:var(--surface-2)}\ntbody tr.has-qty td{background:var(--accent-soft)}\ntbody tr.has-qty:hover td{background:var(--accent-soft)}\ntd.n,th.n{text-align:right;font-variant-numeric:tabular-nums}\n.idx{color:var(--ink-3);font-family:\"IBM Plex Mono\",monospace;font-size:12px}\n.nophoto{display:block;background:repeating-linear-gradient(45deg,var(--sunken),var(--sunken) 5px,var(--surface-2) 5px,var(--surface-2) 10px)}\n.thumb{width:44px;height:58px;object-fit:contain;background:var(--surface-2);border:1px solid var(--line);border-radius:4px;display:block;cursor:zoom-in}\n.pname{white-space:normal;min-width:180px;max-width:290px}\n.pname .b{font-family:Archivo,sans-serif;font-weight:600;font-size:13px;display:block}\n.pname .f{color:var(--ink-2);font-size:12.5px;display:block;line-height:1.3}\n\/* Cartons is the one column people type into, so it is deliberately the\n   largest control on the row and reads as a field rather than a cell. *\/\n.qty{width:104px;padding:8px 10px;text-align:right;background:var(--surface-2);\n  border:2px solid var(--line-strong);border-radius:6px;font-family:\"IBM Plex Mono\",monospace;\n  font-variant-numeric:tabular-nums;font-size:16px;font-weight:600;color:var(--ink);\n  transition:border-color .12s,box-shadow .12s}\n.qty::placeholder{color:var(--ink-3);font-weight:400}\n.refcode{font-family:\"IBM Plex Mono\",monospace;font-size:12.5px;font-weight:600;color:var(--accent-ink);\n  background:var(--accent-soft);border-radius:5px;padding:2px 7px;white-space:nowrap}\n\/* ---- the Cartons column can be dragged wider ------------------------------\n   The WordPress theme styles every number input as width:100% with a selector\n   that outranks a bare class, so the width is set on the COLUMN and the input\n   simply fills it. --qtyfit keeps the box wide enough for the longest number\n   already typed, so the figure is readable whether or not anyone drags. *\/\nth.c-qty,td.c-qty{width:max(var(--qtyw,104px),var(--qtyfit,0px));\n  min-width:max(var(--qtyw,104px),var(--qtyfit,0px))}\ntd.c-qty input.qty{width:100%;box-sizing:border-box;min-width:0}\n\/* the spinner arrows sit on top of the digits and steal about 17px *\/\ninput.qty{-moz-appearance:textfield;appearance:textfield}\ninput.qty::-webkit-outer-spin-button,input.qty::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}\nth.c-qty{position:relative}\n.colgrip{position:absolute;top:0;right:0;width:12px;height:100%;cursor:col-resize;\n  display:flex;align-items:center;justify-content:center;touch-action:none;user-select:none}\n.colgrip::before{content:\"\";width:3px;height:56%;border-radius:2px;background:var(--line-strong)}\n\/* The header scrolls away with the page, so the drag handle alone is not enough \u2014\n   this stepper lives in the bar above the table and stays put. *\/\n.qtyctl{display:flex;align-items:center;gap:5px;flex:none;padding-bottom:5px;margin-left:auto}\n.qtyctl .lb{font-family:Archivo,sans-serif;font-size:10.5px;letter-spacing:.08em;text-transform:uppercase;\n  font-weight:600;color:var(--ink-3);white-space:nowrap}\n.qtyctl button{width:24px;height:24px;line-height:1;border:1px solid var(--line-strong);border-radius:5px;\n  background:var(--surface);color:var(--ink-2);font-size:15px;cursor:pointer;padding:0;\n  display:flex;align-items:center;justify-content:center}\n.qtyctl button:hover{border-color:var(--accent);color:var(--accent-ink)}\n.qtyctl .val{font-family:\"IBM Plex Mono\",monospace;font-size:11.5px;color:var(--ink-3);\n  min-width:38px;text-align:center;font-variant-numeric:tabular-nums}\n\/* the bar rides under the sticky toolbar so the stepper is always reachable *\/\n.scrollbar{position:sticky;top:var(--stickytop,150px);z-index:33}\n.colgrip:hover::before,.colgrip.on::before{background:var(--accent);width:4px}\nbody.colsizing{cursor:col-resize;user-select:none}\n@media print{.colgrip{display:none!important}}\n\n.qty:focus{outline:0;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft);background:var(--surface)}\nth.c-qty,td.c-qty{background:var(--sunken)}\nthead th.c-qty{color:var(--accent-ink)}\ntbody tr.has-qty td.c-qty{background:var(--accent-soft)}\ntr.has-qty .qty{border-color:var(--accent);background:var(--surface);color:var(--accent-ink)}\n.muted{color:var(--ink-3)}\n.was{color:var(--ink-3);text-decoration:line-through;text-decoration-thickness:1.5px;font-size:12.5px}\n.now{color:var(--save);font-weight:700}\n.qtywrap{display:contents}\n.qstep{display:none}\n.savechip{display:inline-flex;align-items:center;gap:6px;background:var(--save-soft);border:1px solid var(--save);\n  color:var(--save-ink);border-radius:100px;padding:4px 12px;font-size:12.5px;font-weight:700;white-space:nowrap}\n\/* the same warm, glinting gold as the welcome page \u2014 no numbers, just the good news *\/\n.discbanner{display:flex;align-items:center;gap:16px;flex-wrap:wrap;margin:16px 0 0;padding:14px 18px;\n  border-radius:14px;color:#6B4A00;position:relative;overflow:hidden;\n  border:1.5px solid #E8B93E;background:linear-gradient(105deg,#FFF7E0,#FFEFC2 55%,#FFF7E0);\n  animation:discpulse 1.6s ease-in-out infinite}\n.discbanner::after{content:\"\";position:absolute;top:0;bottom:0;width:46px;transform:skewX(-20deg);\n  background:linear-gradient(90deg,transparent,rgba(255,255,255,.85),transparent);\n  animation:discsheen 2.6s ease-in-out infinite}\n@media (prefers-reduced-motion: reduce){.discbanner,.discbanner::after{animation:none}}\n.discbanner .pctwrap{display:flex;flex-direction:column;align-items:center;flex:none;position:relative;z-index:1;\n  padding:8px 14px;border-radius:10px;background:#fff;border:1.5px solid #E8B93E}\n.discbanner .pct{font-family:Archivo,sans-serif;font-weight:800;font-size:26px;line-height:1;color:#B07A00}\n.discbanner .pctsub{font-size:10.5px;letter-spacing:.09em;text-transform:uppercase;color:#8A5A00;margin-top:3px;font-weight:700}\n.discbanner .dtext{display:flex;flex-direction:column;gap:3px;min-width:220px;flex:1;position:relative;z-index:1}\n.discbanner .txt{font-family:Archivo,sans-serif;font-size:17px;font-weight:700;letter-spacing:-.01em}\n.discbanner .sub{font-size:13px;line-height:1.4;color:#7A5500}\n.stat.save .v{color:var(--save-ink)}\n.calc{color:var(--accent-ink);font-weight:600}\n.hide-pack .g-pack,.hide-comp .g-comp,.hide-wt .g-wt,.hide-calc .g-calc{display:none}\n\n\/* ---------- dock ---------- *\/\n\/* The sticky dock competes with the table for screen height, so it stays short:\n   the totals only. Container planning sits below it in normal flow. *\/\n.dock{position:sticky;bottom:0;max-height:34vh;overflow-y:auto;z-index:38;background:var(--surface);border:1px solid var(--line);border-top:2px solid var(--accent);border-radius:var(--r) var(--r) 0 0;box-shadow:0 -6px 24px -14px rgba(25,26,22,.35);margin-top:16px}\n.dock-in{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(112px,1fr);gap:1px;\n  background:var(--line);overflow-x:auto;scrollbar-width:thin}\n@media screen and (max-width:900px){.dock-in{grid-auto-flow:row;grid-auto-columns:auto;\n  grid-template-columns:repeat(auto-fit,minmax(108px,1fr));overflow-x:visible}}\n.stat{background:var(--surface);padding:10px 12px}\n.stat .k{font-size:10.5px;letter-spacing:.09em;text-transform:uppercase;color:var(--ink-3);font-weight:600;font-family:Archivo,sans-serif}\n.stat .v{font-family:\"IBM Plex Mono\",monospace;font-variant-numeric:tabular-nums;font-size:17px;font-weight:500;margin-top:2px;letter-spacing:-.02em}\n.stat.money .v{color:var(--accent-ink)}\n.stat .sub{font-size:11.5px;color:var(--ink-3);font-variant-numeric:tabular-nums}\n.cont{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);margin-top:14px;padding:10px 12px;display:flex;gap:18px;align-items:center;flex-wrap:wrap}\n.cont .lbl{font-size:10.5px;letter-spacing:.09em;text-transform:uppercase;color:var(--ink-3);font-weight:600;font-family:Archivo,sans-serif}\n.meter{flex:1 1 160px;min-width:150px}\n.meter .row{display:flex;justify-content:space-between;font-size:11.5px;color:var(--ink-2);margin-bottom:3px;font-variant-numeric:tabular-nums}\n.meter .bar{height:7px;background:var(--sunken);border-radius:100px;overflow:hidden;border:1px solid var(--line)}\n.meter .fill{height:100%;background:var(--good);border-radius:100px;transition:width .25s ease}\n.meter.warn .fill{background:var(--warn)} .meter.over .fill{background:var(--crit)}\n.meter .pc{font-weight:600}\n.loadseg button{padding:4px 11px;font-size:12px}\n.meters{background:var(--surface);border-top:1px solid var(--line);padding:10px 12px;display:flex;gap:18px;align-items:center;flex-wrap:wrap}\n.contline{display:flex;gap:12px;align-items:center;flex-wrap:wrap;padding:10px 12px}\n.contline+.contline{border-top:1px solid var(--line)}\n.contline.pick label{font-size:12px;color:var(--ink-2);font-weight:600}\n.contline.pick select,.contline.pick input{padding:6px 9px;background:var(--surface-2);\n  border:1px solid var(--line-strong);border-radius:5px;font-size:13.5px}\n.contline.pick input{width:70px;text-align:right;font-variant-numeric:tabular-nums;font-family:\"IBM Plex Mono\",monospace}\n.linkbtn{background:none;border:0;color:var(--accent-ink);font-size:12.5px;font-weight:600;\n  text-decoration:underline;cursor:pointer;padding:0}\n.fitmsg{flex:1 1 280px;min-width:240px;font-size:13px;display:flex;align-items:center;gap:9px;\n  padding:7px 12px;border-radius:var(--r);border:1px solid var(--line);background:var(--surface-2);color:var(--ink-2)}\n.fitmsg .dot2{width:9px;height:9px;border-radius:50%;flex:none;background:var(--ink-3)}\n.fitmsg b{color:var(--ink)}\n.fitmsg.full{background:var(--good-soft,var(--accent-soft));border-color:var(--good);color:var(--ink)}\n.fitmsg.full .dot2{background:var(--good)}\n.fitmsg.near{background:var(--surface-2);border-color:var(--line-strong)}\n.fitmsg.near .dot2{background:var(--good)}\n.fitmsg.light{background:var(--warn-soft);border-color:var(--warn);color:var(--warn)}\n.fitmsg.light .dot2{background:var(--warn)}\n.fitmsg.over{background:var(--crit-soft,var(--warn-soft));border-color:var(--crit);color:var(--crit)}\n.fitmsg.over .dot2{background:var(--crit)}\n.meter.dim{opacity:.55}\n.meter .alt{font-size:11.5px;color:var(--ink-2)}\n.ctable{width:100%;border-collapse:collapse;font-size:13.5px;margin-top:6px}\n.ctable th,.ctable td{padding:7px 9px;border-bottom:1px solid var(--line);text-align:left}\n.ctable th{font-family:Archivo,sans-serif;font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-3)}\n.ctable td.n{text-align:right;font-variant-numeric:tabular-nums}\n.palbox{position:relative}\n.palbox>summary{list-style:none;cursor:pointer}\n.palbox>summary::-webkit-details-marker{display:none}\n\/* expands in place \u2014 a floating panel kept getting clipped by the sticky column *\/\n.palpanel{position:static;margin-top:8px;background:var(--surface);border:1px solid var(--line-strong);\n  border-radius:8px;padding:12px;width:100%;box-shadow:none}\n.palpanel .f{display:flex;flex-direction:column;gap:4px;margin-bottom:10px}\n.palpanel label{font-size:11.5px;color:var(--ink-2);font-weight:600}\n.palpanel select,.palpanel input{padding:6px 9px;background:var(--surface-2);border:1px solid var(--line-strong);border-radius:5px;font-size:13.5px;width:100%}\n.palpanel .note{font-size:11.5px;color:var(--ink-3);line-height:1.4}\n.palpanel .slots{display:flex;gap:10px;font-size:11.5px;color:var(--ink-2);font-variant-numeric:tabular-nums;margin:-4px 0 10px}\n.palpanel .slots b{font-family:\"IBM Plex Mono\",monospace}\n\n\/* ---------- order sheet ---------- *\/\n.sheet{position:fixed;inset:0;background:rgba(10,11,8,.55);display:none;z-index:90;overflow-y:auto;padding:24px 16px}\n.sheet.on{display:block}\n.sheetbox{background:var(--surface);border:1px solid var(--line-strong);border-radius:10px;box-shadow:0 24px 60px -20px rgba(0,0,0,.5);max-width:760px;margin:0 auto}\n.sheethd{display:flex;align-items:center;gap:12px;padding:16px 20px;border-bottom:1px solid var(--line);position:sticky;top:0;background:var(--surface);border-radius:10px 10px 0 0;z-index:2}\n.sheethd h2{font-size:17px;margin-right:auto}\n.sheetbody{padding:18px 20px}\n.sheetft{display:flex;gap:10px;align-items:center;flex-wrap:wrap;padding:14px 20px;border-top:1px solid var(--line);position:sticky;bottom:0;background:var(--surface);border-radius:0 0 10px 10px}\n.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:12px}\n.f{display:flex;flex-direction:column;gap:4px}\n.f.wide{grid-column:1\/-1}\n.f label{font-size:11.5px;color:var(--ink-2);font-weight:600}\n.f input,.f textarea{padding:8px 10px;background:var(--surface-2);border:1px solid var(--line-strong);border-radius:5px;width:100%;font-size:14px}\n.f textarea{min-height:66px;resize:vertical}\n.howto{background:var(--warn-soft);border:1px solid var(--warn);border-radius:var(--r);padding:12px 14px;margin-top:16px;font-size:13.5px;color:var(--ink)}\n.howto strong{color:var(--warn)}\n.err{color:var(--crit);font-size:12.5px;font-weight:600}\n.f input.bad{border-color:var(--crit);background:var(--crit-soft,transparent)}\n.confirmbox h3,.donebox h3{font-size:16px;margin-bottom:10px}\n.clist{display:grid;grid-template-columns:auto 1fr;gap:6px 18px;margin:0;font-size:14px}\n.clist dt{color:var(--ink-2)}\n.clist dd{margin:0;font-weight:600;font-variant-numeric:tabular-nums}\n.clist dd.total{color:var(--accent-ink);font-size:16px}\n.clist dd .was{margin-right:6px}\n\/* ---- the review step ---- *\/\n.c-grid{display:grid;grid-template-columns:1.1fr .9fr;gap:12px;margin-bottom:16px}\n.c-card{background:var(--surface-2);border:1px solid var(--line);border-radius:var(--r);padding:13px 16px}\n.c-card h4{margin:0 0 9px;font-family:Archivo,sans-serif;font-size:11px;letter-spacing:.09em;\n  text-transform:uppercase;color:var(--ink-3)}\n.c-card .clist{font-size:13.5px;gap:4px 14px}\n.c-tot{background:var(--accent-soft);border-color:var(--accent-soft)}\n.c-tot .clist dt{color:var(--accent-ink);opacity:.8}\n.c-tot .clist dd{color:var(--accent-ink)}\n.c-items-h{margin:0 0 8px;font-family:Archivo,sans-serif;font-size:11px;letter-spacing:.09em;\n  text-transform:uppercase;color:var(--ink-3)}\n.c-itemswrap{border:1px solid var(--line);border-radius:var(--r);max-height:300px;overflow:auto}\n#sheet .sheetbox{max-width:900px}\n.c-items{width:100%;border-collapse:collapse;font-size:13px}\n.c-items th{position:sticky;top:0;background:var(--sunken);font-family:Archivo,sans-serif;font-size:10.5px;\n  letter-spacing:.06em;text-transform:uppercase;color:var(--ink-2);padding:7px 10px;text-align:left}\n.c-items th.n,.c-items td.n{text-align:right;font-variant-numeric:tabular-nums}\n.c-items td{padding:6px 10px;border-top:1px solid var(--line)}\n.c-items td.ph{width:34px;padding:4px 6px}\n.c-items td.ph img{height:30px;width:auto;max-width:30px;object-fit:contain;display:block;border-radius:3px}\n.c-items .rf{font-family:\"IBM Plex Mono\",monospace;font-size:11.5px;color:var(--accent-ink)}\n.c-items tfoot td{font-weight:700;background:var(--surface-2)}\n@media (max-width:760px){.c-grid{grid-template-columns:1fr}}\n.regwrap{overflow-x:auto;border:1px solid var(--line);border-radius:var(--r)}\n.regtbl{border-collapse:separate;border-spacing:0;width:100%;font-size:13px}\n.regtbl th{background:var(--sunken);text-align:left;font-family:Archivo,sans-serif;font-weight:600;font-size:10.5px;\n  letter-spacing:.06em;text-transform:uppercase;color:var(--ink-2);padding:8px 10px;border-bottom:1px solid var(--line-strong);white-space:nowrap}\n.regtbl td{padding:7px 10px;border-bottom:1px solid var(--line)}\n.regtbl .n{text-align:right;font-variant-numeric:tabular-nums}\n.donebox{text-align:center;padding:14px 0 6px}\n.donebox .tick{width:56px;height:56px;margin:0 auto 14px;border-radius:50%;background:var(--save-soft);\n  border:1px solid var(--save);display:flex;align-items:center;justify-content:center}\n.donebox .tick svg{width:26px;height:26px;stroke:var(--save-ink);fill:none;stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round}\n.donebox p{color:var(--ink-2);margin:0 0 14px}\n.donebox .oid{font-family:\"IBM Plex Mono\",monospace;font-size:20px;font-weight:500;letter-spacing:.04em;\n  background:var(--sunken);border:1px solid var(--line-strong);border-radius:var(--r);padding:12px}\n\n\/* ---------- catalogue ---------- *\/\n.cat{position:fixed;inset:0;background:rgba(10,11,8,.8);display:none;z-index:95;flex-direction:column;padding:16px}\n.cat.on{display:flex}\n.cathd{display:flex;gap:10px;align-items:center;padding-bottom:10px}\n.cathd .t{color:#fff;font-family:Archivo,sans-serif;font-weight:600;margin-right:auto}\n.cat iframe,.cat embed{flex:1;width:100%;border:0;border-radius:8px;background:#fff}\n.catmiss{flex:1;display:flex;align-items:center;justify-content:center;background:var(--surface);border-radius:8px;padding:30px;text-align:center;color:var(--ink-2);font-size:14px}\n\n.lb{position:fixed;inset:0;background:rgba(10,11,8,.82);display:none;align-items:center;justify-content:center;z-index:100;padding:24px;cursor:zoom-out}\n.lb.on{display:flex}\n.lb img{max-width:min(460px,90vw);max-height:80vh;background:#fff;border-radius:8px;padding:12px}\n.empty{padding:44px 20px;text-align:center;color:var(--ink-3)}\n\n\/* left rail \u2014 the customer's own order history *\/\n.layout{display:flex;gap:20px;align-items:flex-start}\n.main{flex:1;min-width:0}\n\/* Container planning is a side panel now, not a bar under the table \u2014 it stays\n   in view while you scroll the products, and stops eating the table's height. *\/\n\/* Everything that is not the product table lives in one left column, so the\n   table gets the whole of the rest of the width. The column is sticky and\n   scrolls on its own, which is what keeps three stacked panels usable. *\/\n.leftcol{width:288px;flex:none;position:sticky;top:120px;max-height:calc(100vh - 148px);\n  overflow-y:auto;overscroll-behavior:contain;display:flex;flex-direction:column;gap:14px;\n  padding-right:4px;scrollbar-width:thin}\n.leftcol > *{flex:none}\n.side{margin-top:0}\n\/* Inside the column the rail must not stick or scroll on its own \u2014 the column\n   does both. Left sticky, it rode over the panels underneath it. *\/\n.leftcol .rail{width:auto;position:static;top:auto;max-height:none;margin-top:16px;overflow:visible}\n.leftcol .railbody{max-height:none;overflow:visible}\n.leftcol .side{margin-top:0}\n\/* \u2500\u2500 3D live load view under the planner \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n#c3d{margin:14px 2px 2px;user-select:none;touch-action:none}\n.c3dtitle{font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-3);\n  font-weight:600;font-family:Archivo,sans-serif;margin:0 0 4px}\n.c3dtrack{display:flex;flex-wrap:wrap;gap:16px 30px;perspective:900px;padding:30px 6px 4px;cursor:grab}\n.c3dtrack:active{cursor:grabbing}\n.c3du{display:flex;flex-direction:column;align-items:center;gap:16px}\n.c3dbox{position:relative;width:104px;height:50px;transform-style:preserve-3d;\n  transform:rotateX(-24deg) rotateY(var(--ry,-32deg))}\n.c3df{position:absolute;left:50%;top:50%;border:1.5px solid var(--line-strong);box-sizing:border-box;\n  background:transparent;overflow:hidden}\n.c3df.cf{width:104px;height:50px;margin:-25px 0 0 -52px;transform:translateZ(23px)}\n.c3df.cs{width:46px;height:50px;margin:-25px 0 0 -23px;transform:rotateY(90deg) translateZ(52px)}\n.c3df.ct{width:104px;height:46px;margin:-23px 0 0 -52px;transform:rotateX(90deg) translateZ(25px);overflow:visible}\n.c3df.cf::after,.c3df.cs::after{content:\"\";position:absolute;inset:0;pointer-events:none;\n  background:repeating-linear-gradient(90deg,transparent 0 7px,rgba(127,127,127,.12) 7px 9px)}\n.c3df .lvl{position:absolute;left:0;right:0;bottom:0;height:0;background:var(--accent);opacity:.92;\n  transition:height .5s cubic-bezier(.22,.9,.36,1)}\n.c3df.cs .lvl{filter:brightness(.75)}\n.c3df.ct.full{background:var(--accent);filter:brightness(1.15);opacity:.95}\n.c3dbox.c3dw .c3df{border-color:var(--crit)}\n.c3dbox.c3dx .c3df{border:1.5px dashed var(--crit);animation:c3dp 1.5s ease-in-out infinite}\n@keyframes c3dp{0%,100%{opacity:.9}50%{opacity:.4}}\n@media (prefers-reduced-motion: reduce){.c3dbox.c3dx .c3df{animation:none}}\n.c3dlab{font-size:10.5px;color:var(--ink-2);font-variant-numeric:tabular-nums;text-align:center}\n.c3dlab.miss{color:var(--crit);font-weight:700}\n.c3dmore{font-weight:700;color:var(--ink-2);align-self:center;font-size:13px}\n.c3dmore.miss{color:var(--crit)}\n\/* \u2500\u2500 left-column sections: minimize + drag to reorder (desktop only) \u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n@media (min-width:861px){\n  .secbar{display:flex;align-items:center;gap:8px;padding:2px 2px 6px}\n  .secgrip{cursor:grab;color:var(--ink-3);font-size:14px;letter-spacing:-1px;line-height:1;\n    padding:3px 5px;border-radius:6px;flex:none;user-select:none}\n  .secgrip:hover{background:var(--sunken);color:var(--ink-2)}\n  .sectitle{flex:1;min-width:0;font-family:Archivo,sans-serif;font-weight:700;font-size:12px;\n    color:var(--ink-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;visibility:hidden}\n  .secfold{flex:none;border:1px solid var(--line);background:var(--surface);border-radius:6px;\n    width:22px;height:22px;cursor:pointer;color:var(--ink-2);font-size:11px;line-height:1;padding:0}\n  .secfold:hover{background:var(--sunken)}\n  .secmin-on > *:not(.secbar){display:none!important}\n  .secmin-on .sectitle{visibility:visible}\n  .secmin-on{padding-bottom:2px;border-bottom:1px dashed var(--line);margin-bottom:10px}\n  .secdrag{opacity:.45;outline:2px dashed var(--line-strong);outline-offset:3px}\n}\n@media (max-width:860px){.secbar,#c3d{display:none!important}}\n\/* the planner leads the column and asks to be filled in *\/\n.contfeature{border:1.5px solid var(--accent);background:color-mix(in srgb, var(--accent) 5%, var(--surface));\n  box-shadow:0 0 0 4px color-mix(in srgb, var(--accent) 9%, transparent), var(--shadow);\n  animation:contnudge 2s ease-in-out .8s 3}\n.contfeature .lbl{color:var(--accent-ink)}\n.contfeature .contline:first-child::before{content:attr(data-nudge);display:block;width:100%;\n  font-size:11.5px;font-weight:600;letter-spacing:.02em;color:var(--accent-ink);\n  background:color-mix(in srgb, var(--accent) 12%, transparent);border-radius:7px;\n  padding:5px 9px;margin-bottom:4px}\n@keyframes contnudge{0%,100%{box-shadow:0 0 0 4px color-mix(in srgb, var(--accent) 9%, transparent), var(--shadow)}\n  50%{box-shadow:0 0 0 9px color-mix(in srgb, var(--accent) 22%, transparent), var(--shadow)}}\n@media (prefers-reduced-motion: reduce){.contfeature{animation:none}}\n.side .cont{margin-top:0;display:block;padding:0}\n.side .contline{padding:12px 14px;gap:10px}\n.side .contline.pick{display:grid;grid-template-columns:auto 1fr;align-items:center;gap:9px 10px}\n.side .contline.pick .fitmsg{grid-column:1 \/ -1;min-width:0;flex:none}\n.side .contline.pick select,.side .contline.pick input{width:100%}\n.side .meters{display:block;padding:12px 14px}\n.side .meter{margin-bottom:11px}\n.side .meter:last-child{margin-bottom:0}\n.side .seg.loadseg{width:100%}\n.side .seg.loadseg button{flex:1}\n@media (max-width:1180px){\n  \/* below this the rail already collapses, so the planner returns to the flow *\/\n  .side{width:auto;position:static;max-height:none;margin-top:14px}\n  .side .contline.pick{grid-template-columns:auto auto 1fr}\n  .side .meters{display:flex;gap:18px;flex-wrap:wrap}\n  .side .meter{flex:1 1 180px;margin-bottom:0}\n}\n.rail{width:250px;flex:none;background:var(--surface);border:1px solid var(--line);border-radius:var(--r);\n  box-shadow:var(--shadow);margin-top:16px;position:sticky;top:120px;max-height:calc(100vh - 150px);\n  display:flex;flex-direction:column;overflow:hidden}\n.railhd{display:flex;align-items:center;gap:8px;padding:11px 14px;border-bottom:1px solid var(--line);\n  font-family:Archivo,sans-serif;font-weight:600;font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-2)}\n.railx{display:none;margin-left:auto;background:none;border:0;font-size:20px;line-height:1;color:var(--ink-3);cursor:pointer}\n.railbody{overflow-y:auto;padding:6px}\n.ordercard{width:100%;text-align:left;background:none;border:1px solid transparent;border-radius:var(--r);\n  padding:9px 10px;cursor:pointer;display:block}\n.ordercard:hover{background:var(--surface-2);border-color:var(--line)}\n.ordercard .oid2{font-family:\"IBM Plex Mono\",monospace;font-size:12px;font-weight:500}\n.ordercard .when{font-size:11.5px;color:var(--ink-3);margin-top:1px}\n.ordercard .amt{font-size:13px;font-weight:700;color:var(--accent-ink);margin-top:3px;font-variant-numeric:tabular-nums}\n.ordercard .qty2{font-size:11.5px;color:var(--ink-2)}\n.railempty{padding:16px 12px;font-size:12.5px;color:var(--ink-3);line-height:1.5}\n.railcount{background:var(--accent-soft);color:var(--accent-ink);border-radius:100px;padding:1px 8px;font-size:11.5px}\n\n\/* submit bar under the table *\/\n\/* rides inside the sticky dock, directly under the order summary numbers *\/\n.submitbar{display:flex;align-items:center;gap:16px;flex-wrap:wrap;justify-content:space-between;\n  padding:12px 14px;background:color-mix(in srgb, var(--accent) 4%, var(--surface));\n  border-top:1px solid var(--line-strong)}\n.sb-sum{font-size:14px;color:var(--ink-2)}\n.sb-sum b{color:var(--ink);font-variant-numeric:tabular-nums}\n.sb-sum .big{font-size:20px;font-weight:700;color:var(--accent-ink);font-variant-numeric:tabular-nums}\n.moqchip{display:inline-flex;align-items:center;gap:6px;margin-top:4px;padding:3px 10px;border-radius:99px;\n  font-size:12px;font-weight:600}\n.moqchip.miss{background:#FDECEA;border:1px solid #E5B4AC;color:#8C2F23}\n.fitflag{display:inline-flex;align-items:center;gap:7px;margin-top:5px;padding:5px 11px;border-radius:9px;\n  font-size:12.5px;font-weight:700;background:#FDECEA;border:1.5px solid #D9776A;color:#A02818;\n  animation:fitpulse2 1.5s ease-in-out infinite}\n@keyframes fitpulse2{0%,100%{box-shadow:0 0 0 0 rgba(217,119,106,.5)}50%{box-shadow:0 0 0 7px rgba(217,119,106,0)}}\n@media (prefers-reduced-motion: reduce){.fitflag{animation:none}}\n.fitwarn{margin:0 0 14px;padding:11px 14px;border-radius:10px;font-size:13.5px;line-height:1.5;font-weight:600;\n  background:#FDECEA;border:1.5px solid #D9776A;color:#A02818}\n.moqchip.ok{background:var(--save-soft,#E8F4EC);border:1px solid var(--save,#7FB58F);color:#1F6B3A}\n.flnote{margin-top:8px;font-size:11.5px;color:var(--ink-3);line-height:1.45}\n\/* fresh mint, calm and modern \u2014 a sibling of the gold banner, not a twin *\/\n.moqcard{display:flex;align-items:center;gap:16px;flex-wrap:wrap;margin:10px 0 0;padding:13px 18px;\n  border-radius:14px;color:#14634A;position:relative;overflow:hidden;\n  border:1.5px solid #8FD9BA;background:linear-gradient(105deg,#EAF9F2,#DBF4E8 55%,#EAF9F2)}\n.moqcard::after{content:\"\";position:absolute;top:0;bottom:0;width:46px;transform:skewX(-20deg);\n  background:linear-gradient(90deg,transparent,rgba(255,255,255,.8),transparent);\n  animation:discsheen 3.2s ease-in-out infinite;animation-delay:1.4s}\n@media (prefers-reduced-motion: reduce){.moqcard::after{animation:none}}\n.moqcard .pctwrap{padding:7px 12px;background:#fff;border-color:#8FD9BA}\n.moqcard .pct{font-size:22px;color:#1B7A5C}\n.moqcard .pctsub{color:#1B7A5C}\n.moqcard .dtext{position:relative;z-index:1}\n.moqcard .txt{font-size:15px}\n.moqcard .sub{color:#2E7C5A}\n.moqcard .moqask label{color:#2E7C5A}\n.moqcard .moqnote{color:#14634A}\n.moqlink{font-size:12.5px;font-weight:700;color:#14634A;text-decoration:underline;background:none;border:0;padding:0;cursor:pointer}\n.moqask{display:block;margin-top:8px}\n.moqask label{display:block;font-size:12px;color:#7A5500;margin-bottom:6px}\n.moqrow{display:flex;gap:8px;position:relative;z-index:1}\n.moqrow input{width:76px;padding:7px 9px;border:1px solid var(--line-strong);border-radius:8px;font-size:16px}\n.moqnote{display:block;margin-top:6px;font-size:12px;color:var(--accent-ink);font-weight:600}\n.btn-big{font-size:15px;padding:12px 22px;border-radius:8px}\n\n@media screen and (max-width:1180px){\n  .rail{position:fixed;left:0;top:0;bottom:0;width:290px;max-height:none;margin:0;z-index:80;\n    border-radius:0;transform:translateX(-102%);transition:transform .22s ease}\n  .rail.on{transform:none}\n  .railx{display:block}\n  \/* Below this the column dissolves: the CONTAINER PLANNER leads (fill it in\n     before picking products), then the product list, then messages and the rest. *\/\n  .layout{display:flex;flex-direction:column}\n  .leftcol{display:contents}\n  #side{order:0;position:static;max-height:none;margin-bottom:6px}\n  .main{order:1;width:100%}\n  #msgside{order:2;margin-top:8px}\n  #catside{order:3}\n  .side{position:static;max-height:none}\n  .msgbody{max-height:340px}\n}\n.notes{margin:18px 0 40px;font-size:13px;color:var(--ink-2)}\n.notes h2{font-size:12px;letter-spacing:.09em;text-transform:uppercase;color:var(--ink-3);margin-bottom:8px}\n.notes ul{margin:0;padding-left:18px} .notes li{margin-bottom:4px}\n\n@media screen and (max-width:860px){\n  .mast{position:static}\n  .mast-in{flex-wrap:wrap;gap:8px 10px;padding-block:9px}\n  .brandmark{order:0;flex:1 1 auto}\n  .brandmark .bn{font-size:16px}\n  #btn-signout{order:1;margin-left:auto}\n  .seg{order:2}\n  .who{order:5;font-size:11px;flex:1 1 auto}\n  .fx{order:6;flex:0 1 auto;justify-content:flex-start}\n  .dock{max-height:30vh}\n  .controls{top:0}\n  .search{flex:1 1 100%;max-width:none}\n  .chips{flex:1 1 100%;flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none}\n  .chips::-webkit-scrollbar{display:none}\n  .spacer{display:none}\n  .tablewrap{border:0;background:transparent;box-shadow:none;overflow:visible}\n  table,tbody,tr,td{display:block;width:100%}\n  thead{display:none}\n  tbody tr{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);margin-bottom:10px;padding:10px 12px;box-shadow:var(--shadow);display:grid;grid-template-columns:auto 1fr;gap:0 12px}\n  tbody tr.has-qty{border-color:var(--accent);border-width:1.5px}\n  tbody td{border:0;padding:3px 0;white-space:normal;display:flex;justify-content:space-between;gap:12px;grid-column:2}\n  tbody tr:hover td,tbody tr.has-qty td{background:transparent}\n  td[data-label]::before{content:attr(data-label);font-size:11px;letter-spacing:.05em;text-transform:uppercase;color:var(--ink-3);font-weight:600;font-family:Archivo,sans-serif;flex:none;padding-top:2px}\n  td.c-photo{grid-column:1;grid-row:1 \/ span 3;padding:0}\n  td.c-photo::before{display:none}\n  .thumb{width:62px;height:82px}\n  td.c-idx{display:none}\n  td.c-name{grid-column:2;padding-bottom:6px}\n  td.c-name::before{display:none}\n  .pname{max-width:none}\n  td.c-qty{grid-column:1 \/ -1;border-top:1px dashed var(--line);margin-top:6px;padding-top:8px}\n  tbody tr:not(.has-qty) td.g-calc{display:none}\n  .qty{width:120px}\n  .dock-in{grid-template-columns:repeat(auto-fit,minmax(96px,1fr))}\n  .stat .v{font-size:15px}\n  \/* forms: one clear column, big touch targets, no iOS zoom-jump *\/\n  .sheet .sheetbox{max-width:none;margin:0;min-height:100dvh;border-radius:0;border-left:0;border-right:0}\n  .sheethd,.sheetft{border-radius:0}\n  #step-details .grid,.c-grid{grid-template-columns:1fr!important}\n  .f input,.f textarea,.f select{font-size:16px;padding:12px 13px;border-radius:9px}\n  .f label{font-size:13px}\n  .sheetbody{padding:16px 14px}\n  .sheetft .btn{flex:1 1 auto;justify-content:center;padding:12px 14px}\n  .btn-big{width:100%;justify-content:center}\n  .submitbar{flex-direction:column;align-items:stretch;gap:10px}\n  .sb-sum{text-align:center}\n  .gatebody{padding:20px 18px 24px}\n  .gatehead{padding:20px 18px 16px}\n  .gatebox input{font-size:17px;padding:13px 14px}\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550 mobile wizard: three calm pages instead of one packed screen \u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n@media screen and (max-width:860px){\n  .mwnav{position:fixed;left:0;right:0;bottom:0;z-index:90;display:flex;align-items:center;gap:10px;\n    padding:10px 14px calc(10px + env(safe-area-inset-bottom));background:var(--surface);\n    border-top:1px solid var(--line-strong);box-shadow:0 -8px 24px rgba(15,23,42,.12)}\n  .mwback{width:46px;height:46px;border-radius:12px;border:1px solid var(--line-strong);\n    background:var(--surface-2);font-size:19px;color:var(--ink-2);flex:none;cursor:pointer}\n  .mwback[disabled]{opacity:.35}\n  .mwmid{flex:1;min-width:0;text-align:center}\n  .mwdots{display:flex;gap:6px;justify-content:center;margin-bottom:3px}\n  .mwdots span{width:22px;height:4px;border-radius:99px;background:var(--line-strong);transition:background .2s}\n  .mwdots span.on{background:var(--accent)}\n  .mwlbl{font-family:Archivo,sans-serif;font-weight:700;font-size:13px}\n  .mwtot{font-size:11.5px;color:var(--ink-2);font-variant-numeric:tabular-nums;min-height:14px}\n  .mwnext{flex:none;min-width:118px;height:46px;border-radius:12px;border:0;cursor:pointer;\n    background:var(--accent);color:#fff;font-family:Archivo,sans-serif;font-weight:700;font-size:14.5px;\n    box-shadow:0 4px 14px rgba(30,78,140,.35)}\n  body.mwiz{padding-bottom:84px}\n  .fitbar{position:fixed;left:10px;right:10px;bottom:calc(76px + env(safe-area-inset-bottom));z-index:89;\n    padding:9px 13px;border-radius:11px;font-size:12.5px;font-weight:700;line-height:1.4;\n    background:#FDECEA;border:1.5px solid #D9776A;color:#A02818;text-align:center;\n    box-shadow:0 6px 18px rgba(160,40,24,.25);animation:fitpulse 1.5s ease-in-out infinite}\n  @keyframes fitpulse{0%,100%{box-shadow:0 0 0 0 rgba(217,119,106,.55)}50%{box-shadow:0 0 0 8px rgba(217,119,106,0)}}\n  @media (prefers-reduced-motion: reduce){.fitbar{animation:none}}\n  \/* the site's WhatsApp \/ chat floaters sit in the corner our nav owns \u2014 lift them *\/\n  body.mwiz .ht-ctc, body.mwiz .joinchat, body.mwiz .qlwapp, body.mwiz .chaty,\n  body.mwiz #chaty-widget, body.mwiz .wa-chat-box, body.mwiz .wa__btn_popup,\n  body.mwiz #whatsapp-chat, body.mwiz [class*=\"whatsapp\"i][class*=\"float\"i],\n  body.mwiz [id*=\"whatsapp\"i][style*=\"fixed\"]{bottom:96px!important}\n  \/* trim the header to the essentials *\/\n  body.mwiz .fx,body.mwiz .who{display:none}\n  body.mwiz .repcard{display:none}\n  body.mwiz.mstep-3 .repcard{display:flex}\n  \/* everything hidden by default; each step turns its own blocks on *\/\n  body.mwiz .controls, body.mwiz .discbanner, body.mwiz .draftbar, body.mwiz .tablewrap,\n  body.mwiz .dock, body.mwiz .notes, body.mwiz #msgside, body.mwiz #catside,\n  body.mwiz #side, body.mwiz #moqcard, body.mwiz .rail, body.mwiz .scrollbar{display:none}\n  body.mwiz.mstep-1 #side{display:block}\n  body.mwiz.mstep-1 #moqcard{display:flex}\n  body.mwiz.mstep-2 .controls{display:block}\n  body.mwiz.mstep-2 .discbanner{display:flex}\n  body.mwiz.mstep-2 .draftbar{display:flex}\n  body.mwiz.mstep-2 .tablewrap{display:block}\n  body.mwiz .controls .btn, body.mwiz .controls .spacer{display:none}\n  body.mwiz .controls .search{max-width:none;flex:1 1 100%}\n  body.mwiz.mstep-3 .dock{display:block;position:static;max-height:none;overflow:visible;border-radius:var(--r)}\n  body.mwiz.mstep-3 #msgside{display:block}\n  body.mwiz.mstep-3 .rail{display:block;position:static;transform:none;width:auto;z-index:1;\n    border:1px solid var(--line);border-radius:var(--r);margin-top:12px;max-height:none}\n  body.mwiz.mstep-3 .railx{display:none}\n  body.mwiz.mstep-3 .mwnext{background:#2E7C5A;box-shadow:0 4px 14px rgba(46,124,90,.35)}\n  \/* lean product card: photo \u00b7 ref+price line \u00b7 name \u00b7 size \u00b7 stepper \u00b7 total *\/\n  body.mwiz tbody td.k-upc, body.mwiz tbody td.k-pu, body.mwiz tbody td.k-pue,\n  body.mwiz tbody td.k-pce, body.mwiz tbody td.k-teur, body.mwiz tbody td.k-units,\n  body.mwiz tbody td.k-pallets, body.mwiz tbody td.k-tcbm, body.mwiz tbody td.k-tnet,\n  body.mwiz tbody td.k-tgross{display:none!important}\n  body.mwiz tbody tr{grid-template-columns:64px 1fr auto;gap:1px 12px;padding:12px 13px;align-items:center}\n  body.mwiz tbody td{grid-column:auto;padding:1px 0}\n  body.mwiz tbody td::before{display:none!important}\n  body.mwiz tbody td.c-photo{grid-column:1;grid-row:1\/span 3;padding:0}\n  body.mwiz .thumb{width:60px;height:76px}\n  body.mwiz tbody td.k-ref{grid-column:2;grid-row:1;padding:0;justify-content:flex-start}\n  body.mwiz tbody td.k-pc{grid-column:3;grid-row:1;justify-content:flex-end;font-size:14px;font-weight:600}\n  body.mwiz tbody td.c-name{grid-column:2\/span 2;grid-row:2;padding:0}\n  body.mwiz .pname .b{font-size:14px}\n  body.mwiz .pname .f{font-size:12.5px}\n  body.mwiz tbody td.k-g{grid-column:2\/span 2;grid-row:3;justify-content:flex-start;color:var(--ink-3);font-size:12px;padding:0}\n  body.mwiz tbody td.c-qty{grid-column:1\/-1;grid-row:4;border-top:1px dashed var(--line);\n    margin-top:9px;padding-top:10px;justify-content:center;\n    width:auto!important;min-width:0!important;background:transparent}\n  body.mwiz .qtywrap{display:flex;align-items:stretch;gap:0;width:100%;max-width:280px;margin:0 auto}\n  body.mwiz .qstep{display:block;width:52px;border:1px solid var(--line-strong);background:var(--surface-2);\n    font-size:20px;color:var(--accent-ink);cursor:pointer;flex:none}\n  body.mwiz .qminus{border-radius:11px 0 0 11px;border-right:0}\n  body.mwiz .qplus{border-radius:0 11px 11px 0;border-left:0}\n  body.mwiz .qty{flex:1;width:auto!important;min-width:0;height:46px;border-radius:0;text-align:center;\n    font-size:17px;font-weight:600;border:1px solid var(--line-strong)}\n  body.mwiz tbody td.k-tusd{grid-column:1\/-1;grid-row:5;display:flex!important;justify-content:space-between;\n    padding:8px 2px 0}\n  body.mwiz tbody td.k-tusd::before{content:attr(data-label);display:block!important;font-size:11px;\n    letter-spacing:.05em;text-transform:uppercase;color:var(--ink-3);font-weight:600;font-family:Archivo,sans-serif}\n  body.mwiz tbody tr:not(.has-qty) td.k-tusd{display:none!important}\n}\n@media screen and (min-width:861px){.mwnav,.fitbar{display:none!important}}\n\n\/* ---------- print ---------- *\/\n.printhead{display:none}\n@media print{\n  @page{ size:A4 landscape; margin:7mm 6mm 9mm; }\n  .mast,.controls,.dock,.noprint,.lb,.sheet,.cat,.rail,.leftcol,.submitbar,.discbanner,\n  .draftbar,.mastbar,#codepanel{display:none!important}\n  html,body{background:#fff!important;color:#111!important}\n  body{font:9pt\/1.25 Helvetica,Arial,sans-serif;-webkit-print-color-adjust:exact;print-color-adjust:exact}\n  .wrap{max-width:none;padding:0}\n  .layout{display:block}\n  .tablewrap{border:0;box-shadow:none;overflow:visible;margin:0}\n\n  .printhead{display:block!important;padding:0 0 6px;border-bottom:2pt solid #1E4E8C;margin-bottom:7px}\n  .printhead .t{font-size:15pt;font-weight:700;letter-spacing:-.3pt;color:#1E4E8C}\n  .printhead .s{font-size:7.5pt;color:#444;margin-top:2px}\n  .printhead .buyer{font-size:8pt;margin-top:4px;padding-top:4px;border-top:.5pt solid #ccc;color:#111}\n\n  table{width:100%;border-collapse:collapse;table-layout:auto}\n  thead{display:table-header-group}\n  tfoot{display:table-footer-group}\n  tr{page-break-inside:avoid;break-inside:avoid}\n  thead th{\n    background:#1E4E8C!important;color:#fff!important;position:static;\n    font-size:5.6pt;letter-spacing:.3pt;text-transform:uppercase;font-weight:700;\n    padding:2.5pt;border:0;border-bottom:.5pt solid #1E4E8C;white-space:normal;vertical-align:bottom}\n  tbody td{padding:1.5pt 2.5pt;border:0;border-bottom:.4pt solid #DDD;font-size:6.9pt;\n    white-space:nowrap;vertical-align:middle}\n  \/* the product name is the only column allowed to wrap, and it gets the room\n     to do it in one or two lines instead of four *\/\n  th.c-name,td.c-name{width:150pt;max-width:150pt}\n  th.c-photo,td.c-photo{width:16pt}\n  tbody tr:nth-child(even) td{background:#F5F4F0!important}\n  tbody tr.has-qty td{background:#E3EBF6!important;font-weight:600}\n  .thumb{width:11pt;height:15pt;border:.4pt solid #ddd;border-radius:1pt;background:#fff}\n  .pname{white-space:normal;max-width:none;min-width:0}\n  .pname{line-height:1.15}\n  .pname .b{font-size:6.9pt;font-weight:700;display:inline}\n  .pname .f{font-size:6.9pt;color:#333;display:inline}\n  .pname .b::after{content:\" \u00b7 \";color:#999;font-weight:400}\n  .idx,.rowedit{font-size:6.6pt;color:#777}\n  .rowedit .pen,.warnflag,.pub{display:none!important}\n  .was{font-size:5.8pt;color:#8a8a84}\n  .now{font-weight:700}\n  .muted{color:#aaa}\n  .qty{border:0!important;background:transparent!important;padding:0!important;width:auto!important;\n       font:700 7.6pt Helvetica,Arial,sans-serif;color:#111;-webkit-appearance:none;appearance:none;text-align:right}\n  .qty::-webkit-inner-spin-button,.qty::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}\n  td.n,th.n{text-align:right}\n  a{color:inherit;text-decoration:none}\n\n  \/* full price list \u2014 drop the order columns, keep everything descriptive *\/\n  body.print-all .g-calc,body.print-all td.c-qty,body.print-all th.c-qty{display:none!important}\n  \/* order sheet \u2014 drop the reference detail, keep what was ordered *\/\n  body.print-selected tbody tr:not(.has-qty){display:none!important}\n  body.print-selected .g-pack,body.print-selected .g-comp,body.print-selected .g-wt{display:none!important}\n  body.print-selected tbody tr:nth-child(even) td{background:transparent!important}\n\n  .printfoot{display:block!important;margin-top:7px;padding-top:5px;border-top:1pt solid #1E4E8C;\n    font-size:7.6pt;color:#222}\n  .printfoot strong{font-size:9pt;color:#1E4E8C}\n}\n.printfoot{display:none}\n\/* TranslatePress drops a floating EN\/TR bubble over every page. It overlaps the\n   totals panel and duplicates the switch already in our header, so it is hidden\n   on the portal pages only \u2014 the plugin still runs everywhere else. *\/\n#trp-floater-ls,.trp-floater-ls-codes,.trp-language-switcher-container.trp-bottom-right{display:none!important}\n\/* the saved-draft strip: present but quiet, so it never competes with prices *\/\n.draftbar{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin:14px 0 0;padding:11px 15px;\n  background:var(--warn-soft);border:1px solid var(--warn);border-radius:var(--r);\n  color:var(--warn);font-size:13.5px;line-height:1.45}\n.draftbar b{font-family:Archivo,sans-serif;display:block;font-size:14px}\n.draftbar .spacer{flex:1}\n.draftbar .btn{background:var(--surface);border-color:var(--warn);color:var(--warn)}\n.savedtick{font-size:12.5px;color:var(--good);font-weight:600;margin-right:auto}\n\/* ---- messages ---- *\/\n\/* ---- catalogue snapshot ---- *\/\n.catcard{padding:0;overflow:hidden}\n.catlink{display:flex;align-items:center;gap:10px;margin:0 14px 11px;padding:10px 12px;\n  border:1px solid var(--accent);border-radius:var(--r);background:var(--accent-soft);\n  color:var(--accent-ink);text-decoration:none;font-size:13px;line-height:1.3}\n.catlink:hover{background:var(--accent);color:var(--on-accent)}\n.catlink:hover svg{stroke:var(--on-accent)}\n.catlink svg{width:19px;height:19px;flex:none;fill:none;stroke:var(--accent-ink);stroke-width:1.6;\n  stroke-linecap:round;stroke-linejoin:round}\n.catlink b{display:block;font-family:Archivo,sans-serif;font-weight:600}\n.catlink .sub{display:block;font-size:11.5px;opacity:.8;margin-top:1px}\n.catahd{padding:11px 14px 9px}\n.catahd .linkbtn{margin-left:auto}\n.catstage{position:relative;background:var(--sunken);display:flex;align-items:center;justify-content:center;\n  aspect-ratio:1\/1.414;overflow:hidden}\n.catstage img{width:100%;height:100%;object-fit:contain;display:block;\n  opacity:0;transition:opacity .45s ease}\n.catstage img.in{opacity:1}\n.catnav{position:absolute;top:50%;transform:translateY(-50%);width:26px;height:38px;border:0;\n  background:rgba(20,21,15,.42);color:#fff;font-size:19px;line-height:1;cursor:pointer;opacity:0;\n  transition:opacity .15s;border-radius:4px}\n.catstage:hover .catnav,.catnav:focus-visible{opacity:1}\n.catnav.prev{left:5px} .catnav.next{right:5px}\n.catfoot{display:flex;align-items:center;gap:10px;padding:8px 14px 11px;font-size:11.5px;\n  color:var(--ink-3);font-variant-numeric:tabular-nums}\n.catdots{margin-left:auto;display:flex;gap:3px;flex-wrap:wrap;max-width:150px;justify-content:flex-end}\n.catdot{width:5px;height:5px;border-radius:100px;background:var(--line-strong)}\n.catdot.on{background:var(--accent)}\n@media (prefers-reduced-motion: reduce){.catstage img{transition:none}}\n\/* ---- the welcome page ---- *\/\n.welcome{min-height:100vh;background:\n  radial-gradient(1100px 500px at 85% -10%, var(--accent-soft) 0%, transparent 60%), var(--ground)}\n.w-mast{background:var(--surface);border-bottom:1px solid var(--line);position:relative;z-index:2}\n\/* a soft, playful backdrop: brand-blue glow top-left, warm glow right, faint confetti dots *\/\n.welcome{position:relative;overflow:hidden}\n.welcome::before{content:\"\";position:absolute;inset:0;pointer-events:none;z-index:0;\n  background:\n    radial-gradient(620px 340px at 12% 0%, color-mix(in srgb, var(--accent) 14%, transparent), transparent 70%),\n    radial-gradient(520px 300px at 95% 18%, rgba(240,171,0,.12), transparent 70%),\n    radial-gradient(3px 3px at 18% 34%, rgba(240,171,0,.5) 40%, transparent 41%),\n    radial-gradient(2.5px 2.5px at 30% 12%, color-mix(in srgb, var(--accent) 55%, transparent) 40%, transparent 41%),\n    radial-gradient(3px 3px at 55% 26%, rgba(216,84,62,.4) 40%, transparent 41%),\n    radial-gradient(2.5px 2.5px at 72% 8%,  rgba(240,171,0,.45) 40%, transparent 41%),\n    radial-gradient(3px 3px at 86% 40%, color-mix(in srgb, var(--accent) 45%, transparent) 40%, transparent 41%),\n    radial-gradient(2.5px 2.5px at 44% 6%, rgba(216,84,62,.35) 40%, transparent 41%)}\n.w-body{position:relative;z-index:1}\n.w-mast-in{display:flex;align-items:center;gap:14px;padding-block:12px}\n.w-mast-in .iconbtn{margin-left:auto}\n.w-body{padding:44px 0 60px;display:grid;grid-template-columns:1.15fr .85fr;gap:34px;align-items:start}\n.w-hero h1{font-family:Archivo,sans-serif;font-size:clamp(28px,4vw,40px);letter-spacing:-.03em;margin:0 0 10px}\n.w-hero h1 em{font-style:normal;background:linear-gradient(100deg,var(--accent-ink),#2E7CD6 80%);\n  -webkit-background-clip:text;background-clip:text;color:transparent}\n.w-wave{display:inline-block;transform-origin:70% 70%;animation:w-wave 2.4s ease .6s 2}\n@keyframes w-wave{0%,100%{transform:rotate(0)}15%{transform:rotate(16deg)}30%{transform:rotate(-7deg)}\n  45%{transform:rotate(12deg)}60%{transform:rotate(-4deg)}75%{transform:rotate(8deg)}}\n\/* the discount banner should be impossible to miss \u2014 it breathes and glints *\/\n.w-disc{display:flex;align-items:center;gap:12px;margin:0 0 20px;padding:13px 18px;max-width:56ch;\n  border-radius:14px;border:1.5px solid #E8B93E;position:relative;overflow:hidden;\n  background:linear-gradient(105deg,#FFF7E0,#FFEFC2 55%,#FFF7E0);\n  animation:discpulse 1.6s ease-in-out infinite}\n.w-disc::after{content:\"\";position:absolute;top:0;bottom:0;width:46px;transform:skewX(-20deg);\n  background:linear-gradient(90deg,transparent,rgba(255,255,255,.85),transparent);\n  animation:discsheen 2.6s ease-in-out infinite}\n@keyframes discsheen{0%,55%{left:-60px}100%{left:calc(100% + 40px)}}\n@keyframes discpulse{0%,100%{box-shadow:0 0 0 0 rgba(232,151,0,.45);transform:scale(1)}\n  50%{box-shadow:0 0 0 9px rgba(232,151,0,0);transform:scale(1.012)}}\n.w-disc .pct{flex:none;font-family:Archivo,sans-serif;font-weight:800;font-size:19px;color:#8A5A00;\n  background:#fff;border:1.5px solid #E8B93E;border-radius:10px;padding:6px 11px;white-space:nowrap}\n.w-disc b{color:#6B4A00}\n.w-disc span.tx{font-size:14.5px;line-height:1.45;color:#6B4A00}\n@media (prefers-reduced-motion: reduce){.w-disc,.w-disc::after,.w-wave{animation:none}}\n.w-hero p{font-size:16.5px;line-height:1.65;color:var(--ink-2);margin:0 0 20px;max-width:56ch}\n.w-points{display:grid;gap:12px;margin-bottom:28px}\n.w-point{display:flex;gap:13px;align-items:flex-start;background:var(--surface);border:1px solid var(--line);\n  border-radius:var(--r);padding:13px 16px;box-shadow:var(--shadow)}\n.w-point .ico{flex:none;width:36px;height:36px;border-radius:10px;display:flex;align-items:center;justify-content:center}\n.w-point:nth-child(1) .ico{background:color-mix(in srgb, var(--accent) 12%, transparent)}\n.w-point:nth-child(2) .ico{background:rgba(240,171,0,.16)}\n.w-point:nth-child(3) .ico{background:rgba(46,124,90,.13)}\n.w-point svg{width:20px;height:20px;fill:none;stroke:var(--accent);\n  stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}\n.w-point:nth-child(2) svg{stroke:#B07A00}\n.w-point:nth-child(3) svg{stroke:#2E7C5A}\n.w-point b{display:block;font-family:Archivo,sans-serif;font-size:14.5px;margin-bottom:2px}\n.w-point span{font-size:13.5px;color:var(--ink-2);line-height:1.5}\n.w-cta{display:flex;align-items:center;gap:16px;flex-wrap:wrap}\n.w-cta .btn-big{font-size:16px;padding:13px 24px;animation:ctaglow 2.2s ease-in-out infinite}\n.w-sign{margin-top:26px;max-width:56ch}\n.w-sign-line{margin:0 0 10px;font-size:14.5px;color:var(--ink-2);font-style:italic}\n.w-sign-card{display:flex;gap:12px;align-items:center;background:var(--surface);\n  border:1px solid var(--line);border-left:4px solid var(--accent);border-radius:var(--r);\n  padding:13px 16px;box-shadow:var(--shadow)}\n.w-sign-card .ravatar{width:42px;height:42px;font-size:15px}\n.w-sign-who{display:flex;flex-direction:column;line-height:1.35;min-width:0}\n.w-sign-who b{font-family:Archivo,sans-serif;font-size:15px}\n.w-sign-who > span:first-of-type{font-size:11px;color:var(--accent-ink);font-weight:600;\n  letter-spacing:.05em;text-transform:uppercase}\n.w-sign-links{display:flex;gap:12px;flex-wrap:wrap;font-size:13px;margin-top:2px}\n.w-sign-links a{color:var(--accent-ink);text-decoration:none;font-variant-numeric:tabular-nums}\n.w-sign-links a:hover{text-decoration:underline}\n@keyframes ctaglow{0%,100%{box-shadow:0 2px 6px rgba(16,42,84,.25)}50%{box-shadow:0 4px 18px rgba(30,78,140,.45)}}\n@media (prefers-reduced-motion: reduce){.w-cta .btn-big{animation:none}}\n.w-hint{font-size:12.5px;color:var(--ink-3);max-width:30ch;line-height:1.45}\n.w-docs h2{font-family:Archivo,sans-serif;font-size:13px;letter-spacing:.11em;text-transform:uppercase;\n  color:var(--ink-3);margin:6px 0 14px}\n.doccards{display:grid;gap:12px}\n.doccard{display:flex;gap:14px;align-items:flex-start;background:var(--surface);border:1px solid var(--line);\n  border-radius:var(--r);padding:15px 17px;text-decoration:none;color:inherit;box-shadow:var(--shadow);\n  transition:border-color .12s, transform .12s}\n.doccard:hover{border-color:var(--accent);transform:translateY(-1px)}\n.doccard .ic{width:38px;height:38px;flex:none;border-radius:9px;display:flex;align-items:center;justify-content:center;\n  font-family:Archivo,sans-serif;font-weight:800;font-size:10.5px;letter-spacing:.04em;color:#fff}\n.doccard .ic.pdf{background:var(--accent)}\n.doccard .ic.xls{background:var(--good)}\n.doccard b{display:block;font-family:Archivo,sans-serif;font-size:15px;margin-bottom:3px}\n.doccard p{margin:0;font-size:13px;color:var(--ink-2);line-height:1.5}\n.doccard .meta{display:block;font-size:11.5px;color:var(--ink-3);margin-top:5px;font-variant-numeric:tabular-nums}\n.doccard.off{opacity:.5;pointer-events:none}\n.w-alt{margin-top:16px;padding:16px 18px;border:1.5px solid color-mix(in srgb, var(--accent) 38%, transparent);\n  border-radius:var(--r);font-size:13.5px;color:var(--ink);line-height:1.55;\n  background:color-mix(in srgb, var(--accent) 7%, var(--surface));box-shadow:var(--shadow)}\n.w-alt .althd{display:flex;align-items:center;gap:9px;font-family:Archivo,sans-serif;font-weight:700;\n  font-size:15px;margin-bottom:9px;color:var(--accent-ink)}\n.w-alt .althd svg{width:19px;height:19px;fill:none;stroke:var(--accent);stroke-width:1.9;\n  stroke-linecap:round;stroke-linejoin:round}\n.w-alt ol{margin:0 0 6px;padding-left:0;list-style:none;display:grid;gap:6px}\n.w-alt ol li{display:flex;gap:9px;align-items:baseline}\n.w-alt ol li .n{flex:none;width:19px;height:19px;border-radius:50%;background:var(--accent);color:#fff;\n  font-size:11px;font-weight:700;display:inline-flex;align-items:center;justify-content:center;transform:translateY(3px)}\n.w-alt .mail{font-weight:700;color:var(--accent-ink);text-decoration:none;border-bottom:1.5px solid var(--accent)}\n.w-alt .fine{color:var(--ink-2);font-size:12.5px;margin:4px 0 0}\n\/* the customer's direct line to their Claimont person \u2014 always visible, hard to miss *\/\n.repcard{display:flex;align-items:center;gap:10px;padding:6px 13px 6px 8px;border-radius:12px;\n  background:color-mix(in srgb, var(--accent) 8%, var(--surface));\n  border:1.5px solid color-mix(in srgb, var(--accent) 40%, transparent)}\n.ravatar{width:34px;height:34px;flex:none;border-radius:50%;background:var(--accent);color:#fff;\n  display:flex;align-items:center;justify-content:center;font-family:Archivo,sans-serif;\n  font-weight:800;font-size:13px;letter-spacing:.02em}\n.repcard .rtxt{display:flex;flex-direction:column;line-height:1.25;min-width:0}\n.repcard b{font-family:Archivo,sans-serif;font-size:13px}\n.repcard .rrole{font-size:10.5px;color:var(--accent-ink);font-weight:600;letter-spacing:.04em;text-transform:uppercase}\n.repcard .rlinks{display:flex;gap:10px;font-size:12px;white-space:nowrap}\n.repcard .rlinks a{color:var(--accent-ink);text-decoration:none;font-variant-numeric:tabular-nums}\n.repcard .rlinks a:hover{text-decoration:underline}\n.repcard .rlinks a[hidden]{display:none}\n@media (max-width:900px){\n  .repcard{order:11;flex:1 1 100%;justify-content:flex-start;padding:7px 12px}\n  .repcard .rlinks{display:flex;flex-wrap:wrap;gap:6px 12px}\n}\n.mailwarn{margin:12px auto 0;max-width:52ch;padding:10px 14px;border-radius:9px;font-size:13px;line-height:1.5;\n  background:#FFF6E4;border:1px solid #E8B93E;color:#6B4A00;text-align:left}\n@media (max-width:980px){.w-body{grid-template-columns:1fr;padding-top:26px}}\n@media (max-width:620px){\n  .w-body{padding:18px 0 40px;gap:24px}\n  .w-hero h1{font-size:26px}\n  .w-hero p{font-size:15px}\n  .w-mast-in{flex-wrap:wrap;gap:8px 10px}\n  .w-disc{padding:11px 13px;gap:10px}\n  .w-disc .pct{font-size:16px;padding:5px 9px}\n  .w-disc span.tx{font-size:13.5px}\n  .w-cta{gap:10px}\n  .w-cta .btn-big{flex:1 1 100%;text-align:center;justify-content:center}\n  .w-sign-card{flex-wrap:wrap}\n  .doccard{padding:12px 13px}\n}\n.msgcard{display:flex;flex-direction:column;min-height:0}\n\/* Collapsing the conversation lifts everything below it up the column, which is\n   the point of having it at the top. The choice is remembered per browser. *\/\n.msgtoggle{background:none;border:0;padding:2px 4px;margin-left:auto;cursor:pointer;\n  color:var(--ink-3);display:flex;align-items:center;line-height:1}\n.msgtoggle:hover{color:var(--accent-ink)}\n.msgtoggle svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:2.2;\n  stroke-linecap:round;stroke-linejoin:round;transition:transform .18s ease}\n#msgside.folded .msgtoggle svg{transform:rotate(-90deg)}\n#msgside.folded .msgbody,#msgside.folded .msgform{display:none}\n#msgside.folded .msghd{padding-bottom:12px}\n@media (prefers-reduced-motion: reduce){.msgtoggle svg{transition:none}}\n.msghd{align-items:center}\n.msgn{min-width:19px;height:19px;padding:0 6px;border-radius:100px;background:var(--crit);color:#fff;\n  font-size:11px;font-weight:700;line-height:19px;text-align:center;font-family:\"IBM Plex Mono\",monospace}\n.msghd .linkbtn{margin-left:auto}\n.msgbody{padding:0 14px 4px;max-height:290px;overflow-y:auto;display:flex;flex-direction:column;gap:9px}\n.msgempty{padding:10px 0 14px;color:var(--ink-3);font-size:12.5px;line-height:1.5}\n.bub{max-width:92%;padding:8px 11px;border-radius:12px;font-size:13px;line-height:1.45;\n  border:1px solid var(--line);background:var(--surface-2);align-self:flex-start;overflow-wrap:anywhere}\n.bub.mine{align-self:flex-end;background:var(--accent-soft);border-color:var(--accent-soft);color:var(--accent-ink)}\n.bub .meta{display:block;font-size:10.5px;color:var(--ink-3);margin-top:4px;font-variant-numeric:tabular-nums}\n.bub.mine .meta{color:var(--accent-ink);opacity:.75}\n.msgform{display:flex;gap:8px;align-items:flex-end;padding:11px 14px;border-top:1px solid var(--line)}\n.msgform textarea{flex:1;min-width:0;resize:vertical;padding:7px 9px;border:1px solid var(--line-strong);\n  border-radius:6px;background:var(--surface-2);font:inherit;font-size:13px;color:inherit;\n  font-family:\"Source Sans 3\",system-ui,sans-serif}\n.msgform textarea:focus{outline:0;border-color:var(--accent);background:var(--surface);\n  box-shadow:0 0 0 3px var(--accent-soft)}\n.msgform .btn{flex:none}\n.threadrow{display:block;width:100%;text-align:left;background:none;border:0;border-bottom:1px solid var(--line);\n  padding:9px 0;cursor:pointer;font:inherit;color:inherit}\n.threadrow:last-child{border-bottom:0}\n.threadrow:hover{color:var(--accent-ink)}\n.threadrow .tn{display:flex;align-items:center;gap:7px;font-weight:600;font-size:13.5px}\n.threadrow .tl{display:block;font-size:12px;color:var(--ink-2);margin-top:2px;\n  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.threadrow .tw{display:block;font-size:11px;color:var(--ink-3);margin-top:2px;font-variant-numeric:tabular-nums}\n.dotu{width:8px;height:8px;border-radius:100px;background:var(--crit);flex:none}\n@media (prefers-reduced-motion: reduce){*{transition:none!important}}\n<\/style>\n\n<div class=\"gate\" id=\"gate\">\n  <div class=\"gatebox\">\n    <div class=\"gatehead\">\n      <img decoding=\"async\" class=\"gatelogo\" src=\"https:\/\/claimont.com\/wp-content\/uploads\/2024\/01\/logo.png\" alt=\"Claimont\" onerror=\"this.hidden=true\">\n      <div class=\"bn\">CLAIMONT<\/div>\n      <div class=\"bs\" id=\"g-sub\">Customer orders<\/div>\n    <\/div>\n    <div class=\"gatebody\">\n    <div class=\"gatetag\" id=\"g-tag\">Snacks the world comes back for<\/div>\n    <h1 id=\"g-title\">Enter your access code<\/h1>\n    <p id=\"g-text\">Use the code Claimont gave you. It unlocks the product list, prices and the order sheet for your account.<\/p>\n    <input id=\"g-code\" type=\"text\" autocomplete=\"off\" spellcheck=\"false\" placeholder=\"CLM-XXXXXX\" aria-label=\"Access code\">\n    <div class=\"row\"><button class=\"btn btn-primary\" id=\"g-go\">Unlock<\/button><\/div>\n    <div class=\"gateerr\" id=\"g-err\"><\/div>\n    <div class=\"gatefoot\" id=\"g-foot\">No code yet? Email export@claimont.com and we'll issue one.<\/div>\n    <div class=\"langmini\">\n      <button id=\"g-en\" aria-pressed=\"true\">English<\/button>\n      <button id=\"g-tr\" aria-pressed=\"false\">T\u00fcrk\u00e7e<\/button>\n    <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<div class=\"welcome\" id=\"welcome\" hidden>\n  <div class=\"w-mast\">\n    <div class=\"wrap w-mast-in\">\n      <div class=\"brandmark\">\n        <img decoding=\"async\" class=\"logo\" src=\"https:\/\/claimont.com\/wp-content\/uploads\/2024\/01\/logo.png\" alt=\"Claimont\" onerror=\"this.hidden=true\">\n        <span class=\"txt\"><span class=\"bn\">CLAIMONT<\/span><span class=\"bs\" id=\"w-sub\">Customer orders<\/span><\/span>\n      <\/div>\n      <button class=\"iconbtn\" id=\"w-signout\">Sign out<\/button>\n      <div class=\"seg\" role=\"group\" aria-label=\"Language\">\n        <button id=\"w-en\" aria-pressed=\"true\">EN<\/button>\n        <button id=\"w-tr\" aria-pressed=\"false\">TR<\/button>\n      <\/div>\n    <\/div>\n  <\/div>\n  <div class=\"wrap w-body\">\n    <section class=\"w-hero\">\n      <h1 id=\"w-title\">Welcome<\/h1>\n      <p id=\"w-lead\"><\/p>\n      <div class=\"w-disc\" id=\"w-disc\" hidden><\/div>\n      <div class=\"w-points\" id=\"w-points\"><\/div>\n      <div class=\"w-cta\">\n        <button class=\"btn btn-primary btn-big\" id=\"w-enter\">View prices &amp; place your order \u2192<\/button>\n        <span class=\"w-hint\" id=\"w-screen\"><\/span>\n      <\/div>\n      <div class=\"w-sign\" id=\"w-sign\" hidden><\/div>\n    <\/section>\n    <section class=\"w-docs\">\n      <h2 id=\"w-dochd\">Documents<\/h2>\n      <div class=\"doccards\" id=\"doccards\"><\/div>\n      <div class=\"w-alt\" id=\"w-alt\"><\/div>\n    <\/section>\n  <\/div>\n<\/div>\n\n<div id=\"app\" hidden>\n<div class=\"mast\">\n  <div class=\"wrap mast-in\">\n    <div class=\"brandmark\"><img decoding=\"async\" class=\"logo\" src=\"https:\/\/claimont.com\/wp-content\/uploads\/2024\/01\/logo.png\" alt=\"Claimont\" onerror=\"this.hidden=true\"><span class=\"txt\"><span class=\"bn\">CLAIMONT<\/span><span class=\"bs\" id=\"masthead-sub\">Customer orders<\/span><\/span><\/div>\n    <div class=\"repcard\" id=\"repcard\" hidden>\n      <span class=\"ravatar\" id=\"rep-av\"><\/span>\n      <span class=\"rtxt\"><b id=\"rep-name\"><\/b><span class=\"rrole\" id=\"rep-role\"><\/span>\n        <span class=\"rlinks\"><a id=\"rep-tel\" href=\"#\"><\/a><a id=\"rep-mail\" href=\"#\"><\/a><\/span><\/span>\n    <\/div>\n    <span class=\"who\" id=\"who\"><\/span>\n    <div class=\"fx\" id=\"fxbox\"><span class=\"dot\"><\/span><span>USD \u2192 EUR<\/span><span class=\"mono\" id=\"fxrate\">0.8700<\/span><span id=\"fxsrc\" class=\"muted\"><\/span><\/div>\n    <button class=\"iconbtn\" id=\"btn-signout\">Sign out<\/button>\n    <div class=\"seg\" role=\"group\" aria-label=\"Language\">\n      <button id=\"lang-en\" aria-pressed=\"true\">EN<\/button>\n      <button id=\"lang-tr\" aria-pressed=\"false\">TR<\/button>\n    <\/div>\n  <\/div>\n<\/div>\n\n<div class=\"controls\">\n  <div class=\"wrap controls-in\">\n    <div class=\"search\">\n      <svg viewbox=\"0 0 24 24\"><circle cx=\"11\" cy=\"11\" r=\"7\"\/><path d=\"M20 20l-3.5-3.5\"\/><\/svg>\n      <input id=\"q\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\">\n    <\/div>\n    <div class=\"chips\" id=\"chips\"><\/div>\n    <div class=\"spacer\"><\/div>\n    <button class=\"btn\" id=\"btn-history\">Your orders<\/button>\n    <button class=\"btn\" id=\"btn-cat\">Catalogue<\/button>\n    <button class=\"btn\" id=\"btn-printall\">Print full list<\/button>\n    <button class=\"btn\" id=\"btn-printsel\" disabled>Print selection<\/button>\n    <button class=\"btn\" id=\"btn-xlsall\">Excel<\/button>\n    <button class=\"btn btn-primary\" id=\"btn-order\" disabled>Order sheet<\/button>\n    <button class=\"btn\" id=\"btn-reset\">Reset<\/button>\n  <\/div>\n<\/div>\n\n<div class=\"wrap layout\">\n <div class=\"leftcol\" id=\"leftcol\">\n <aside class=\"side noprint\" id=\"side\">\n<div class=\"cont contfeature\" id=\"controw\">\n  <div class=\"contline\" id=\"contline1\" data-nudge=\"\">\n    <span class=\"lbl\" id=\"contlbl\">Container planning<\/span>\n    <button class=\"linkbtn\" id=\"btn-continfo\">What do these mean?<\/button>\n    <div class=\"seg loadseg\" role=\"group\">\n      <button id=\"lm-floor\" aria-pressed=\"true\">Floor loaded<\/button>\n      <button id=\"lm-pal\" aria-pressed=\"false\">Palletised<\/button>\n    <\/div>\n    <details class=\"palbox\" id=\"palbox\" hidden>\n      <summary class=\"btn\" id=\"palbtn\">Pallet settings<\/summary>\n      <div class=\"palpanel\">\n        <div class=\"f\"><label for=\"pal-type\" id=\"l-paltype\">Pallet size<\/label>\n          <select id=\"pal-type\"><\/select><\/div>\n        <div class=\"slots\" id=\"pal-slots\"><\/div>\n        <div class=\"f\"><label for=\"pal-kg\" id=\"l-palkg\">Weight of one empty pallet (kg)<\/label>\n          <input id=\"pal-kg\" type=\"number\" min=\"0\" step=\"0.5\" value=\"25\"><\/div>\n        <div class=\"note\" id=\"pal-note\"><\/div>\n      <\/div>\n    <\/details>\n  <\/div>\n  <div class=\"contline pick\">\n    <label for=\"cont-type\" id=\"l-conttype\">I want to ship in<\/label>\n    <select id=\"cont-type\"><\/select>\n    <label for=\"cont-n\" id=\"l-contn\">How many<\/label>\n    <input id=\"cont-n\" type=\"number\" min=\"1\" max=\"99\" step=\"1\" value=\"1\">\n    <div class=\"fitmsg\" id=\"fitmsg\"><\/div>\n  <\/div>\n  <div class=\"meters\" id=\"meters\"><\/div>\n  <div class=\"c3dwrap noprint\" id=\"c3d\"><\/div>\n  <div class=\"flnote\" id=\"flnote\" hidden><\/div>\n<\/div>\n <\/aside>\n <aside class=\"side noprint\" id=\"msgside\">\n  <div class=\"cont msgcard\">\n    <div class=\"contline msghd\">\n      <span class=\"lbl\" id=\"msglbl\">Messages<\/span>\n      <span class=\"msgn\" id=\"msgn\" hidden>0<\/span>\n      <button class=\"msgtoggle\" id=\"msgfold\" aria-expanded=\"true\" aria-controls=\"msgbody\" aria-label=\"Collapse messages\">\n        <svg viewbox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M6 9l6 6 6-6\"\/><\/svg>\n      <\/button>\n      \n    <\/div>\n    <div class=\"msgbody\" id=\"msgbody\"><\/div>\n    <div class=\"msgform\" id=\"msgform\" hidden>\n      <textarea id=\"msgtext\" rows=\"2\" placeholder=\"Write a message\u2026\" aria-label=\"Mesaj\"><\/textarea>\n      <button class=\"btn btn-primary\" id=\"msgsend\">Send<\/button>\n    <\/div>\n  <\/div>\n <\/aside>\n <aside class=\"rail\" id=\"rail\">\n   <div class=\"railhd\">\n     <span id=\"rail-title\">Your orders<\/span>\n     <button class=\"railx\" id=\"rail-x\" aria-label=\"Kapat\">\u00d7<\/button>\n   <\/div>\n   <div class=\"railbody\" id=\"rail-body\"><\/div>\n <\/aside>\n <aside class=\"side noprint\" id=\"catside\" hidden>\n  <div class=\"cont catcard\">\n    <div class=\"contline catahd\">\n      <span class=\"lbl\" id=\"catlbl\">From the catalogue<\/span>\n    <\/div>\n    <a class=\"catlink\" id=\"catlink\" href=\"#\" target=\"_blank\" rel=\"noopener\" hidden>\n      <svg viewbox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M7 3h7l5 5v13a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1z\"\/><path d=\"M14 3v5h5\"\/><\/svg>\n      <span><b id=\"catlink-t\">Open the full catalogue<\/b><span class=\"sub\" id=\"catlink-s\"><\/span><\/span>\n    <\/a>\n    <div class=\"catstage\" id=\"catstage\">\n      <img id=\"catimg\" alt=\"\">\n      <button class=\"catnav prev\" id=\"cat-prev\" aria-label=\"Previous page\">\u2039<\/button>\n      <button class=\"catnav next\" id=\"cat-next\" aria-label=\"Next page\">\u203a<\/button>\n    <\/div>\n    <div class=\"catfoot\"><span id=\"catpage\">\u2014<\/span><span class=\"catdots\" id=\"catdots\"><\/span><\/div>\n  <\/div>\n <\/aside>\n <\/div>\n <main class=\"main\">\n  <div class=\"oldver noprint\" id=\"oldver\" hidden><\/div>\n\n  <div class=\"printhead\">\n    <div class=\"t\" id=\"ph-t\">CLAIMONT \u2014 Product list 2026<\/div>\n    <div class=\"s\" id=\"ph-s\"><\/div>\n    <div class=\"buyer\" id=\"ph-b\"><\/div>\n  <\/div>\n\n  <div class=\"discbanner noprint\" id=\"discbanner\" hidden><\/div>\n  <div class=\"moqcard noprint\" id=\"moqcard\" hidden>\n    <span class=\"pctwrap\"><span class=\"pct\">&#128230;<\/span><span class=\"pctsub\" id=\"moq-tag\">mix &amp; match<\/span><\/span>\n    <span class=\"dtext\">\n      <span class=\"txt\" id=\"moq-line\"><\/span>\n      <span class=\"sub\"><button class=\"linkbtn moqlink\" id=\"moq-ask\">Need more in one container? Ask us<\/button><\/span>\n      <span class=\"moqask\" id=\"moqask\" hidden>\n        <label for=\"moq-n\" id=\"moq-asklb\">How many products per container would suit you?<\/label>\n        <span class=\"moqrow\">\n          <input id=\"moq-n\" type=\"number\" min=\"1\" max=\"20\" step=\"1\" inputmode=\"numeric\">\n          <button class=\"btn btn-primary\" id=\"moq-send\">Send request<\/button>\n        <\/span>\n        <span class=\"moqnote\" id=\"moq-msg\"><\/span>\n      <\/span>\n    <\/span>\n  <\/div>\n  <div class=\"draftbar noprint\" id=\"draftbar\" hidden><\/div>\n\n  <div class=\"scrollbar noprint\" id=\"scrollbar\">\n    <span class=\"hint\" id=\"scrollhint\">Scroll for more columns \u2192<\/span>\n    <div class=\"scrolltop\" id=\"scrolltop\"><div id=\"scrollspacer\"><\/div><\/div>\n    <div class=\"qtyctl\" id=\"qtyctl\">\n      <span class=\"lb\" id=\"qtyctl-lb\">Cartons box<\/span>\n      <button type=\"button\" id=\"qty-narrow\" aria-label=\"Narrower\">\u2212<\/button>\n      <span class=\"val\" id=\"qty-val\">104<\/span>\n      <button type=\"button\" id=\"qty-wide\" aria-label=\"Wider\">+<\/button>\n    <\/div>\n  <\/div>\n  <div class=\"tablewrap\" id=\"tablewrap\">\n    <table id=\"tbl\"><thead><tr id=\"hrow\"><\/tr><\/thead><tbody id=\"tbody\"><\/tbody><\/table>\n    <div class=\"empty\" id=\"empty\" hidden><\/div>\n  <\/div>\n\n  <div class=\"printfoot\" id=\"printfoot\"><\/div>\n\n  <div class=\"dock\" id=\"dock\">\n    <div class=\"dock-in\" id=\"stats\"><\/div>\n    <div class=\"submitbar noprint\" id=\"submitbar\" hidden>\n      <div class=\"sb-sum\" id=\"sb-sum\"><\/div>\n      <button class=\"btn btn-big\" id=\"btn-savedraft\">Save as draft<\/button>\n      <button class=\"btn btn-primary btn-big\" id=\"btn-submit\">Review and submit order<\/button>\n    <\/div>\n  <\/div>\n\n  <div class=\"notes noprint\"><h2 id=\"noteshd\">Notes<\/h2><ul id=\"noteslist\"><\/ul><\/div>\n <\/main>\n <\/div>\n<div class=\"fitbar noprint\" id=\"fitbar\" hidden><\/div>\n<div class=\"mwnav noprint\" id=\"mwnav\" hidden>\n  <button class=\"mwback\" id=\"mw-back\" aria-label=\"Back\">&#8592;<\/button>\n  <div class=\"mwmid\">\n    <div class=\"mwdots\" aria-hidden=\"true\"><span><\/span><span><\/span><span><\/span><\/div>\n    <div class=\"mwlbl\" id=\"mw-lbl\"><\/div>\n    <div class=\"mwtot\" id=\"mw-tot\"><\/div>\n  <\/div>\n  <button class=\"mwnext\" id=\"mw-next\">Next &#8594;<\/button>\n<\/div>\n<\/div>\n\n\n<div class=\"sheet\" id=\"sheet\" role=\"dialog\" aria-modal=\"true\">\n  <div class=\"sheetbox\">\n    <div class=\"sheethd\"><h2 id=\"o-title\">Your order<\/h2><button class=\"btn\" id=\"o-x\">Kapat<\/button><\/div>\n\n    <div class=\"sheetbody\" id=\"step-details\">\n      <div class=\"fitwarn\" id=\"fitwarn-1\" hidden><\/div>\n      <div class=\"grid\">\n        <div class=\"f\"><label for=\"o-company\" id=\"l-company\">Company<\/label><input id=\"o-company\" autocomplete=\"organization\"><\/div>\n        <div class=\"f\"><label for=\"o-contact\" id=\"l-contact\">Contact name<\/label><input id=\"o-contact\" autocomplete=\"name\"><\/div>\n        <div class=\"f\"><label for=\"o-email\" id=\"l-email\">Email<\/label><input id=\"o-email\" type=\"email\" autocomplete=\"email\" inputmode=\"email\"><\/div>\n        <div class=\"f\"><label for=\"o-phone\" id=\"l-phone\">Phone<\/label><input id=\"o-phone\" type=\"tel\" autocomplete=\"tel\" inputmode=\"tel\"><\/div>\n        <div class=\"f\"><label for=\"o-country\" id=\"l-country\">Country \/ port of destination<\/label><input id=\"o-country\"><\/div>\n        <div class=\"f wide\"><label for=\"o-notes\" id=\"l-notes\">Notes for Claimont<\/label><textarea id=\"o-notes\"><\/textarea><\/div>\n      <\/div>\n      <div class=\"howto\" id=\"o-howto\"><\/div>\n    <\/div>\n\n    <div class=\"sheetbody\" id=\"step-confirm\" hidden>\n      <div class=\"fitwarn\" id=\"fitwarn-2\" hidden><\/div>\n      <div class=\"confirmbox\">\n        <h3 id=\"c-h\"><\/h3>\n        <div class=\"c-grid\">\n          <div class=\"c-card\"><h4 id=\"c-ct-h\">Delivery & contact<\/h4><dl class=\"clist\" id=\"c-list\"><\/dl><\/div>\n          <div class=\"c-card c-tot\"><h4 id=\"c-tt-h\">Order totals<\/h4><dl class=\"clist\" id=\"c-tots\"><\/dl><\/div>\n        <\/div>\n        <h4 class=\"c-items-h\" id=\"c-items-h\">Products in this order<\/h4>\n        <div class=\"c-itemswrap\"><table class=\"c-items\" id=\"c-items\"><\/table><\/div>\n      <\/div>\n      <div class=\"howto\" id=\"c-howto\"><\/div>\n    <\/div>\n\n    <div class=\"sheetbody\" id=\"step-done\" hidden>\n      <div class=\"donebox\">\n        <div class=\"tick\" aria-hidden=\"true\">\n          <svg viewbox=\"0 0 24 24\"><path d=\"M4 12.5l5.5 5.5L20 7\"\/><\/svg>\n        <\/div>\n        <h3 id=\"d-h\"><\/h3>\n        <p id=\"d-p\"><\/p>\n        <div class=\"oid\" id=\"d-id\"><\/div>\n        <p class=\"mailwarn\" id=\"d-mail\" hidden><\/p>\n      <\/div>\n    <\/div>\n\n    <div class=\"sheetft\">\n      <button class=\"btn\" id=\"o-savedraft\">Save as draft<\/button>\n      <button class=\"btn btn-primary\" id=\"o-review\">Review order<\/button>\n      <button class=\"btn btn-primary\" id=\"o-send\" hidden>Confirm and send<\/button>\n      <button class=\"btn\" id=\"o-back\" hidden>Back<\/button>\n      <button class=\"btn\" id=\"o-pdf\" hidden>Download PDF<\/button>\n      <button class=\"btn\" id=\"o-csv\" hidden>Download Excel<\/button>\n      <button class=\"btn\" id=\"o-done\" hidden>Kapat<\/button>\n      <span class=\"err\" id=\"o-err\"><\/span>\n    <\/div>\n  <\/div>\n<\/div>\n\n<div class=\"sheet\" id=\"pastsheet\" role=\"dialog\" aria-modal=\"true\">\n  <div class=\"sheetbox\" style=\"max-width:900px\">\n    <div class=\"sheethd\"><h2 id=\"past-title\">Order<\/h2><button class=\"btn\" id=\"past-x\">Kapat<\/button><\/div>\n    <div class=\"sheetbody\" id=\"past-body\"><\/div>\n  <\/div>\n<\/div>\n\n<div class=\"cat\" id=\"cat\">\n  <div class=\"cathd\"><span class=\"t\" id=\"cat-t\">Product catalogue<\/span>\n    <a class=\"btn\" id=\"cat-open\" target=\"_blank\" rel=\"noopener\">Open in new tab<\/a>\n    <button class=\"btn\" id=\"cat-x\">Kapat<\/button><\/div>\n  <iframe id=\"cat-frame\" title=\"Product catalogue\"><\/iframe>\n  <div class=\"catmiss\" id=\"cat-miss\" hidden><\/div>\n<\/div>\n\n<div class=\"sheet\" id=\"infosheet\" role=\"dialog\" aria-modal=\"true\">\n  <div class=\"sheetbox\" style=\"max-width:720px\">\n    <div class=\"sheethd\"><h2 id=\"info-title\">Containers and pallets<\/h2><button class=\"btn\" id=\"info-x\">Kapat<\/button><\/div>\n    <div class=\"sheetbody\" id=\"info-body\"><\/div>\n  <\/div>\n<\/div>\n\n<div class=\"lb\" id=\"lb\"><img id=\"lbimg\" alt=\"\"><\/div>\n\n<script>\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   1. WHERE THE CATALOGUE PDF LIVES\n   Upload the catalogue to WordPress (Media \u2192 Add New), copy its URL,\n   and paste it between the quotes below.\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nconst CATALOGUE_URL = \"https:\/\/claimont.com\/wp-content\/uploads\/2026\/08\/Claimont-Product-Catalogue-EN_compressed.pdf\";\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   2. WHERE ORDERS SHOULD BE SENT\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nconst ORDER_EMAIL = \"export@claimont.com\";\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   3. PORTAL BACKEND\n   The Google Apps Script web-app address. Access codes, discounts and\n   orders all go through it \u2014 no codes are stored in this page.\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nconst ENDPOINT_URL = \"https:\/\/script.google.com\/macros\/s\/AKfycbwOaFLL7LPMiAMNOatbxQJrqxp4MugK9Fp1yZbu4B4heCQH986Kkgln87z55z8AHOWifQ\/exec\";\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   4. PRICES \u2014 unit price USD, carton price USD, both ex-works\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nconst PRICES = {\n  1: [0.121, 6.05],   \/\/ 2603 \u00b7 Rixy Llama \u00b7 Cheddar Cheese Corn Chips \u00b7 18 g\n  2: [0.22, 3.3],   \/\/ 2652 \u00b7 Rixy Llama \u00b7 Cheddar Cheese Corn Chips \u00b7 35 g\n  3: [0.32, 4.8],   \/\/ 2607 \u00b7 Rixy Llama \u00b7 Cheddar Cheese Corn Chips \u00b7 65 g\n  4: [0.121, 6.05],   \/\/ 2634 \u00b7 Rixy Llama \u00b7 Space Chicken \u00b7 18 g\n  5: [0.32, 4.8],   \/\/ 2639 \u00b7 Rixy Llama \u00b7 Space Chicken \u00b7 65 g\n  6: [0.22, 3.3],   \/\/ 2653 \u00b7 Rixy Llama \u00b7 Space Chicken Corn Chips \u00b7 35 g\n  7: [0.32, 4.8],   \/\/ 2632 \u00b7 Rixy Llama \u00b7 Pizza Corn Chips \u00b7 65 g\n  8: [0.22, 3.3],   \/\/ 2654 \u00b7 Rixy Llama \u00b7 Pizza Corn Chips \u00b7 35 g\n  9: [0.121, 6.05],   \/\/ 2627 \u00b7 Rixy Llama \u00b7 Pizza Corn Chips \u00b7 18 g\n  10: [0.32, 4.8],   \/\/ 2615 \u00b7 Rixy Llama \u00b7 Peanut Butter Corn Chips \u00b7 65 g\n  11: [0.22, 3.3],   \/\/ 2612 \u00b7 Rixy Llama \u00b7 Peanut Butter Corn Chips \u00b7 35 g\n  12: [0.121, 6.05],   \/\/ 2609 \u00b7 Rixy Llama \u00b7 Burger Corn Chips \u00b7 18 g\n  13: [0.32, 4.8],   \/\/ 2622 \u00b7 Rixy Rings \u00b7 Onion \u00b7 60 g\n  14: [0.32, 4.8],   \/\/ 2625 \u00b7 Rixy Rings \u00b7 Sea Salt & Pepper \u00b7 60 g\n  15: [0.32, 4.8],   \/\/ 2620 \u00b7 Rixy Rings \u00b7 Cheese \u00b7 60 g\n  16: [0.22, 3.3],   \/\/ 2822 \u00b7 World of Unicorns \u00b7 Cheddar Cheese Corn Chips \u00b7 35 g\n  17: [0.32, 4.8],   \/\/ 2819 \u00b7 World of Unicorns \u00b7 Space Chicken Corn Chips \u00b7 65 g\n  18: [0.22, 3.3],   \/\/ 2823 \u00b7 World of Unicorns \u00b7 Space Chicken Corn Chips \u00b7 35 g\n  19: [0.32, 4.8],   \/\/ 2810 \u00b7 World of Unicorns \u00b7 Pizza Corn Chips \u00b7 65 g\n  20: [0.22, 3.3],   \/\/ 2824 \u00b7 World of Unicorns \u00b7 Pizza Corn Chips \u00b7 35 g\n  21: [0.7, 10.5],   \/\/ 2304 \u00b7 Lava Waves \u00b7 Spicy Cheese & Lime \u00b7 70 g\n  22: [0.4, 6.0],   \/\/ 2308 \u00b7 Lava Waves \u00b7 Spicy Cheese & Lime \u00b7 40 g\n  23: [0.7, 10.5],   \/\/ 2310 \u00b7 Lava Waves \u00b7 Tomato & Herbs \u00b7 70 g\n  24: [0.4, 6.0],   \/\/ 2314 \u00b7 Lava Waves \u00b7 Tomato & Herbs \u00b7 40 g\n  25: [0.7, 10.5],   \/\/ 2321 \u00b7 Lava Waves \u00b7 Atomic \u00b7 70 g\n  26: [0.4, 6.0],   \/\/ 2302 \u00b7 Lava Waves \u00b7 Atomic \u00b7 40 g\n  27: [0.4, 6.0],   \/\/ 2319 \u00b7 Lava Waves \u00b7 Pizza \u00b7 40 g\n  28: [0.44, 6.6],   \/\/ 2501 \u00b7 ProChips \u00b7 Cheddar Cheese & Onion Protein Chips \u00b7 50 g\n  29: [0.44, 6.6],   \/\/ 2502 \u00b7 ProChips \u00b7 Chilli Lime Protein Chips \u00b7 50 g\n  30: [0.44, 6.6],   \/\/ 2503 \u00b7 ProChips \u00b7 Herbs Seasoning Protein Chips \u00b7 50 g\n  31: [0.59, 7.08],   \/\/ 2642 \u00b7 Rixy XXL \u00b7 Holland Cheese \u00b7 107 g\n  32: [0.59, 7.08],   \/\/ 2655 \u00b7 Rixy XXL \u00b7 Sweet Corn \u00b7 107 g\n  33: [0.55, 11.0],   \/\/ 2618 \u00b7 Rixy XXL \u00b7 White Cheese \u00b7 90 g\n  34: [0.55, 11.0],   \/\/ 2617 \u00b7 Rixy XXL \u00b7 Ketchup \u00b7 90 g\n  35: [0.55, 11.0],   \/\/ 2656 \u00b7 Rixy XXL \u00b7 Chilli & Lime \u00b7 90 g\n  36: [0.59, 7.08],   \/\/ 2662 \u00b7 Rixy Llama XXL \u00b7 Pizza \u00b7 107 g\n  37: [0.59, 11.8],   \/\/ 2602 \u00b7 Rixy Dino XXL \u00b7 Pizza \u00b7 107 g\n  38: [0.59, 11.8],   \/\/ 2601 \u00b7 Rixy Dino XXL \u00b7 Cheese \u00b7 107 g\n  39: [0.69, 6.21],   \/\/ 2210 \u00b7 Dubai Fusion \u00b7 Garlic & Olive Oil \u00b7 115 g\n  40: [0.42, 6.3],   \/\/ 2202 \u00b7 Dubai Fusion \u00b7 Garlic & Olive Oil \u00b7 65 g\n  41: [0.69, 6.21],   \/\/ 2012 \u00b7 Dubai Fusion \u00b7 Pesto \u00b7 115 g\n  42: [0.42, 6.3],   \/\/ 2205 \u00b7 Dubai Fusion \u00b7 Pesto \u00b7 65 g\n  43: [0.69, 6.21],   \/\/ 2013 \u00b7 Dubai Fusion \u00b7 Sour Cream & Chives \u00b7 115 g\n  44: [0.69, 6.21],   \/\/ 2011 \u00b7 Dubai Fusion \u00b7 Napoli Pizza \u00b7 115 g\n  45: [0.35, 5.25],   \/\/ 2429 \u00b7 Munchiz SpongeBob \u00b7 Cheese \u00b7 35 g\n  46: [0.35, 5.25],   \/\/ 2434 \u00b7 Munchiz Ninja Turtles \u00b7 Pizza \u00b7 35 g\n  47: [0.35, 5.25],   \/\/ 2407 \u00b7 Munchiz Barbie \u00b7 Strawberry \u00b7 35 g\n  48: [0.35, 5.25],   \/\/ 2405 \u00b7 Munchiz Barbie \u00b7 Ketchup \u00b7 35 g\n  49: [0.35, 5.25],   \/\/ 2411 \u00b7 Munchiz Hello Kitty \u00b7 Vanilla & Milk \u00b7 35 g\n  50: [0.35, 5.25],   \/\/ 2423 \u00b7 Munchiz One Piece \u00b7 Mushroom & Cream \u00b7 35 g\n  51: [0.69, 13.8],   \/\/ 2425 \u00b7 Munchiz One Piece \u00b7 Spicy Cheese & Lime \u00b7 107 g\n  52: [0.35, 5.25],   \/\/ 2414 \u00b7 Munchiz Hot Wheels \u00b7 Cheese \u00b7 35 g\n  53: [0.69, 13.8],   \/\/ 2451 \u00b7 Munchiz Super Hero \u00b7 Chicken Noodles \u00b7 107 g\n  54: [0.69, 13.8],   \/\/ 2444 \u00b7 Munchiz SpongeBob XXL \u00b7 Cheese \u00b7 107 g\n  55: [0.69, 13.8],   \/\/ 2450 \u00b7 Munchiz Dora \u00b7 Cheddar Cheese \u00b7 107 g\n  56: [0.69, 13.8],   \/\/ 2446 \u00b7 Munchiz Barbie XXL \u00b7 Sweet Corn \u00b7 107 g\n  57: [0.69, 13.8],   \/\/ 2445 \u00b7 Munchiz Barbie XXL \u00b7 Cheese \u00b7 107 g\n  58: [0.69, 13.8],   \/\/ 2447 \u00b7 Munchiz Hello Kitty XXL \u00b7 Sweet Corn \u00b7 107 g\n  59: [0.69, 13.8],   \/\/ 2448 \u00b7 Munchiz Kuromi XXL \u00b7 Ketchup \u00b7 107 g\n  60: [0.35, 21.0],   \/\/ 2440 \u00b7 Munchiz Display Stand V3 \u00b7 Barbie Ketchup \u00b7 Hot Wheels Cheese \u00b7 Hello Kitty Vanilla & Milk \u00b7 SpongeBob Cheddar Cheese \u00b7 30 g\n  61: [0.6, 12.0],   \/\/ 2657 \u00b7 Puffy Cubs \u00b7 Salt & Vinegar \u00b7 99 g\n  62: [0.6, 12.0],   \/\/ 2658 \u00b7 Puffy Cubs \u00b7 Pesto \u00b7 99 g\n  63: [0.6, 12.0],   \/\/ 2659 \u00b7 Puffy Cubs \u00b7 French Cheese \u00b7 99 g\n  64: [0.6, 12.0],   \/\/ 2103 \u00b7 7Chips \u00b7 Ring Pizza \u00b7 99 g\n  65: [0.6, 12.0],   \/\/ 2104 \u00b7 7Chips \u00b7 Cone Ketchup & Mayonnaise \u00b7 99 g\n  66: [0.6, 12.0],   \/\/ 2105 \u00b7 7Chips \u00b7 Flower Chilli Lime \u00b7 99 g\n  67: [0.6, 12.0],   \/\/ 2106 \u00b7 7Chips \u00b7 Cone Salt & Vinegar \u00b7 99 g\n  68: [0.6, 12.0],   \/\/ 2107 \u00b7 7Chips \u00b7 Flat Pesto \u00b7 99 g\n  69: [0.6, 12.0],   \/\/ 2108 \u00b7 7Chips \u00b7 Flat Salt & Vinegar \u00b7 99 g\n  70: [0.6, 12.0],   \/\/ 2660 \u00b7 Rixy Pops \u00b7 Classic Popcorn \u00b7 99 g\n  71: [0.6, 12.0],   \/\/ 2661 \u00b7 Rixy Pops \u00b7 White Cheddar Popcorn \u00b7 99 g\n  72: [0.38, 5.7],   \/\/ 2504 \u00b7 ProKids \u00b7 Cheese \u00b7 35 g\n  73: [0.38, 5.7],   \/\/ 2505 \u00b7 ProKids \u00b7 Pizza \u00b7 35 g\n  74: [0.38, 5.7],   \/\/ 2506 \u00b7 ProKids \u00b7 Vegetable Seasoning \u00b7 35 g\n  75: [0.38, 5.7],   \/\/ 2507 \u00b7 ProKids \u00b7 Sweet Corn \u00b7 35 g\n};\n\n\/* \u2550\u2550\u2550 end of editable prices \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   5. SHARED DATA PAGE \u2014 the same page the team portal publishes to.\n   Anything the team publishes there appears here automatically.\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nconst DATA_URL = \"\/claimont-data\/\";\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   PRODUCT PHOTOS\n   The packshots live in one file so this page stays small enough to\n   paste into WordPress. Upload claimont-images.txt to Media Library,\n   copy its address, and paste it between the quotes below.\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nconst IMAGES_URL = \"\";\nconst IMAGES = {};\n\nfunction applyImages(map){\n  let n=0;\n  (typeof ALL!==\"undefined\"?ALL:DATA).forEach(d=>{ if(map[d.id]){ d.img=map[d.id]; n++; } });\n  return n;\n}\nfunction loadImages(){\n  if(IMAGES && Object.keys(IMAGES).length){ applyImages(IMAGES); return Promise.resolve(); }\n  \/* photos change rarely and weigh the most, so they live in this browser\n     until the Portal-documents stamp says a newer set exists *\/\n  const KEY=\"clm-photos-\"+DATASET;\n  const stamp=String((settings&&settings.imagesUpdated)||\"\");\n  let cachedStamp=null;\n  try{\n    const c=JSON.parse(localStorage.getItem(KEY)||\"null\");\n    if(c&&c.map){ applyImages(c.map); renderBody(); cachedStamp=String(c.stamp||\"\"); }\n  }catch(e){}\n  if(cachedStamp!==null && stamp && cachedStamp===stamp) return Promise.resolve();\n  const fromService=()=>api({action:\"getImages\"})\n      .then(r=>{ if(r&&r.ok&&r.images){ applyImages(r.images); renderBody();\n        try{ localStorage.setItem(KEY, JSON.stringify({stamp:String(r.updated||stamp||\"\"), map:r.images})); }catch(e){}\n      } })\n      .catch(()=>{});\n  if(!IMAGES_URL || IMAGES_URL.indexOf(\"__\")===0) return fromService();\n  return fetch(IMAGES_URL,{credentials:\"same-origin\"})\n    .then(r=>r.ok?r.text():Promise.reject())\n    .then(txt=>{ applyImages(JSON.parse(txt)); renderBody(); })\n    .catch(fromService);   \/* the website refused the file? Drive serves it instead *\/\n}\n\nconst ALL = [{\"id\":1,\"ref\":\"2603\",\"fam\":\"Rixy\",\"famTr\":\"Rixy\",\"brand\":\"Rixy Llama\",\"brandTr\":\"Rixy Llama\",\"name\":\"Cheddar Cheese Corn Chips\",\"nameTr\":\"Cheddar Peyniri Aromal\u0131 M\u0131s\u0131r Cipsi\",\"shelf\":\"12 Months\",\"g\":18.0,\"upc\":50,\"cpp\":42,\"l\":59.3,\"w\":26.2,\"h\":30.8,\"cbm\":0.047853,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.9,\"tare\":0.3,\"gross\":1.2,\"pub\":true},{\"id\":2,\"ref\":\"2652\",\"fam\":\"Rixy\",\"famTr\":\"Rixy\",\"brand\":\"Rixy Llama\",\"brandTr\":\"Rixy Llama\",\"name\":\"Cheddar Cheese Corn Chips\",\"nameTr\":\"Cheddar Peyniri Aromal\u0131 M\u0131s\u0131r Cipsi\",\"shelf\":\"12 Months\",\"g\":35.0,\"upc\":15,\"cpp\":72,\"l\":39.5,\"w\":29.5,\"h\":23.1,\"cbm\":0.026917,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.525,\"tare\":0.3,\"gross\":0.825,\"pub\":true},{\"id\":3,\"ref\":\"2607\",\"fam\":\"Rixy\",\"famTr\":\"Rixy\",\"brand\":\"Rixy Llama\",\"brandTr\":\"Rixy Llama\",\"name\":\"Cheddar Cheese Corn Chips\",\"nameTr\":\"Cheddar Peyniri Aromal\u0131 M\u0131s\u0131r Cipsi\",\"shelf\":\"12 Months\",\"g\":65.0,\"upc\":15,\"cpp\":54,\"l\":39.5,\"w\":39.5,\"h\":25.0,\"cbm\":0.039006,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.975,\"tare\":0.4,\"gross\":1.375,\"pub\":true},{\"id\":4,\"ref\":\"2634\",\"fam\":\"Rixy\",\"famTr\":\"Rixy\",\"brand\":\"Rixy Llama\",\"brandTr\":\"Rixy Llama\",\"name\":\"Space Chicken\",\"nameTr\":\"Uzay Tavu\u011fu Aromal\u0131 M\u0131s\u0131r Cipsi\",\"shelf\":\"12 Months\",\"g\":18.0,\"upc\":50,\"cpp\":42,\"l\":59.3,\"w\":26.2,\"h\":30.8,\"cbm\":0.047853,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.9,\"tare\":0.4,\"gross\":1.3,\"pub\":true},{\"id\":5,\"ref\":\"2639\",\"fam\":\"Rixy\",\"famTr\":\"Rixy\",\"brand\":\"Rixy Llama\",\"brandTr\":\"Rixy Llama\",\"name\":\"Space Chicken\",\"nameTr\":\"Uzay Tavu\u011fu Aromal\u0131 M\u0131s\u0131r Cipsi\",\"shelf\":\"12 Months\",\"g\":65.0,\"upc\":15,\"cpp\":54,\"l\":39.5,\"w\":39.5,\"h\":25.0,\"cbm\":0.039006,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.975,\"tare\":0.4,\"gross\":1.375,\"pub\":true},{\"id\":6,\"ref\":\"2653\",\"fam\":\"Rixy\",\"famTr\":\"Rixy\",\"brand\":\"Rixy Llama\",\"brandTr\":\"Rixy Llama\",\"name\":\"Space Chicken Corn Chips\",\"nameTr\":\"Uzay Tavu\u011fu Aromal\u0131 M\u0131s\u0131r Cipsi\",\"shelf\":\"12 Months\",\"g\":35.0,\"upc\":15,\"cpp\":72,\"l\":39.5,\"w\":29.5,\"h\":23.1,\"cbm\":0.026917,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.525,\"tare\":0.3,\"gross\":0.825,\"pub\":true},{\"id\":7,\"ref\":\"2632\",\"fam\":\"Rixy\",\"famTr\":\"Rixy\",\"brand\":\"Rixy Llama\",\"brandTr\":\"Rixy Llama\",\"name\":\"Pizza Corn Chips\",\"nameTr\":\"Pizza Aromal\u0131 M\u0131s\u0131r Cipsi\",\"shelf\":\"12 Months\",\"g\":65.0,\"upc\":15,\"cpp\":54,\"l\":39.5,\"w\":39.5,\"h\":25.0,\"cbm\":0.039006,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.975,\"tare\":0.4,\"gross\":1.375,\"pub\":true},{\"id\":8,\"ref\":\"2654\",\"fam\":\"Rixy\",\"famTr\":\"Rixy\",\"brand\":\"Rixy Llama\",\"brandTr\":\"Rixy Llama\",\"name\":\"Pizza Corn Chips\",\"nameTr\":\"Pizza Aromal\u0131 M\u0131s\u0131r Cipsi\",\"shelf\":\"12 Months\",\"g\":35.0,\"upc\":15,\"cpp\":72,\"l\":39.5,\"w\":29.5,\"h\":23.1,\"cbm\":0.026917,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.525,\"tare\":0.3,\"gross\":0.825,\"pub\":true},{\"id\":9,\"ref\":\"2627\",\"fam\":\"Rixy\",\"famTr\":\"Rixy\",\"brand\":\"Rixy Llama\",\"brandTr\":\"Rixy Llama\",\"name\":\"Pizza Corn Chips\",\"nameTr\":\"Pizza Aromal\u0131 M\u0131s\u0131r Cipsi\",\"shelf\":\"12 Months\",\"g\":18.0,\"upc\":50,\"cpp\":42,\"l\":59.3,\"w\":26.2,\"h\":30.8,\"cbm\":0.047853,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.9,\"tare\":0.3,\"gross\":1.2,\"pub\":true},{\"id\":10,\"ref\":\"2615\",\"fam\":\"Rixy\",\"famTr\":\"Rixy\",\"brand\":\"Rixy Llama\",\"brandTr\":\"Rixy Llama\",\"name\":\"Peanut Butter Corn Chips\",\"nameTr\":\"F\u0131st\u0131k Ezmesi Aromal\u0131 M\u0131s\u0131r Cipsi\",\"shelf\":\"12 Months\",\"g\":65.0,\"upc\":15,\"cpp\":54,\"l\":39.5,\"w\":39.5,\"h\":25.0,\"cbm\":0.039006,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.975,\"tare\":0.4,\"gross\":1.375,\"pub\":true},{\"id\":11,\"ref\":\"2612\",\"fam\":\"Rixy\",\"famTr\":\"Rixy\",\"brand\":\"Rixy Llama\",\"brandTr\":\"Rixy Llama\",\"name\":\"Peanut Butter Corn Chips\",\"nameTr\":\"F\u0131st\u0131k Ezmesi Aromal\u0131 M\u0131s\u0131r Cipsi\",\"shelf\":\"12 Months\",\"g\":35.0,\"upc\":15,\"cpp\":72,\"l\":39.5,\"w\":29.5,\"h\":23.1,\"cbm\":0.026917,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.525,\"tare\":0.3,\"gross\":0.825,\"pub\":true},{\"id\":12,\"ref\":\"2609\",\"fam\":\"Rixy\",\"famTr\":\"Rixy\",\"brand\":\"Rixy Llama\",\"brandTr\":\"Rixy Llama\",\"name\":\"Burger Corn Chips\",\"nameTr\":\"Burger Aromal\u0131 M\u0131s\u0131r Cipsi\",\"shelf\":\"12 Months\",\"g\":18.0,\"upc\":50,\"cpp\":42,\"l\":59.3,\"w\":26.2,\"h\":30.8,\"cbm\":0.047853,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.9,\"tare\":0.3,\"gross\":1.2,\"pub\":true},{\"id\":13,\"ref\":\"2622\",\"fam\":\"Rixy\",\"famTr\":\"Rixy\",\"brand\":\"Rixy Rings\",\"brandTr\":\"Rixy Rings\",\"name\":\"Onion\",\"nameTr\":\"So\u011fan Aromal\u0131 M\u0131s\u0131r Cipsi\",\"shelf\":\"12 Months\",\"g\":60.0,\"upc\":15,\"cpp\":54,\"l\":39.5,\"w\":39.5,\"h\":25.0,\"cbm\":0.039006,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.9,\"tare\":0.4,\"gross\":1.3,\"pub\":true},{\"id\":14,\"ref\":\"2625\",\"fam\":\"Rixy\",\"famTr\":\"Rixy\",\"brand\":\"Rixy Rings\",\"brandTr\":\"Rixy Rings\",\"name\":\"Sea Salt & Pepper\",\"nameTr\":\"Deniz Tuzu ve Karabiber Aromal\u0131 M\u0131s\u0131r Cipsi\",\"shelf\":\"12 Months\",\"g\":60.0,\"upc\":15,\"cpp\":54,\"l\":39.5,\"w\":39.5,\"h\":25.0,\"cbm\":0.039006,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.9,\"tare\":0.4,\"gross\":1.3,\"pub\":true},{\"id\":15,\"ref\":\"2620\",\"fam\":\"Rixy\",\"famTr\":\"Rixy\",\"brand\":\"Rixy Rings\",\"brandTr\":\"Rixy Rings\",\"name\":\"Cheese\",\"nameTr\":\"Peynir Aromal\u0131 M\u0131s\u0131r Cipsi\",\"shelf\":\"12 Months\",\"g\":60.0,\"upc\":15,\"cpp\":54,\"l\":39.5,\"w\":39.5,\"h\":25.0,\"cbm\":0.039006,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.9,\"tare\":0.4,\"gross\":1.3,\"pub\":true},{\"id\":16,\"ref\":\"2822\",\"fam\":\"World of Unicorns\",\"famTr\":\"World of Unicorns\",\"brand\":\"World of Unicorns\",\"brandTr\":\"World of Unicorns\",\"name\":\"Cheddar Cheese Corn Chips\",\"nameTr\":\"Cheddar Peyniri Aromal\u0131 M\u0131s\u0131r Cipsi\",\"shelf\":\"12 Months\",\"g\":35.0,\"upc\":15,\"cpp\":72,\"l\":39.5,\"w\":29.5,\"h\":23.1,\"cbm\":0.026917,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.525,\"tare\":0.3,\"gross\":0.825,\"pub\":true},{\"id\":17,\"ref\":\"2819\",\"fam\":\"World of Unicorns\",\"famTr\":\"World of Unicorns\",\"brand\":\"World of Unicorns\",\"brandTr\":\"World of Unicorns\",\"name\":\"Space Chicken Corn Chips\",\"nameTr\":\"Uzay Tavu\u011fu Aromal\u0131 M\u0131s\u0131r Cipsi\",\"shelf\":\"12 Months\",\"g\":65.0,\"upc\":15,\"cpp\":54,\"l\":39.5,\"w\":39.5,\"h\":25.0,\"cbm\":0.039006,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.975,\"tare\":0.4,\"gross\":1.375,\"pub\":true},{\"id\":18,\"ref\":\"2823\",\"fam\":\"World of Unicorns\",\"famTr\":\"World of Unicorns\",\"brand\":\"World of Unicorns\",\"brandTr\":\"World of Unicorns\",\"name\":\"Space Chicken Corn Chips\",\"nameTr\":\"Uzay Tavu\u011fu Aromal\u0131 M\u0131s\u0131r Cipsi\",\"shelf\":\"12 Months\",\"g\":35.0,\"upc\":15,\"cpp\":72,\"l\":39.5,\"w\":29.5,\"h\":23.1,\"cbm\":0.026917,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.525,\"tare\":0.3,\"gross\":0.825,\"pub\":true},{\"id\":19,\"ref\":\"2810\",\"fam\":\"World of Unicorns\",\"famTr\":\"World of Unicorns\",\"brand\":\"World of Unicorns\",\"brandTr\":\"World of Unicorns\",\"name\":\"Pizza Corn Chips\",\"nameTr\":\"Pizza Aromal\u0131 M\u0131s\u0131r Cipsi\",\"shelf\":\"12 Months\",\"g\":65.0,\"upc\":15,\"cpp\":54,\"l\":39.5,\"w\":39.5,\"h\":25.0,\"cbm\":0.039006,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.975,\"tare\":0.4,\"gross\":1.375,\"pub\":true},{\"id\":20,\"ref\":\"2824\",\"fam\":\"World of Unicorns\",\"famTr\":\"World of Unicorns\",\"brand\":\"World of Unicorns\",\"brandTr\":\"World of Unicorns\",\"name\":\"Pizza Corn Chips\",\"nameTr\":\"Pizza Aromal\u0131 M\u0131s\u0131r Cipsi\",\"shelf\":\"12 Months\",\"g\":35.0,\"upc\":15,\"cpp\":72,\"l\":39.5,\"w\":29.5,\"h\":23.1,\"cbm\":0.026917,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.525,\"tare\":0.3,\"gross\":0.825,\"pub\":true},{\"id\":21,\"ref\":\"2304\",\"fam\":\"Lava Waves\",\"famTr\":\"Lava Waves\",\"brand\":\"Lava Waves\",\"brandTr\":\"Lava Waves\",\"name\":\"Spicy Cheese & Lime\",\"nameTr\":\"Ac\u0131l\u0131 Peynir ve Misket Limonu Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":70.0,\"upc\":15,\"cpp\":54,\"l\":39.5,\"w\":39.5,\"h\":25.0,\"cbm\":0.039006,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":1.05,\"tare\":0.4,\"gross\":1.45,\"pub\":true},{\"id\":22,\"ref\":\"2308\",\"fam\":\"Lava Waves\",\"famTr\":\"Lava Waves\",\"brand\":\"Lava Waves\",\"brandTr\":\"Lava Waves\",\"name\":\"Spicy Cheese & Lime\",\"nameTr\":\"Ac\u0131l\u0131 Peynir ve Misket Limonu Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":40.0,\"upc\":15,\"cpp\":72,\"l\":39.5,\"w\":29.5,\"h\":23.1,\"cbm\":0.026917,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.6,\"tare\":0.3,\"gross\":0.9,\"pub\":true},{\"id\":23,\"ref\":\"2310\",\"fam\":\"Lava Waves\",\"famTr\":\"Lava Waves\",\"brand\":\"Lava Waves\",\"brandTr\":\"Lava Waves\",\"name\":\"Tomato & Herbs\",\"nameTr\":\"Domates ve Baharat Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":70.0,\"upc\":15,\"cpp\":54,\"l\":39.5,\"w\":39.5,\"h\":25.0,\"cbm\":0.039006,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":1.05,\"tare\":0.4,\"gross\":1.45,\"pub\":true},{\"id\":24,\"ref\":\"2314\",\"fam\":\"Lava Waves\",\"famTr\":\"Lava Waves\",\"brand\":\"Lava Waves\",\"brandTr\":\"Lava Waves\",\"name\":\"Tomato & Herbs\",\"nameTr\":\"Domates ve Baharat Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":40.0,\"upc\":15,\"cpp\":72,\"l\":39.5,\"w\":29.5,\"h\":23.1,\"cbm\":0.026917,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.6,\"tare\":0.3,\"gross\":0.9,\"pub\":true},{\"id\":25,\"ref\":\"2321\",\"fam\":\"Lava Waves\",\"famTr\":\"Lava Waves\",\"brand\":\"Lava Waves\",\"brandTr\":\"Lava Waves\",\"name\":\"Atomic\",\"nameTr\":\"Atomic (Ekstra Ac\u0131)\",\"shelf\":\"12 Months\",\"g\":70.0,\"upc\":15,\"cpp\":54,\"l\":39.5,\"w\":39.5,\"h\":25.0,\"cbm\":0.039006,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":1.05,\"tare\":0.4,\"gross\":1.45,\"pub\":true},{\"id\":26,\"ref\":\"2302\",\"fam\":\"Lava Waves\",\"famTr\":\"Lava Waves\",\"brand\":\"Lava Waves\",\"brandTr\":\"Lava Waves\",\"name\":\"Atomic\",\"nameTr\":\"Atomic (Ekstra Ac\u0131)\",\"shelf\":\"12 Months\",\"g\":40.0,\"upc\":15,\"cpp\":72,\"l\":39.5,\"w\":29.5,\"h\":23.1,\"cbm\":0.026917,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.6,\"tare\":0.3,\"gross\":0.9,\"pub\":true},{\"id\":27,\"ref\":\"2319\",\"fam\":\"Lava Waves\",\"famTr\":\"Lava Waves\",\"brand\":\"Lava Waves\",\"brandTr\":\"Lava Waves\",\"name\":\"Pizza\",\"nameTr\":\"Pizza Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":40.0,\"upc\":15,\"cpp\":72,\"l\":39.5,\"w\":29.5,\"h\":23.1,\"cbm\":0.026917,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.6,\"tare\":0.3,\"gross\":0.9,\"pub\":true},{\"id\":28,\"ref\":\"2501\",\"fam\":\"ProChips\",\"famTr\":\"ProChips\",\"brand\":\"ProChips\",\"brandTr\":\"ProChips\",\"name\":\"Cheddar Cheese & Onion Protein Chips\",\"nameTr\":\"Cheddar Peyniri ve So\u011fan Aromal\u0131 Protein Cips\",\"shelf\":\"12 Months\",\"g\":50.0,\"upc\":15,\"cpp\":72,\"l\":39.5,\"w\":29.5,\"h\":23.1,\"cbm\":0.026917,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.75,\"tare\":0.3,\"gross\":1.05,\"pub\":true},{\"id\":29,\"ref\":\"2502\",\"fam\":\"ProChips\",\"famTr\":\"ProChips\",\"brand\":\"ProChips\",\"brandTr\":\"ProChips\",\"name\":\"Chilli Lime Protein Chips\",\"nameTr\":\"Ac\u0131 Biber ve Misket Limonu Aromal\u0131 Protein Cips\",\"shelf\":\"12 Months\",\"g\":50.0,\"upc\":15,\"cpp\":72,\"l\":39.5,\"w\":29.5,\"h\":23.0,\"cbm\":0.026801,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.75,\"tare\":0.3,\"gross\":1.05,\"pub\":true},{\"id\":30,\"ref\":\"2503\",\"fam\":\"ProChips\",\"famTr\":\"ProChips\",\"brand\":\"ProChips\",\"brandTr\":\"ProChips\",\"name\":\"Herbs Seasoning Protein Chips\",\"nameTr\":\"Baharat Aromal\u0131 Protein Cips\",\"shelf\":\"12 Months\",\"g\":50.0,\"upc\":15,\"cpp\":72,\"l\":39.5,\"w\":29.5,\"h\":23.1,\"cbm\":0.026917,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.75,\"tare\":0.3,\"gross\":1.05,\"pub\":true},{\"id\":31,\"ref\":\"2642\",\"fam\":\"Rixy\",\"famTr\":\"Rixy\",\"brand\":\"Rixy XXL\",\"brandTr\":\"Rixy XXL\",\"name\":\"Holland Cheese\",\"nameTr\":\"Hollanda Peyniri Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":107.0,\"upc\":12,\"cpp\":28,\"l\":58.5,\"w\":39.5,\"h\":32.5,\"cbm\":0.075099,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":1.284,\"tare\":0.5,\"gross\":1.784,\"pub\":true},{\"id\":32,\"ref\":\"2655\",\"fam\":\"Rixy\",\"famTr\":\"Rixy\",\"brand\":\"Rixy XXL\",\"brandTr\":\"Rixy XXL\",\"name\":\"Sweet Corn\",\"nameTr\":\"Tatl\u0131 M\u0131s\u0131r Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":107.0,\"upc\":12,\"cpp\":28,\"l\":58.5,\"w\":39.5,\"h\":32.5,\"cbm\":0.075099,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":1.284,\"tare\":0.5,\"gross\":1.784,\"pub\":true},{\"id\":33,\"ref\":\"2618\",\"fam\":\"Rixy\",\"famTr\":\"Rixy\",\"brand\":\"Rixy XXL\",\"brandTr\":\"Rixy XXL\",\"name\":\"White Cheese\",\"nameTr\":\"Beyaz Peynir Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":90.0,\"upc\":20,\"cpp\":21,\"l\":80.0,\"w\":40.0,\"h\":30.0,\"cbm\":0.096,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":1.8,\"tare\":0.5,\"gross\":2.3,\"pub\":true},{\"id\":34,\"ref\":\"2617\",\"fam\":\"Rixy\",\"famTr\":\"Rixy\",\"brand\":\"Rixy XXL\",\"brandTr\":\"Rixy XXL\",\"name\":\"Ketchup\",\"nameTr\":\"Ket\u00e7ap Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":90.0,\"upc\":20,\"cpp\":21,\"l\":80.0,\"w\":40.0,\"h\":30.0,\"cbm\":0.096,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":1.8,\"tare\":0.5,\"gross\":2.3,\"pub\":true},{\"id\":35,\"ref\":\"2656\",\"fam\":\"Rixy\",\"famTr\":\"Rixy\",\"brand\":\"Rixy XXL\",\"brandTr\":\"Rixy XXL\",\"name\":\"Chilli & Lime\",\"nameTr\":\"Ac\u0131 Biber ve Misket Limonu Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":90.0,\"upc\":20,\"cpp\":21,\"l\":80.0,\"w\":40.0,\"h\":30.0,\"cbm\":0.096,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":1.8,\"tare\":0.5,\"gross\":2.3,\"pub\":true},{\"id\":36,\"ref\":\"2662\",\"fam\":\"Rixy\",\"famTr\":\"Rixy\",\"brand\":\"Rixy Llama XXL\",\"brandTr\":\"Rixy Llama XXL\",\"name\":\"Pizza\",\"nameTr\":\"Pizza Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":107.0,\"upc\":12,\"cpp\":28,\"l\":58.5,\"w\":39.5,\"h\":32.5,\"cbm\":0.075099,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":1.284,\"tare\":0.5,\"gross\":1.784,\"pub\":true},{\"id\":37,\"ref\":\"2602\",\"fam\":\"Rixy\",\"famTr\":\"Rixy\",\"brand\":\"Rixy Dino XXL\",\"brandTr\":\"Rixy Dino XXL\",\"name\":\"Pizza\",\"nameTr\":\"Pizza Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":107.0,\"upc\":20,\"cpp\":21,\"l\":80.0,\"w\":40.0,\"h\":30.0,\"cbm\":0.096,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":2.14,\"tare\":0.5,\"gross\":2.64,\"pub\":true},{\"id\":38,\"ref\":\"2601\",\"fam\":\"Rixy\",\"famTr\":\"Rixy\",\"brand\":\"Rixy Dino XXL\",\"brandTr\":\"Rixy Dino XXL\",\"name\":\"Cheese\",\"nameTr\":\"Peynir Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":107.0,\"upc\":20,\"cpp\":21,\"l\":80.0,\"w\":40.0,\"h\":30.0,\"cbm\":0.096,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":2.14,\"tare\":0.5,\"gross\":2.64,\"pub\":true},{\"id\":39,\"ref\":\"2210\",\"fam\":\"Dubai Fusion\",\"famTr\":\"Dubai Fusion\",\"brand\":\"Dubai Fusion\",\"brandTr\":\"Dubai Fusion\",\"name\":\"Garlic & Olive Oil\",\"nameTr\":\"Sar\u0131msak ve Zeytinya\u011f\u0131 Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":115.0,\"upc\":9,\"cpp\":48,\"l\":54.0,\"w\":27.5,\"h\":28.0,\"cbm\":0.04158,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":1.035,\"tare\":0.4,\"gross\":1.435,\"pub\":true},{\"id\":40,\"ref\":\"2202\",\"fam\":\"Dubai Fusion\",\"famTr\":\"Dubai Fusion\",\"brand\":\"Dubai Fusion\",\"brandTr\":\"Dubai Fusion\",\"name\":\"Garlic & Olive Oil\",\"nameTr\":\"Sar\u0131msak ve Zeytinya\u011f\u0131 Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":65.0,\"upc\":15,\"cpp\":54,\"l\":39.5,\"w\":39.5,\"h\":25.0,\"cbm\":0.039006,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.975,\"tare\":0.4,\"gross\":1.375,\"pub\":true},{\"id\":41,\"ref\":\"2012\",\"fam\":\"Dubai Fusion\",\"famTr\":\"Dubai Fusion\",\"brand\":\"Dubai Fusion\",\"brandTr\":\"Dubai Fusion\",\"name\":\"Pesto\",\"nameTr\":\"Pesto Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":115.0,\"upc\":9,\"cpp\":48,\"l\":54.0,\"w\":27.5,\"h\":28.0,\"cbm\":0.04158,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":1.035,\"tare\":0.4,\"gross\":1.435,\"pub\":true},{\"id\":42,\"ref\":\"2205\",\"fam\":\"Dubai Fusion\",\"famTr\":\"Dubai Fusion\",\"brand\":\"Dubai Fusion\",\"brandTr\":\"Dubai Fusion\",\"name\":\"Pesto\",\"nameTr\":\"Pesto Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":65.0,\"upc\":15,\"cpp\":54,\"l\":39.5,\"w\":39.5,\"h\":25.0,\"cbm\":0.039006,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.975,\"tare\":0.4,\"gross\":1.375,\"pub\":true},{\"id\":43,\"ref\":\"2013\",\"fam\":\"Dubai Fusion\",\"famTr\":\"Dubai Fusion\",\"brand\":\"Dubai Fusion\",\"brandTr\":\"Dubai Fusion\",\"name\":\"Sour Cream & Chives\",\"nameTr\":\"Ek\u015fi Krema ve Frenk So\u011fan\u0131 Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":115.0,\"upc\":9,\"cpp\":48,\"l\":54.0,\"w\":27.5,\"h\":28.0,\"cbm\":0.04158,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":1.035,\"tare\":0.4,\"gross\":1.435,\"pub\":true},{\"id\":44,\"ref\":\"2011\",\"fam\":\"Dubai Fusion\",\"famTr\":\"Dubai Fusion\",\"brand\":\"Dubai Fusion\",\"brandTr\":\"Dubai Fusion\",\"name\":\"Napoli Pizza\",\"nameTr\":\"Napoli Pizza Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":115.0,\"upc\":9,\"cpp\":48,\"l\":54.0,\"w\":27.5,\"h\":28.0,\"cbm\":0.04158,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":1.035,\"tare\":0.4,\"gross\":1.435,\"pub\":true},{\"id\":45,\"ref\":\"2429\",\"fam\":\"Munchiz\",\"famTr\":\"Munchiz\",\"brand\":\"Munchiz SpongeBob\",\"brandTr\":\"Munchiz SpongeBob\",\"name\":\"Cheese\",\"nameTr\":\"Peynir Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":35.0,\"upc\":15,\"cpp\":72,\"l\":39.5,\"w\":29.5,\"h\":23.1,\"cbm\":0.026917,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.525,\"tare\":0.3,\"gross\":0.825,\"pub\":true},{\"id\":46,\"ref\":\"2434\",\"fam\":\"Munchiz\",\"famTr\":\"Munchiz\",\"brand\":\"Munchiz Ninja Turtles\",\"brandTr\":\"Munchiz Ninja Turtles\",\"name\":\"Pizza\",\"nameTr\":\"Pizza Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":35.0,\"upc\":15,\"cpp\":72,\"l\":39.5,\"w\":29.5,\"h\":23.1,\"cbm\":0.026917,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.525,\"tare\":0.3,\"gross\":0.825,\"pub\":true},{\"id\":47,\"ref\":\"2407\",\"fam\":\"Munchiz\",\"famTr\":\"Munchiz\",\"brand\":\"Munchiz Barbie\",\"brandTr\":\"Munchiz Barbie\",\"name\":\"Strawberry\",\"nameTr\":\"\u00c7ilek Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":35.0,\"upc\":15,\"cpp\":72,\"l\":39.5,\"w\":29.5,\"h\":23.1,\"cbm\":0.026917,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.525,\"tare\":0.3,\"gross\":0.825,\"pub\":true},{\"id\":48,\"ref\":\"2405\",\"fam\":\"Munchiz\",\"famTr\":\"Munchiz\",\"brand\":\"Munchiz Barbie\",\"brandTr\":\"Munchiz Barbie\",\"name\":\"Ketchup\",\"nameTr\":\"Ket\u00e7ap Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":35.0,\"upc\":15,\"cpp\":72,\"l\":39.5,\"w\":29.5,\"h\":23.1,\"cbm\":0.026917,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.525,\"tare\":0.3,\"gross\":0.825,\"pub\":true},{\"id\":49,\"ref\":\"2411\",\"fam\":\"Munchiz\",\"famTr\":\"Munchiz\",\"brand\":\"Munchiz Hello Kitty\",\"brandTr\":\"Munchiz Hello Kitty\",\"name\":\"Vanilla & Milk\",\"nameTr\":\"Vanilya ve S\u00fct Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":35.0,\"upc\":15,\"cpp\":72,\"l\":39.5,\"w\":29.5,\"h\":23.1,\"cbm\":0.026917,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.525,\"tare\":0.3,\"gross\":0.825,\"pub\":true},{\"id\":50,\"ref\":\"2423\",\"fam\":\"Munchiz\",\"famTr\":\"Munchiz\",\"brand\":\"Munchiz One Piece\",\"brandTr\":\"Munchiz One Piece\",\"name\":\"Mushroom & Cream\",\"nameTr\":\"Mantar ve Krema Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":35.0,\"upc\":15,\"cpp\":72,\"l\":39.5,\"w\":29.5,\"h\":23.1,\"cbm\":0.026917,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.525,\"tare\":0.3,\"gross\":0.825,\"pub\":true},{\"id\":51,\"ref\":\"2425\",\"fam\":\"Munchiz\",\"famTr\":\"Munchiz\",\"brand\":\"Munchiz One Piece\",\"brandTr\":\"Munchiz One Piece\",\"name\":\"Spicy Cheese & Lime\",\"nameTr\":\"Ac\u0131l\u0131 Peynir ve Misket Limonu Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":107.0,\"upc\":20,\"cpp\":21,\"l\":80.0,\"w\":40.0,\"h\":30.0,\"cbm\":0.096,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":2.14,\"tare\":0.5,\"gross\":2.64,\"pub\":true},{\"id\":52,\"ref\":\"2414\",\"fam\":\"Munchiz\",\"famTr\":\"Munchiz\",\"brand\":\"Munchiz Hot Wheels\",\"brandTr\":\"Munchiz Hot Wheels\",\"name\":\"Cheese\",\"nameTr\":\"Peynir Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":35.0,\"upc\":15,\"cpp\":72,\"l\":39.5,\"w\":29.5,\"h\":23.1,\"cbm\":0.026917,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.525,\"tare\":0.3,\"gross\":0.825,\"pub\":true},{\"id\":53,\"ref\":\"2451\",\"fam\":\"Munchiz\",\"famTr\":\"Munchiz\",\"brand\":\"Munchiz Super Hero\",\"brandTr\":\"Munchiz Super Hero\",\"name\":\"Chicken Noodles\",\"nameTr\":\"Tavuklu Noodle Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":107.0,\"upc\":20,\"cpp\":21,\"l\":80.0,\"w\":40.0,\"h\":30.0,\"cbm\":0.096,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":2.14,\"tare\":0.5,\"gross\":2.64,\"pub\":true},{\"id\":54,\"ref\":\"2444\",\"fam\":\"Munchiz\",\"famTr\":\"Munchiz\",\"brand\":\"Munchiz SpongeBob XXL\",\"brandTr\":\"Munchiz SpongeBob XXL\",\"name\":\"Cheese\",\"nameTr\":\"Peynir Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":107.0,\"upc\":20,\"cpp\":21,\"l\":80.0,\"w\":40.0,\"h\":30.0,\"cbm\":0.096,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":2.14,\"tare\":0.5,\"gross\":2.64,\"pub\":true},{\"id\":55,\"ref\":\"2450\",\"fam\":\"Munchiz\",\"famTr\":\"Munchiz\",\"brand\":\"Munchiz Dora\",\"brandTr\":\"Munchiz Dora\",\"name\":\"Cheddar Cheese\",\"nameTr\":\"Cheddar Peyniri Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":107.0,\"upc\":20,\"cpp\":21,\"l\":80.0,\"w\":40.0,\"h\":30.0,\"cbm\":0.096,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":2.14,\"tare\":0.5,\"gross\":2.64,\"pub\":true},{\"id\":56,\"ref\":\"2446\",\"fam\":\"Munchiz\",\"famTr\":\"Munchiz\",\"brand\":\"Munchiz Barbie XXL\",\"brandTr\":\"Munchiz Barbie XXL\",\"name\":\"Sweet Corn\",\"nameTr\":\"Sweet Corn\",\"shelf\":\"12 Months\",\"g\":107.0,\"upc\":20,\"cpp\":21,\"l\":80.0,\"w\":40.0,\"h\":30.0,\"cbm\":0.096,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":2.14,\"tare\":0.5,\"gross\":2.64,\"pub\":true},{\"id\":57,\"ref\":\"2445\",\"fam\":\"Munchiz\",\"famTr\":\"Munchiz\",\"brand\":\"Munchiz Barbie XXL\",\"brandTr\":\"Munchiz Barbie XXL\",\"name\":\"Cheese\",\"nameTr\":\"Peynir Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":107.0,\"upc\":20,\"cpp\":21,\"l\":80.0,\"w\":40.0,\"h\":30.0,\"cbm\":0.096,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":2.14,\"tare\":0.5,\"gross\":2.64,\"pub\":true},{\"id\":58,\"ref\":\"2447\",\"fam\":\"Munchiz\",\"famTr\":\"Munchiz\",\"brand\":\"Munchiz Hello Kitty XXL\",\"brandTr\":\"Munchiz Hello Kitty XXL\",\"name\":\"Sweet Corn\",\"nameTr\":\"Sweet Corn\",\"shelf\":\"12 Months\",\"g\":107.0,\"upc\":20,\"cpp\":21,\"l\":80.0,\"w\":40.0,\"h\":30.0,\"cbm\":0.096,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":2.14,\"tare\":0.5,\"gross\":2.64,\"pub\":true},{\"id\":59,\"ref\":\"2448\",\"fam\":\"Munchiz\",\"famTr\":\"Munchiz\",\"brand\":\"Munchiz Kuromi XXL\",\"brandTr\":\"Munchiz Kuromi XXL\",\"name\":\"Ketchup\",\"nameTr\":\"Ket\u00e7ap Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":107.0,\"upc\":20,\"cpp\":21,\"l\":80.0,\"w\":40.0,\"h\":30.0,\"cbm\":0.096,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":2.14,\"tare\":0.5,\"gross\":2.64,\"pub\":true},{\"id\":60,\"ref\":\"2440\",\"fam\":\"Munchiz Display Stand\",\"famTr\":\"Munchiz Display Stand\",\"brand\":\"Munchiz Display Stand V3\",\"brandTr\":\"Munchiz Stant V3\",\"name\":\"Barbie Ketchup \u00b7 Hot Wheels Cheese \u00b7 Hello Kitty Vanilla & Milk \u00b7 SpongeBob Cheddar Cheese\",\"nameTr\":\"Barbie Ket\u00e7ap \u00b7 Hot Wheels Peynir \u00b7 Hello Kitty Vanilya & S\u00fct \u00b7 SpongeBob Ka\u015far\",\"shelf\":\"12 Months\",\"g\":30.0,\"upc\":60,\"cpp\":16,\"l\":30.0,\"w\":40.0,\"h\":110.0,\"cbm\":0.132,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":1.8,\"tare\":2.0,\"gross\":3.8,\"pub\":true},{\"id\":61,\"ref\":\"2657\",\"fam\":\"Puffy Cubs\",\"famTr\":\"Puffy Cubs\",\"brand\":\"Puffy Cubs\",\"brandTr\":\"Puffy Cubs\",\"name\":\"Salt & Vinegar\",\"nameTr\":\"Tuz ve Sirke Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":99.0,\"upc\":20,\"cpp\":21,\"l\":80.0,\"w\":40.0,\"h\":30.0,\"cbm\":0.096,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":1.98,\"tare\":0.5,\"gross\":2.48,\"pub\":true},{\"id\":62,\"ref\":\"2658\",\"fam\":\"Puffy Cubs\",\"famTr\":\"Puffy Cubs\",\"brand\":\"Puffy Cubs\",\"brandTr\":\"Puffy Cubs\",\"name\":\"Pesto\",\"nameTr\":\"Pesto Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":99.0,\"upc\":20,\"cpp\":21,\"l\":80.0,\"w\":40.0,\"h\":30.0,\"cbm\":0.096,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":1.98,\"tare\":0.5,\"gross\":2.48,\"pub\":true},{\"id\":63,\"ref\":\"2659\",\"fam\":\"Puffy Cubs\",\"famTr\":\"Puffy Cubs\",\"brand\":\"Puffy Cubs\",\"brandTr\":\"Puffy Cubs\",\"name\":\"French Cheese\",\"nameTr\":\"Frans\u0131z Peyniri Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":99.0,\"upc\":20,\"cpp\":21,\"l\":80.0,\"w\":40.0,\"h\":30.0,\"cbm\":0.096,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":1.98,\"tare\":0.5,\"gross\":2.48,\"pub\":true},{\"id\":64,\"ref\":\"2103\",\"fam\":\"7Chips\",\"famTr\":\"7Chips\",\"brand\":\"7Chips\",\"brandTr\":\"7Chips\",\"name\":\"Ring Pizza\",\"nameTr\":\"Ring Pizza\",\"shelf\":\"12 Months\",\"g\":99.0,\"upc\":20,\"cpp\":21,\"l\":80.0,\"w\":40.0,\"h\":30.0,\"cbm\":0.096,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":1.98,\"tare\":0.5,\"gross\":2.48,\"pub\":true},{\"id\":65,\"ref\":\"2104\",\"fam\":\"7Chips\",\"famTr\":\"7Chips\",\"brand\":\"7Chips\",\"brandTr\":\"7Chips\",\"name\":\"Cone Ketchup & Mayonnaise\",\"nameTr\":\"Cone Ketchup & Mayonnaise\",\"shelf\":\"12 Months\",\"g\":99.0,\"upc\":20,\"cpp\":21,\"l\":80.0,\"w\":40.0,\"h\":30.0,\"cbm\":0.096,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":1.98,\"tare\":0.5,\"gross\":2.48,\"pub\":true},{\"id\":66,\"ref\":\"2105\",\"fam\":\"7Chips\",\"famTr\":\"7Chips\",\"brand\":\"7Chips\",\"brandTr\":\"7Chips\",\"name\":\"Flower Chilli Lime\",\"nameTr\":\"Flower Chilli Lime\",\"shelf\":\"12 Months\",\"g\":99.0,\"upc\":20,\"cpp\":21,\"l\":80.0,\"w\":40.0,\"h\":30.0,\"cbm\":0.096,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":1.98,\"tare\":0.5,\"gross\":2.48,\"pub\":true},{\"id\":67,\"ref\":\"2106\",\"fam\":\"7Chips\",\"famTr\":\"7Chips\",\"brand\":\"7Chips\",\"brandTr\":\"7Chips\",\"name\":\"Cone Salt & Vinegar\",\"nameTr\":\"Cone Salt & Vinegar\",\"shelf\":\"12 Months\",\"g\":99.0,\"upc\":20,\"cpp\":21,\"l\":80.0,\"w\":40.0,\"h\":30.0,\"cbm\":0.096,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":1.98,\"tare\":0.5,\"gross\":2.48,\"pub\":true},{\"id\":68,\"ref\":\"2107\",\"fam\":\"7Chips\",\"famTr\":\"7Chips\",\"brand\":\"7Chips\",\"brandTr\":\"7Chips\",\"name\":\"Flat Pesto\",\"nameTr\":\"Flat Pesto\",\"shelf\":\"12 Months\",\"g\":99.0,\"upc\":20,\"cpp\":21,\"l\":80.0,\"w\":40.0,\"h\":30.0,\"cbm\":0.096,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":1.98,\"tare\":0.5,\"gross\":2.48,\"pub\":true},{\"id\":69,\"ref\":\"2108\",\"fam\":\"7Chips\",\"famTr\":\"7Chips\",\"brand\":\"7Chips\",\"brandTr\":\"7Chips\",\"name\":\"Flat Salt & Vinegar\",\"nameTr\":\"Flat Salt & Vinegar\",\"shelf\":\"12 Months\",\"g\":99.0,\"upc\":20,\"cpp\":21,\"l\":80.0,\"w\":40.0,\"h\":30.0,\"cbm\":0.096,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":1.98,\"tare\":0.5,\"gross\":2.48,\"pub\":true},{\"id\":70,\"ref\":\"2660\",\"fam\":\"Rixy Pops\",\"famTr\":\"Rixy Pops\",\"brand\":\"Rixy Pops\",\"brandTr\":\"Rixy Pops\",\"name\":\"Classic Popcorn\",\"nameTr\":\"Klasik\",\"shelf\":\"12 Months\",\"g\":99.0,\"upc\":20,\"cpp\":21,\"l\":80.0,\"w\":40.0,\"h\":30.0,\"cbm\":0.096,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":1.98,\"tare\":0.5,\"gross\":2.48,\"pub\":true},{\"id\":71,\"ref\":\"2661\",\"fam\":\"Rixy Pops\",\"famTr\":\"Rixy Pops\",\"brand\":\"Rixy Pops\",\"brandTr\":\"Rixy Pops\",\"name\":\"White Cheddar Popcorn\",\"nameTr\":\"Beyaz Peynir Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":99.0,\"upc\":20,\"cpp\":21,\"l\":80.0,\"w\":40.0,\"h\":30.0,\"cbm\":0.096,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":1.98,\"tare\":0.5,\"gross\":2.48,\"pub\":true},{\"id\":72,\"ref\":\"2504\",\"fam\":\"ProKids\",\"famTr\":\"ProKids\",\"brand\":\"ProKids\",\"brandTr\":\"ProKids\",\"name\":\"Cheese\",\"nameTr\":\"Peynir Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":35.0,\"upc\":15,\"cpp\":72,\"l\":39.5,\"w\":29.5,\"h\":23.1,\"cbm\":0.026917,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.525,\"tare\":0.3,\"gross\":0.825,\"pub\":true},{\"id\":73,\"ref\":\"2505\",\"fam\":\"ProKids\",\"famTr\":\"ProKids\",\"brand\":\"ProKids\",\"brandTr\":\"ProKids\",\"name\":\"Pizza\",\"nameTr\":\"Pizza Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":35.0,\"upc\":15,\"cpp\":72,\"l\":39.5,\"w\":29.5,\"h\":23.1,\"cbm\":0.026917,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.525,\"tare\":0.3,\"gross\":0.825,\"pub\":true},{\"id\":74,\"ref\":\"2506\",\"fam\":\"ProKids\",\"famTr\":\"ProKids\",\"brand\":\"ProKids\",\"brandTr\":\"ProKids\",\"name\":\"Vegetable Seasoning\",\"nameTr\":\"Sebze Baharatl\u0131\",\"shelf\":\"12 Months\",\"g\":35.0,\"upc\":15,\"cpp\":72,\"l\":39.5,\"w\":29.5,\"h\":23.1,\"cbm\":0.026917,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.525,\"tare\":0.3,\"gross\":0.825,\"pub\":true},{\"id\":75,\"ref\":\"2507\",\"fam\":\"ProKids\",\"famTr\":\"ProKids\",\"brand\":\"ProKids\",\"brandTr\":\"ProKids\",\"name\":\"Sweet Corn\",\"nameTr\":\"Tatl\u0131 M\u0131s\u0131r Aromal\u0131\",\"shelf\":\"12 Months\",\"g\":35.0,\"upc\":15,\"cpp\":72,\"l\":39.5,\"w\":29.5,\"h\":23.1,\"cbm\":0.026917,\"hs\":\"1905.90.55.00.00\",\"bc\":\"\",\"cbc\":\"\",\"temp\":\"18\u201325\u00b0C\",\"net\":0.525,\"tare\":0.3,\"gross\":0.825,\"pub\":true}];\nALL.forEach(d=>{ const p=PRICES[d.id]; if(p){ d.pu=p[0]; d.pc=p[1]; } });\nconst byId = id => ALL.find(x=>String(x.id)===String(id));\n\nfunction applyShared(j){\n  if(j.prices) Object.keys(j.prices).forEach(id=>{ const d=byId(id); if(d){ d.pu=j.prices[id][0]; d.pc=j.prices[id][1]; } });\n  if(j.overrides) Object.keys(j.overrides).forEach(id=>{ const d=byId(id); if(d) Object.assign(d,j.overrides[id]); });\n  if(j.public) Object.keys(j.public).forEach(id=>{ const d=byId(id); if(d) d.pub=!!j.public[id]; });\n  if(Array.isArray(j.extra)) j.extra.forEach(e=>{ if(!byId(e.id)) ALL.push(e); });\n}\n\/\/ only products the team has marked visible ever reach a customer\nlet DATA = [];\nfunction rebuild(){\n  DATA = ALL.filter(d=>d.pub).sort((a,b)=>a.id-b.id);\n}\nrebuild();\n\/* Same order as the internal portal: whatever Claimont published wins, with the\n   WordPress page as the fallback. *\/\nfunction applySharedData(d){\n  if(!d||!d.updated) throw 0;\n  if(String(d.dataset||\"\")!==String(DATASET)) throw 0;   \/\/ stale \u2014 from the previous product list\n  applyShared({updated:d.updated, prices:d.prices, public:d.pub,\n               overrides:d.overrides, extra:Object.values(d.added||{})});\n  rebuild();\n  Object.keys(qty).forEach(id=>{ if(!DATA.some(x=>String(x.id)===id)) delete qty[id]; });\n  renderChips(); renderAll();\n}\nfunction loadShared(){\n  return api({action:\"getData\"})\n    .then(r=>{ if(!r||!r.ok) throw 0; applySharedData(r.data); })\n    .catch(()=>loadSharedPage());\n}\nfunction loadSharedPage(){\n  return fetch(DATA_URL,{credentials:\"same-origin\"})\n    .then(r=>r.ok?r.text():Promise.reject())\n    .then(html=>{\n      const el=new DOMParser().parseFromString(html,\"text\/html\").querySelector(\"#claimont-data\");\n      if(!el) throw 0;\n      const j=JSON.parse(el.textContent.trim());\n      if(String(j.dataset||\"\")!==String(DATASET)) throw 0;\n      applyShared(j);\n      rebuild();\n      Object.keys(qty).forEach(id=>{ if(!DATA.some(d=>String(d.id)===id)) delete qty[id]; });\n      renderChips(); renderAll();\n    })\n    .catch(()=>{});\n}\n\nconst T = {\n en:{\n  sub:\"Customer orders\", gTag:\"Snacks the world comes back for\", gTitle:\"Enter your access code\",\n  gText:\"Use the code Claimont gave you. It unlocks the product list, prices and the order sheet for your account.\",\n  gGo:\"Unlock\", gFoot:`No code yet? Email ${ORDER_EMAIL} and we'll issue one.`,\n  gBad:\"That code isn't recognised. Check it and try again.\",\n  gEmpty:\"Enter your code to continue.\",\n  account:\"Account\", search:\"Search product, code, barcode\u2026\", all:\"All\",\n  cat:\"Catalogue\", printAll:\"Price list (PDF)\", printSel:\"Print selection\", order:\"Order sheet\", reset:\"Reset\",\n  cols:{idx:\"#\",ref:\"Reference\",photo:\"Photo\",name:\"Product\",g:\"Grammage\",upc:\"Units \/ carton\",qty:\"Cartons\",\n    pu:\"Unit USD\",pue:\"Unit EUR\",pc:\"Carton USD\",pce:\"Carton EUR\",tusd:\"Total USD\",teur:\"Total EUR\",units:\"Units\",pallets:\"Pallets\",\n    tcbm:\"Total CBM\",tnet:\"Total net kg\",tgross:\"Total gross kg\",\n    cpp:\"Cartons \/ pallet\",l:\"L cm\",w:\"W cm\",h:\"H cm\",cbm:\"CBM \/ carton\",\n    net:\"Net kg \/ ctn\",gross:\"Gross kg \/ ctn\",shelf:\"Shelf life\",temp:\"Storage\",hs:\"HS code\",bc:\"Unit barcode\"},\n  stats:{lines:\"Lines\",cartons:\"Cartons\",units:\"Units\",pallets:\"Pallets\",cbm:\"Total CBM\",\n    net:\"Net weight\",gross:\"Gross weight\",usd:\"Ex-works USD\",eur:\"Ex-works EUR\"},\n  contlbl:\"Container fill\", empty:\"No products match that search.\",\n  contlbl2:\"Container planning\",\n  shipIn:\"I want to ship in\", howMany:\"How many\", whatMean:\"What do these mean?\",\n  wouldNeed:\"would need {n}\",\n  fitIdle:\"Enter quantities above and this will tell you whether the order fills the container you have chosen.\",\n  fitOver:\"This will not fit. You would need {need}, or {over} less cargo.\",\n  fitFull:\"Good full container load \u2014 {pct} of the space used.\",\n  fitNear:\"Fits, at {pct} full. There is still room for about {room}.\",\n  fitLight:\"Well short of a full container \u2014 only {pct} used. Around {room} of space would ship empty.\",\n  fitWeight:\"It is also over the {kg} payload limit, so weight will stop you before volume does.\",\n  infoTitle:\"Containers and pallets\",   infoCont:\"Container\", infoInner:\"Inside size\", infoVol:\"Usable volume\",\n  infoPal100:\"Pallets 100\u00d7120\", infoPalEuro:\"Pallets 80\u00d7120\", infoPayload:\"Max payload\",\n  infoIntro:\"Sea freight is sold by the container, not by weight, so the aim is to fill one as completely as you can. These are the three we ship in:\",\n  infoFloor:\"<b>Floor loaded<\/b> means cartons are stacked straight into the container by hand. It uses the most space, so you fit more in \u2014 but loading and unloading takes longer.\",\n  infoPallet:\"<b>Palletised<\/b> means cartons are stacked on wooden pallets and moved by forklift. Faster to handle and safer for the goods, but the pallets themselves take up space and add about 25 kg each, so a container holds less.\",\n  infoCaveat:\"Volumes and pallet counts are working figures for planning. Your freight forwarder decides the final loading plan.\",\n  signOut:\"Sign out\",\n  oldTitle:\"The Claimont service needs updating\",\n  oldText:\"This portal is talking to an older version of the backend script, so some features \u2014 past orders, order detail \u2014 will not work. In Apps Script: paste the latest claimont-backend.gs, then Deploy \u2192 Manage deployments \u2192 \u270f\ufe0f \u2192 Version: New version \u2192 Deploy.\",\n  floorLoaded:\"Floor loaded\", palletised:\"Palletised\", palletsShort:\"pallets\",\n  palSettings:\"Pallet settings\", palSize:\"Pallet size\",\n  palWeight:\"Weight of one empty pallet (kg)\",\n  palNote:\"Slots are single-stacked pallets per container. Change the pallet size if yours differs, and tell Claimont if these figures don't match your forwarder's.\",\n  palletsWhole:\"Pallets\", loading:\"Loading\",\n  live:\"ECB rate\", fallback:\"fixed rate\",\n  yourOrders:\"Your orders\", noOrders:\"No orders yet. Build one below and it will appear here.\",\n  linesWord:\"lines\", cartonsWord:\"cartons\", loadingOrder:\"Loading\u2026\",\n  orderFailed:\"Couldn't load that order. Try again in a moment.\", oWhen:\"Placed\",\n  submitBtn:\"Review and submit order\",\n  discCta:\"special price\",\n  gUnset:\"This portal is not connected to Claimont's system yet. The ENDPOINT_URL setting at the top of the page still needs filling in.\", gChecking:\"Checking\u2026\", gOffline:\"Can't reach Claimont right now. Please try again in a moment.\",\n  phone:\"Phone\", needEmail:\"Please enter your email address.\", needPhone:\"Please enter your phone number.\",\n  badEmail:\"That email address doesn't look right.\", badPhone:\"That phone number looks too short.\",\n  review:\"Review order\", sendBtn:\"Confirm and send\", sending:\"Sending\u2026\", back:\"Back\", doneClose:\"Close\",\n  sendFailed:\"The order could not be sent. Check your connection and try again \u2014 nothing has been submitted.\",\n  confirmTitle:\"Please check your order before it is sent\",\n  confirmHowto:`Pressing <strong>Confirm and send<\/strong> emails this order straight to Claimont at <strong>${ORDER_EMAIL}<\/strong>. We'll reply to the email address above with availability, freight and a proforma invoice.`,\n  doneTitle:\"Order sent to Claimont\", doneTitleName:\"Thank you, {name}! Your order is on its way to us \ud83c\udf89\", doneText:\"We've received it and will be in touch shortly. Your reference:\",\n  doneMailWarn:\"Your order is saved and Claimont can see it in their system, but the confirmation email could not be sent just now. No action needed \u2014 if you want to be extra sure, mention your reference in a message via the Messages panel.\",\n  discTitle:\"You have a special price on every product\",\n  discTitleN:\"{name}, you have a special price on every product\",\n  discSub:\"Your account discount is already applied below \u2014 the crossed-out figure is what everyone else pays.\",\n  saved:\"You save\", wasLabel:\"list\",\n  oTitle:\"Your order\", close:\"Close\",\n  confirmContact:\"Delivery & contact\", confirmTotals:\"Order totals\", confirmItems:\"Products in this order ({n})\",\n  youSave:\"You save\", pdfBtn:\"Download PDF\", pdfWait:\"Building the PDF\u2026\", pdfFailed:\"The PDF could not be made \u2014 try again.\",\n  floorNote:\"Volumes include a ~10% packing allowance. At loading, exact quantities can vary slightly \u2014 we always confirm the final load with you.\",\n  c3dTitle:\"Live load view \u2014 drag to rotate\", c3dExtra:\"more needed\",\n  fitFlag:\"This order will NOT fit in {n} \u00d7 {type} \u2014 it needs {need}. Add a container\/truck or reduce quantities.\",\n  fitFlagW:\"This order is over the weight limit for {n} \u00d7 {type}. Add a container\/truck or reduce quantities.\",\n  moqCardLine:\"Up to {cap} different products this trip ({n} per container). More containers = more variety \u2728\",\n  moqAskBtn:\"Need more in one container? Just ask \u2192\",\n  mwSteps:[\"Shipment\",\"Products\",\"Finish\"], mwNext:\"Next &#8594;\", mwReview:\"Review order &#8594;\",\n  moqTag:\"mix & match\",\n  moqAskLb:\"How many different products per container would suit you?\",\n  moqAskSend:\"Send request\",\n  moqAskText:\"Request from the order portal: we would like to load up to {n} different products in a single container\/truck. Could you make an exception for us?\",\n  moqAskDone:\"Request sent \u2014 we'll get back to you shortly! \ud83d\ude4c\",\n  moqAskFail:\"Couldn't send just now \u2014 please try the Messages panel.\",\n  moqNeed:\"Maximum {max} different products for this shipment \u2014 you have {have}. Remove some, or add another container.\",\n  moqMet:\"Up to {max} different products \u2014 you have {have} \u2713\",\n  moqBlock:\"Your account allows at most {max} different products per container\/truck for this shipment. You currently have {have} \u2014 remove some products, or increase the container count.\",\n  wTitle:\"Welcome, {name}\", wLeadPersonal:\"We're delighted to be working with {company}.\",\n  repRole:\"Your Claimont representative\", repHint:\"Reach out directly any time \u2014 call or email.\",\n  wSignLine:\"I set this page up for you personally \u2014 if anything is unclear, or you'd rather order over the phone or by email, reach me directly any time:\",\n  wLead:\"This is your private Claimont order desk. Your account prices are already applied to every product, and everything you see here is live \u2014 when we update a price or add a product, you see it immediately.\",\n  wLeadDisc:\"You've been given a <b>special discount<\/b> \u2014 it's already included in every price you'll see.\",\n  wP1t:\"Browse the full range with live prices\",\n  wP1:\"All products with photos, pack sizes, pallet data and your prices in USD and EUR. Search, filter by brand, and plan container loads as you go.\",\n  wP2t:\"Place your order online\",\n  wP2:\"Enter carton quantities, review the totals, and send the order to Claimont in one click. You can also save a draft and finish it later.\",\n  wP3t:\"Talk to us directly\",\n  wP3:\"The Messages panel reaches your Claimont representative \u2014 ask about stock, shipping or anything else, right from the portal.\",\n  wEnter:\"View prices & place your order \u2192\",\n  wScreen:\"The web price list is best viewed on a computer.\",\n  wDocs:\"Your documents\",\n  wDocCatT:\"Product Catalogue (PDF)\",\n  wDocCat:\"Our full printed catalogue \u2014 every brand and flavour with photography, for browsing and sharing with your team.\",\n  wDocPdfT:\"Price List 2026 (PDF)\",\n  wDocPdf:\"The complete price list, one product per line with its photo, reference, pack data and prices. Ready to print or forward.\",\n  wDocXlsT:\"Price List 2026 (Excel)\",\n  wDocXls:\"The same price list as a working spreadsheet \u2014 with order columns, so you can plan quantities your own way.\",\n  contNudge:\"Tell us how you want to ship{name} \u2014 pick a container and we'll show you how full it gets as you order.\",\n  wAltT:\"Prefer to order by email?\",\n  wAlt1:\"Download the Excel price list above\",\n  wAlt2:\"Fill in the carton quantities you want\",\n  wAlt3:\"Email the file to {email}\",\n  wAltEnd:\"We'll confirm your order the same business day \u2014 the web portal works too, whichever you prefer.\",\n  wUpdated:\"Updated {when}\",\n  catOpenFull:\"Open the full catalogue\", catUpdated:\"PDF \u00b7 updated {when}\",\n  catSnapTitle:\"From the catalogue\", catSnapOpen:\"Open\",\n  qtyResize:\"Drag to make the Cartons column wider\",\n  qtyBox:\"Cartons box\",\n  msgCollapse:\"Collapse messages\", msgExpand:\"Show messages\",\n  messages:\"Messages\", msgSend:\"Send\", msgYou:\"You\",\n  msgPlaceholder:\"Write to Claimont\u2026\",\n  msgEmpty:\"No messages yet. Ask us anything about prices, stock or shipping \u2014 we reply here.\",\n  msgFailed:\"That didn't send. Try again.\",\n  draftSave:\"Save as draft\", draftSaving:\"Saving\u2026\",\n  draftSaved:\"Draft saved at {when} \u2014 you can come back to it any time.\",\n  draftFailed:\"That didn't save. Check your connection and try again.\",\n  draftEmpty:\"Enter some quantities first.\",\n  draftResumed:\"Your draft is back \u2014 carry on where you left off.\",\n  draftFound:\"You have an unfinished order\",\n  draftFoundSub:\"Saved {when} \u00b7 {lines} lines \u00b7 {cartons} cartons\",\n  draftResume:\"Pick it up\", draftDiscard:\"Start fresh\",\n  company:\"Company\", contact:\"Contact name\", email:\"Email\",\n  country:\"Country \/ port of destination\", fNotes:\"Notes for Claimont\",\n  howto:`Fill in your details, then review and confirm. The order is emailed straight to Claimont at <strong>${ORDER_EMAIL}<\/strong> \u2014 you don't need to send anything yourself. <strong>Email and phone are required<\/strong> so we can reply.`,\n  pdf:\"Download PDF\", csv:\"Download Excel\", xlsAll:\"Excel\", mailBtn:\"Open in email\",\n  needCompany:\"Please enter your company name.\",\n  catTitle:\"Product catalogue\", catOpen:\"Open in new tab\",\n  catMissing:\"The catalogue hasn't been linked yet. Ask Claimont for a copy.\",\n  phAll:\"CLAIMONT \u2014 Product list 2026\", phSel:\"CLAIMONT \u2014 Order request\",\n  noteshd:\"Notes\",\n  notes:[\n    \"All prices are <strong>ex-works<\/strong> and exclude taxes, FOB and freight charges.\",\n    \"EUR is converted from USD at the European Central Bank reference rate shown in the header.\",\n    \"Enter quantities in <strong>cartons<\/strong>. Units, pallets, volume, weight and totals calculate as you type.\",\n    \"Choose <strong>Floor loaded<\/strong> or <strong>Palletised<\/strong> below the table. Floor loading measures the container by volume (20' DV 29 m\u00b3 \u00b7 40' HC 76.3 m\u00b3 \u00b7 45' HC 85.6 m\u00b3 \u00b7 Tautliner truck 90 m\u00b3). Palletised counts whole pallets per product, adds the weight of the empty pallets, and measures the container in pallet places instead.\",\n    \"Prices are indicative until confirmed on a proforma invoice. Minimum order quantities may apply.\"\n  ],\n  genOn:\"generated\"\n },\n tr:{\n  sub:\"M\u00fc\u015fteri sipari\u015fleri\", gTag:\"D\u00fcnyan\u0131n d\u00f6n\u00fcp d\u00f6n\u00fcp ald\u0131\u011f\u0131 at\u0131\u015ft\u0131rmal\u0131klar\", gTitle:\"Eri\u015fim kodunuzu girin\",\n  gText:\"Claimont'un size verdi\u011fi kodu kullan\u0131n. \u00dcr\u00fcn listesi, fiyatlar ve sipari\u015f formu bu kodla a\u00e7\u0131l\u0131r.\",\n  gGo:\"A\u00e7\", gFoot:`Kodunuz yok mu? ${ORDER_EMAIL} adresine yaz\u0131n, size bir kod verelim.`,\n  gBad:\"Bu kod tan\u0131nmad\u0131. Kontrol edip tekrar deneyin.\",\n  gEmpty:\"Devam etmek i\u00e7in kodunuzu girin.\",\n  account:\"Hesap\", search:\"\u00dcr\u00fcn, kod, barkod ara\u2026\", all:\"T\u00fcm\u00fc\",\n  cat:\"Katalog\", printAll:\"Fiyat listesi (PDF)\", printSel:\"Se\u00e7imi yazd\u0131r\", order:\"Sipari\u015f formu\", reset:\"S\u0131f\u0131rla\",\n  cols:{idx:\"#\",ref:\"Referans\",photo:\"Foto\u011fraf\",name:\"\u00dcr\u00fcn\",g:\"Gramaj\",upc:\"Koli i\u00e7i adet\",qty:\"Koli\",\n    pu:\"Birim USD\",pue:\"Birim EUR\",pc:\"Koli USD\",pce:\"Koli EUR\",tusd:\"Toplam USD\",teur:\"Toplam EUR\",units:\"Adet\",pallets:\"Palet\",\n    tcbm:\"Toplam m\u00b3\",tnet:\"Toplam net kg\",tgross:\"Toplam br\u00fct kg\",\n    cpp:\"Palet ba\u015f\u0131na koli\",l:\"U cm\",w:\"G cm\",h:\"Y cm\",cbm:\"Koli hacmi m\u00b3\",\n    net:\"Net kg \/ koli\",gross:\"Br\u00fct kg \/ koli\",shelf:\"Raf \u00f6mr\u00fc\",temp:\"Saklama\",hs:\"GT\u0130P kodu\",bc:\"\u00dcr\u00fcn barkodu\"},\n  stats:{lines:\"Kalem\",cartons:\"Koli\",units:\"Adet\",pallets:\"Palet\",cbm:\"Toplam m\u00b3\",\n    net:\"Net a\u011f\u0131rl\u0131k\",gross:\"Br\u00fct a\u011f\u0131rl\u0131k\",usd:\"Fabrika teslim USD\",eur:\"Fabrika teslim EUR\"},\n  contlbl:\"Konteyner doluluk\", empty:\"Araman\u0131za uyan \u00fcr\u00fcn bulunamad\u0131.\",\n  contlbl2:\"Konteyner planlama\",\n  shipIn:\"Sevkiyat \u015fekli\", howMany:\"Ka\u00e7 adet\", whatMean:\"Bunlar ne demek?\",\n  wouldNeed:\"{n} adet gerekir\",\n  fitIdle:\"Yukar\u0131dan miktar girin; sipari\u015fin se\u00e7ti\u011finiz konteyneri doldurup doldurmad\u0131\u011f\u0131n\u0131 burada g\u00f6receksiniz.\",\n  fitOver:\"Bu s\u0131\u011fmaz. {need} gerekir veya {over} daha az y\u00fckleme yapmal\u0131s\u0131n\u0131z.\",\n  fitFull:\"Tam konteyner y\u00fck\u00fc \u2014 alan\u0131n {pct} kadar\u0131 kullan\u0131ld\u0131.\",\n  fitNear:\"S\u0131\u011f\u0131yor, doluluk {pct}. Yakla\u015f\u0131k {room} kadar daha yer var.\",\n  fitLight:\"Tam konteynerden hayli uzak \u2014 yaln\u0131zca {pct} kullan\u0131ld\u0131. Yakla\u015f\u0131k {room} bo\u015f gidecek.\",\n  fitWeight:\"Ayr\u0131ca {kg} ta\u015f\u0131ma s\u0131n\u0131r\u0131n\u0131n \u00fczerinde; hacimden \u00f6nce a\u011f\u0131rl\u0131k s\u0131n\u0131rlayacakt\u0131r.\",\n  infoTitle:\"Konteynerler ve paletler\",   infoCont:\"Konteyner\", infoInner:\"\u0130\u00e7 \u00f6l\u00e7\u00fc\", infoVol:\"Kullan\u0131labilir hacim\",\n  infoPal100:\"Palet 100\u00d7120\", infoPalEuro:\"Palet 80\u00d7120\", infoPayload:\"Azami y\u00fck\",\n  infoIntro:\"Deniz ta\u015f\u0131mac\u0131l\u0131\u011f\u0131 a\u011f\u0131rl\u0131kla de\u011fil konteynerle sat\u0131l\u0131r; ama\u00e7 konteyneri olabildi\u011fince doldurmakt\u0131r. Kulland\u0131\u011f\u0131m\u0131z \u00fc\u00e7 tip \u015funlard\u0131r:\",\n  infoFloor:\"<b>Zemine y\u00fckleme<\/b>, kolilerin do\u011frudan elle konteynere istiflenmesidir. Alan\u0131 en verimli kullan\u0131r, daha \u00e7ok mal s\u0131\u011far; ancak y\u00fckleme ve bo\u015faltma daha uzun s\u00fcrer.\",\n  infoPallet:\"<b>Paletli<\/b> y\u00fckleme, kolilerin ah\u015fap paletlere istiflenip forkliftle ta\u015f\u0131nmas\u0131d\u0131r. Elle\u00e7lemesi h\u0131zl\u0131 ve mal i\u00e7in daha g\u00fcvenlidir; ancak paletler yer kaplar ve her biri yakla\u015f\u0131k 25 kg ekler, bu y\u00fczden konteynere daha az mal s\u0131\u011far.\",\n  infoCaveat:\"Hacim ve palet say\u0131lar\u0131 planlama i\u00e7indir. Nihai y\u00fckleme plan\u0131na nakliyeciniz karar verir.\",\n  signOut:\"\u00c7\u0131k\u0131\u015f\",\n  oldTitle:\"Claimont servisinin g\u00fcncellenmesi gerekiyor\",\n  oldText:\"Bu portal, arka u\u00e7 script'in eski bir s\u00fcr\u00fcm\u00fcyle konu\u015fuyor; ge\u00e7mi\u015f sipari\u015fler ve sipari\u015f detay\u0131 gibi baz\u0131 \u00f6zellikler \u00e7al\u0131\u015fmaz. Apps Script'te en g\u00fcncel claimont-backend.gs dosyas\u0131n\u0131 yap\u0131\u015ft\u0131r\u0131n, ard\u0131ndan Deploy \u2192 Manage deployments \u2192 \u270f\ufe0f \u2192 Version: New version \u2192 Deploy yap\u0131n.\",\n  floorLoaded:\"Zemine y\u00fckleme\", palletised:\"Paletli\", palletsShort:\"palet\",\n  palSettings:\"Palet ayarlar\u0131\", palSize:\"Palet \u00f6l\u00e7\u00fcs\u00fc\",\n  palWeight:\"Bo\u015f palet a\u011f\u0131rl\u0131\u011f\u0131 (kg)\",\n  palNote:\"Kapasiteler, konteyner ba\u015f\u0131na tek s\u0131ra (\u00fcst \u00fcste koymadan) palet say\u0131s\u0131d\u0131r. Palet \u00f6l\u00e7\u00fcn\u00fcz farkl\u0131ysa de\u011fi\u015ftirin; rakamlar nakliyecinizinkiyle uyu\u015fmuyorsa Claimont'a bildirin.\",\n  palletsWhole:\"Palet\", loading:\"Y\u00fckleme\",\n  live:\"AMB kuru\", fallback:\"sabit kur\",\n  yourOrders:\"Sipari\u015fleriniz\", noOrders:\"Hen\u00fcz sipari\u015f yok. A\u015fa\u011f\u0131dan olu\u015fturdu\u011funuzda burada g\u00f6r\u00fcn\u00fcr.\",\n  linesWord:\"kalem\", cartonsWord:\"koli\", loadingOrder:\"Y\u00fckleniyor\u2026\",\n  orderFailed:\"Bu sipari\u015f y\u00fcklenemedi. Birazdan tekrar deneyin.\", oWhen:\"Tarih\",\n  submitBtn:\"Sipari\u015fi g\u00f6zden ge\u00e7ir ve g\u00f6nder\",\n  discCta:\"\u00f6zel fiyat\",\n  gUnset:\"Bu portal hen\u00fcz Claimont sistemine ba\u011fl\u0131 de\u011fil. Sayfan\u0131n ba\u015f\u0131ndaki ENDPOINT_URL ayar\u0131n\u0131n doldurulmas\u0131 gerekiyor.\", gChecking:\"Kontrol ediliyor\u2026\", gOffline:\"Claimont'a \u015fu anda ula\u015f\u0131lam\u0131yor. L\u00fctfen birazdan tekrar deneyin.\",\n  phone:\"Telefon\", needEmail:\"L\u00fctfen e-posta adresinizi girin.\", needPhone:\"L\u00fctfen telefon numaran\u0131z\u0131 girin.\",\n  badEmail:\"Bu e-posta adresi ge\u00e7erli g\u00f6r\u00fcnm\u00fcyor.\", badPhone:\"Bu telefon numaras\u0131 \u00e7ok k\u0131sa g\u00f6r\u00fcn\u00fcyor.\",\n  review:\"Sipari\u015fi g\u00f6zden ge\u00e7ir\", sendBtn:\"Onayla ve g\u00f6nder\", sending:\"G\u00f6nderiliyor\u2026\", back:\"Geri\", doneClose:\"Kapat\",\n  sendFailed:\"Sipari\u015f g\u00f6nderilemedi. Ba\u011flant\u0131n\u0131z\u0131 kontrol edip tekrar deneyin \u2014 hi\u00e7bir \u015fey iletilmedi.\",\n  confirmTitle:\"G\u00f6nderilmeden \u00f6nce sipari\u015finizi kontrol edin\",\n  confirmHowto:`<strong>Onayla ve g\u00f6nder<\/strong> d\u00fc\u011fmesi bu sipari\u015fi do\u011frudan <strong>${ORDER_EMAIL}<\/strong> adresine e-posta ile iletir. Stok, navlun ve proforma fatura i\u00e7in yukar\u0131daki e-posta adresine d\u00f6n\u00fc\u015f yapaca\u011f\u0131z.`,\n  doneTitle:\"Sipari\u015f Claimont'a g\u00f6nderildi\", doneTitleName:\"Te\u015fekk\u00fcrler {name}! Sipari\u015finiz bize ula\u015ft\u0131 \ud83c\udf89\", doneText:\"Sipari\u015finizi ald\u0131k, k\u0131sa s\u00fcre i\u00e7inde size d\u00f6nece\u011fiz. Referans\u0131n\u0131z:\",\n  doneMailWarn:\"Sipari\u015finiz kaydedildi ve Claimont sisteminde g\u00f6r\u00fcn\u00fcyor; ancak onay e-postas\u0131 \u015fu anda g\u00f6nderilemedi. Bir \u015fey yapman\u0131z gerekmiyor \u2014 emin olmak isterseniz Mesajlar panelinden referans\u0131n\u0131z\u0131 yazabilirsiniz.\",\n  discTitle:\"Her \u00fcr\u00fcnde size \u00f6zel fiyat\",\n  discTitleN:\"{name}, her \u00fcr\u00fcnde size \u00f6zel fiyat\",\n  discSub:\"Hesab\u0131n\u0131za tan\u0131ml\u0131 indirim a\u015fa\u011f\u0131daki t\u00fcm fiyatlara yans\u0131d\u0131 \u2014 \u00fcst\u00fc \u00e7izili rakam herkesin \u00f6dedi\u011fi fiyatt\u0131r.\",\n  saved:\"Kazanc\u0131n\u0131z\", wasLabel:\"liste\",\n  oTitle:\"Sipari\u015finiz\", close:\"Kapat\",\n  confirmContact:\"Teslimat & ileti\u015fim\", confirmTotals:\"Sipari\u015f toplamlar\u0131\", confirmItems:\"Bu sipari\u015fteki \u00fcr\u00fcnler ({n})\",\n  youSave:\"Kazanc\u0131n\u0131z\", pdfBtn:\"PDF indir\", pdfWait:\"PDF haz\u0131rlan\u0131yor\u2026\", pdfFailed:\"PDF olu\u015fturulamad\u0131 \u2014 tekrar deneyin.\",\n  floorNote:\"Hacimlere yakla\u015f\u0131k %10 istifleme pay\u0131 dahildir. Y\u00fcklemede kesin adetler k\u00fc\u00e7\u00fck farkl\u0131l\u0131klar g\u00f6sterebilir \u2014 nihai y\u00fcklemeyi her zaman sizinle teyit ederiz.\",\n  c3dTitle:\"Canl\u0131 y\u00fck g\u00f6r\u00fcn\u00fcm\u00fc \u2014 d\u00f6nd\u00fcrmek i\u00e7in s\u00fcr\u00fckleyin\", c3dExtra:\"daha gerekli\",\n  fitFlag:\"Bu sipari\u015f {n} \u00d7 {type} i\u00e7ine SI\u011eMAYACAK \u2014 {need} adet gerekiyor. Konteyner\/t\u0131r ekleyin ya da adetleri azalt\u0131n.\",\n  fitFlagW:\"Bu sipari\u015f {n} \u00d7 {type} i\u00e7in a\u011f\u0131rl\u0131k s\u0131n\u0131r\u0131n\u0131 a\u015f\u0131yor. Konteyner\/t\u0131r ekleyin ya da adetleri azalt\u0131n.\",\n  moqCardLine:\"Bu sevkiyatta en fazla {cap} farkl\u0131 \u00fcr\u00fcn ({n} \/ konteyner). Daha \u00e7ok konteyner = daha \u00e7ok \u00e7e\u015fit \u2728\",\n  moqAskBtn:\"Tek konteynerde daha fazla m\u0131 laz\u0131m? Sorman yeter \u2192\",\n  mwSteps:[\"Sevkiyat\",\"\u00dcr\u00fcnler\",\"Tamamla\"], mwNext:\"\u0130leri &#8594;\", mwReview:\"Sipari\u015fi incele &#8594;\",\n  moqTag:\"kar\u0131\u015ft\u0131r & e\u015fle\u015ftir\",\n  moqAskLb:\"Konteyner ba\u015f\u0131na ka\u00e7 farkl\u0131 \u00fcr\u00fcn istersiniz?\",\n  moqAskSend:\"Talep g\u00f6nder\",\n  moqAskText:\"Sipari\u015f portal\u0131ndan talep: tek konteynerde\/t\u0131rda en fazla {n} farkl\u0131 \u00fcr\u00fcn y\u00fcklemek istiyoruz. Bizim i\u00e7in bir istisna yapabilir misiniz?\",\n  moqAskDone:\"Talebiniz iletildi \u2014 en k\u0131sa s\u00fcrede d\u00f6nece\u011fiz! \ud83d\ude4c\",\n  moqAskFail:\"\u015eu anda g\u00f6nderilemedi \u2014 l\u00fctfen Mesajlar panelini deneyin.\",\n  moqNeed:\"Bu sevkiyat i\u00e7in en fazla {max} farkl\u0131 \u00fcr\u00fcn \u2014 \u015fu an {have} \u00fcr\u00fcndesiniz. \u00dcr\u00fcn azalt\u0131n ya da konteyner ekleyin.\",\n  moqMet:\"En fazla {max} farkl\u0131 \u00fcr\u00fcn \u2014 \u015fu an {have} \u2713\",\n  moqBlock:\"Hesab\u0131n\u0131z bu sevkiyatta konteyner\/t\u0131r ba\u015f\u0131na en fazla {max} farkl\u0131 \u00fcr\u00fcne izin veriyor. \u015eu an {have} \u00fcr\u00fcn\u00fcn\u00fcz var \u2014 baz\u0131 \u00fcr\u00fcnleri \u00e7\u0131kar\u0131n ya da konteyner say\u0131s\u0131n\u0131 art\u0131r\u0131n.\",\n  wTitle:\"Ho\u015f geldiniz, {name}\", wLeadPersonal:\"{company} ile \u00e7al\u0131\u015fmaktan b\u00fcy\u00fck mutluluk duyuyoruz.\",\n  repRole:\"Claimont temsilciniz\", repHint:\"Diledi\u011finiz zaman do\u011frudan ula\u015f\u0131n \u2014 aray\u0131n ya da yaz\u0131n.\",\n  wSignLine:\"Bu sayfay\u0131 sizin i\u00e7in ben haz\u0131rlad\u0131m \u2014 akl\u0131n\u0131za tak\u0131lan olursa ya da telefonla veya e-postayla sipari\u015f vermeyi tercih ederseniz, bana diledi\u011finiz an do\u011frudan ula\u015fabilirsiniz:\",\n  wLead:\"Buras\u0131 size \u00f6zel Claimont sipari\u015f masas\u0131. Hesab\u0131n\u0131za tan\u0131ml\u0131 fiyatlar t\u00fcm \u00fcr\u00fcnlere uygulanm\u0131\u015f durumda ve g\u00f6rd\u00fc\u011f\u00fcn\u00fcz her \u015fey canl\u0131 \u2014 bir fiyat\u0131 g\u00fcncelledi\u011fimizde veya \u00fcr\u00fcn ekledi\u011fimizde an\u0131nda g\u00f6r\u00fcrs\u00fcn\u00fcz.\",\n  wLeadDisc:\"Size <b>\u00f6zel bir indirim<\/b> tan\u0131mland\u0131 \u2014 g\u00f6rece\u011finiz t\u00fcm fiyatlara zaten dahil.\",\n  wP1t:\"T\u00fcm \u00fcr\u00fcnleri g\u00fcncel fiyatlarla inceleyin\",\n  wP1:\"Foto\u011fraflar, ambalaj bilgileri, palet verileri ve USD\/EUR fiyatlar\u0131yla t\u00fcm \u00fcr\u00fcnler. Aray\u0131n, markaya g\u00f6re filtreleyin, konteyner planlay\u0131n.\",\n  wP2t:\"Sipari\u015finizi \u00e7evrimi\u00e7i verin\",\n  wP2:\"Koli adetlerini girin, \u00f6zeti inceleyin ve sipari\u015fi tek t\u0131kla Claimont'a g\u00f6nderin. Taslak kaydedip sonra da tamamlayabilirsiniz.\",\n  wP3t:\"Bizimle do\u011frudan konu\u015fun\",\n  wP3:\"Mesajlar paneli Claimont temsilcinize ula\u015f\u0131r \u2014 stok, sevkiyat veya ba\u015fka her konuyu portaldan sorabilirsiniz.\",\n  wEnter:\"Fiyatlar\u0131 g\u00f6r & sipari\u015f ver \u2192\",\n  wScreen:\"Web fiyat listesi en iyi bilgisayarda g\u00f6r\u00fcnt\u00fclenir.\",\n  wDocs:\"Belgeleriniz\",\n  wDocCatT:\"\u00dcr\u00fcn Katalo\u011fu (PDF)\",\n  wDocCat:\"T\u00fcm marka ve aromalar\u0131n foto\u011frafl\u0131 bas\u0131l\u0131 katalo\u011fu \u2014 incelemek ve ekibinizle payla\u015fmak i\u00e7in.\",\n  wDocPdfT:\"Fiyat Listesi 2026 (PDF)\",\n  wDocPdf:\"Tam fiyat listesi; her \u00fcr\u00fcn foto\u011fraf\u0131, referans\u0131, ambalaj verisi ve fiyatlar\u0131yla tek sat\u0131rda. Yazd\u0131rmaya haz\u0131r.\",\n  wDocXlsT:\"Fiyat Listesi 2026 (Excel)\",\n  wDocXls:\"Ayn\u0131 listenin \u00e7al\u0131\u015f\u0131labilir hali \u2014 sipari\u015f s\u00fctunlar\u0131yla; adetleri kendi d\u00fczeninizde planlay\u0131n.\",\n  contNudge:\"Nas\u0131l sevk etmek istedi\u011finizi se\u00e7in{name} \u2014 konteyneri se\u00e7in, sipari\u015f verdik\u00e7e doluluk oran\u0131n\u0131 g\u00f6sterelim.\",\n  wAltT:\"E-posta ile sipari\u015f vermeyi mi tercih edersiniz?\",\n  wAlt1:\"Yukar\u0131daki Excel fiyat listesini indirin\",\n  wAlt2:\"\u0130stedi\u011finiz koli adetlerini girin\",\n  wAlt3:\"Dosyay\u0131 {email} adresine g\u00f6nderin\",\n  wAltEnd:\"Sipari\u015finizi ayn\u0131 i\u015f g\u00fcn\u00fc teyit ederiz \u2014 dilerseniz web portal\u0131n\u0131 da kullanabilirsiniz.\",\n  wUpdated:\"{when} g\u00fcncellendi\",\n  catOpenFull:\"Tam katalo\u011fu a\u00e7\", catUpdated:\"PDF \u00b7 {when} g\u00fcncellendi\",\n  catSnapTitle:\"Katalo\u011fumuzdan\", catSnapOpen:\"A\u00e7\",\n  qtyResize:\"Kolon geni\u015fli\u011fini ayarlamak i\u00e7in s\u00fcr\u00fckleyin\",\n  qtyBox:\"Koli kutusu\",\n  msgCollapse:\"Mesajlar\u0131 gizle\", msgExpand:\"Mesajlar\u0131 g\u00f6ster\",\n  messages:\"Mesajlar\", msgSend:\"G\u00f6nder\", msgYou:\"Siz\",\n  msgPlaceholder:\"Claimont'a yaz\u0131n\u2026\",\n  msgEmpty:\"Hen\u00fcz mesaj yok. Fiyat, stok veya sevkiyat hakk\u0131nda her \u015feyi sorabilirsiniz \u2014 buradan yan\u0131tl\u0131yoruz.\",\n  msgFailed:\"G\u00f6nderilemedi. Tekrar deneyin.\",\n  draftSave:\"Taslak olarak kaydet\", draftSaving:\"Kaydediliyor\u2026\",\n  draftSaved:\"Taslak {when} itibar\u0131yla kaydedildi \u2014 istedi\u011finiz zaman geri d\u00f6nebilirsiniz.\",\n  draftFailed:\"Kaydedilemedi. Ba\u011flant\u0131n\u0131z\u0131 kontrol edip tekrar deneyin.\",\n  draftEmpty:\"\u00d6nce miktar girin.\",\n  draftResumed:\"Tasla\u011f\u0131n\u0131z geri geldi \u2014 kald\u0131\u011f\u0131n\u0131z yerden devam edin.\",\n  draftFound:\"Tamamlanmam\u0131\u015f bir sipari\u015finiz var\",\n  draftFoundSub:\"{when} kaydedildi \u00b7 {lines} kalem \u00b7 {cartons} koli\",\n  draftResume:\"Devam et\", draftDiscard:\"Yeniden ba\u015fla\",\n  company:\"Firma\", contact:\"Yetkili ad\u0131\", email:\"E-posta\",\n  country:\"\u00dclke \/ var\u0131\u015f liman\u0131\", fNotes:\"Claimont i\u00e7in notlar\",\n  howto:`Bilgilerinizi doldurun, ard\u0131ndan g\u00f6zden ge\u00e7irip onaylay\u0131n. Sipari\u015f do\u011frudan <strong>${ORDER_EMAIL}<\/strong> adresine e-posta ile iletilir \u2014 sizin ayr\u0131ca bir \u015fey g\u00f6ndermenize gerek yoktur. Size d\u00f6nebilmemiz i\u00e7in <strong>e-posta ve telefon zorunludur<\/strong>.`,\n  pdf:\"PDF indir\", csv:\"Excel indir\", xlsAll:\"Excel\", mailBtn:\"E-posta ile a\u00e7\",\n  needCompany:\"L\u00fctfen firma ad\u0131n\u0131z\u0131 girin.\",\n  catTitle:\"\u00dcr\u00fcn katalo\u011fu\", catOpen:\"Yeni sekmede a\u00e7\",\n  catMissing:\"Katalog hen\u00fcz ba\u011flanmad\u0131. Claimont'tan bir kopya isteyin.\",\n  phAll:\"CLAIMONT \u2014 \u00dcr\u00fcn listesi 2026\", phSel:\"CLAIMONT \u2014 Sipari\u015f talebi\",\n  noteshd:\"Notlar\",\n  notes:[\n    \"T\u00fcm fiyatlar <strong>fabrika teslim (ex-works)<\/strong> olup vergiler, FOB ve navlun masraflar\u0131 hari\u00e7tir.\",\n    \"EUR, ba\u015fl\u0131kta g\u00f6sterilen Avrupa Merkez Bankas\u0131 referans kuru ile USD \u00fczerinden hesaplan\u0131r.\",\n    \"Miktarlar\u0131 <strong>koli<\/strong> olarak girin. Adet, palet, hacim, a\u011f\u0131rl\u0131k ve toplamlar siz yazd\u0131k\u00e7a hesaplan\u0131r.\",\n    \"Tablonun alt\u0131ndan <strong>Zemine y\u00fckleme<\/strong> veya <strong>Paletli<\/strong> se\u00e7in. Zemine y\u00fcklemede konteyner hacimle \u00f6l\u00e7\u00fcl\u00fcr (20' DV 29 m\u00b3 \u00b7 40' HC 76,3 m\u00b3 \u00b7 45' HC 85,6 m\u00b3 \u00b7 Tautliner t\u0131r 90 m\u00b3). Paletli se\u00e7ildi\u011finde her \u00fcr\u00fcn i\u00e7in tam palet say\u0131s\u0131 hesaplan\u0131r, bo\u015f palet a\u011f\u0131rl\u0131klar\u0131 eklenir ve konteyner palet yeri \u00fczerinden \u00f6l\u00e7\u00fcl\u00fcr.\",\n    \"Fiyatlar proforma fatura ile teyit edilene kadar bilgi ama\u00e7l\u0131d\u0131r. Asgari sipari\u015f miktarlar\u0131 uygulanabilir.\"\n  ],\n  genOn:\"olu\u015fturulma\"\n }\n};\n\nconst CONTAINERS = [\n  {key:\"20dv\", name:\"20' DV\", cbm:29,   slots:{std:10, euro:11}, payload:28200, inner:\"5.90 \u00d7 2.35 \u00d7 2.39 m\"},\n  {key:\"40hc\", name:\"40' HC\", cbm:76.3, slots:{std:21, euro:24}, payload:28600, inner:\"12.03 \u00d7 2.35 \u00d7 2.69 m\"},\n  {key:\"45hc\", name:\"45' HC\", cbm:85.6, slots:{std:24, euro:27}, payload:27600, inner:\"13.56 \u00d7 2.35 \u00d7 2.69 m\"},\n  {key:\"taut\", name:\"Tautliner 13.6 m\", cbm:90, slots:{std:26, euro:33}, payload:24500, inner:\"13.60 \\u00d7 2.50 \\u00d7 2.65 m\"}\n];\nlet contType=\"40hc\", contCount=1;\nfunction container(){ return CONTAINERS.find(c=>c.key===contType) || CONTAINERS[1]; }\n\/* floor loading keeps a ~10% packing allowance in reserve: real-world loading\n   never quite reaches the paper volume, and a container that \"just fits\" on\n   screen but not at the ramp makes nobody happy *\/\nconst FLOOR_ALLOWANCE = 0.9;\nfunction capacityPer(){ const c=container(); return palletised ? c.slots[palletType] : c.cbm*FLOOR_ALLOWANCE; }\nfunction fitReport(t){\n  const c=container(), per=capacityPer(), used=palletised?t.pallets:t.cbm;\n  const cap=per*Math.max(1,contCount);\n  const need=used>0?Math.ceil(used\/per):0;\n  const pct=cap?used\/cap*100:0;\n  const overWeight=t.gross>c.payload*Math.max(1,contCount);\n  let state=\"idle\";\n  if(used<=0) state=\"idle\";\n  else if(pct>100) state=\"over\";\n  else if(pct>=90) state=\"full\";\n  else if(pct>=70) state=\"near\";\n  else state=\"light\";\n  return {c, per, cap, used, need, pct, state, overWeight};\n}\nconst PALLET_TYPES = { std:\"100 \u00d7 120 cm\", euro:\"80 \u00d7 120 cm (Euro)\" };\nlet palletised=false, palletType=\"std\", palletKg=25;\nconst COLS = [\n  {k:\"idx\",g:null,cls:\"c-idx\"},{k:\"ref\",g:null,cls:\"c-ref\"},{k:\"photo\",g:null,cls:\"c-photo\"},{k:\"name\",g:null,cls:\"c-name\"},\n  {k:\"g\",g:null,n:1},{k:\"upc\",g:null,n:1},\n  {k:\"pu\",g:null,n:1},{k:\"pue\",g:null,n:1},\n  {k:\"pc\",g:null,n:1},{k:\"pce\",g:null,n:1},\n  {k:\"qty\",g:null,cls:\"c-qty\",n:1},\n  {k:\"tusd\",g:\"g-calc\",n:1},{k:\"teur\",g:\"g-calc\",n:1},{k:\"units\",g:\"g-calc\",n:1},\n  {k:\"pallets\",g:\"g-calc\",n:1},{k:\"tcbm\",g:\"g-calc\",n:1},{k:\"tnet\",g:\"g-calc\",n:1},{k:\"tgross\",g:\"g-calc\",n:1},\n  {k:\"cpp\",g:\"g-pack\",n:1},{k:\"l\",g:\"g-pack\",n:1},{k:\"w\",g:\"g-pack\",n:1},{k:\"h\",g:\"g-pack\",n:1},{k:\"cbm\",g:\"g-pack\",n:1},\n  {k:\"net\",g:\"g-wt\",n:1},{k:\"gross\",g:\"g-wt\",n:1},\n  {k:\"shelf\",g:\"g-comp\"},{k:\"temp\",g:\"g-comp\"},{k:\"hs\",g:\"g-comp\"},{k:\"bc\",g:\"g-comp\"}\n];\n\nlet lang=\"en\", rate=0.87, rateSource=\"fallback\", rateDate=\"\", account=\"\", accountName=\"\", accountRep=\"\", repc=null, discount=0, moqSku=0, unlockCode=\"\", boot=null;\nconst qty={}; let filter=\"all\", query=\"\";\nconst $=s=>document.querySelector(s);\nconst BACKEND_MIN = 17;\n\/* Which product list this build was made for. Published changes carry the same\n   tag; anything tagged for a different list is ignored rather than applied to\n   products that now mean something else. *\/\nconst DATASET = 4;\nfunction checkVersion(v){\n  const el=$(\"#oldver\");\n  el.hidden = Number(v) >= BACKEND_MIN;\n  if(!el.hidden) el.innerHTML = `<b>${T[lang].oldTitle}<\/b>${T[lang].oldText}`;\n}\nconst fmt=(v,d=0)=>v==null||isNaN(v)?\"\u2014\":new Intl.NumberFormat(lang===\"tr\"?\"tr-TR\":\"en-US\",{minimumFractionDigits:d,maximumFractionDigits:d}).format(v);\nconst esc=s=>String(s==null?\"\":s).replace(\/[&<>\"]\/g,c=>({\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\"}[c]));\n\n\/* ---------- access gate ---------- *\/\nfunction endpointReady(){ return ENDPOINT_URL && ENDPOINT_URL.indexOf(\"__\")!==0 && \/^https?:\/.test(ENDPOINT_URL); }\nfunction api(payload){\n  if(!endpointReady()) return Promise.reject(new Error(\"no_endpoint\"));\n  return fetch(ENDPOINT_URL,{\n    method:\"POST\",\n    headers:{\"Content-Type\":\"text\/plain;charset=utf-8\"},\n    body:JSON.stringify(payload)\n  }).then(r=>r.json());\n}\nlet unlocking=false;\nasync function submitCode(){\n  const v=$(\"#g-code\").value.trim().toUpperCase();\n  const err=$(\"#g-err\"), btn=$(\"#g-go\"), t=T[lang];\n  if(!v){ err.textContent=t.gEmpty; return; }\n  if(unlocking) return;\n  unlocking=true; btn.disabled=true; btn.textContent=t.gChecking; err.textContent=\"\";\n  try{\n    \/* one round trip brings everything: account, settings, catalogue, orders,\n       messages and any saved draft \u2014 the page is ready the moment it opens *\/\n    let r=await api({action:\"boot\", code:v, ua:navigator.userAgent.slice(0,120)});\n    if(r && !r.ok && r.error===\"unknown_action\")\n      r=await api({action:\"unlock\", code:v, ua:navigator.userAgent.slice(0,120)});\n    const u=(r&&r.unlock)?r.unlock:r;\n    if(!u||!u.ok){ err.textContent=t.gBad; return; }\n    boot=(r&&r.unlock)?r:null;\n    if(boot&&boot.settings) settings=boot.settings;\n    account=u.ref; accountName=u.name||\"\"; accountRep=u.rep||\"\";\n    repc=(u.repc&&u.repc.name)?u.repc:null;  \/* rep is always a Claimont user, sent by the service *\/\n    moqSku=Math.max(0,Number(u.moq)||0);\n    prefill=u.prefill||{};\n    discount=Math.max(0,Math.min(90,Number(u.discount)||0));\n    checkVersion(u.version);\n    unlockCode=v;\n    try{ sessionStorage.setItem(\"claimont-acct\",JSON.stringify({code:v})); }catch(e){}\n    openWelcome();\n  }catch(e){\n    err.textContent = e && e.message===\"no_endpoint\" ? t.gUnset : t.gOffline;\n  }finally{\n    unlocking=false; btn.disabled=false; btn.textContent=t.gGo;\n  }\n}\n\/* The welcome page sits between the code and the price list: it says what the\n   portal is, hands over the documents, and offers the Excel-by-email route. *\/\nlet prefill={};\n\/* the customer's first name, for a personal word wherever it fits *\/\nfunction custFirst(){ return (prefill.contact||\"\").trim().split(\/\\s+\/)[0]||\"\"; }\nfunction openWelcome(){\n  $(\"#gate\").hidden=true; $(\"#gate\").style.display=\"none\";\n  $(\"#app\").hidden=true;\n  $(\"#welcome\").hidden=false;\n  renderWelcome();\n  if(!boot) loadSettings();   \/\/ with boot the addresses arrived with sign-in\n  window.scrollTo(0,0);\n}\nfunction initials(n){ return String(n||\"\").trim().split(\/\\s+\/).slice(0,2).map(w=>w[0]||\"\").join(\"\").toUpperCase(); }\nfunction renderRepCard(){\n  const t=T[lang], el=$(\"#repcard\");\n  if(!repc||!repc.name){ el.hidden=true; return; }\n  el.hidden=false;\n  $(\"#rep-av\").textContent=initials(repc.name);\n  $(\"#rep-name\").textContent=repc.name;\n  $(\"#rep-role\").textContent=t.repRole;\n  const tel=$(\"#rep-tel\"), ml=$(\"#rep-mail\");\n  tel.hidden=!repc.phone; if(repc.phone){ tel.textContent=repc.phone; tel.href=\"tel:\"+repc.phone.replace(\/[^+\\d]\/g,\"\"); }\n  ml.hidden=!repc.email; if(repc.email){ ml.textContent=repc.email; ml.href=\"mailto:\"+repc.email; }\n  el.title=t.repHint;\n}\nfunction renderWelcome(){\n  const t=T[lang];\n  $(\"#w-sub\").textContent=t.sub;\n  $(\"#w-signout\").textContent=t.signOut;\n  $(\"#w-title\").innerHTML='<span class=\"w-wave\">\\ud83d\\udc4b<\/span> '+t.wTitle.replace(\"{name}\", `<em>${esc(custFirst()||accountName||account)}<\/em>`);\n  $(\"#w-lead\").innerHTML=t.wLeadPersonal.replace(\"{company}\", `<b>${esc(accountName||account)}<\/b>`)+\" \"+esc(t.wLead);\n  const wd=$(\"#w-disc\");\n  if(discount){\n    wd.hidden=false;\n    wd.innerHTML=`<span class=\"pct\">\\u2605<\/span>`+\n      `<span class=\"tx\">${t.wLeadDisc}<\/span>`;\n  } else wd.hidden=true;\n  const ICONS={\n    list:'<svg viewBox=\"0 0 24 24\"><path d=\"M8 6h13M8 12h13M8 18h13\"\/><circle cx=\"3.5\" cy=\"6\" r=\"1.3\"\/><circle cx=\"3.5\" cy=\"12\" r=\"1.3\"\/><circle cx=\"3.5\" cy=\"18\" r=\"1.3\"\/><\/svg>',\n    box:'<svg viewBox=\"0 0 24 24\"><path d=\"M21 8l-9-5-9 5v8l9 5 9-5V8z\"\/><path d=\"M3.5 8.2L12 13l8.5-4.8M12 13v9\"\/><\/svg>',\n    chat:'<svg viewBox=\"0 0 24 24\"><path d=\"M21 12a8 8 0 0 1-8 8H4l2-3a8 8 0 1 1 15-5z\"\/><\/svg>'};\n  $(\"#w-points\").innerHTML=[\n    ['list', t.wP1t, t.wP1],\n    ['box',  t.wP2t, t.wP2],\n    ['chat', t.wP3t, t.wP3]\n  ].map(([ic,b,txt])=>`<div class=\"w-point\"><span class=\"ico\">${ICONS[ic]}<\/span><div><b>${b}<\/b><span>${txt}<\/span><\/div><\/div>`).join(\"\");\n  $(\"#w-enter\").textContent=t.wEnter;\n  $(\"#w-screen\").textContent=t.wScreen;\n  \/* the page signs off as a note from their own Claimont person *\/\n  const ws=$(\"#w-sign\");\n  if(repc&&repc.name){\n    ws.hidden=false;\n    ws.innerHTML=`<p class=\"w-sign-line\">${t.wSignLine}<\/p>\n      <div class=\"w-sign-card\">\n        <span class=\"ravatar\">${esc(initials(repc.name))}<\/span>\n        <span class=\"w-sign-who\"><b>${esc(repc.name)}<\/b><span>${t.repRole}<\/span>\n          <span class=\"w-sign-links\">\n            ${repc.phone?`<a href=\"tel:${esc(repc.phone.replace(\/[^+\\d]\/g,\"\"))}\">${esc(repc.phone)}<\/a>`:\"\"}\n            ${repc.email?`<a href=\"mailto:${esc(repc.email)}\">${esc(repc.email)}<\/a>`:\"\"}\n          <\/span><\/span>\n      <\/div>`;\n  } else ws.hidden=true;\n  $(\"#w-dochd\").textContent=t.wDocs;\n  $(\"#w-alt\").innerHTML=\n    `<div class=\"althd\"><svg viewBox=\"0 0 24 24\"><path d=\"M3 6h18v12H3z\"\/><path d=\"M3 7l9 6 9-6\"\/><\/svg>${t.wAltT}<\/div>`+\n    `<ol><li><span class=\"n\">1<\/span><span>${t.wAlt1}<\/span><\/li>`+\n    `<li><span class=\"n\">2<\/span><span>${t.wAlt2}<\/span><\/li>`+\n    `<li><span class=\"n\">3<\/span><span>${t.wAlt3.replace(\"{email}\", `<a class=\"mail\" href=\"mailto:export@claimont.com\">export@claimont.com<\/a>`)}<\/span><\/li><\/ol>`+\n    `<p class=\"fine\">${t.wAltEnd}<\/p>`;\n  renderDocCards();\n}\nconst DOC_FALLBACK={ catalogue:\"https:\/\/claimont.com\/wp-content\/uploads\/2026\/08\/Claimont-Product-Catalogue-EN_compressed.pdf\", pricePdf:\"https:\/\/claimont.com\/wp-content\/uploads\/2026\/08\/claimont-price-list-2026.pdf\", priceXlsx:\"https:\/\/claimont.com\/wp-content\/uploads\/2026\/08\/claimont-price-list-2026.xlsx\" };\nfunction docHref(pre){\n  const f=DOC_FALLBACK[pre]||\"\";\n  return settings[pre+\"Url\"] || (f.indexOf(\"__\")===0?\"\":f);\n}\nfunction renderDocCards(){\n  const t=T[lang];\n  const card=(pre,cls,label,title,desc)=>{\n    const url=docHref(pre), up=settings[pre+\"Updated\"];\n    return `<a class=\"doccard ${url?\"\":\"off\"}\" href=\"${esc(url||\"#\")}\" target=\"_blank\" rel=\"noopener\">\n      <span class=\"ic ${cls}\">${label}<\/span>\n      <span><b>${title}<\/b><p>${desc}<\/p>\n      ${up?`<span class=\"meta\">${t.wUpdated.replace(\"{when}\", esc(String(up).slice(0,10)))}<\/span>`:\"\"}<\/span><\/a>`;\n  };\n  $(\"#doccards\").innerHTML =\n    card(\"catalogue\",\"pdf\",\"PDF\", t.wDocCatT, t.wDocCat) +\n    card(\"pricePdf\",\"pdf\",\"PDF\", t.wDocPdfT, t.wDocPdf) +\n    card(\"priceXlsx\",\"xls\",\"XLS\", t.wDocXlsT, t.wDocXls);\n}\n\/* \u2500\u2500 the mobile wizard: Shipment \u2192 Products \u2192 Finish \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\nlet mstep=1;\nconst isPhone=()=>window.matchMedia(\"(max-width:860px)\").matches;\nfunction setMStep(n,noScroll){\n  mstep=Math.max(1,Math.min(3,n));\n  document.body.classList.remove(\"mstep-1\",\"mstep-2\",\"mstep-3\");\n  document.body.classList.add(\"mstep-\"+mstep);\n  const t=T[lang];\n  $(\"#mw-lbl\").textContent=`${mstep}\/3 \u00b7 ${t.mwSteps[mstep-1]}`;\n  [...document.querySelectorAll(\".mwdots span\")].forEach((d,i)=>d.classList.toggle(\"on\",i<mstep));\n  $(\"#mw-back\").disabled = mstep===1;\n  $(\"#mw-next\").innerHTML = mstep===3 ? t.mwReview : t.mwNext;\n  if(!noScroll) window.scrollTo(0,0);\n  renderStats();\n}\nlet wizOn=null;\nfunction applyWizard(){\n  const on = isPhone() && !$(\"#app\").hidden;\n  if(on===wizOn) return;               \/* phones fire resize when the URL bar\n                                          collapses mid-scroll \u2014 never re-step\n                                          (or scroll to top) for that *\/\n  wizOn=on;\n  document.body.classList.toggle(\"mwiz\",on);\n  $(\"#mwnav\").hidden=!on;\n  if(!on) $(\"#fitbar\").hidden=true;\n  if(on) setMStep(mstep,true);\n}\n$(\"#mw-back\").addEventListener(\"click\",()=>setMStep(mstep-1));\n$(\"#mw-next\").addEventListener(\"click\",()=>{\n  if(mstep<3){ setMStep(mstep+1); return; }\n  if(moqOver()){\n    flashSaved(T[lang].moqBlock.replace(\"{max}\", fmt(moqCap())).replace(\"{have}\", fmt(orderRows().length)), true);\n    $(\"#submitbar\").scrollIntoView({behavior:\"smooth\",block:\"center\"});\n    return;\n  }\n  openOrder();\n});\nwindow.addEventListener(\"resize\",()=>{ clearTimeout(window.__mwR); window.__mwR=setTimeout(applyWizard,150); });\nfunction openApp(){\n  $(\"#gate\").hidden=true; $(\"#gate\").style.display=\"none\";\n  $(\"#welcome\").hidden=true;\n  if(boot){\n    \/* everything arrived with sign-in \u2014 paint it, no further waiting *\/\n    myOrders=boot.orders||[];\n    msgs=boot.messages||[]; msgUnread=(boot.unlock&&boot.unlock.unread)||0;\n    pendingDraft=boot.draft||null;\n    try{ applySharedData(boot.data); }catch(e){ loadSharedPage(); }\n    renderMessages(); renderDraftbar();\n    renderCatLink();\n    if(settings.cataloguePagesUrl && !catPages.length) loadCatalogue(settings.cataloguePagesUrl);\n  }else{\n    checkDraft();\n    loadMessages(false);\n    loadSettings();\n    loadShared();\n    loadMyOrders();\n  }\n  loadCatalogue();\n  renderCatLink();\n  clearInterval(window.__msgTimer);\n  window.__msgTimer=setInterval(()=>loadMessages(false),60000);\n  $(\"#app\").hidden=false;\n  if(window.innerWidth<=860) $(\"#tablewrap\").classList.add(\"hide-pack\",\"hide-wt\",\"hide-comp\");\n  applyLang();\n  loadImages();\n  loadRate();\n  mstep=1; wizOn=null; applyWizard();\n}\n\n\/* ---------- past orders ---------- *\/\nlet myOrders=[];\nfunction loadMyOrders(){\n  return api({action:\"myOrders\", code:unlockCode})\n    .then(r=>{ if(r&&r.ok){ myOrders=r.orders||[]; renderRail(); } })\n    .catch(()=>{});\n}\nfunction renderRail(){\n  const t=T[lang];\n  $(\"#rail-title\").innerHTML = `${t.yourOrders} <span class=\"railcount\">${myOrders.length}<\/span>`;\n  $(\"#btn-history\").innerHTML = `${t.yourOrders} <span class=\"n\">${myOrders.length}<\/span>`;\n  if(!myOrders.length){ $(\"#rail-body\").innerHTML=`<div class=\"railempty\">${t.noOrders}<\/div>`; return; }\n  $(\"#rail-body\").innerHTML = myOrders.map(o=>`\n    <button class=\"ordercard\" data-oid=\"${esc(o.orderId)}\">\n      <span class=\"oid2\">${esc(o.orderId)}<\/span>\n      <span class=\"when\">${esc(o.when)}<\/span>\n      <span class=\"amt\">$${fmt(o.totalUSD,2)}<\/span>\n      <span class=\"qty2\">${fmt(o.lines)} ${t.linesWord} \u00b7 ${fmt(o.cartons)} ${t.cartonsWord}<\/span>\n    <\/button>`).join(\"\");\n}\nasync function showPastOrder(id){\n  const t=T[lang];\n  $(\"#past-title\").textContent=id;\n  $(\"#past-body\").innerHTML=`<div class=\"railempty\">${t.loadingOrder}<\/div>`;\n  $(\"#pastsheet\").classList.add(\"on\"); document.body.style.overflow=\"hidden\";\n  try{\n    const r=await api({action:\"orderDetail\", code:unlockCode, orderId:id});\n    if(!r||!r.ok) throw 0;\n    const o=r.order;\n    const line=(k,v)=>v?`<dt>${k}<\/dt><dd>${esc(v)}<\/dd>`:\"\";\n    const img=it=>{ const d=(it.ref!=null&&DATA.find(x=>String(x.ref)===String(it.ref)))||byId(it.id);\n      return d&&d.img?`<img decoding=\"async\" src=\"${d.img}\" alt=\"\">`:\"\"; };\n    const saved=(Number(o.listUSD)||0)-(Number(o.totalUSD)||0);\n    $(\"#past-body\").innerHTML=`\n      <div class=\"c-grid\">\n        <div class=\"c-card\"><h4>${t.confirmContact}<\/h4><dl class=\"clist\">\n          ${line(t.oWhen,o.when)}${line(t.company,o.company)}${line(t.contact,o.contact)}\n          ${line(t.email,o.email)}${line(t.phone,o.phone)}${line(t.country,o.country)}\n          ${line(t.loading,o.loading)}\n        <\/dl><\/div>\n        <div class=\"c-card c-tot\"><h4>${t.confirmTotals}<\/h4><dl class=\"clist\">\n          <dt>${t.stats.lines}<\/dt><dd>${fmt(o.lines||(o.items||[]).length)}<\/dd>\n          <dt>${t.stats.cartons}<\/dt><dd>${fmt(o.cartons)}<\/dd>\n          <dt>${t.stats.cbm}<\/dt><dd>${fmt(o.cbm,2)} m\u00b3<\/dd>\n          <dt>${t.stats.gross}<\/dt><dd>${fmt(o.grossKg,1)} kg<\/dd>\n          <dt>${t.stats.usd}<\/dt><dd class=\"total\">${o.discount?`<span class=\"was\">$${fmt(o.listUSD,2)}<\/span> `:\"\"}$${fmt(o.totalUSD,2)}<\/dd>\n\n        <\/dl><\/div>\n      <\/div>\n      <h4 class=\"c-items-h\">${t.confirmItems.replace(\"{n}\", fmt((o.items||[]).length))}<\/h4>\n      <div class=\"c-itemswrap\"><table class=\"c-items\">\n        <thead><tr><th><\/th><th>${t.cols.ref}<\/th><th>${t.cols.name}<\/th><th class=\"n\">${t.cols.g}<\/th>\n          <th class=\"n\">${t.cols.qty}<\/th><th class=\"n\">${t.cols.units}<\/th>\n          <th class=\"n\">${t.cols.pc}<\/th><th class=\"n\">${t.cols.tusd}<\/th><\/tr><\/thead>\n        <tbody>${(o.items||[]).map(it=>`<tr>\n          <td class=\"ph\">${img(it)}<\/td>\n          <td class=\"rf\">${esc(it.ref||\"\")}<\/td>\n          <td>${esc(it.name)}<\/td>\n          <td class=\"n\">${fmt(it.g)} g<\/td><td class=\"n\">${fmt(it.cartons)}<\/td>\n          <td class=\"n\">${fmt(it.units)}<\/td>\n          <td class=\"n\">${it.cartonUSD!=null?\"$\"+fmt(it.cartonUSD,2):\"\"}<\/td>\n          <td class=\"n\"><b>$${fmt(it.total,2)}<\/b><\/td><\/tr>`).join(\"\")}<\/tbody>\n        <tfoot><tr><td colspan=\"4\"><\/td><td class=\"n\">${fmt(o.cartons)}<\/td><td><\/td><td><\/td>\n          <td class=\"n\">$${fmt(o.totalUSD,2)}<\/td><\/tr><\/tfoot>\n      <\/table><\/div>\n      ${o.notes?`<p style=\"margin-top:12px\"><strong>${t.fNotes}:<\/strong> ${esc(o.notes)}<\/p>`:\"\"}\n      <div style=\"margin-top:14px;display:flex;gap:10px;flex-wrap:wrap\">\n        <button class=\"btn btn-primary\" id=\"past-pdf\">${t.pdfBtn}<\/button>\n      <\/div>`;\n    $(\"#past-pdf\").addEventListener(\"click\",e=>orderPdfDownload(id,e.target));\n  }catch(e){ $(\"#past-body\").innerHTML=`<div class=\"railempty\">${T[lang].orderFailed}<\/div>`; }\n}\n\/* the same PDF that rides on the order email, fetched on demand *\/\nasync function orderPdfDownload(id,btn){\n  const t=T[lang], was=btn.textContent;\n  btn.disabled=true; btn.textContent=t.pdfWait;\n  try{\n    const r=await api({action:\"orderPdf\", code:unlockCode, orderId:id});\n    if(!r||!r.ok||!r.b64) throw 0;\n    const a=document.createElement(\"a\");\n    a.href=\"data:application\/pdf;base64,\"+r.b64;\n    a.download=r.name||(\"Claimont order \"+id+\".pdf\");\n    document.body.appendChild(a); a.click(); a.remove();\n    btn.textContent=was;\n  }catch(e){ btn.textContent=t.pdfFailed; setTimeout(()=>{btn.textContent=was;},4000); }\n  finally{ btn.disabled=false; }\n}\n\n\/* ---------- rendering ---------- *\/\nfunction families(){\n  const seen=[];\n  DATA.forEach(d=>{ if(!seen.some(x=>x.k===d.fam)) seen.push({k:d.fam,label:lang===\"tr\"?d.famTr:d.fam,n:0}); });\n  seen.forEach(s=>s.n=DATA.filter(d=>d.fam===s.k).length);\n  return seen;\n}\nfunction visible(){\n  const q=query.trim().toLowerCase();\n  const rows=DATA.filter(d=>{\n    if(filter!==\"all\"&&d.fam!==filter) return false;\n    if(!q) return true;\n    return [d.id,d.ref,d.brand,d.brandTr,d.name,d.nameTr,d.hs,d.bc,d.g].join(\" \").toLowerCase().includes(q);\n  });\n  \/* what's already in the basket floats to the top \u2014 resorted only once\n     typing in a quantity box has finished, so rows never jump mid-entry *\/\n  return rows.map((d,i)=>[d,i]).sort((a,b)=>((qty[b[0].id]>0)-(qty[a[0].id]>0))||(a[1]-b[1])).map(x=>x[0]);\n}\nfunction cell(d,k){\n  const c=qty[d.id]||0;\n  switch(k){\n    case \"idx\": return `<span class=\"idx\">${String(d.id).padStart(2,\"0\")}<\/span>`;\n    case \"ref\": return `<span class=\"refcode\">${esc(d.ref||\"\u2014\")}<\/span>`;\n    case \"photo\": return d.img ? `<img decoding=\"async\" class=\"thumb\" src=\"${d.img}\" alt=\"\" loading=\"lazy\">` : `<span class=\"thumb nophoto\"><\/span>`;\n    case \"name\": return `<div class=\"pname\"><span class=\"b\">${esc(lang===\"tr\"?d.brandTr:d.brand)}<\/span><span class=\"f\">${esc(lang===\"tr\"?d.nameTr:d.name)}<\/span><\/div>`;\n    case \"g\": return fmt(d.g)+\" g\";\n    case \"upc\": return fmt(d.upc);\n    case \"qty\": return `<span class=\"qtywrap\"><button type=\"button\" class=\"qstep qminus\" data-id=\"${d.id}\" aria-label=\"Less\" tabindex=\"-1\">&#8722;<\/button><input class=\"qty\" type=\"number\" min=\"0\" step=\"1\" inputmode=\"numeric\" value=\"${c||\"\"}\" data-id=\"${d.id}\" placeholder=\"0\" aria-label=\"Cartons\"><button type=\"button\" class=\"qstep qplus\" data-id=\"${d.id}\" aria-label=\"More\" tabindex=\"-1\">+<\/button><\/span>`;\n    case \"pu\": return discount\n      ? `<span class=\"was\">$${fmt(d.pu,3)}<\/span> <span class=\"now\">$${fmt(net(d.pu),3)}<\/span>`\n      : \"$\"+fmt(d.pu,3);\n    case \"pue\": return discount\n      ? `<span class=\"was\">\u20ac${fmt(d.pu*rate,3)}<\/span> <span class=\"now\">\u20ac${fmt(net(d.pu)*rate,3)}<\/span>`\n      : \"\u20ac\"+fmt(d.pu*rate,3);\n    case \"pc\": return discount\n      ? `<span class=\"was\">$${fmt(d.pc,2)}<\/span> <span class=\"now\">$${fmt(net(d.pc),2)}<\/span>`\n      : \"$\"+fmt(d.pc,2);\n    case \"pce\": return discount\n      ? `<span class=\"was\">\u20ac${fmt(d.pc*rate,2)}<\/span> <span class=\"now\">\u20ac${fmt(net(d.pc)*rate,2)}<\/span>`\n      : \"\u20ac\"+fmt(d.pc*rate,2);\n    case \"tusd\": return c?`<span class=\"calc\">$${fmt(c*net(d.pc),2)}<\/span>`:`<span class=\"muted\">\u2014<\/span>`;\n    case \"teur\": return c?`<span class=\"calc\">\u20ac${fmt(c*net(d.pc)*rate,2)}<\/span>`:`<span class=\"muted\">\u2014<\/span>`;\n    case \"units\": return c?`<span class=\"calc\">${fmt(c*d.upc)}<\/span>`:`<span class=\"muted\">\u2014<\/span>`;\n    case \"pallets\": return c? `<span class=\"calc\">${fmt(linePallets(d,c), palletised?0:2)}<\/span>` : `<span class=\"muted\">\u2014<\/span>`;\n    case \"tcbm\": return c?`<span class=\"calc\">${fmt(c*d.cbm,3)}<\/span>`:`<span class=\"muted\">\u2014<\/span>`;\n    case \"tnet\": return c?`<span class=\"calc\">${fmt(c*d.net,1)}<\/span>`:`<span class=\"muted\">\u2014<\/span>`;\n    case \"tgross\": return c? `<span class=\"calc\">${fmt(c*d.gross + (palletised?Math.ceil(c\/d.cpp)*palletKg:0),1)}<\/span>` : `<span class=\"muted\">\u2014<\/span>`;\n    case \"cpp\": return fmt(d.cpp);\n    case \"l\": return fmt(d.l,1); case \"w\": return fmt(d.w,1); case \"h\": return fmt(d.h,1);\n    case \"cbm\": return fmt(d.cbm,4);\n    case \"net\": return fmt(d.net,3); case \"gross\": return fmt(d.gross,3);\n    case \"shelf\": return esc(d.shelf)||\"\u2014\";\n    case \"temp\": return d.temp?`<span class=\"mono\">${esc(d.temp).replace(\" to \",\"\u2013\").replace(\/\\s*C$\/,\"\u00b0C\")}<\/span>`:\"\u2014\";\n    case \"hs\": return d.hs?`<span class=\"mono\">${esc(d.hs)}<\/span>`:\"\u2014\";\n    case \"bc\": return d.bc?`<span class=\"mono\">${esc(d.bc)}<\/span>`:`<span class=\"muted\">\u2014<\/span>`;\n  }\n  return \"\";\n}\nconst net = v => v*(1-discount\/100);\n\/* ---------- a Cartons column you can drag wider -----------------------------\n   The number people type is the one thing they must be able to read back, and\n   how much room that needs depends on their quantities, so it is theirs to set. *\/\nconst QTY_MIN=84, QTY_MAX=320, QTYW_KEY=\"claimont-qtyw\";\nfunction setQtyWidth(px,save){\n  const w=Math.max(QTY_MIN,Math.min(QTY_MAX,Math.round(px)));\n  document.documentElement.style.setProperty(\"--qtyw\",w+\"px\");\n  const v=document.getElementById(\"qty-val\"); if(v) v.textContent=w;\n  if(save){ try{ localStorage.setItem(QTYW_KEY,w); }catch(e){} }\n  return w;\n}\nfunction qtyWidthNow(){\n  return parseFloat(getComputedStyle(document.documentElement).getPropertyValue(\"--qtyw\"))||104;\n}\n\/* Keep the bar clear of whatever sticky chrome is above it, measured rather\n   than guessed, so it stays reachable at any zoom or window width. *\/\nfunction syncStickyTop(){\n  const mast=document.querySelector(\".mast\"), ctl=document.querySelector(\".controls\");\n  const h=(mast?mast.offsetHeight:0)+(ctl?ctl.offsetHeight:0);\n  document.documentElement.style.setProperty(\"--stickytop\", h+\"px\");\n}\nwindow.addEventListener(\"resize\",syncStickyTop);\n\/* Grow the column to fit the longest number entered, so a six-figure quantity is\n   never half-hidden. It only ever raises the floor \u2014 a wider manual setting wins. *\/\nfunction fitQtyWidth(){\n  let longest=0;\n  for (const id in qty){ const n=String(qty[id]||\"\"); if(n.length>longest) longest=n.length; }\n  const px = longest ? Math.min(QTY_MAX, 46 + longest*11) : 0;\n  document.documentElement.style.setProperty(\"--qtyfit\", px+\"px\");\n}\n(function(){ try{ const v=+localStorage.getItem(QTYW_KEY); if(v) setQtyWidth(v,false); }catch(e){} })();\n\nfunction attachQtyStepper(){\n  const box=document.getElementById(\"qtyctl\");\n  if(!box || box.dataset.on) return;\n  box.dataset.on=\"1\";\n  document.getElementById(\"qty-narrow\").addEventListener(\"click\",()=>setQtyWidth(qtyWidthNow()-16,true));\n  document.getElementById(\"qty-wide\").addEventListener(\"click\",()=>setQtyWidth(qtyWidthNow()+16,true));\n  document.getElementById(\"qty-val\").textContent=qtyWidthNow();\n}\nfunction attachColGrip(){\n  const th=document.querySelector(\"th.c-qty\");\n  if(!th || th.querySelector(\".colgrip\")) return;\n  const grip=document.createElement(\"span\");\n  grip.className=\"colgrip\"; grip.title=T[lang].qtyResize;\n  grip.setAttribute(\"role\",\"separator\"); grip.setAttribute(\"aria-orientation\",\"vertical\");\n  grip.tabIndex=0;\n  th.appendChild(grip);\n\n  let startX=0, startW=0;\n  const current=qtyWidthNow;\n  const move=e=>{\n    const x=(e.touches?e.touches[0].clientX:e.clientX);\n    setQtyWidth(startW+(x-startX),false);\n  };\n  const stop=()=>{\n    document.removeEventListener(\"pointermove\",move);\n    document.removeEventListener(\"pointerup\",stop);\n    document.body.classList.remove(\"colsizing\"); grip.classList.remove(\"on\");\n    setQtyWidth(current(),true);\n    requestAnimationFrame(syncScrollbars);\n  };\n  grip.addEventListener(\"pointerdown\",e=>{\n    e.preventDefault(); e.stopPropagation();\n    startX=e.clientX; startW=current();\n    grip.classList.add(\"on\"); document.body.classList.add(\"colsizing\");\n    document.addEventListener(\"pointermove\",move);\n    document.addEventListener(\"pointerup\",stop);\n  });\n  \/* keyboard, because a drag handle nobody can tab to is not a control *\/\n  grip.addEventListener(\"keydown\",e=>{\n    const step=e.shiftKey?24:8;\n    if(e.key===\"ArrowLeft\"){ e.preventDefault(); setQtyWidth(current()-step,true); }\n    if(e.key===\"ArrowRight\"){ e.preventDefault(); setQtyWidth(current()+step,true); }\n    if(e.key===\"Home\"){ e.preventDefault(); setQtyWidth(104,true); }\n  });\n  grip.addEventListener(\"dblclick\",()=>setQtyWidth(104,true));\n}\nfunction renderHead(){\n  $(\"#hrow\").innerHTML=COLS.map(c=>`<th class=\"${c.g||\"\"} ${c.n?\"n\":\"\"} ${c.cls||\"\"}\">${T[lang].cols[c.k]}<\/th>`).join(\"\");\n  attachColGrip(); attachQtyStepper(); syncStickyTop();\n}\nfunction renderBody(){\n  const rows=visible(), tb=$(\"#tbody\");\n  if(!rows.length){ tb.innerHTML=\"\"; $(\"#empty\").hidden=false; $(\"#empty\").textContent=T[lang].empty; return; }\n  $(\"#empty\").hidden=true;\n  tb.innerHTML=rows.map(d=>{\n    const c=qty[d.id]||0;\n    return `<tr class=\"${c?\"has-qty\":\"\"}\" data-id=\"${d.id}\">`+COLS.map(col=>\n      `<td class=\"${col.g||\"\"} ${col.n?\"n\":\"\"} ${col.cls||\"\"} k-${col.k}\" data-label=\"${T[lang].cols[col.k]}\">${cell(d,col.k)}<\/td>`).join(\"\")+`<\/tr>`;\n  }).join(\"\");\n}\nfunction renderChips(){\n  $(\"#chips\").innerHTML=`<button class=\"chip\" data-f=\"all\" aria-pressed=\"${filter===\"all\"}\">${T[lang].all}<span class=\"c\">${DATA.length}<\/span><\/button>`+\n    families().map(f=>`<button class=\"chip\" data-f=\"${esc(f.k)}\" aria-pressed=\"${filter===f.k}\">${esc(f.label)}<span class=\"c\">${f.n}<\/span><\/button>`).join(\"\");\n}\nfunction linePallets(d,c){ return palletised ? Math.ceil(c\/d.cpp) : c\/d.cpp; }\nfunction totals(){\n  const t={lines:0,cartons:0,units:0,pallets:0,cbm:0,net:0,goods:0,gross:0,usd:0,list:0,saved:0,palletKg:0};\n  DATA.forEach(d=>{ const c=qty[d.id]||0; if(!c) return;\n    t.lines++; t.cartons+=c; t.units+=c*d.upc; t.pallets+=linePallets(d,c);\n    t.cbm+=c*d.cbm; t.net+=c*d.net; t.goods+=c*d.gross;\n    t.list+=c*d.pc; t.usd+=c*net(d.pc); });\n  t.saved=t.list-t.usd;\n  \/\/ a loaded pallet carries its own weight; floor-loaded cargo does not\n  t.palletKg = palletised ? t.pallets*palletKg : 0;\n  t.gross = t.goods + t.palletKg;\n  return t;\n}\nfunction renderStats(){\n  fitQtyWidth();\n  const t=totals(), s=T[lang].stats;\n  $(\"#stats\").innerHTML=[\n    [s.lines,fmt(t.lines)],[s.cartons,fmt(t.cartons)],[s.units,fmt(t.units)],\n    ...(palletised?[[s.pallets,fmt(t.pallets,0), T[lang].palletsWhole]]:[]),\n    [s.cbm,fmt(t.cbm,2)+\" m\u00b3\"],\n    [s.net,fmt(t.net,1)+\" kg\"],\n    [s.gross,fmt(t.gross,1)+\" kg\", t.palletKg?`+${fmt(t.palletKg,0)} kg ${T[lang].palletsShort}`:\"\"],\n    [s.usd,\"$\"+fmt(t.usd,2), discount?`${T[lang].wasLabel} $${fmt(t.list,2)}`:\"\",\"money\"],\n    [s.eur,\"\u20ac\"+fmt(t.usd*rate,2),\"@ \"+rate.toFixed(4),\"money\"]\n  ].map(([k,v,sub,cls])=>`<div class=\"stat ${cls||\"\"}\"><div class=\"k\">${k}<\/div><div class=\"v\">${v}<\/div>${sub?`<div class=\"sub\">${sub}<\/div>`:\"\"}<\/div>`).join(\"\");\n  renderMeters(t);\n  syncSecbars();\n  const mt=$(\"#mw-tot\");\n  if(mt) mt.textContent = t.lines\n    ? `${fmt(t.lines)} \u00b7 ${fmt(t.cartons)} ${T[lang].cartonsWord} \u00b7 $${fmt(t.usd,2)}` : \"\";\n  const any=t.lines>0;\n  const sb=$(\"#submitbar\");\n  sb.hidden=!any;\n  if(any){\n    const L=T[lang];\n    \/* the loudest flag of all: the order doesn't fit the containers they chose *\/\n    const fr=t.lines?fitReport(t):null;\n    const over = fr && (fr.state===\"over\" || fr.overWeight);\n    const fit = over\n      ? `<br><span class=\"fitflag\">\\u26A0 ${(fr.overWeight&&fr.state!==\"over\"?L.fitFlagW:L.fitFlag)\n          .replace(\"{n}\", fmt(Math.max(1,contCount)))\n          .replace(\"{type}\", fr.c.name)\n          .replace(\"{need}\", fmt(fr.need))}<\/span>` : \"\";\n    const fb=$(\"#fitbar\");\n    if(fb){\n      const showBar = over && document.body.classList.contains(\"mwiz\") && mstep>=2;\n      fb.hidden=!showBar;\n      if(showBar) fb.textContent=\"\\u26A0 \"+(fr.overWeight&&fr.state!==\"over\"?L.fitFlagW:L.fitFlag)\n        .replace(\"{n}\", fmt(Math.max(1,contCount)))\n        .replace(\"{type}\", fr.c.name)\n        .replace(\"{need}\", fmt(fr.need));\n    }\n    const mq = moqSku ? (moqOver()\n        ? `<br><span class=\"moqchip miss\">${L.moqNeed.replace(\"{max}\", fmt(moqCap())).replace(\"{have}\", fmt(t.lines))}<\/span>`\n        : `<br><span class=\"moqchip ok\">${L.moqMet.replace(\"{max}\", fmt(moqCap())).replace(\"{have}\", fmt(t.lines))}<\/span>`) : \"\";\n    $(\"#sb-sum\").innerHTML=`<b>${fmt(t.lines)}<\/b> ${L.linesWord} \u00b7 <b>${fmt(t.cartons)}<\/b> ${L.cartonsWord} \u00b7 <b>${fmt(t.cbm,2)} m\u00b3<\/b><br>\n      <span class=\"big\">$${fmt(t.usd,2)}<\/span>${fit}${mq}`;\n    $(\"#btn-submit\").textContent=L.submitBtn;\n  }\n  $(\"#btn-order\").disabled=!any;\n  $(\"#btn-printsel\").disabled=!any;\n  $(\"#btn-order\").innerHTML=T[lang].order+(any?` <span class=\"n\">${t.lines}<\/span>`:\"\");\n}\nfunction updateFloorNote(){\n  const el=$(\"#flnote\");\n  el.hidden=palletised;\n  if(!palletised) el.textContent=T[lang].floorNote;\n}\nfunction updateMoqCard(){\n  const t=T[lang], card=$(\"#moqcard\");\n  if(!moqSku){ card.hidden=true; return; }\n  card.hidden=false;\n  $(\"#moq-line\").innerHTML=t.moqCardLine\n    .replace(\"{cap}\", `<b>${fmt(moqCap())}<\/b>`)\n    .replace(\"{n}\", fmt(moqSku))\n    .replace(\"{n2}\", fmt(moqSku));\n  $(\"#moq-ask\").textContent=t.moqAskBtn;\n  $(\"#moq-tag\").textContent=t.moqTag;\n  $(\"#moq-asklb\").textContent=t.moqAskLb;\n  $(\"#moq-send\").textContent=t.moqAskSend;\n}\n$(\"#moq-ask\").addEventListener(\"click\",()=>{ const a=$(\"#moqask\"); a.hidden=!a.hidden; if(!a.hidden)$(\"#moq-n\").focus(); });\n$(\"#moq-send\").addEventListener(\"click\",async()=>{\n  const t=T[lang], n=parseInt($(\"#moq-n\").value)||0, btn=$(\"#moq-send\");\n  if(!n){ $(\"#moq-n\").focus(); return; }\n  btn.disabled=true;\n  try{\n    const r=await api({action:\"sendMessage\", code:unlockCode,\n      text:t.moqAskText.replace(\"{n}\", n)});\n    if(!r||!r.ok) throw 0;\n    $(\"#moq-msg\").textContent=t.moqAskDone;\n    $(\"#moqask\").hidden=true; loadMessages(false);\n  }catch(e){ $(\"#moq-msg\").textContent=t.moqAskFail; }\n  finally{ btn.disabled=false; }\n});\nfunction renderMeters(t){\n  updateMoqCard(); updateFloorNote();\n  const tt=T[lang], f=fitReport(t);\n  const unit = palletised ? tt.palletsShort : \"m\u00b3\";\n  $(\"#meters\").innerHTML = CONTAINERS.map(c=>{\n    const per = palletised ? c.slots[palletType] : c.cbm;\n    const chosen = c.key===contType;\n    const cap = per*(chosen?Math.max(1,contCount):1);\n    const pct = cap ? f.used\/cap*100 : 0;\n    const cls = pct>100?\"over\":pct>85?\"warn\":\"\";\n    const need = f.used>0?Math.ceil(f.used\/per):0;\n    return `<div class=\"meter ${cls} ${chosen?\"\":\"dim\"}\">\n      <div class=\"row\"><span>${chosen?\"<b>\"+c.name+\" \u00d7 \"+Math.max(1,contCount)+\"<\/b>\":c.name}<\/span>\n        <span class=\"pc\">${fmt(pct,0)}%<\/span><\/div>\n      <div class=\"bar\"><div class=\"fill\" style=\"width:${Math.min(100,pct)}%\"><\/div><\/div>\n      <div class=\"row\" style=\"margin:3px 0 0\"><span class=\"alt\">${fmt(f.used, palletised?0:2)} \/ ${fmt(cap, palletised?0:1)} ${unit}${\n        chosen?\"\":` \u00b7 ${tt.wouldNeed.replace(\"{n}\",fmt(need))}`}<\/span><\/div>\n    <\/div>`;\n  }).join(\"\");\n  render3D(f);\n  renderFit(f);\n}\n\/* \u2500\u2500 the 3D live load view: one box per requested container, filling in\n      sequence as quantities grow; red dashed ghosts when more are needed \u2500\u2500 *\/\nlet c3dRy=-32;\nfunction render3D(f){\n  const el=$(\"#c3d\"); if(!el) return;\n  const L=T[lang], n=Math.max(1,contCount), per=f.per, used=f.used;\n  const shown=Math.min(n,6), extra=Math.max(0,f.need-n), exShown=Math.min(extra,3);\n  let h=`<p class=\"c3dtitle\">${L.c3dTitle}<\/p><div class=\"c3dtrack\" id=\"c3dtrack\" style=\"--ry:${c3dRy}deg\">`;\n  for(let i=0;i<shown;i++){\n    const fill=Math.max(0,Math.min(100, per>0?(used-i*per)\/per*100:0));\n    h+=`<div class=\"c3du\"><div class=\"c3dbox ${f.overWeight?\"c3dw\":\"\"}\">\n      <div class=\"c3df cf\"><div class=\"lvl\" style=\"height:${fill}%\"><\/div><\/div>\n      <div class=\"c3df cs\"><div class=\"lvl\" style=\"height:${fill}%\"><\/div><\/div>\n      <div class=\"c3df ct ${fill>=99.9?\"full\":\"\"}\"><\/div>\n    <\/div><span class=\"c3dlab\">${esc(f.c.name)} #${i+1} \u00b7 ${fmt(fill,0)}%<\/span><\/div>`;\n  }\n  if(n>shown) h+=`<span class=\"c3dmore\">+${fmt(n-shown)}<\/span>`;\n  for(let i=0;i<exShown;i++){\n    h+=`<div class=\"c3du\"><div class=\"c3dbox c3dx\">\n      <div class=\"c3df cf\"><\/div><div class=\"c3df cs\"><\/div><div class=\"c3df ct\"><\/div>\n    <\/div><span class=\"c3dlab miss\">+1 ${L.c3dExtra}<\/span><\/div>`;\n  }\n  if(extra>exShown) h+=`<span class=\"c3dmore miss\">+${fmt(extra-exShown)}<\/span>`;\n  el.innerHTML=h+`<\/div>`;\n}\n(function(){\n  const el=$(\"#c3d\"); if(!el) return; let dn=null;\n  el.addEventListener(\"pointerdown\",e=>{ dn={x:e.clientX,ry:c3dRy}; try{el.setPointerCapture(e.pointerId);}catch(_){}});\n  el.addEventListener(\"pointermove\",e=>{ if(!dn) return;\n    c3dRy=Math.max(-75,Math.min(15, dn.ry+(e.clientX-dn.x)*0.4));\n    const tr=$(\"#c3dtrack\"); if(tr) tr.style.setProperty(\"--ry\",c3dRy+\"deg\"); });\n  window.addEventListener(\"pointerup\",()=>{ dn=null; });\n})();\n\/* \u2500\u2500 left-column sections: minimize and drag-to-reorder, remembered locally \u2500\u2500 *\/\nconst SEC_IDS=[\"side\",\"msgside\",\"rail\",\"catside\"];\nconst SEC_LBL={side:\"#contlbl\",msgside:\"#msglbl\",rail:\"#rail-title\",catside:\"#catlbl\"};\nconst SEC_KEY=\"clm-order-leftcol\";\nlet secState={order:[],min:{}}, secDragEl=null;\nfunction secSave(){ try{ localStorage.setItem(SEC_KEY,JSON.stringify(secState)); }catch(e){} }\nfunction syncSecbars(){\n  SEC_IDS.forEach(id=>{\n    const el=document.getElementById(id); if(!el) return;\n    const t=el.querySelector(\".sectitle\"), l=document.querySelector(SEC_LBL[id]);\n    if(t&&l) t.textContent=l.textContent;\n  });\n}\nfunction initLeftcol(){\n  const col=$(\"#leftcol\"); if(!col) return;\n  try{ secState=Object.assign(secState,JSON.parse(localStorage.getItem(SEC_KEY)||\"{}\")); }catch(e){}\n  (secState.order||[]).forEach(id=>{ if(SEC_IDS.includes(id)){ const el=document.getElementById(id); if(el) col.appendChild(el); }});\n  SEC_IDS.forEach(id=>{\n    const el=document.getElementById(id); if(!el) return;\n    const bar=document.createElement(\"div\"); bar.className=\"secbar noprint\";\n    bar.innerHTML=`<span class=\"secgrip\" title=\"\u21c5\">\u283f<\/span><span class=\"sectitle\"><\/span><button class=\"secfold\" type=\"button\" aria-label=\"Minimize\">\u25be<\/button>`;\n    el.prepend(bar);\n    if(secState.min[id]) el.classList.add(\"secmin-on\");\n    bar.querySelector(\".secfold\").addEventListener(\"click\",()=>{\n      el.classList.toggle(\"secmin-on\");\n      secState.min[id]=el.classList.contains(\"secmin-on\");\n      secSave(); syncSecbars();\n    });\n    bar.querySelector(\".secgrip\").addEventListener(\"mousedown\",()=>el.setAttribute(\"draggable\",\"true\"));\n    el.addEventListener(\"dragstart\",e=>{\n      if(el.getAttribute(\"draggable\")!==\"true\"){ e.preventDefault(); return; }\n      secDragEl=el; el.classList.add(\"secdrag\");\n      e.dataTransfer.effectAllowed=\"move\";\n      try{ e.dataTransfer.setData(\"text\/plain\",id); }catch(_){}\n    });\n    el.addEventListener(\"dragend\",()=>{\n      el.classList.remove(\"secdrag\"); el.removeAttribute(\"draggable\"); secDragEl=null;\n      secState.order=[...col.children].map(c=>c.id).filter(Boolean); secSave();\n    });\n  });\n  window.addEventListener(\"mouseup\",()=>{ SEC_IDS.forEach(id=>{ const el=document.getElementById(id); if(el&&!secDragEl) el.removeAttribute(\"draggable\"); }); });\n  col.addEventListener(\"dragover\",e=>{\n    if(!secDragEl) return; e.preventDefault(); e.dataTransfer.dropEffect=\"move\";\n    const after=[...col.children].filter(c=>c!==secDragEl).find(c=>{\n      const r=c.getBoundingClientRect(); return e.clientY < r.top+r.height\/2; });\n    if(after) col.insertBefore(secDragEl,after); else col.appendChild(secDragEl);\n  });\n  col.addEventListener(\"drop\",e=>e.preventDefault());\n  syncSecbars();\n}\ninitLeftcol();\nfunction renderFit(f){\n  const t=T[lang], el=$(\"#fitmsg\");\n  const unit = palletised ? t.palletsShort : \"m\u00b3\";\n  el.className=\"fitmsg \"+f.state;\n  let msg;\n  if(f.state===\"idle\") msg = t.fitIdle;\n  else if(f.state===\"over\"){\n    const short=f.used-f.cap;\n    msg = t.fitOver.replace(\"{need}\",`<b>${fmt(f.need)} \u00d7 ${f.c.name}<\/b>`)\n                   .replace(\"{over}\",`<b>${fmt(short, palletised?0:2)} ${unit}<\/b>`);\n  } else if(f.state===\"full\") msg = t.fitFull.replace(\"{pct}\",`<b>${fmt(f.pct,0)}%<\/b>`);\n  else if(f.state===\"near\")   msg = t.fitNear.replace(\"{pct}\",`<b>${fmt(f.pct,0)}%<\/b>`)\n                   .replace(\"{room}\",`<b>${fmt(f.cap-f.used, palletised?0:2)} ${unit}<\/b>`);\n  else msg = t.fitLight.replace(\"{pct}\",`<b>${fmt(f.pct,0)}%<\/b>`)\n                   .replace(\"{room}\",`<b>${fmt(f.cap-f.used, palletised?0:2)} ${unit}<\/b>`);\n  if(f.overWeight) msg += \" \" + t.fitWeight.replace(\"{kg}\",`<b>${fmt(f.c.payload*Math.max(1,contCount)\/1000,1)} t<\/b>`);\n  el.innerHTML = `<span class=\"dot2\"><\/span><span>${msg}<\/span>`;\n}\nfunction renderPalletUI(){\n  const t=T[lang];\n  $(\"#lm-floor\").textContent=t.floorLoaded;\n  $(\"#lm-pal\").textContent=t.palletised;\n  $(\"#lm-floor\").setAttribute(\"aria-pressed\",!palletised);\n  $(\"#lm-pal\").setAttribute(\"aria-pressed\",palletised);\n  $(\"#palbox\").hidden=!palletised;\n  $(\"#palbtn\").textContent=t.palSettings;\n  $(\"#l-paltype\").textContent=t.palSize;\n  $(\"#l-palkg\").textContent=t.palWeight;\n  $(\"#pal-note\").textContent=t.palNote;\n  const sel=$(\"#pal-type\");\n  if(sel.options.length!==Object.keys(PALLET_TYPES).length){\n    sel.innerHTML=Object.keys(PALLET_TYPES).map(k=>`<option value=\"${k}\">${PALLET_TYPES[k]}<\/option>`).join(\"\");\n  }\n  sel.value=palletType;\n  $(\"#pal-slots\").innerHTML=CONTAINERS.map(c=>`<span>${c.name} <b>${c.slots[palletType]}<\/b><\/span>`).join(\"\");\n  const cs=$(\"#cont-type\");\n  if(cs.options.length!==CONTAINERS.length)\n    cs.innerHTML=CONTAINERS.map(c=>`<option value=\"${c.key}\">${c.name}<\/option>`).join(\"\");\n  cs.value=contType;\n  $(\"#cont-n\").value=contCount;\n  $(\"#l-conttype\").textContent=t.shipIn;\n  $(\"#l-contn\").textContent=t.howMany;\n  $(\"#btn-continfo\").textContent=t.whatMean;\n}\nfunction showContainerInfo(){\n  const t=T[lang];\n  $(\"#info-title\").textContent=t.infoTitle;\n  $(\"#info-body\").innerHTML = `<p>${t.infoIntro}<\/p>\n    <table class=\"ctable\"><tr><th>${t.infoCont}<\/th><th>${t.infoInner}<\/th>\n      <th class=\"n\">${t.infoVol}<\/th><th class=\"n\">${t.infoPal100}<\/th>\n      <th class=\"n\">${t.infoPalEuro}<\/th><th class=\"n\">${t.infoPayload}<\/th><\/tr>\n      ${CONTAINERS.map(c=>`<tr><td><b>${c.name}<\/b><\/td><td>${c.inner}<\/td>\n        <td class=\"n\">${fmt(c.cbm,1)} m\u00b3<\/td><td class=\"n\">${c.slots.std}<\/td>\n        <td class=\"n\">${c.slots.euro}<\/td><td class=\"n\">${fmt(c.payload\/1000,1)} t<\/td><\/tr>`).join(\"\")}\n    <\/table>\n    <p style=\"margin-top:14px\">${t.infoFloor}<\/p>\n    <p>${t.infoPallet}<\/p>\n    <p style=\"color:var(--ink-3);font-size:12.5px\">${t.infoCaveat}<\/p>`;\n  $(\"#infosheet\").classList.add(\"on\"); document.body.style.overflow=\"hidden\";\n}\nfunction setLoading(pal){\n  palletised=pal;\n  renderPalletUI(); renderBody(); renderStats();\n}\n\nfunction syncScrollbars(){\n  const tw=$(\"#tablewrap\"), st=$(\"#scrolltop\"), sp=$(\"#scrollspacer\");\n  if(!tw||!st) return;\n  sp.style.width = tw.scrollWidth + \"px\";\n  $(\"#scrollbar\").hidden = tw.scrollWidth <= tw.clientWidth + 4;\n}\nfunction renderAll(){ renderHead(); renderBody(); renderStats(); renderPalletUI(); requestAnimationFrame(syncScrollbars); }\n\nfunction applyLang(){\n  const t=T[lang];\n  document.documentElement.lang=lang;\n  $(\"#g-sub\").textContent=t.sub; $(\"#g-title\").textContent=t.gTitle; $(\"#g-tag\").textContent=t.gTag; $(\"#g-text\").textContent=t.gText;\n  $(\"#g-go\").textContent=t.gGo; $(\"#g-foot\").textContent=t.gFoot;\n  $(\"#g-en\").setAttribute(\"aria-pressed\",lang===\"en\"); $(\"#g-tr\").setAttribute(\"aria-pressed\",lang===\"tr\");\n  $(\"#masthead-sub\").textContent=t.sub; renderRepCard(); if(document.body.classList.contains(\"mwiz\")) setMStep(mstep,true);\n  $(\"#who\").textContent=accountName ? `${accountName} \u00b7 ${account}` : `${t.account} ${account}`;\n  const db=$(\"#discbanner\");\n  db.hidden=!discount;\n  if(discount) db.innerHTML=`\n    <span class=\"pctwrap\"><span class=\"pct\">\\u2605<\/span>\n      <span class=\"pctsub\">${t.discCta}<\/span><\/span>\n    <span class=\"dtext\"><span class=\"txt\">${custFirst()?t.discTitleN.replace(\"{name}\",esc(custFirst())):t.discTitle}<\/span>\n      <span class=\"sub\">${t.discSub}<\/span><\/span>`;\n  $(\"#q\").placeholder=t.search;\n  $(\"#btn-cat\").textContent=t.cat; $(\"#past-x\").textContent=t.close;\n  renderRail(); $(\"#btn-printall\").textContent=t.printAll;\n  $(\"#btn-printsel\").textContent=t.printSel; $(\"#btn-reset\").textContent=t.reset;\n  $(\"#contlbl\").textContent=t.contlbl2; $(\"#contline1\").setAttribute(\"data-nudge\", t.contNudge.replace(\"{name}\", custFirst()?\", \"+custFirst():\"\"));\n  $(\"#btn-signout\").textContent=t.signOut;\n  $(\"#info-x\").textContent=t.close;\n  $(\"#noteshd\").textContent=t.noteshd;\n  $(\"#noteslist\").innerHTML=t.notes.map(n=>`<li>${n}<\/li>`).join(\"\");\n  $(\"#lang-en\").setAttribute(\"aria-pressed\",lang===\"en\"); $(\"#lang-tr\").setAttribute(\"aria-pressed\",lang===\"tr\");\n  $(\"#o-title\").textContent=t.oTitle; $(\"#o-x\").textContent=t.close;\n  $(\"#l-company\").textContent=t.company; $(\"#l-contact\").textContent=t.contact;\n  $(\"#l-email\").textContent=t.email; $(\"#l-phone\").textContent=t.phone;\n  $(\"#l-country\").textContent=t.country; $(\"#l-notes\").textContent=t.fNotes;\n  $(\"#o-howto\").innerHTML=t.howto;\n  $(\"#o-review\").textContent=t.review; $(\"#o-send\").textContent=t.sendBtn;\n  $(\"#o-back\").textContent=t.back; $(\"#o-done\").textContent=t.doneClose;\n  $(\"#o-pdf\").textContent=t.pdf; $(\"#o-csv\").textContent=t.csv;\n  $(\"#btn-savedraft\").textContent=t.draftSave; $(\"#o-savedraft\").textContent=t.draftSave;\n  $(\"#qtyctl-lb\").textContent=t.qtyBox;\n  $(\"#catlbl\").textContent=t.catSnapTitle; renderCatLink();\n  renderMessages();\n  renderDraftbar();\n  $(\"#btn-xlsall\").textContent=t.xlsAll;\n  $(\"#cat-t\").textContent=t.catTitle; $(\"#cat-open\").textContent=t.catOpen; $(\"#cat-x\").textContent=t.close;\n  $(\"#cat-miss\").textContent=t.catMissing;\n  $(\"#fxsrc\").textContent=rateSource===\"live\"?`${t.live} ${rateDate}`:t.fallback;\n  $(\"#fxbox\").classList.toggle(\"live\",rateSource===\"live\");\n  $(\"#fxbox\").classList.toggle(\"fallback\",rateSource!==\"live\");\n  renderChips(); renderAll();\n}\n\n\/* ---------- print ---------- *\/\nfunction buyerLine(){\n  const g=id=>($(\"#\"+id).value||\"\").trim();\n  const bits=[g(\"o-company\"),g(\"o-contact\"),g(\"o-email\"),g(\"o-phone\"),g(\"o-country\")].filter(Boolean);\n  return bits.join(\" \u00b7 \");\n}\nfunction preparePrint(mode){\n  const t=T[lang], d=new Date().toLocaleDateString(lang===\"tr\"?\"tr-TR\":\"en-GB\");\n  document.body.classList.remove(\"print-all\",\"print-selected\");\n  document.body.classList.add(mode===\"sel\"?\"print-selected\":\"print-all\");\n  $(\"#ph-t\").textContent=mode===\"sel\"?t.phSel:t.phAll;\n  const load = palletised ? `${t.palletised} (${PALLET_TYPES[palletType]})` : t.floorLoaded;\n  $(\"#ph-s\").textContent=`${t.account} ${account} \u00b7 ${t.genOn} ${d} \u00b7 ${t.loading}: ${load} \u00b7 USD\u2192EUR ${rate.toFixed(4)}`;\n  const b=buyerLine();\n  $(\"#ph-b\").textContent=b;\n  $(\"#ph-b\").style.display=b?\"\":\"none\";\n  const tt=totals();\n  $(\"#printfoot\").innerHTML = mode===\"sel\"\n    ? `${t.stats.cartons}: ${fmt(tt.cartons)} \u00b7 ${t.stats.units}: ${fmt(tt.units)} \u00b7 ${palletised?`${t.stats.pallets}: ${fmt(tt.pallets,0)} \u00b7 `:\"\"}${t.stats.cbm}: ${fmt(tt.cbm,2)} m\u00b3 \u00b7 ${t.stats.gross}: ${fmt(tt.gross,1)} kg${tt.palletKg?` (incl. ${fmt(tt.palletKg,0)} kg ${t.palletsShort})`:\"\"} \u00b7 <strong>${t.stats.usd}: $${fmt(tt.usd,2)} \/ ${t.stats.eur}: \u20ac${fmt(tt.usd*rate,2)}<\/strong><br>${t.notes[0].replace(\/<[^>]+>\/g,\"\")} ${t.notes[4].replace(\/<[^>]+>\/g,\"\")}`\n    : t.notes[0].replace(\/<[^>]+>\/g,\"\");\n  window.print();\n}\n\n\/* ---------- downloads ---------- *\/\nfunction orderRows(){ return DATA.filter(d=>qty[d.id]>0); }\nfunction saveXlsx(buf, name){\n  const blob=new Blob([buf],{type:\"application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"});\n  const a=document.createElement(\"a\");\n  a.href=URL.createObjectURL(blob); a.download=name;\n  document.body.appendChild(a); a.click(); a.remove();\n  setTimeout(()=>URL.revokeObjectURL(a.href),2000);\n}\n\/* the product list \u2014 one row per product, priced at this customer's discount *\/\nfunction listWorkbook(){\n  const t=T[lang], tt=totals();\n  const cols=[\n    {title:\"#\",key:\"idx\",w:5,type:\"int\"},\n    {title:t.cols.ref,key:\"ref\",w:11},\n    {title:t.cols.name,key:\"name\",w:42},\n    {title:t.cols.g,key:\"g\",w:11,type:\"int\"},\n    {title:t.cols.upc,key:\"upc\",w:13,type:\"int\"},\n    {title:t.cols.pu,key:\"pu\",w:11,type:\"usd\"},\n    {title:t.cols.pue,key:\"pue\",w:11,type:\"eur\"},\n    {title:t.cols.pc,key:\"pc\",w:12,type:\"usd\"},\n    {title:t.cols.pce,key:\"pce\",w:12,type:\"eur\"},\n    {title:t.cols.qty,key:\"qty\",w:10,type:\"int\"},\n    {title:t.cols.units,key:\"units\",w:11,type:\"int\"},\n    {title:t.cols.tusd,key:\"tusd\",w:14,type:\"usd\"},\n    {title:t.cols.teur,key:\"teur\",w:14,type:\"eur\"},\n    {title:t.cols.tcbm,key:\"tcbm\",w:11,type:\"dec3\"},\n    {title:t.cols.tgross,key:\"tgross\",w:13,type:\"dec2\"},\n    {title:t.cols.cbm,key:\"cbm\",w:12,type:\"dec3\"},\n    {title:t.cols.gross,key:\"gross\",w:13,type:\"dec2\"},\n    {title:t.cols.shelf,key:\"shelf\",w:12},\n    {title:t.cols.temp,key:\"temp\",w:12},\n    {title:t.cols.hs,key:\"hs\",w:18},\n    {title:t.cols.bc,key:\"bc\",w:18}\n  ];\n  const rows=visible().map(d=>{\n    const q=qty[d.id]||0, pc=net(d.pc), pu=net(d.pu);\n    return {idx:d.id, ref:d.ref||\"\", name:(lang===\"tr\"?d.brandTr+\" \"+d.nameTr:d.brand+\" \"+d.name),\n      g:d.g, upc:d.upc, pu:+pu.toFixed(4), pue:+(pu*rate).toFixed(4),\n      pc:+pc.toFixed(4), pce:+(pc*rate).toFixed(4), qty:q, units:q*d.upc,\n      tusd:+(q*pc).toFixed(2), teur:+(q*pc*rate).toFixed(2),\n      tcbm:+(q*d.cbm).toFixed(4), tgross:+(q*d.gross).toFixed(2),\n      cbm:d.cbm, gross:d.gross, shelf:d.shelf, temp:d.temp, hs:d.hs, bc:d.bc||\"\"};\n  });\n  const load = palletised ? `${t.palletised} \u00b7 ${PALLET_TYPES[palletType]} \u00b7 ${palletKg} kg` : t.floorLoaded;\n  return xlsxBuild({\n    title:t.phAll, sheet:\"Product list\", accent:\"1E4E8C\",\n    subtitle:`${account}${accountName?\" \u2014 \"+accountName:\"\"} \u00b7 ${new Date().toLocaleDateString(lang===\"tr\"?\"tr-TR\":\"en-GB\")}`\n      + ` \u00b7 ${load} \u00b7 USD\u2192EUR ${rate.toFixed(4)}`,\n    columns:cols, rows,\n    totals:[\n      {label:t.stats.cartons, value:tt.cartons},\n      ...(palletised?[{label:t.stats.pallets, value:+tt.pallets.toFixed(0)}]:[]),\n      {label:t.stats.cbm,     value:+tt.cbm.toFixed(3)},\n      {label:t.stats.gross,   value:+tt.gross.toFixed(1)},\n      {label:t.stats.usd,     value:+tt.usd.toFixed(2), style:\"usd\"}\n    ]\n  });\n}\n\/* the submitted order \u2014 same shape, only the lines actually ordered *\/\nfunction orderWorkbook(){\n  const t=T[lang], tt=totals(), g=id=>($(\"#\"+id).value||\"\").trim();\n  const cols=[\n    {title:\"#\",key:\"idx\",w:5,type:\"int\"},\n    {title:t.cols.ref,key:\"ref\",w:11},\n    {title:t.cols.name,key:\"name\",w:42},\n    {title:t.cols.g,key:\"g\",w:11,type:\"int\"},\n    {title:t.cols.upc,key:\"upc\",w:13,type:\"int\"},\n    {title:t.cols.pu,key:\"pu\",w:11,type:\"usd\"},\n    {title:t.cols.pc,key:\"pc\",w:12,type:\"usd\"},\n    {title:t.cols.qty,key:\"qty\",w:10,type:\"int\"},\n    {title:t.cols.units,key:\"units\",w:11,type:\"int\"},\n    {title:t.cols.tcbm,key:\"tcbm\",w:11,type:\"dec3\"},\n    {title:t.cols.tgross,key:\"tgross\",w:13,type:\"dec2\"},\n    {title:t.cols.tusd,key:\"tusd\",w:14,type:\"usd\"},\n    {title:t.cols.teur,key:\"teur\",w:14,type:\"eur\"},\n    {title:t.cols.hs,key:\"hs\",w:18},\n    {title:t.cols.bc,key:\"bc\",w:18}\n  ];\n  const rows=orderRows().map(d=>{\n    const q=qty[d.id], pc=net(d.pc), pu=net(d.pu);\n    return {idx:d.id, ref:d.ref||\"\", name:(lang===\"tr\"?d.brandTr+\" \"+d.nameTr:d.brand+\" \"+d.name),\n      g:d.g, upc:d.upc, pu:+pu.toFixed(4), pc:+pc.toFixed(4), qty:q, units:q*d.upc,\n      tcbm:+(q*d.cbm).toFixed(4), tgross:+(q*d.gross).toFixed(2),\n      tusd:+(q*pc).toFixed(2), teur:+(q*pc*rate).toFixed(2), hs:d.hs, bc:d.bc||\"\"};\n  });\n  const load = palletised ? `${t.palletised} \u00b7 ${PALLET_TYPES[palletType]} \u00b7 ${palletKg} kg` : t.floorLoaded;\n  const tot=[\n    {label:t.company,  value:g(\"o-company\")},\n    {label:t.contact,  value:g(\"o-contact\")},\n    {label:t.email,    value:g(\"o-email\")},\n    {label:t.phone,    value:g(\"o-phone\")},\n    {label:t.country,  value:g(\"o-country\")},\n    {label:t.loading,  value:load},\n    {label:t.stats.cartons, value:tt.cartons},\n    ...(palletised?[{label:t.stats.pallets, value:+tt.pallets.toFixed(0)}]:[]),\n    {label:t.stats.cbm,     value:+tt.cbm.toFixed(3)},\n    {label:t.stats.gross,   value:+tt.gross.toFixed(1)},\n    {label:t.stats.usd,     value:+tt.usd.toFixed(2), style:\"usd\"}\n  ];\n  return xlsxBuild({\n    title:\"CLAIMONT \u2014 \"+t.oTitle, sheet:\"Order\", accent:\"1E4E8C\",\n    subtitle:`${lastOrderId||account} \u00b7 ${account}${accountName?\" \u2014 \"+accountName:\"\"}`\n      + ` \u00b7 ${new Date().toLocaleDateString(lang===\"tr\"?\"tr-TR\":\"en-GB\")} \u00b7 USD\u2192EUR ${rate.toFixed(4)}`,\n    columns:cols, rows, totals:tot\n  });\n}\nfunction download(name,text,mime){\n  const blob=new Blob([text],{type:mime});\n  const a=document.createElement(\"a\");\n  a.href=URL.createObjectURL(blob); a.download=name;\n  document.body.appendChild(a); a.click(); a.remove();\n  setTimeout(()=>URL.revokeObjectURL(a.href),2000);\n}\n\/* ---- printing: keep only the portal on the page ---------------------------\n   Everything else in the WordPress document (theme header, footer, floating\n   chat button) is hidden by marking each sibling along our ancestor chain. *\/\nfunction markPrintChrome(on){\n  document.querySelectorAll('[data-clhide]').forEach(function(e){ e.removeAttribute('data-clhide'); });\n  if(!on) return;\n  var el = document.getElementById('app') || document.body.firstElementChild;\n  while (el && el.parentElement && el !== document.documentElement){\n    var kids = el.parentElement.children;\n    for (var i=0;i<kids.length;i++) if (kids[i] !== el) kids[i].setAttribute('data-clhide','');\n    el = el.parentElement;\n  }\n}\nwindow.addEventListener('beforeprint', function(){ markPrintChrome(true); });\nwindow.addEventListener('afterprint',  function(){ markPrintChrome(false); });\n\n\/* ---------- a real .xlsx, written by hand ----------------------------------\n   Excel opens a semicolon CSV as one column with a \"possible data loss\"\n   warning, and a CSV cannot carry column widths, number formats or a frozen\n   header. So we emit a genuine workbook instead: a ZIP holding a handful of\n   XML parts. Entries are STOREd rather than deflated, which is perfectly\n   valid and keeps this dependency-free.                                     *\/\nfunction xlsxBuild(opts){\n  var enc = new TextEncoder();\n\n  \/* ---- zip (store only) ---- *\/\n  var CRC = (function(){\n    var t = new Uint32Array(256);\n    for (var n=0;n<256;n++){ var c=n;\n      for (var k=0;k<8;k++) c = c&1 ? 0xEDB88320 ^ (c>>>1) : c>>>1;\n      t[n]=c>>>0; }\n    return t;\n  })();\n  function crc32(b){ var c=0xFFFFFFFF;\n    for (var i=0;i<b.length;i++) c = CRC[(c ^ b[i]) & 0xFF] ^ (c>>>8);\n    return (c ^ 0xFFFFFFFF)>>>0; }\n\n  function zip(files){\n    var parts=[], central=[], offset=0;\n    function u16(v){ return [v&255,(v>>8)&255]; }\n    function u32(v){ return [v&255,(v>>8)&255,(v>>16)&255,(v>>>24)&255]; }\n    files.forEach(function(f){\n      var name = enc.encode(f.name), data = enc.encode(f.data), crc = crc32(data);\n      var local = [].concat([0x50,0x4b,0x03,0x04], u16(20), u16(0), u16(0),\n                            u16(0), u16(0), u32(crc), u32(data.length), u32(data.length),\n                            u16(name.length), u16(0));\n      parts.push(new Uint8Array(local), name, data);\n      central.push([].concat([0x50,0x4b,0x01,0x02], u16(20), u16(20), u16(0), u16(0),\n                             u16(0), u16(0), u32(crc), u32(data.length), u32(data.length),\n                             u16(name.length), u16(0), u16(0), u16(0), u16(0), u32(0),\n                             u32(offset)), name);\n      offset += local.length + name.length + data.length;\n    });\n    var cdir=[], cstart=offset;\n    central.forEach(function(c){\n      if (Array.isArray(c)) { cdir.push(new Uint8Array(c)); offset += c.length; }\n      else { cdir.push(c); offset += c.length; }\n    });\n    var end = new Uint8Array([].concat([0x50,0x4b,0x05,0x06], u16(0), u16(0),\n      u16(files.length), u16(files.length), u32(offset-cstart), u32(cstart), u16(0)));\n    var all = parts.concat(cdir, [end]);\n    var total = all.reduce(function(a,x){return a+x.length;},0);\n    var out = new Uint8Array(total), p=0;\n    all.forEach(function(x){ out.set(x,p); p+=x.length; });\n    return out;\n  }\n\n  \/* ---- helpers ---- *\/\n  function esc(v){ return String(v==null?'':v)\n    .replace(\/&\/g,'&amp;').replace(\/<\/g,'&lt;').replace(\/>\/g,'&gt;')\n    .replace(\/\"\/g,'&quot;').replace(\/\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\/g,''); }\n  function colName(i){ var s=''; i++; while(i>0){ var m=(i-1)%26; s=String.fromCharCode(65+m)+s; i=(i-m-1)\/26; } return s; }\n\n  var cols = opts.columns, rows = opts.rows;\n\n  \/* style ids, in the order they are written into cellXfs below *\/\n  var S = { text:0, head:1, int:2, dec2:3, dec3:4, usd:5, eur:6, title:7, sub:8, totLbl:9, totVal:10, totUsd:11 };\n\n  function cell(ref, v, style, type){\n    if (v===null || v===undefined || v==='')\n      return '<c r=\"'+ref+'\" s=\"'+style+'\"\/>';\n    if (type==='n')\n      return '<c r=\"'+ref+'\" s=\"'+style+'\"><v>'+v+'<\/v><\/c>';\n    return '<c r=\"'+ref+'\" s=\"'+style+'\" t=\"inlineStr\"><is><t xml:space=\"preserve\">'+esc(v)+'<\/t><\/is><\/c>';\n  }\n\n  var xml=[], r=1;\n  \/* title block *\/\n  xml.push('<row r=\"'+r+'\" ht=\"22\" customHeight=\"1\">'+cell('A'+r,opts.title,S.title)+'<\/row>'); r++;\n  if (opts.subtitle){ xml.push('<row r=\"'+r+'\">'+cell('A'+r,opts.subtitle,S.sub)+'<\/row>'); r++; }\n  r++;                                             \/* one blank row *\/\n  var headRow = r;\n  xml.push('<row r=\"'+r+'\" ht=\"30\" customHeight=\"1\">' +\n    cols.map(function(c,i){ return cell(colName(i)+r, c.title, S.head); }).join('') + '<\/row>');\n  r++;\n  var firstData = r;\n  rows.forEach(function(d){\n    xml.push('<row r=\"'+r+'\">' + cols.map(function(c,i){\n      var v = d[c.key], ref = colName(i)+r;\n      if (c.type && c.type!=='text'){\n        if (v===null||v===undefined||v==='') return cell(ref,null,S[c.type]);\n        return cell(ref, Number(v), S[c.type], 'n');\n      }\n      return cell(ref, v, S.text);\n    }).join('') + '<\/row>');\n    r++;\n  });\n  var lastData = r-1;\n  \/* totals *\/\n  if (opts.totals && opts.totals.length){\n    r++;\n    opts.totals.forEach(function(t){\n      xml.push('<row r=\"'+r+'\">' + cell('A'+r, t.label, S.totLbl) +\n        cell('B'+r, t.value, t.style==='usd'?S.totUsd:S.totVal, typeof t.value==='number'?'n':undefined) +\n        '<\/row>');\n      r++;\n    });\n  }\n\n  var accent = (opts.accent||'0E5F58').replace('#','');\n  var sheet =\n    '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n    '<worksheet xmlns=\"http:\/\/schemas.openxmlformats.org\/spreadsheetml\/2006\/main\">' +\n    '<sheetPr><outlinePr\/><\/sheetPr>' +\n    '<sheetViews><sheetView workbookViewId=\"0\" showGridLines=\"0\">' +\n      '<pane ySplit=\"'+headRow+'\" topLeftCell=\"A'+(headRow+1)+'\" activePane=\"bottomLeft\" state=\"frozen\"\/>' +\n    '<\/sheetView><\/sheetViews>' +\n    '<sheetFormatPr defaultRowHeight=\"15\"\/>' +\n    '<cols>' + cols.map(function(c,i){\n      return '<col min=\"'+(i+1)+'\" max=\"'+(i+1)+'\" width=\"'+(c.w||12)+'\" customWidth=\"1\"\/>'; }).join('') +\n    '<\/cols>' +\n    '<sheetData>' + xml.join('') + '<\/sheetData>' +\n    (lastData>=firstData\n      ? '<autoFilter ref=\"A'+headRow+':'+colName(cols.length-1)+lastData+'\"\/>' : '') +\n    '<pageMargins left=\"0.3\" right=\"0.3\" top=\"0.4\" bottom=\"0.4\" header=\"0.2\" footer=\"0.2\"\/>' +\n    '<pageSetup orientation=\"landscape\" fitToWidth=\"1\" fitToHeight=\"0\" paperSize=\"9\"\/>' +\n    '<\/worksheet>';\n\n  var styles =\n    '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n    '<styleSheet xmlns=\"http:\/\/schemas.openxmlformats.org\/spreadsheetml\/2006\/main\">' +\n    '<numFmts count=\"5\">' +\n      '<numFmt numFmtId=\"164\" formatCode=\"#,##0\"\/>' +\n      '<numFmt numFmtId=\"165\" formatCode=\"#,##0.00\"\/>' +\n      '<numFmt numFmtId=\"166\" formatCode=\"#,##0.000\"\/>' +\n      '<numFmt numFmtId=\"167\" formatCode=\"&quot;$&quot;#,##0.00\"\/>' +\n      '<numFmt numFmtId=\"168\" formatCode=\"&quot;\u20ac&quot;#,##0.00\"\/>' +\n    '<\/numFmts>' +\n    '<fonts count=\"5\">' +\n      '<font><sz val=\"10\"\/><name val=\"Calibri\"\/><\/font>' +\n      '<font><b\/><sz val=\"10\"\/><color rgb=\"FFFFFFFF\"\/><name val=\"Calibri\"\/><\/font>' +\n      '<font><b\/><sz val=\"14\"\/><color rgb=\"FF'+accent+'\"\/><name val=\"Calibri\"\/><\/font>' +\n      '<font><sz val=\"9\"\/><color rgb=\"FF7A7A72\"\/><name val=\"Calibri\"\/><\/font>' +\n      '<font><b\/><sz val=\"10\"\/><name val=\"Calibri\"\/><\/font>' +\n    '<\/fonts>' +\n    '<fills count=\"3\">' +\n      '<fill><patternFill patternType=\"none\"\/><\/fill>' +\n      '<fill><patternFill patternType=\"gray125\"\/><\/fill>' +\n      '<fill><patternFill patternType=\"solid\"><fgColor rgb=\"FF'+accent+'\"\/>' +\n        '<bgColor indexed=\"64\"\/><\/patternFill><\/fill>' +\n    '<\/fills>' +\n    '<borders count=\"2\"><border><left\/><right\/><top\/><bottom\/><diagonal\/><\/border>' +\n      '<border><left\/><right\/><top\/><bottom style=\"thin\">' +\n        '<color rgb=\"FFDDDDDD\"\/><\/bottom><diagonal\/><\/border><\/borders>' +\n    '<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"\/><\/cellStyleXfs>' +\n    '<cellXfs count=\"12\">' +\n      '<xf numFmtId=\"0\"   fontId=\"0\" fillId=\"0\" borderId=\"1\" xfId=\"0\" applyBorder=\"1\"\/>' +                       \/* 0 text  *\/\n      '<xf numFmtId=\"0\"   fontId=\"1\" fillId=\"2\" borderId=\"0\" xfId=\"0\" applyFont=\"1\" applyFill=\"1\" applyAlignment=\"1\">' +\n        '<alignment vertical=\"center\" wrapText=\"1\"\/><\/xf>' +                                                     \/* 1 head  *\/\n      '<xf numFmtId=\"164\" fontId=\"0\" fillId=\"0\" borderId=\"1\" xfId=\"0\" applyNumberFormat=\"1\" applyBorder=\"1\"\/>' +  \/* 2 int   *\/\n      '<xf numFmtId=\"165\" fontId=\"0\" fillId=\"0\" borderId=\"1\" xfId=\"0\" applyNumberFormat=\"1\" applyBorder=\"1\"\/>' +  \/* 3 dec2  *\/\n      '<xf numFmtId=\"166\" fontId=\"0\" fillId=\"0\" borderId=\"1\" xfId=\"0\" applyNumberFormat=\"1\" applyBorder=\"1\"\/>' +  \/* 4 dec3  *\/\n      '<xf numFmtId=\"167\" fontId=\"0\" fillId=\"0\" borderId=\"1\" xfId=\"0\" applyNumberFormat=\"1\" applyBorder=\"1\"\/>' +  \/* 5 usd   *\/\n      '<xf numFmtId=\"168\" fontId=\"0\" fillId=\"0\" borderId=\"1\" xfId=\"0\" applyNumberFormat=\"1\" applyBorder=\"1\"\/>' +  \/* 6 eur   *\/\n      '<xf numFmtId=\"0\"   fontId=\"2\" fillId=\"0\" borderId=\"0\" xfId=\"0\" applyFont=\"1\"\/>' +                          \/* 7 title *\/\n      '<xf numFmtId=\"0\"   fontId=\"3\" fillId=\"0\" borderId=\"0\" xfId=\"0\" applyFont=\"1\"\/>' +                          \/* 8 sub   *\/\n      '<xf numFmtId=\"0\"   fontId=\"4\" fillId=\"0\" borderId=\"0\" xfId=\"0\" applyFont=\"1\"\/>' +                          \/* 9 totLbl*\/\n      '<xf numFmtId=\"165\" fontId=\"4\" fillId=\"0\" borderId=\"0\" xfId=\"0\" applyFont=\"1\" applyNumberFormat=\"1\"\/>' +    \/*10 totVal*\/\n      '<xf numFmtId=\"167\" fontId=\"2\" fillId=\"0\" borderId=\"0\" xfId=\"0\" applyFont=\"1\" applyNumberFormat=\"1\"\/>' +    \/*11 totUsd*\/\n    '<\/cellXfs>' +\n    '<cellStyles count=\"1\"><cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"\/><\/cellStyles>' +\n    '<\/styleSheet>';\n\n  var files = [\n    { name:'[Content_Types].xml', data:\n      '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n      '<Types xmlns=\"http:\/\/schemas.openxmlformats.org\/package\/2006\/content-types\">' +\n      '<Default Extension=\"rels\" ContentType=\"application\/vnd.openxmlformats-package.relationships+xml\"\/>' +\n      '<Default Extension=\"xml\" ContentType=\"application\/xml\"\/>' +\n      '<Override PartName=\"\/xl\/workbook.xml\" ContentType=\"application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"\/>' +\n      '<Override PartName=\"\/xl\/worksheets\/sheet1.xml\" ContentType=\"application\/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"\/>' +\n      '<Override PartName=\"\/xl\/styles.xml\" ContentType=\"application\/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"\/>' +\n      '<\/Types>' },\n    { name:'_rels\/.rels', data:\n      '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n      '<Relationships xmlns=\"http:\/\/schemas.openxmlformats.org\/package\/2006\/relationships\">' +\n      '<Relationship Id=\"rId1\" Type=\"http:\/\/schemas.openxmlformats.org\/officeDocument\/2006\/relationships\/officeDocument\" Target=\"xl\/workbook.xml\"\/>' +\n      '<\/Relationships>' },\n    { name:'xl\/workbook.xml', data:\n      '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n      '<workbook xmlns=\"http:\/\/schemas.openxmlformats.org\/spreadsheetml\/2006\/main\" ' +\n      'xmlns:r=\"http:\/\/schemas.openxmlformats.org\/officeDocument\/2006\/relationships\">' +\n      '<sheets><sheet name=\"'+esc((opts.sheet||'Sheet1').slice(0,31))+'\" sheetId=\"1\" r:id=\"rId1\"\/><\/sheets>' +\n      '<\/workbook>' },\n    { name:'xl\/_rels\/workbook.xml.rels', data:\n      '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n      '<Relationships xmlns=\"http:\/\/schemas.openxmlformats.org\/package\/2006\/relationships\">' +\n      '<Relationship Id=\"rId1\" Type=\"http:\/\/schemas.openxmlformats.org\/officeDocument\/2006\/relationships\/worksheet\" Target=\"worksheets\/sheet1.xml\"\/>' +\n      '<Relationship Id=\"rId2\" Type=\"http:\/\/schemas.openxmlformats.org\/officeDocument\/2006\/relationships\/styles\" Target=\"styles.xml\"\/>' +\n      '<\/Relationships>' },\n    { name:'xl\/styles.xml', data: styles },\n    { name:'xl\/worksheets\/sheet1.xml', data: sheet }\n  ];\n  return zip(files);\n}\n\n\/* ---------- events ---------- *\/\n$(\"#g-go\").addEventListener(\"click\",submitCode);\n$(\"#g-code\").addEventListener(\"keydown\",e=>{ if(e.key===\"Enter\") submitCode(); });\n$(\"#g-en\").addEventListener(\"click\",()=>{lang=\"en\";applyLang();});\n$(\"#g-tr\").addEventListener(\"click\",()=>{lang=\"tr\";applyLang();});\n$(\"#btn-signout\").addEventListener(\"click\",()=>{\n  try{ sessionStorage.removeItem(\"claimont-acct\"); }catch(e){}\n  document.body.classList.remove(\"mwiz\"); wizOn=null; const mw=$(\"#mwnav\"); if(mw) mw.hidden=true;\n  location.reload();\n});\n$(\"#lang-en\").addEventListener(\"click\",()=>{lang=\"en\";applyLang();});\n$(\"#lang-tr\").addEventListener(\"click\",()=>{lang=\"tr\";applyLang();});\n$(\"#q\").addEventListener(\"input\",e=>{query=e.target.value;renderBody();});\n$(\"#chips\").addEventListener(\"click\",e=>{const b=e.target.closest(\".chip\");if(!b)return;filter=b.dataset.f;renderChips();renderBody();});\n$(\"#tbody\").addEventListener(\"click\",e=>{\n  const b=e.target.closest(\".qstep\"); if(!b) return;\n  const wrap=b.closest(\".qtywrap\"), inp=wrap&&wrap.querySelector(\".qty\"); if(!inp) return;\n  const v=Math.max(0,(Math.floor(+inp.value)||0)+(b.classList.contains(\"qplus\")?1:-1));\n  inp.value=v||\"\";\n  inp.dispatchEvent(new Event(\"input\",{bubbles:true}));\n});\n$(\"#tbody\").addEventListener(\"input\",e=>{\n  const i=e.target.closest(\".qty\"); if(!i)return;\n  const id=+i.dataset.id, v=Math.max(0,Math.floor(+i.value||0));\n  qty[id]=v;\n  const tr=i.closest(\"tr\"); tr.classList.toggle(\"has-qty\",v>0);\n  const d=DATA.find(x=>x.id===id);\n  [\"tusd\",\"teur\",\"units\",\"pallets\",\"tcbm\",\"tnet\",\"tgross\"].forEach(k=>{\n    const idx=COLS.findIndex(c=>c.k===k); if(idx>=0) tr.children[idx].innerHTML=cell(d,k);\n  });\n  renderStats();\n});\n\/* chosen products rise to the top \u2014 but only once the customer has left the\n   quantity boxes altogether, so the list never jumps while they hop between rows *\/\n$(\"#tbody\").addEventListener(\"change\",e=>{\n  if(!e.target.closest(\".qty\")) return;\n  setTimeout(()=>{\n    const ae=document.activeElement;\n    if(ae && ae.closest && ae.closest(\"#tbody\") && ae.classList && ae.classList.contains(\"qty\")) return;\n    renderBody();\n  },80);\n});\n$(\"#tbody\").addEventListener(\"click\",e=>{\n  const img=e.target.closest(\".thumb\"); if(!img)return;\n  $(\"#lbimg\").src=img.src; $(\"#lb\").classList.add(\"on\");\n});\n$(\"#lb\").addEventListener(\"click\",()=>$(\"#lb\").classList.remove(\"on\"));\n(function(){\n  const tw=$(\"#tablewrap\"), st=$(\"#scrolltop\");\n  let lock=false;\n  tw.addEventListener(\"scroll\",()=>{ if(lock)return; lock=true; st.scrollLeft=tw.scrollLeft; lock=false; });\n  st.addEventListener(\"scroll\",()=>{ if(lock)return; lock=true; tw.scrollLeft=st.scrollLeft; lock=false; });\n  window.addEventListener(\"resize\",syncScrollbars);\n})();\n$(\"#cont-type\").addEventListener(\"change\",e=>{ contType=e.target.value; renderStats(); });\n$(\"#cont-n\").addEventListener(\"input\",e=>{ contCount=Math.max(1,Math.floor(+e.target.value||1)); renderStats(); });\n$(\"#btn-continfo\").addEventListener(\"click\",showContainerInfo);\n$(\"#info-x\").addEventListener(\"click\",()=>{ $(\"#infosheet\").classList.remove(\"on\"); document.body.style.overflow=\"\"; });\n$(\"#infosheet\").addEventListener(\"click\",e=>{ if(e.target.id===\"infosheet\"){ $(\"#infosheet\").classList.remove(\"on\"); document.body.style.overflow=\"\"; }});\n$(\"#lm-floor\").addEventListener(\"click\",()=>setLoading(false));\n$(\"#lm-pal\").addEventListener(\"click\",()=>setLoading(true));\n$(\"#pal-type\").addEventListener(\"change\",e=>{ palletType=e.target.value; renderPalletUI(); renderStats(); });\n$(\"#pal-kg\").addEventListener(\"input\",e=>{ const v=parseFloat(e.target.value); palletKg=isNaN(v)?0:Math.max(0,v); renderBody(); renderStats(); });\n$(\"#btn-reset\").addEventListener(\"click\",()=>{\n  Object.keys(qty).forEach(k=>delete qty[k]);\n  query=\"\"; $(\"#q\").value=\"\"; filter=\"all\"; renderChips(); renderAll();\n});\n$(\"#cat-prev\").addEventListener(\"click\",()=>stepCat(-1));\n$(\"#cat-next\").addEventListener(\"click\",()=>stepCat(1));\n\/* pause while the pointer is on it, so a page can actually be read *\/\n$(\"#catstage\").addEventListener(\"pointerenter\",()=>clearInterval(catTimer));\n$(\"#catstage\").addEventListener(\"pointerleave\",()=>{ if(catPages.length) startCat(); });\n$(\"#msgfold\").addEventListener(\"click\",()=>setMsgFold(!document.getElementById(\"msgside\").classList.contains(\"folded\"),true));\n$(\"#w-enter\").addEventListener(\"click\",openApp);\n$(\"#w-signout\").addEventListener(\"click\",()=>{\n  try{ sessionStorage.removeItem(\"claimont-acct\"); }catch(e){}\n  document.body.classList.remove(\"mwiz\"); wizOn=null; const mw=$(\"#mwnav\"); if(mw) mw.hidden=true;\n  location.reload();\n});\n$(\"#w-en\").addEventListener(\"click\",()=>{lang=\"en\";renderWelcome();\n  $(\"#w-en\").setAttribute(\"aria-pressed\",\"true\");$(\"#w-tr\").setAttribute(\"aria-pressed\",\"false\");});\n$(\"#w-tr\").addEventListener(\"click\",()=>{lang=\"tr\";renderWelcome();\n  $(\"#w-tr\").setAttribute(\"aria-pressed\",\"true\");$(\"#w-en\").setAttribute(\"aria-pressed\",\"false\");});\n$(\"#msgsend\").addEventListener(\"click\",sendMessage);\n$(\"#msgtext\").addEventListener(\"keydown\",e=>{\n  if(e.key===\"Enter\" && (e.metaKey||e.ctrlKey)) sendMessage();\n});\n\/* looking at the thread is what marks it read *\/\n$(\"#msgbody\").addEventListener(\"focusin\",()=>{ if(msgUnread) loadMessages(true); });\n$(\"#msgtext\").addEventListener(\"focus\",()=>{ if(msgUnread) loadMessages(true); });\n$(\"#btn-savedraft\").addEventListener(\"click\",e=>saveDraft(e.currentTarget));\n$(\"#o-savedraft\").addEventListener(\"click\",e=>saveDraft(e.currentTarget));\n$(\"#btn-xlsall\").addEventListener(\"click\",()=>{\n  saveXlsx(listWorkbook(), \"claimont-product-list-2026.xlsx\");\n});\n\/* the designed PDF edition is the printable list now; the browser print stays as fallback *\/\n$(\"#btn-printall\").addEventListener(\"click\",()=>{\n  const url=docHref(\"pricePdf\");\n  if(url) window.open(url,\"_blank\",\"noopener\");\n  else preparePrint(\"all\");\n});\n$(\"#btn-printsel\").addEventListener(\"click\",()=>preparePrint(\"sel\"));\n\/* ---------- order flow: details \u2192 confirm \u2192 sent ---------- *\/\nlet orderStep=\"details\", sending=false, lastOrderId=\"\";\nfunction showStep(step){\n  orderStep=step;\n  $(\"#step-details\").hidden = step!==\"details\";\n  $(\"#step-confirm\").hidden = step!==\"confirm\";\n  $(\"#step-done\").hidden    = step!==\"done\";\n  $(\"#o-review\").hidden = step!==\"details\";\n  $(\"#o-savedraft\").hidden = step!==\"details\";\n  $(\"#o-send\").hidden   = step!==\"confirm\";\n  $(\"#o-back\").hidden   = step!==\"confirm\";\n  $(\"#o-pdf\").hidden    = step!==\"done\";\n  $(\"#o-csv\").hidden    = step!==\"done\";\n  $(\"#o-done\").hidden   = step!==\"done\";\n  $(\"#o-x\").hidden      = step===\"done\";\n  $(\"#o-err\").textContent=\"\";\n}\nfunction applyPrefill(){\n  \/* what we already know about this account fills the blanks \u2014 every field\n     stays editable, nothing is locked *\/\n  [[\"o-company\",\"company\"],[\"o-contact\",\"contact\"],[\"o-email\",\"email\"],\n   [\"o-phone\",\"phone\"],[\"o-country\",\"country\"]].forEach(([id,k])=>{\n    const el=$(\"#\"+id);\n    if(el && !el.value.trim() && prefill[k]) el.value=prefill[k];\n  });\n}\nfunction openOrder(){\n  setTimeout(renderFitWarn,0);\n  applyPrefill();\n  showStep(\"details\");\n  $(\"#sheet\").classList.add(\"on\"); document.body.style.overflow=\"hidden\";\n  $(\"#o-company\").focus();\n}\nfunction closeOrder(){ $(\"#sheet\").classList.remove(\"on\"); document.body.style.overflow=\"\"; }\n$(\"#btn-order\").addEventListener(\"click\",openOrder);\n\/* per-customer cap: at MOST N different products for each container\/truck *\/\nfunction moqCap(){ return moqSku ? moqSku*Math.max(1,contCount) : 0; }\nfunction moqOver(){ const cap=moqCap(); return cap ? Math.max(0, orderRows().length-cap) : 0; }\n$(\"#btn-submit\").addEventListener(\"click\",()=>{\n  if(moqOver()){\n    flashSaved(T[lang].moqBlock.replace(\"{max}\", fmt(moqCap())).replace(\"{have}\", fmt(orderRows().length)), true);\n    return;\n  }\n  openOrder();\n});\n$(\"#btn-history\").addEventListener(\"click\",()=>$(\"#rail\").classList.toggle(\"on\"));\n$(\"#rail-x\").addEventListener(\"click\",()=>$(\"#rail\").classList.remove(\"on\"));\n$(\"#rail-body\").addEventListener(\"click\",e=>{\n  const b=e.target.closest(\".ordercard\"); if(!b)return;\n  $(\"#rail\").classList.remove(\"on\");\n  showPastOrder(b.dataset.oid);\n});\n$(\"#past-x\").addEventListener(\"click\",()=>{ $(\"#pastsheet\").classList.remove(\"on\"); document.body.style.overflow=\"\"; });\n$(\"#pastsheet\").addEventListener(\"click\",e=>{ if(e.target.id===\"pastsheet\"){ $(\"#pastsheet\").classList.remove(\"on\"); document.body.style.overflow=\"\"; }});\n$(\"#o-x\").addEventListener(\"click\",closeOrder);\n$(\"#o-done\").addEventListener(\"click\",()=>{ closeOrder(); });\n$(\"#sheet\").addEventListener(\"click\",e=>{ if(e.target.id===\"sheet\" && orderStep!==\"done\") closeOrder(); });\n$(\"#o-back\").addEventListener(\"click\",()=>showStep(\"details\"));\n\nconst val = id => ($(\"#\"+id).value||\"\").trim();\nfunction validate(){\n  const t=T[lang];\n  const checks=[[\"o-company\",t.needCompany],[\"o-email\",t.needEmail],[\"o-phone\",t.needPhone]];\n  [\"o-company\",\"o-email\",\"o-phone\"].forEach(id=>$(\"#\"+id).classList.remove(\"bad\"));\n  for(const [id,msg] of checks){\n    if(!val(id)){ fail(id,msg); return false; }\n  }\n  if(!\/^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$\/.test(val(\"o-email\"))){ fail(\"o-email\",t.badEmail); return false; }\n  if(val(\"o-phone\").replace(\/[^0-9]\/g,\"\").length<7){ fail(\"o-phone\",t.badPhone); return false; }\n  $(\"#o-err\").textContent=\"\";\n  return true;\n}\nfunction fail(id,msg){ $(\"#o-err\").textContent=msg; $(\"#\"+id).classList.add(\"bad\"); $(\"#\"+id).focus(); }\n\n\/* ---------- catalogue snapshot --------------------------------------------\n   Pages of the printed catalogue, cycling slowly beside the price list \u2014 it is\n   there to remind people what the products actually look like. The images live\n   in one uploaded file, like the product photos, so the page stays small. *\/\nconst CAT_PAGES_URL = \"https:\/\/claimont.com\/wp-content\/uploads\/2026\/08\/claimont-catalogue.txt\";\nlet settings={};\n\/* The catalogue address is whatever Claimont last published, so a new edition\n   reaches customers without this page being touched. *\/\nfunction loadSettings(){\n  return api({action:\"getSettings\"})\n    .then(r=>{\n      if(!r||!r.ok) return;\n      settings=r.settings||{};\n      renderCatLink();\n      if(!$(\"#welcome\").hidden) renderDocCards();\n      if(settings.cataloguePagesUrl && !catPages.length) loadCatalogue(settings.cataloguePagesUrl);\n    })\n    .catch(()=>{});\n}\nfunction catalogueHref(){\n  \/* whatever Claimont last uploaded, else the address this page was built with *\/\n  return settings.catalogueUrl || (CATALOGUE_URL.indexOf(\"__\")===0 ? \"\" : CATALOGUE_URL);\n}\nfunction renderCatLink(){\n  const t=T[lang], a=$(\"#catlink\"), url=catalogueHref();\n  a.hidden=!url;\n  if(!url) return;\n  a.href=url;\n  $(\"#catlink-t\").textContent=t.catOpenFull;\n  $(\"#catlink-s\").textContent = settings.catalogueUpdated\n    ? t.catUpdated.replace(\"{when}\", String(settings.catalogueUpdated).slice(0,10)) : \"\";\n}\nlet catPages=[], catIdx=0, catTimer=null;\nconst CAT_EVERY=5000;\n\nfunction loadCatalogue(url){\n  const src = url || CAT_PAGES_URL;\n  if(!src || src.indexOf(\"__\")===0) return;\n  fetch(src,{credentials:\"same-origin\"})\n    .then(r=>r.ok?r.json():Promise.reject())\n    .then(list=>{\n      if(!Array.isArray(list)||!list.length) return;\n      catPages=list; catIdx=0;\n      $(\"#catside\").hidden=false;\n      renderCatDots(); showCatPage(0); startCat();\n    })\n    .catch(()=>{});\n}\nfunction renderCatDots(){\n  $(\"#catdots\").innerHTML = catPages.length<=24\n    ? catPages.map((_,i)=>`<span class=\"catdot${i===catIdx?\" on\":\"\"}\"><\/span>`).join(\"\") : \"\";\n}\nfunction showCatPage(i){\n  if(!catPages.length) return;\n  catIdx=(i+catPages.length)%catPages.length;\n  const img=$(\"#catimg\");\n  img.classList.remove(\"in\");\n  const next=new Image();\n  next.onload=()=>{ img.src=next.src; requestAnimationFrame(()=>img.classList.add(\"in\")); };\n  next.src=catPages[catIdx];\n  $(\"#catpage\").textContent=`${catIdx+1} \/ ${catPages.length}`;\n  renderCatDots();\n}\nfunction startCat(){\n  clearInterval(catTimer);\n  catTimer=setInterval(()=>showCatPage(catIdx+1), CAT_EVERY);\n}\n\/* stepping by hand restarts the clock rather than fighting it *\/\nfunction stepCat(n){ showCatPage(catIdx+n); startCat(); }\n\n\/* ---- collapse \/ expand the conversation panel ---- *\/\nconst MSGFOLD_KEY=\"claimont-msgfold\";\nfunction setMsgFold(on,save){\n  const side=document.getElementById(\"msgside\");\n  if(!side) return;\n  side.classList.toggle(\"folded\",!!on);\n  const btn=document.getElementById(\"msgfold\");\n  if(btn){\n    btn.setAttribute(\"aria-expanded\",on?\"false\":\"true\");\n    btn.setAttribute(\"aria-label\", on ? T[lang].msgExpand : T[lang].msgCollapse);\n  }\n  if(save){ try{ localStorage.setItem(MSGFOLD_KEY,on?\"1\":\"0\"); }catch(e){} }\n}\n(function(){ try{ if(localStorage.getItem(MSGFOLD_KEY)===\"1\")\n  document.addEventListener(\"DOMContentLoaded\",()=>setMsgFold(true,false)); }catch(e){} })();\n\/* ---------- messages ------------------------------------------------------\n   One conversation with Claimont, held on the service rather than in this\n   browser so both sides always see the same thread. *\/\nlet msgs=[], msgUnread=0, msgSending=false;\n\nasync function loadMessages(markRead){\n  try{\n    const r=await api({action:\"listMessages\", code:unlockCode});\n    if(!r||!r.ok) return;\n    msgs=r.messages||[]; msgUnread=r.unread||0;\n    renderMessages();\n    if(markRead && msgUnread){\n      await api({action:\"readMessages\", code:unlockCode});\n      msgUnread=0; renderMessages();\n    }\n  }catch(e){}\n}\nfunction renderMessages(){\n  const t=T[lang];\n  $(\"#msglbl\").textContent=t.messages;\n  $(\"#msgn\").hidden = !msgUnread; $(\"#msgn\").textContent = msgUnread>99?\"99+\":msgUnread;\n  $(\"#msgtext\").placeholder=t.msgPlaceholder;\n  $(\"#msgsend\").textContent=t.msgSend;\n  $(\"#msgform\").hidden=false;\n  const body=$(\"#msgbody\");\n  const nearBottom = body.scrollHeight - body.scrollTop - body.clientHeight < 40;\n  body.innerHTML = msgs.length ? msgs.map(m=>`\n    <div class=\"bub ${m.from===\"customer\"?\"mine\":\"\"}\">${esc(m.text)}\n      <span class=\"meta\">${m.from===\"customer\"?t.msgYou:esc(m.author||\"Claimont\")} \u00b7 ${esc(String(m.when).slice(5,16))}<\/span>\n    <\/div>`).join(\"\") : `<div class=\"msgempty\">${t.msgEmpty}<\/div>`;\n  if(nearBottom) body.scrollTop = body.scrollHeight;\n}\nasync function sendMessage(){\n  const box=$(\"#msgtext\"), text=box.value.trim(), t=T[lang];\n  if(!text || msgSending) return;\n  msgSending=true; $(\"#msgsend\").disabled=true;\n  try{\n    const r=await api({action:\"sendMessage\", code:unlockCode, text:text});\n    if(!r||!r.ok) throw 0;\n    box.value=\"\"; await loadMessages(true);\n  }catch(e){ box.placeholder=t.msgFailed; }\n  finally{ msgSending=false; $(\"#msgsend\").disabled=false; }\n}\n\n\/* ---------- drafts ---------------------------------------------------------\n   One basket per customer, held by the backend rather than this browser, so it\n   survives a different device and Claimont can see it was started. *\/\nlet pendingDraft=null, savingDraft=false;\n\nfunction draftPayload(){\n  const t=totals(), g=id=>($(\"#\"+id).value||\"\").trim();\n  return {\n    company:g(\"o-company\"), contact:g(\"o-contact\"), email:g(\"o-email\"),\n    phone:g(\"o-phone\"), country:g(\"o-country\"), notes:g(\"o-notes\"),\n    loading: palletised ? `Palletised (${PALLET_TYPES[palletType]}, ${palletKg} kg)` : \"Floor loaded\",\n    lines:t.lines, cartons:t.cartons, cbm:+t.cbm.toFixed(3), grossKg:+t.gross.toFixed(1),\n    totalUSD:+t.usd.toFixed(2),\n    items: orderRows().map(d=>({\n      id:d.id, ref:d.ref, name:(lang===\"tr\"?d.brandTr+\" \"+d.nameTr:d.brand+\" \"+d.name),\n      g:d.g, cartons:qty[d.id], units:qty[d.id]*d.upc,\n      cartonUSD:+net(d.pc).toFixed(4), total:+(qty[d.id]*net(d.pc)).toFixed(2)\n    }))\n  };\n}\nasync function saveDraft(btn){\n  const t=T[lang];\n  if(savingDraft) return;\n  if(!orderRows().length){ flashSaved(t.draftEmpty,true); return; }\n  savingDraft=true;\n  const label=btn?btn.textContent:null;\n  if(btn){ btn.disabled=true; btn.textContent=t.draftSaving; }\n  try{\n    const r=await api({action:\"saveDraft\", code:unlockCode, order:draftPayload()});\n    if(!r||!r.ok) throw 0;\n    flashSaved(t.draftSaved.replace(\"{when}\", String(r.savedAt||\"\").slice(11,16)));\n    $(\"#draftbar\").hidden=true; pendingDraft=null;\n  }catch(e){ flashSaved(t.draftFailed,true); }\n  finally{ savingDraft=false; if(btn){ btn.disabled=false; btn.textContent=label; } }\n}\nfunction flashSaved(msg,bad){\n  const bar=$(\"#submitbar\"); let el=bar.querySelector(\".savedtick\");\n  if(!el){ el=document.createElement(\"span\"); el.className=\"savedtick\"; bar.insertBefore(el,bar.firstChild); }\n  el.textContent=msg; el.style.color = bad ? \"var(--crit)\" : \"var(--good)\";\n  clearTimeout(window.__savedT); window.__savedT=setTimeout(()=>{ el.textContent=\"\"; },6000);\n}\n\/* offer the saved basket back rather than silently overwriting what they type *\/\nasync function checkDraft(){\n  try{\n    const r=await api({action:\"getDraft\", code:unlockCode});\n    if(!r||!r.ok||!r.draft) return;\n    pendingDraft=r.draft;\n    renderDraftbar();\n  }catch(e){}\n}\nfunction renderDraftbar(){\n  const t=T[lang], bar=$(\"#draftbar\");\n  if(!pendingDraft){ bar.hidden=true; return; }\n  bar.hidden=false;\n  bar.innerHTML = `<span><b>${t.draftFound}<\/b>${t.draftFoundSub\n      .replace(\"{when}\", esc(pendingDraft.updated))\n      .replace(\"{lines}\", fmt(pendingDraft.lines))\n      .replace(\"{cartons}\", fmt(pendingDraft.cartons))}<\/span>`\n    + `<span class=\"spacer\"><\/span>`\n    + `<button class=\"btn\" id=\"draft-open\">${t.draftResume}<\/button>`\n    + `<button class=\"btn\" id=\"draft-drop\">${t.draftDiscard}<\/button>`;\n  $(\"#draft-open\").addEventListener(\"click\",resumeDraft);\n  $(\"#draft-drop\").addEventListener(\"click\",async()=>{\n    bar.hidden=true;\n    try{ await api({action:\"dropDraft\", code:unlockCode}); }catch(e){}\n    pendingDraft=null;\n  });\n}\nfunction resumeDraft(){\n  const d=pendingDraft; if(!d) return;\n  Object.keys(qty).forEach(k=>delete qty[k]);\n  (d.items||[]).forEach(i=>{ const p=(i.ref!=null && DATA.find(x=>String(x.ref)===String(i.ref)))||byId(i.id); if(p) qty[p.id]=i.cartons; });\n  [[\"o-company\",\"company\"],[\"o-contact\",\"contact\"],[\"o-email\",\"email\"],\n   [\"o-phone\",\"phone\"],[\"o-country\",\"country\"],[\"o-notes\",\"notes\"]]\n    .forEach(([id,k])=>{ const el=$(\"#\"+id); if(el&&d[k]) el.value=d[k]; });\n  if(\/palletised\/i.test(d.loading||\"\")) setLoading(true);\n  $(\"#draftbar\").hidden=true; pendingDraft=null;\n  renderAll(); renderChips();\n  flashSaved(T[lang].draftResumed);\n}\n\n\/* the same red flag, shown inside the order window before they confirm *\/\nfunction renderFitWarn(){\n  const t=totals(), L=T[lang];\n  const fr=t.lines?fitReport(t):null;\n  const over = fr && (fr.state===\"over\" || fr.overWeight);\n  [\"fitwarn-1\",\"fitwarn-2\"].forEach(id=>{\n    const el=document.getElementById(id); if(!el) return;\n    el.hidden=!over;\n    if(over) el.textContent=\"\\u26A0 \"+(fr.overWeight&&fr.state!==\"over\"?L.fitFlagW:L.fitFlag)\n      .replace(\"{n}\", fmt(Math.max(1,contCount)))\n      .replace(\"{type}\", fr.c.name)\n      .replace(\"{need}\", fmt(fr.need));\n  });\n}\nfunction orderPayload(){\n  const t=totals();\n  return {\n    company:val(\"o-company\"), contact:val(\"o-contact\"), email:val(\"o-email\"),\n    phone:val(\"o-phone\"), country:val(\"o-country\"), notes:val(\"o-notes\"),\n    loading: palletised ? `Palletised (${PALLET_TYPES[palletType]}, ${palletKg} kg)` : \"Floor loaded\",\n    lines:t.lines, cartons:t.cartons, pallets:+t.pallets.toFixed(palletised?0:2),\n    cbm:+t.cbm.toFixed(3), grossKg:+t.gross.toFixed(1),\n    listUSD:+t.list.toFixed(2), totalUSD:+t.usd.toFixed(2),\n    container: (()=>{ const f=fitReport(t), n=Math.max(1,contCount);\n      return { type:f.c.name, count:n, fillPct:+f.pct.toFixed(1), needed:f.need,\n               state:f.state, inner:f.c.inner }; })(),\n    items: orderRows().map(d=>({\n      id:d.id, ref:d.ref, name:(lang===\"tr\"?d.brandTr+\" \"+d.nameTr:d.brand+\" \"+d.name),\n      g:d.g, upc:d.upc, cartons:qty[d.id], units:qty[d.id]*d.upc,\n      listCartonUSD:+(+d.pc).toFixed(4),\n      unitUSD:+net(d.pu).toFixed(4), cartonUSD:+net(d.pc).toFixed(4),\n      cbm:+(qty[d.id]*d.cbm).toFixed(3),\n      grossKg:+(qty[d.id]*d.gross).toFixed(1),\n      total:+(qty[d.id]*net(d.pc)).toFixed(2)\n    }))\n  };\n}\nfunction renderConfirm(){\n  renderFitWarn();\n  const t=T[lang], o=orderPayload(), tt=totals();\n  $(\"#c-h\").textContent=t.confirmTitle;\n  $(\"#c-ct-h\").textContent=t.confirmContact;\n  $(\"#c-tt-h\").textContent=t.confirmTotals;\n  $(\"#c-items-h\").textContent=t.confirmItems.replace(\"{n}\", fmt(tt.lines));\n  const line=(k,v)=>v?`<dt>${k}<\/dt><dd>${esc(v)}<\/dd>`:\"\";\n  $(\"#c-list\").innerHTML =\n    line(t.company,o.company)+line(t.contact,o.contact)+\n    line(t.email,o.email)+line(t.phone,o.phone)+\n    line(t.country,o.country)+line(t.loading,o.loading)+\n    (o.notes?line(t.fNotes,o.notes):\"\");\n  $(\"#c-tots\").innerHTML =\n    line(t.stats.lines,fmt(tt.lines))+\n    line(t.stats.cartons,fmt(tt.cartons))+\n    (palletised?line(t.stats.pallets,fmt(tt.pallets,0)):\"\")+\n    line(t.stats.cbm,fmt(tt.cbm,2)+\" m\u00b3\")+\n    line(t.stats.gross,fmt(tt.gross,1)+\" kg\")+\n    `<dt>${t.stats.usd}<\/dt><dd class=\"total\">${discount?`<span class=\"was\">$${fmt(tt.list,2)}<\/span> `:\"\"}$${fmt(tt.usd,2)}<\/dd>`;\n  $(\"#c-items\").innerHTML =\n    `<thead><tr><th><\/th><th>${t.cols.ref}<\/th><th>${t.cols.name}<\/th><th class=\"n\">${t.cols.g}<\/th>\n     <th class=\"n\">${t.cols.qty}<\/th><th class=\"n\">${t.cols.units}<\/th>\n     <th class=\"n\">${t.cols.pc}<\/th><th class=\"n\">${t.cols.tusd}<\/th><\/tr><\/thead><tbody>`+\n    orderRows().map(d=>{\n      const q=qty[d.id], pc=net(d.pc);\n      return `<tr><td class=\"ph\">${d.img?`<img decoding=\"async\" src=\"${d.img}\" alt=\"\">`:\"\"}<\/td>\n        <td class=\"rf\">${esc(d.ref||\"\u2014\")}<\/td>\n        <td><b>${esc(lang===\"tr\"?d.brandTr:d.brand)}<\/b> ${esc(lang===\"tr\"?d.nameTr:d.name)}<\/td>\n        <td class=\"n\">${fmt(d.g)} g<\/td><td class=\"n\">${fmt(q)}<\/td><td class=\"n\">${fmt(q*d.upc)}<\/td>\n        <td class=\"n\">$${fmt(pc,2)}<\/td><td class=\"n\"><b>$${fmt(q*pc,2)}<\/b><\/td><\/tr>`;\n    }).join(\"\")+\n    `<\/tbody><tfoot><tr><td colspan=\"4\"><\/td><td class=\"n\">${fmt(tt.cartons)}<\/td>\n     <td class=\"n\">${fmt(tt.units)}<\/td><td><\/td><td class=\"n\">$${fmt(tt.usd,2)}<\/td><\/tr><\/tfoot>`;\n  $(\"#c-howto\").innerHTML=t.confirmHowto;\n}\n$(\"#o-review\").addEventListener(\"click\",()=>{\n  if(!validate()) return;\n  renderConfirm(); showStep(\"confirm\");\n});\n$(\"#o-send\").addEventListener(\"click\",async ()=>{\n  if(sending) return;\n  const t=T[lang], btn=$(\"#o-send\");\n  sending=true; btn.disabled=true; btn.textContent=t.sending; $(\"#o-err\").textContent=\"\";\n  try{\n    if(moqOver()){\n      $(\"#o-err\").textContent=T[lang].moqBlock.replace(\"{max}\", fmt(moqCap())).replace(\"{have}\", fmt(orderRows().length));\n      sending=false; btn.disabled=false; btn.textContent=t.sendBtn; return;\n    }\n    const r=await api({action:\"order\", code:unlockCode, order:orderPayload()});\n    if(!r||!r.ok) throw 0;\n    lastOrderId=r.orderId||\"\";\n    loadMyOrders();\n    const fn=custFirst();\n    $(\"#d-h\").textContent = fn ? t.doneTitleName.replace(\"{name}\", fn) : t.doneTitle;\n    $(\"#d-p\").textContent=t.doneText;\n    $(\"#d-id\").textContent=lastOrderId;\n    \/* honest about the email: the order is saved either way, but if the mail\n       could not go out, the customer should not believe it did *\/\n    const mw=$(\"#d-mail\");\n    if(r.emailed===false){ mw.hidden=false; mw.textContent=t.doneMailWarn; }\n    else mw.hidden=true;\n    showStep(\"done\");\n  }catch(e){\n    $(\"#o-err\").textContent=t.sendFailed;\n  }finally{\n    sending=false; btn.disabled=false; btn.textContent=t.sendBtn;\n  }\n});\n$(\"#o-pdf\").addEventListener(\"click\",()=>{ closeOrder(); setTimeout(()=>preparePrint(\"sel\"),80); });\n$(\"#o-csv\").addEventListener(\"click\",()=>{\n  saveXlsx(orderWorkbook(), `claimont-order-${lastOrderId||account}.xlsx`);\n});\n\n$(\"#btn-cat\").addEventListener(\"click\",()=>{\n  \/* whatever Claimont last published wins; the build-time address is the fallback *\/\n  const url = catalogueHref();\n  const ok = !!url;\n  $(\"#cat-frame\").hidden=!ok; $(\"#cat-miss\").hidden=ok; $(\"#cat-open\").hidden=!ok;\n  if(ok){ $(\"#cat-frame\").src=url; $(\"#cat-open\").href=url; }\n  $(\"#cat\").classList.add(\"on\");\n});\n$(\"#cat-x\").addEventListener(\"click\",()=>{ $(\"#cat\").classList.remove(\"on\"); $(\"#cat-frame\").src=\"about:blank\"; });\ndocument.addEventListener(\"keydown\",e=>{\n  if(e.key!==\"Escape\")return;\n  $(\"#lb\").classList.remove(\"on\");\n  if($(\"#cat\").classList.contains(\"on\")){ $(\"#cat\").classList.remove(\"on\"); $(\"#cat-frame\").src=\"about:blank\"; }\n  if($(\"#sheet\").classList.contains(\"on\")) closeOrder();\n});\n\nfunction loadRate(){\n  fetch(\"https:\/\/api.frankfurter.dev\/v1\/latest?base=USD&symbols=EUR\")\n    .then(r=>r.ok?r.json():Promise.reject())\n    .then(j=>{\n      if(!(j&&j.rates&&j.rates.EUR)) throw 0;\n      rate=j.rates.EUR; rateSource=\"live\"; rateDate=j.date;\n      $(\"#fxrate\").textContent=rate.toFixed(4);\n      applyLang();\n    }).catch(()=>{ rateSource=\"fallback\"; applyLang(); });\n}\n\n\/* resume a session that already unlocked *\/\n(function(){\n  applyLang();\n  let saved=null;\n  try{ saved=JSON.parse(sessionStorage.getItem(\"claimont-acct\")||\"null\"); }catch(e){}\n  if(saved && saved.code){ $(\"#g-code\").value=saved.code; submitCode(); }\n})();\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Claimont Order Portal CLAIMONT Customer orders Snacks the world comes back for Enter your access code Use the code Claimont gave you. It unlocks the product list, prices and the order sheet for your account. Unlock No code yet? Email export@claimont.com and we&#8217;ll issue one. English T\u00fcrk\u00e7e CLAIMONTCustomer orders Sign out EN TR Welcome View [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_joinchat":[],"footnotes":""},"class_list":["post-4862","page","type-page","status-publish","hentry"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":8}},"_links":{"self":[{"href":"https:\/\/claimont.com\/tr\/wp-json\/wp\/v2\/pages\/4862","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/claimont.com\/tr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/claimont.com\/tr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/claimont.com\/tr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/claimont.com\/tr\/wp-json\/wp\/v2\/comments?post=4862"}],"version-history":[{"count":60,"href":"https:\/\/claimont.com\/tr\/wp-json\/wp\/v2\/pages\/4862\/revisions"}],"predecessor-version":[{"id":5499,"href":"https:\/\/claimont.com\/tr\/wp-json\/wp\/v2\/pages\/4862\/revisions\/5499"}],"wp:attachment":[{"href":"https:\/\/claimont.com\/tr\/wp-json\/wp\/v2\/media?parent=4862"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}