{"id":262,"date":"2026-05-26T11:04:32","date_gmt":"2026-05-26T11:04:32","guid":{"rendered":"https:\/\/marketplace.dbaasltd.com\/?page_id=262"},"modified":"2026-05-26T11:54:18","modified_gmt":"2026-05-26T11:54:18","slug":"basket","status":"publish","type":"page","link":"https:\/\/brithaventech.co.uk\/index.php\/basket\/","title":{"rendered":"Basket"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"262\" class=\"elementor elementor-262\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-e05920e elementor-section-full_width elementor-section-stretched elementor-section-height-default elementor-section-height-default\" data-id=\"e05920e\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;stretch_section&quot;:&quot;section-stretched&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-c80bbe6\" data-id=\"c80bbe6\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-cc31644 elementor-widget elementor-widget-shortcode\" data-id=\"cc31644\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Basket \u2014 BritHaven Tech<\/title>\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Syne:wght@400;500;600;700;800&family=DM+Sans:ital,wght@0,300;0,400;0,500;0,600;1,400&display=swap\" rel=\"stylesheet\">\n<style>\n*{box-sizing:border-box;margin:0;padding:0}\n:root{\n  --ink:#0A0F1E;--navy:#0C1A4B;--navy2:#112266;\n  --blue:#1547E8;--blue2:#0F39C8;--blue-lt:#EBF0FF;\n  --white:#FFFFFF;--g50:#F7F8FC;--g100:#EDEEF4;\n  --g200:#D8DAE8;--g400:#9BA3BF;--g600:#5C6480;--g700:#3A405A;\n  --green:#0B7A45;--green-lt:#E6F5EE;\n  --red:#C0272D;--red-lt:#FEF0F0;\n  --amber:#B45309;--amber-lt:#FFF8ED;\n  --purple:#5B21B6;--purple-lt:#F3F0FF;\n  --teal:#0F766E;--teal-lt:#EDFAF8;\n  --shadow-xs:0 1px 2px rgba(10,15,30,0.06);\n  --shadow-sm:0 2px 8px rgba(10,15,30,0.08);\n  --shadow-md:0 6px 20px rgba(10,15,30,0.10);\n  --shadow-lg:0 16px 48px rgba(10,15,30,0.14);\n  --r4:4px;--r6:6px;--r8:8px;--r10:10px;--r12:12px;--r16:16px;\n}\nbody{font-family:'DM Sans',sans-serif;background:var(--g50);color:var(--ink);font-size:14px;min-height:100vh}\n\n\/* \u2500\u2500 TOPBAR \u2500\u2500 *\/\n.topbar{background:var(--navy);padding:7px 24px;display:flex;justify-content:space-between;align-items:center;font-size:11.5px;color:rgba(255,255,255,0.65)}\n.tb-r{display:flex;gap:18px;align-items:center}\n.tb-r span{cursor:pointer;transition:color 0.15s}\n.tb-r span:hover{color:#fff}\n.tb-badge{background:rgba(255,255,255,0.12);border:1px solid rgba(255,255,255,0.15);border-radius:20px;padding:2px 10px;font-size:10.5px;font-weight:600;letter-spacing:0.03em;color:rgba(255,255,255,0.9)}\n\n\/* \u2500\u2500 HEADER \u2500\u2500 *\/\n.header{background:#fff;border-bottom:1px solid var(--g100);position:sticky;top:0;z-index:500;box-shadow:var(--shadow-xs)}\n.header-inner{max-width:1440px;margin:0 auto;padding:0 24px;height:64px;display:grid;grid-template-columns:auto 1fr auto;gap:24px;align-items:center}\n.logo{display:flex;align-items:center;gap:10px;text-decoration:none;flex-shrink:0;cursor:pointer}\n.logo-mark{width:36px;height:36px;background:var(--navy);border-radius:var(--r8);display:flex;align-items:center;justify-content:center;font-family:'Syne',sans-serif;font-weight:800;font-size:12px;color:#fff;letter-spacing:-0.02em}\n.logo-text{font-family:'Syne',sans-serif;font-weight:700;font-size:17px;color:var(--navy);letter-spacing:-0.03em}\n.logo-text em{color:var(--blue);font-style:normal}\n.search-wrap{display:flex;background:var(--g50);border:1.5px solid var(--g200);border-radius:var(--r8);overflow:hidden;transition:border-color 0.2s,box-shadow 0.2s}\n.search-wrap:focus-within{border-color:var(--blue);box-shadow:0 0 0 3px rgba(21,71,232,0.08);background:#fff}\n.search-input{flex:1;padding:10px 16px;border:none;background:transparent;font-family:'DM Sans',sans-serif;font-size:13px;color:var(--ink);outline:none}\n.search-input::placeholder{color:var(--g400)}\n.search-btn{padding:10px 20px;background:var(--blue);color:#fff;font-size:13px;font-weight:600;font-family:'DM Sans',sans-serif;border:none;cursor:pointer;transition:background 0.2s;display:flex;align-items:center;gap:6px}\n.search-btn:hover{background:var(--blue2)}\n.header-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}\n.h-btn{display:flex;align-items:center;gap:6px;padding:8px 12px;border-radius:var(--r8);font-size:12.5px;font-weight:500;color:var(--g700);cursor:pointer;transition:all 0.15s;border:none;background:none;font-family:'DM Sans',sans-serif;white-space:nowrap}\n.h-btn:hover{background:var(--g50);color:var(--ink)}\n.cart-chip{display:flex;align-items:center;gap:7px;padding:8px 14px;background:var(--blue);color:#fff;border-radius:var(--r8);font-size:12.5px;font-weight:600;cursor:pointer;transition:all 0.2s;font-family:'DM Sans',sans-serif;border:none}\n.cart-chip:hover{background:var(--blue2)}\n.cart-count{background:rgba(255,255,255,0.25);border-radius:12px;padding:1px 7px;font-size:10px;font-weight:700}\n.h-contact{padding:8px 16px;background:var(--navy);color:#fff;border-radius:var(--r8);font-size:12.5px;font-weight:600;cursor:pointer;transition:background 0.2s;border:none;font-family:'DM Sans',sans-serif;white-space:nowrap}\n.h-contact:hover{background:var(--navy2)}\n\n\/* \u2500\u2500 NAV \u2500\u2500 *\/\n.nav{background:#fff;border-bottom:2px solid var(--navy)}\n.nav-inner{max-width:1440px;margin:0 auto;padding:0 24px;display:flex;align-items:center;gap:0;overflow-x:auto;scrollbar-width:none}\n.nav-inner::-webkit-scrollbar{display:none}\n.nav-lnk{padding:14px 16px;font-size:13px;font-weight:500;color:var(--g700);cursor:pointer;display:flex;align-items:center;gap:5px;border-bottom:3px solid transparent;margin-bottom:-2px;transition:all 0.15s;white-space:nowrap;font-family:'DM Sans',sans-serif}\n.nav-lnk:hover{color:var(--blue);border-bottom-color:var(--blue)}\n\n\/* \u2500\u2500 BREADCRUMB \u2500\u2500 *\/\n.breadcrumb{max-width:1440px;margin:0 auto;padding:16px 24px 0;display:flex;align-items:center;gap:6px;font-size:12px;color:var(--g400)}\n.bc-link{cursor:pointer;transition:color 0.15s}\n.bc-link:hover{color:var(--blue)}\n.bc-sep{color:var(--g200)}\n.bc-cur{color:var(--g700);font-weight:500}\n\n\/* \u2500\u2500 PAGE HEADER \u2500\u2500 *\/\n.page-head{max-width:1440px;margin:0 auto;padding:20px 24px 28px}\n.ph-row{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;flex-wrap:wrap}\n.ph-left{}\n.ph-tag{font-size:10.5px;font-weight:700;color:var(--blue);text-transform:uppercase;letter-spacing:0.09em;margin-bottom:4px}\n.ph-title{font-family:'Syne',sans-serif;font-size:26px;font-weight:800;color:var(--navy);letter-spacing:-0.03em}\n.ph-sub{font-size:13px;color:var(--g600);margin-top:4px}\n.ph-continue{display:flex;align-items:center;gap:6px;font-size:13px;font-weight:600;color:var(--blue);cursor:pointer;transition:color 0.15s;border:none;background:none;font-family:'DM Sans',sans-serif}\n.ph-continue:hover{color:var(--blue2)}\n\n\/* \u2500\u2500 STEP INDICATOR \u2500\u2500 *\/\n.steps-bar{background:#fff;border-bottom:1px solid var(--g100);margin-bottom:0}\n.steps-inner{max-width:1440px;margin:0 auto;padding:0 24px;display:flex;align-items:center}\n.step{display:flex;align-items:center;gap:8px;padding:14px 20px 14px 0;position:relative;cursor:default}\n.step:not(:last-child)::after{content:'\u203a';position:absolute;right:6px;color:var(--g200);font-size:16px}\n.step-num{width:22px;height:22px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:700;flex-shrink:0}\n.step.active .step-num{background:var(--blue);color:#fff}\n.step.done .step-num{background:var(--green);color:#fff}\n.step.upcoming .step-num{background:var(--g100);color:var(--g400)}\n.step-lbl{font-size:12px;font-weight:500}\n.step.active .step-lbl{color:var(--ink);font-weight:600}\n.step.done .step-lbl{color:var(--green)}\n.step.upcoming .step-lbl{color:var(--g400)}\n\n\/* \u2500\u2500 MAIN LAYOUT \u2500\u2500 *\/\n.basket-layout{max-width:1440px;margin:0 auto;padding:24px 24px 60px;display:grid;grid-template-columns:1fr 340px;gap:24px;align-items:start}\n\n\/* \u2500\u2500 BASKET TABLE \u2500\u2500 *\/\n.basket-panel{background:#fff;border:1.5px solid var(--g100);border-radius:var(--r12);overflow:hidden;box-shadow:var(--shadow-xs)}\n.bp-head{padding:18px 24px;border-bottom:1px solid var(--g100);display:flex;align-items:center;justify-content:space-between}\n.bp-title{font-family:'Syne',sans-serif;font-size:15px;font-weight:700;color:var(--navy)}\n.bp-count{font-size:12px;color:var(--g400)}\n.bp-clear{font-size:12px;font-weight:600;color:var(--red);cursor:pointer;border:none;background:none;font-family:'DM Sans',sans-serif;transition:opacity 0.15s}\n.bp-clear:hover{opacity:0.7}\n\n\/* Basket item *\/\n.basket-item{display:grid;grid-template-columns:56px 1fr auto;gap:16px;align-items:start;padding:20px 24px;border-bottom:1px solid var(--g100);transition:background 0.15s;animation:fadeSlide 0.3s ease forwards}\n.basket-item:last-child{border-bottom:none}\n.basket-item:hover{background:var(--g50)}\n@keyframes fadeSlide{from{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}\n.bi-icon-wrap{width:56px;height:56px;background:var(--g50);border:1.5px solid var(--g100);border-radius:var(--r10);display:flex;align-items:center;justify-content:center;font-size:26px;flex-shrink:0}\n.bi-main{min-width:0}\n.bi-badges{display:flex;align-items:center;gap:6px;margin-bottom:5px;flex-wrap:wrap}\n.bi-vendor-tag{font-size:9.5px;font-weight:700;color:var(--g400);text-transform:uppercase;letter-spacing:0.06em}\n.bi-cat-tag{font-size:9px;font-weight:700;padding:2px 7px;border-radius:4px;text-transform:uppercase;letter-spacing:0.05em}\n.bi-name{font-size:13.5px;font-weight:600;color:var(--ink);line-height:1.35;margin-bottom:4px}\n.bi-desc{font-size:11.5px;color:var(--g600);line-height:1.5;margin-bottom:10px}\n.bi-meta{display:flex;align-items:center;gap:12px;flex-wrap:wrap}\n.bi-price-lbl{font-size:11px;color:var(--g600)}\n.bi-price-val{font-size:12px;font-weight:700;color:var(--ink)}\n.bi-qty-wrap{display:flex;align-items:center;gap:0;border:1.5px solid var(--g200);border-radius:var(--r6);overflow:hidden}\n.bi-qty-btn{width:28px;height:28px;border:none;background:#fff;cursor:pointer;font-size:14px;color:var(--g600);transition:all 0.15s;display:flex;align-items:center;justify-content:center;font-family:'DM Sans',sans-serif}\n.bi-qty-btn:hover{background:var(--g100);color:var(--ink)}\n.bi-qty-val{min-width:32px;text-align:center;font-size:12.5px;font-weight:600;color:var(--ink);background:#fff;border-left:1px solid var(--g200);border-right:1px solid var(--g200);height:28px;display:flex;align-items:center;justify-content:center}\n.bi-seats-wrap{display:flex;align-items:center;gap:6px}\n.bi-seats-lbl{font-size:11px;color:var(--g600)}\n.bi-seats-input{width:60px;height:28px;border:1.5px solid var(--g200);border-radius:var(--r4);padding:0 8px;font-size:12px;font-weight:600;color:var(--ink);font-family:'DM Sans',sans-serif;outline:none;transition:border-color 0.2s}\n.bi-seats-input:focus{border-color:var(--blue)}\n.bi-actions{display:flex;flex-direction:column;align-items:flex-end;gap:8px;flex-shrink:0}\n.bi-remove{width:28px;height:28px;border:1.5px solid var(--g200);border-radius:var(--r6);background:#fff;cursor:pointer;font-size:12px;color:var(--g400);display:flex;align-items:center;justify-content:center;transition:all 0.2s}\n.bi-remove:hover{border-color:var(--red);color:var(--red);background:var(--red-lt)}\n.bi-quote-tag{font-size:10px;font-weight:600;color:var(--amber);background:var(--amber-lt);padding:3px 8px;border-radius:20px;white-space:nowrap}\n.bi-save{font-size:11px;font-weight:500;color:var(--blue);cursor:pointer;border:none;background:none;font-family:'DM Sans',sans-serif;white-space:nowrap}\n.bi-save:hover{text-decoration:underline}\n\n\/* Empty basket *\/\n.basket-empty{padding:60px 24px;text-align:center}\n.be-icon{font-size:48px;margin-bottom:16px;opacity:0.4}\n.be-title{font-family:'Syne',sans-serif;font-size:18px;font-weight:700;color:var(--navy);margin-bottom:8px}\n.be-sub{font-size:13px;color:var(--g600);margin-bottom:24px;line-height:1.6}\n.be-btn{padding:12px 24px;background:var(--blue);color:#fff;border-radius:var(--r8);font-size:13px;font-weight:600;cursor:pointer;border:none;font-family:'DM Sans',sans-serif;transition:all 0.2s}\n.be-btn:hover{background:var(--blue2);transform:translateY(-1px)}\n\n\/* Recommendations strip *\/\n.rec-panel{background:#fff;border:1.5px solid var(--g100);border-radius:var(--r12);overflow:hidden;box-shadow:var(--shadow-xs);margin-top:16px}\n.rec-head{padding:16px 24px;border-bottom:1px solid var(--g100);display:flex;align-items:center;justify-content:space-between}\n.rec-title{font-size:13px;font-weight:600;color:var(--navy)}\n.rec-sub{font-size:11px;color:var(--g400)}\n.rec-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:12px;padding:16px 24px}\n.rec-card{border:1.5px solid var(--g100);border-radius:var(--r10);padding:12px;cursor:pointer;transition:all 0.2s}\n.rec-card:hover{border-color:var(--blue);box-shadow:var(--shadow-sm);transform:translateY(-2px)}\n.rc-icon{font-size:22px;margin-bottom:8px}\n.rc-vendor{font-size:9px;font-weight:700;color:var(--g400);text-transform:uppercase;letter-spacing:0.06em;margin-bottom:2px}\n.rc-name{font-size:11px;font-weight:600;color:var(--ink);line-height:1.35;margin-bottom:6px}\n.rc-add{width:100%;padding:7px;background:var(--blue);color:#fff;border:none;border-radius:var(--r4);font-size:10.5px;font-weight:600;cursor:pointer;font-family:'DM Sans',sans-serif;transition:background 0.2s}\n.rc-add:hover{background:var(--blue2)}\n.rc-add.added{background:var(--green)}\n\n\/* \u2500\u2500 ORDER SUMMARY \u2500\u2500 *\/\n.summary-panel{background:#fff;border:1.5px solid var(--g100);border-radius:var(--r12);overflow:hidden;box-shadow:var(--shadow-xs);position:sticky;top:88px}\n.sp-head{padding:16px 20px;border-bottom:1px solid var(--g100);background:var(--navy)}\n.sp-title{font-family:'Syne',sans-serif;font-size:14px;font-weight:700;color:#fff}\n.sp-body{padding:20px}\n.sp-row{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px;font-size:13px}\n.sp-row-label{color:var(--g600)}\n.sp-row-val{font-weight:500;color:var(--ink)}\n.sp-divider{border:none;border-top:1px solid var(--g100);margin:14px 0}\n.sp-total-row{display:flex;justify-content:space-between;align-items:center;padding:14px;background:var(--g50);border-radius:var(--r8);margin-bottom:16px}\n.sp-total-label{font-size:13px;font-weight:600;color:var(--navy)}\n.sp-total-val{font-family:'Syne',sans-serif;font-size:16px;font-weight:700;color:var(--navy)}\n.sp-quote-note{background:var(--amber-lt);border:1px solid rgba(180,83,9,0.15);border-radius:var(--r8);padding:10px 12px;margin-bottom:16px;font-size:11.5px;color:var(--amber);line-height:1.5}\n.sp-cta-primary{width:100%;padding:14px;background:var(--navy);color:#fff;border:none;border-radius:var(--r8);font-size:13.5px;font-weight:700;cursor:pointer;font-family:'DM Sans',sans-serif;transition:all 0.2s;letter-spacing:-0.01em;margin-bottom:8px}\n.sp-cta-primary:hover{background:var(--navy2);transform:translateY(-1px);box-shadow:var(--shadow-md)}\n.sp-cta-quote{width:100%;padding:13px;background:#fff;color:var(--blue);border:1.5px solid var(--blue);border-radius:var(--r8);font-size:13px;font-weight:600;cursor:pointer;font-family:'DM Sans',sans-serif;transition:all 0.2s;margin-bottom:16px}\n.sp-cta-quote:hover{background:var(--blue-lt)}\n.sp-trust{display:flex;flex-direction:column;gap:6px;padding-top:4px}\n.sp-trust-item{display:flex;align-items:center;gap:8px;font-size:11.5px;color:var(--g600)}\n.sp-trust-icon{font-size:13px;flex-shrink:0}\n.sp-promo{margin-bottom:16px}\n.sp-promo-inner{display:flex;gap:6px}\n.sp-promo-input{flex:1;height:36px;border:1.5px solid var(--g200);border-radius:var(--r6);padding:0 12px;font-size:12px;font-family:'DM Sans',sans-serif;color:var(--ink);outline:none;transition:border-color 0.2s}\n.sp-promo-input:focus{border-color:var(--blue)}\n.sp-promo-btn{height:36px;padding:0 14px;background:var(--g100);color:var(--g700);border:none;border-radius:var(--r6);font-size:12px;font-weight:600;cursor:pointer;font-family:'DM Sans',sans-serif;transition:all 0.2s;white-space:nowrap}\n.sp-promo-btn:hover{background:var(--g200)}\n.sp-promo-lbl{font-size:11px;color:var(--g400);margin-bottom:6px}\n.sp-account-note{background:var(--blue-lt);border:1px solid rgba(21,71,232,0.15);border-radius:var(--r8);padding:10px 12px;margin-top:14px;font-size:11px;color:var(--blue);line-height:1.5}\n\n\/* \u2500\u2500 SPECIALIST BAR \u2500\u2500 *\/\n.specialist-bar{background:#fff;border:1.5px solid var(--g100);border-radius:var(--r12);padding:20px 24px;box-shadow:var(--shadow-xs);margin-top:16px;display:flex;align-items:center;gap:16px}\n.sb-ava{width:42px;height:42px;background:var(--navy);border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:20px;flex-shrink:0}\n.sb-info{flex:1;min-width:0}\n.sb-name{font-size:13px;font-weight:600;color:var(--ink);margin-bottom:2px}\n.sb-role{font-size:11px;color:var(--g400)}\n.sb-ctas{display:flex;gap:8px;flex-shrink:0}\n.sb-call{padding:9px 16px;background:var(--green);color:#fff;border:none;border-radius:var(--r8);font-size:12px;font-weight:600;cursor:pointer;font-family:'DM Sans',sans-serif;transition:background 0.2s;white-space:nowrap}\n.sb-call:hover{background:#085c33}\n.sb-chat{padding:9px 16px;background:#fff;color:var(--navy);border:1.5px solid var(--g200);border-radius:var(--r8);font-size:12px;font-weight:600;cursor:pointer;font-family:'DM Sans',sans-serif;transition:all 0.2s;white-space:nowrap}\n.sb-chat:hover{border-color:var(--navy)}\n\n\/* \u2500\u2500 TOAST \u2500\u2500 *\/\n.toast{position:fixed;bottom:24px;left:50%;transform:translateX(-50%) translateY(80px);background:var(--ink);color:#fff;padding:10px 20px;border-radius:var(--r8);font-size:13px;font-weight:500;opacity:0;transition:all 0.3s;z-index:9999;white-space:nowrap;pointer-events:none}\n.toast.show{opacity:1;transform:translateX(-50%) translateY(0)}\n.toast.success{background:var(--green)}\n.toast.error{background:var(--red)}\n\n\/* \u2500\u2500 QUOTE MODAL \u2500\u2500 *\/\n.modal-overlay{position:fixed;inset:0;background:rgba(10,15,30,0.55);backdrop-filter:blur(4px);z-index:1000;display:none;align-items:center;justify-content:center;padding:24px}\n.modal-overlay.open{display:flex}\n.modal{background:#fff;border-radius:var(--r16);width:100%;max-width:580px;max-height:90vh;overflow:hidden;display:flex;flex-direction:column;box-shadow:var(--shadow-lg)}\n.modal-head{padding:20px 24px;border-bottom:1px solid var(--g100);display:flex;align-items:center;justify-content:space-between;flex-shrink:0}\n.modal-title{font-family:'Syne',sans-serif;font-size:16px;font-weight:700;color:var(--navy)}\n.modal-close{width:30px;height:30px;border:none;background:var(--g100);border-radius:var(--r6);cursor:pointer;font-size:13px;color:var(--g600);display:flex;align-items:center;justify-content:center;transition:all 0.15s}\n.modal-close:hover{background:var(--g200)}\n.modal-body{padding:24px;overflow-y:auto;flex:1}\n.modal-body p{font-size:13px;color:var(--g600);margin-bottom:18px;line-height:1.6}\n.form-label{display:block;font-size:12px;font-weight:600;color:var(--g700);margin-bottom:5px}\n.form-input{width:100%;height:38px;border:1.5px solid var(--g200);border-radius:var(--r6);padding:0 12px;font-size:13px;font-family:'DM Sans',sans-serif;color:var(--ink);outline:none;transition:border-color 0.2s,box-shadow 0.2s;background:#fff}\n.form-input:focus{border-color:var(--blue);box-shadow:0 0 0 3px rgba(21,71,232,0.08)}\n.form-textarea{width:100%;border:1.5px solid var(--g200);border-radius:var(--r6);padding:10px 12px;font-size:12.5px;font-family:'DM Sans',sans-serif;color:var(--ink);outline:none;transition:border-color 0.2s;resize:vertical;min-height:80px;background:#fff}\n.form-textarea:focus{border-color:var(--blue)}\n.form-row{margin-bottom:14px}\n.form-row-2{display:grid;grid-template-columns:1fr 1fr;gap:12px}\n.modal-foot{padding:16px 24px;border-top:1px solid var(--g100);display:flex;gap:10px;justify-content:flex-end;flex-shrink:0}\n.modal-cancel{padding:10px 20px;background:#fff;color:var(--g600);border:1.5px solid var(--g200);border-radius:var(--r8);font-size:13px;font-weight:500;cursor:pointer;font-family:'DM Sans',sans-serif;transition:all 0.2s}\n.modal-cancel:hover{border-color:var(--g400)}\n.modal-submit{padding:10px 22px;background:var(--navy);color:#fff;border:none;border-radius:var(--r8);font-size:13px;font-weight:600;cursor:pointer;font-family:'DM Sans',sans-serif;transition:all 0.2s}\n.modal-submit:hover{background:var(--navy2);transform:translateY(-1px)}\n\n\/* basket item colour-code badges (match homepage) *\/\n.badge-sw{background:var(--blue-lt);color:var(--blue)}\n.badge-sec{background:var(--red-lt);color:var(--red)}\n.badge-cloud{background:var(--teal-lt);color:var(--teal)}\n.badge-backup{background:var(--purple-lt);color:var(--purple)}\n.badge-hw{background:var(--amber-lt);color:var(--amber)}\n.badge-email{background:var(--green-lt);color:var(--green)}\n.badge-mfa{background:#FFF8E1;color:#92400E}\n.badge-iam{background:#F0FDF4;color:#166534}\n\n\/* \u2500\u2500 FOOTER \u2500\u2500 *\/\n.footer{background:var(--navy);padding:20px 24px;border-top:2px solid var(--navy2)}\n.footer-inner{max-width:1440px;margin:0 auto;display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:12px}\n.footer-left{font-size:12px;color:rgba(255,255,255,0.45)}\n.footer-certs{display:flex;gap:8px;flex-wrap:wrap}\n.fc-badge{background:rgba(255,255,255,0.08);border:1px solid rgba(255,255,255,0.12);border-radius:4px;padding:3px 8px;font-size:10px;font-weight:600;color:rgba(255,255,255,0.55)}\n.footer-links{display:flex;gap:16px}\n.footer-links a{font-size:12px;color:rgba(255,255,255,0.4);cursor:pointer;transition:color 0.15s}\n.footer-links a:hover{color:rgba(255,255,255,0.8)}\n\n@media(max-width:900px){\n  .basket-layout{grid-template-columns:1fr}\n  .summary-panel{position:static}\n  .rec-grid{grid-template-columns:1fr 1fr}\n  .form-row-2{grid-template-columns:1fr}\n  .specialist-bar{flex-wrap:wrap}\n}\n@media(max-width:560px){\n  .rec-grid{grid-template-columns:1fr}\n  .basket-item{grid-template-columns:44px 1fr auto}\n  .bi-icon-wrap{width:44px;height:44px;font-size:20px}\n}\n<\/style>\n<\/head>\n<body>\n\n\n\n\n\n\n\n<!-- STEP INDICATOR -->\n<div class=\"steps-bar\">\n  <div class=\"steps-inner\">\n    <div class=\"step active\">\n      <div class=\"step-num\">1<\/div>\n      <div class=\"step-lbl\">Basket<\/div>\n    <\/div>\n    <div class=\"step upcoming\">\n      <div class=\"step-num\">2<\/div>\n      <div class=\"step-lbl\">Quote \/ Details<\/div>\n    <\/div>\n    <div class=\"step upcoming\">\n      <div class=\"step-num\">3<\/div>\n      <div class=\"step-lbl\">Review<\/div>\n    <\/div>\n    <div class=\"step upcoming\">\n      <div class=\"step-num\">4<\/div>\n      <div class=\"step-lbl\">Confirmation<\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- BREADCRUMB -->\n<div class=\"breadcrumb\">\n  <span class=\"bc-link\">Home<\/span>\n  <span class=\"bc-sep\">\u203a<\/span>\n  <span class=\"bc-link\">Products<\/span>\n  <span class=\"bc-sep\">\u203a<\/span>\n  <span class=\"bc-cur\">Basket<\/span>\n<\/div>\n\n<!-- PAGE HEADER -->\n<div class=\"page-head\">\n  <div class=\"ph-row\">\n    <div class=\"ph-left\">\n      <div class=\"ph-tag\">Step 1 of 4<\/div>\n      <div class=\"ph-title\">Your Basket<\/div>\n      <div class=\"ph-sub\" id=\"basketSubtitle\">Review your selected products before requesting a quote<\/div>\n    <\/div>\n    <button class=\"ph-continue\" onclick=\"window.scrollTo({top:0,behavior:'smooth'})\">\u2190 Continue Shopping<\/button>\n  <\/div>\n<\/div>\n\n<!-- MAIN LAYOUT -->\n<div class=\"basket-layout\">\n\n  <!-- LEFT: ITEMS + RECS -->\n  <div>\n    <!-- Basket Panel -->\n    <div class=\"basket-panel\">\n      <div class=\"bp-head\">\n        <div>\n          <div class=\"bp-title\">\ud83d\uded2 Basket Items<\/div>\n          <div class=\"bp-count\" id=\"itemCountLabel\">0 items<\/div>\n        <\/div>\n        <button class=\"bp-clear\" id=\"clearAllBtn\" onclick=\"clearAll()\" style=\"display:none\">Clear all<\/button>\n      <\/div>\n      <div id=\"basketBody\">\n        <!-- Populated by JS -->\n      <\/div>\n    <\/div>\n\n    <!-- \"You May Also Need\" recommendations -->\n    <div class=\"rec-panel\" id=\"recPanel\" style=\"display:none\">\n      <div class=\"rec-head\">\n        <div class=\"rec-title\">\ud83d\udca1 You May Also Need<\/div>\n        <div class=\"rec-sub\">Commonly paired with your selection<\/div>\n      <\/div>\n      <div class=\"rec-grid\" id=\"recGrid\"><\/div>\n    <\/div>\n\n    <!-- Specialist help bar -->\n    <div class=\"specialist-bar\">\n      <div class=\"sb-ava\">\ud83d\udc68\u200d\ud83d\udcbc<\/div>\n      <div class=\"sb-info\">\n        <div class=\"sb-name\">UK Sales Team<\/div>\n        <div class=\"sb-role\">Available Mon\u2013Fri, 8am\u20136pm \u00b7 Response within 4 hrs<\/div>\n      <\/div>\n      <div class=\"sb-ctas\">\n        <button class=\"sb-call\">\ud83d\udcde 0800 111 4567<\/button>\n        <button class=\"sb-chat\">\ud83d\udcac Live Chat<\/button>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- RIGHT: ORDER SUMMARY -->\n  <div>\n    <div class=\"summary-panel\">\n      <div class=\"sp-head\">\n        <div class=\"sp-title\">\ud83d\udccb Order Summary<\/div>\n      <\/div>\n      <div class=\"sp-body\">\n        <div class=\"sp-row\"><span class=\"sp-row-label\">Items in basket<\/span><span class=\"sp-row-val\" id=\"summaryItemCount\">0<\/span><\/div>\n        <div class=\"sp-row\"><span class=\"sp-row-label\">Licence type<\/span><span class=\"sp-row-val\">B2B \/ Annual<\/span><\/div>\n        <div class=\"sp-row\"><span class=\"sp-row-label\">VAT (20%)<\/span><span class=\"sp-row-val\">Included in quote<\/span><\/div>\n        <div class=\"sp-row\"><span class=\"sp-row-label\">Delivery<\/span><span class=\"sp-row-val\">Digital \u00b7 Same-day<\/span><\/div>\n        <hr class=\"sp-divider\">\n        <div class=\"sp-total-row\">\n          <span class=\"sp-total-label\">Total Estimate<\/span>\n          <span class=\"sp-total-val\" id=\"summaryTotal\">Quote Required<\/span>\n        <\/div>\n        <div class=\"sp-quote-note\" id=\"quoteNote\">\n          \ud83d\udcb7 Pricing for most products requires a tailored quote. Our team will respond within 4 business hours with competitive UK pricing.\n        <\/div>\n\n        <!-- Promo code -->\n        <div class=\"sp-promo\">\n          <div class=\"sp-promo-lbl\">Have a promo or framework code?<\/div>\n          <div class=\"sp-promo-inner\">\n            <input class=\"sp-promo-input\" id=\"promoInput\" placeholder=\"G-Cloud ref \/ promo code\">\n            <button class=\"sp-promo-btn\" onclick=\"applyPromo()\">Apply<\/button>\n          <\/div>\n        <\/div>\n\n        <button class=\"sp-cta-primary\" onclick=\"proceedCheckout()\">Proceed to Checkout \u2192<\/button>\n        <button class=\"sp-cta-quote\" onclick=\"openQuote()\">\ud83d\udccb Request a Quote for All Items<\/button>\n\n        <!-- Trust signals -->\n        <div class=\"sp-trust\">\n          <div class=\"sp-trust-item\"><span class=\"sp-trust-icon\">\ud83d\udd12<\/span> Secure B2B checkout \u2014 ISO 27001 certified<\/div>\n          <div class=\"sp-trust-item\"><span class=\"sp-trust-icon\">\ud83c\uddec\ud83c\udde7<\/span> UK-based sales & support team<\/div>\n          <div class=\"sp-trust-item\"><span class=\"sp-trust-icon\">\u26a1<\/span> Software licences activated same-day<\/div>\n          <div class=\"sp-trust-item\"><span class=\"sp-trust-icon\">\ud83d\udccb<\/span> G-Cloud 15 & DOS6 framework supplier<\/div>\n        <\/div>\n\n        <div class=\"sp-account-note\">\n          \ud83c\udfe2 <strong>Existing account?<\/strong> Sign in to access contract pricing, volume discounts and invoice terms.\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n\n<\/div>\n\n<!-- QUOTE MODAL -->\n<div class=\"modal-overlay\" id=\"quoteModal\">\n  <div class=\"modal\">\n    <div class=\"modal-head\">\n      <div class=\"modal-title\">\ud83d\udccb Request a Quote<\/div>\n      <button class=\"modal-close\" onclick=\"closeQuote()\">\u2715<\/button>\n    <\/div>\n    <div class=\"modal-body\">\n      <p>Complete the form below and a member of our UK sales team will respond within 4 business hours with competitive pricing.<\/p>\n      <div class=\"form-row-2\">\n        <div class=\"form-row\" style=\"margin-bottom:0\"><label class=\"form-label\">First Name *<\/label><input class=\"form-input\" placeholder=\"Jane\"><\/div>\n        <div class=\"form-row\" style=\"margin-bottom:0\"><label class=\"form-label\">Last Name *<\/label><input class=\"form-input\" placeholder=\"Smith\"><\/div>\n      <\/div>\n      <div style=\"margin-top:14px\"><\/div>\n      <div class=\"form-row-2\">\n        <div class=\"form-row\" style=\"margin-bottom:0\"><label class=\"form-label\">Work Email *<\/label><input class=\"form-input\" type=\"email\" placeholder=\"jane@company.co.uk\"><\/div>\n        <div class=\"form-row\" style=\"margin-bottom:0\"><label class=\"form-label\">Phone<\/label><input class=\"form-input\" placeholder=\"0800 000 0000\"><\/div>\n      <\/div>\n      <div style=\"margin-top:14px\"><\/div>\n      <div class=\"form-row\"><label class=\"form-label\">Company Name *<\/label><input class=\"form-input\" placeholder=\"Company Ltd\"><\/div>\n      <div class=\"form-row\"><label class=\"form-label\">Products (from your basket)<\/label><textarea class=\"form-textarea\" id=\"quoteProductList\" style=\"min-height:90px;font-size:12px\"><\/textarea><\/div>\n      <div class=\"form-row\"><label class=\"form-label\">Number of Users \/ Licences<\/label><input class=\"form-input\" placeholder=\"e.g. 50 users\"><\/div>\n      <div class=\"form-row\" style=\"margin-bottom:0\"><label class=\"form-label\">Additional Requirements<\/label><textarea class=\"form-textarea\" placeholder=\"Budget, timeline, existing contracts, framework ref\u2026\"><\/textarea><\/div>\n    <\/div>\n    <div class=\"modal-foot\">\n      <button class=\"modal-cancel\" onclick=\"closeQuote()\">Cancel<\/button>\n      <button class=\"modal-submit\" onclick=\"submitQuote()\">Submit Quote Request \u2192<\/button>\n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- TOAST -->\n<div class=\"toast\" id=\"toast\"><\/div>\n\n\n\n\n<script>\n\/*\n  BritHaven Basket System\n  How to use on any product button from any page:\n  onclick=\"addToBasketAndRedirect({id:'m365-premium', name:'Microsoft 365 Business Premium', vendor:'Microsoft', icon:'\ud83e\ude9f', badge:'badge-sw', badgeLabel:'Software', desc:'Advanced security, Intune and full Office suite.', price:'Request Pricing', seats:25, qty:1})\"\n\n  Basket page URL example:\n  \/basket\/\n*\/\n\n\/* PAGE SETTINGS *\/\nconst BASKET_PAGE_URL = window.location.pathname;\nconst CART_STORAGE_KEY = 'brithaven_cart';\n\n\/* PRODUCT CATALOGUE FOR RECOMMENDATIONS *\/\nconst CATALOGUE = [\n  {id:'m365-basic',vendor:'Microsoft',name:'Microsoft 365 Business Basic',desc:'Email, Teams, OneDrive and web apps.',price:'From \u00a35.10 \/user\/month',icon:'\ud83e\ude9f',badge:'badge-sw',badgeLabel:'Software',cat:'microsoft'},\n  {id:'m365-standard',vendor:'Microsoft',name:'Microsoft 365 Business Standard',desc:'Full desktop Office apps, Teams, SharePoint.',price:'From \u00a310.30 \/user\/month',icon:'\ud83e\ude9f',badge:'badge-sw',badgeLabel:'Software',cat:'microsoft'},\n  {id:'m365-premium',vendor:'Microsoft',name:'Microsoft 365 Business Premium',desc:'Advanced security, Intune, Azure AD P1 and full Office suite.',price:'Request Pricing',icon:'\ud83e\ude9f',badge:'badge-sw',badgeLabel:'Software',cat:'microsoft'},\n  {id:'defender-business',vendor:'Microsoft',name:'Microsoft Defender for Business',desc:'Enterprise endpoint security with automated remediation.',price:'Request Pricing',icon:'\ud83d\udee1\ufe0f',badge:'badge-sec',badgeLabel:'Security',cat:'microsoft'},\n  {id:'sentinelone-core',vendor:'SentinelOne',name:'SentinelOne Singularity Core',desc:'AI-powered endpoint protection with autonomous rollback.',price:'Request Pricing',icon:'\ud83d\udee1\ufe0f',badge:'badge-sec',badgeLabel:'Security',cat:'security'},\n  {id:'sentinelone-complete',vendor:'SentinelOne',name:'SentinelOne Singularity Complete',desc:'Complete XDR with identity threat detection.',price:'Request Pricing',icon:'\ud83d\udee1\ufe0f',badge:'badge-sec',badgeLabel:'Security',cat:'security'},\n  {id:'sophos-mdr',vendor:'Sophos',name:'Sophos MDR',desc:'24\/7 managed detection and response by Sophos experts.',price:'Request Pricing',icon:'\ud83d\udd12',badge:'badge-sec',badgeLabel:'MDR',cat:'security'},\n  {id:'mimecast-email',vendor:'Mimecast',name:'Mimecast Email Security Cloud',desc:'Cloud-based email security against spam, malware and phishing.',price:'Request Pricing',icon:'\ud83d\udce7',badge:'badge-email',badgeLabel:'Email Sec',cat:'email'},\n  {id:'1password-teams',vendor:'1Password',name:'1Password Teams Starter Pack',desc:'Secure password management for small teams up to 10 users.',price:'Request Pricing',icon:'\ud83d\udddd\ufe0f',badge:'badge-iam',badgeLabel:'IAM',cat:'identity'},\n  {id:'1password-business',vendor:'1Password',name:'1Password Business',desc:'Advanced password management with SSO and audit logs.',price:'Request Pricing',icon:'\ud83d\udddd\ufe0f',badge:'badge-iam',badgeLabel:'IAM',cat:'identity'},\n  {id:'acronis-cyber',vendor:'Acronis',name:'Acronis Cyber Protect',desc:'Integrated backup and cyber protection.',price:'Request Pricing',icon:'\ud83d\udd10',badge:'badge-backup',badgeLabel:'Backup',cat:'backup'},\n  {id:'veeam-m365',vendor:'Veeam',name:'Veeam Backup for Microsoft 365',desc:'Protect Exchange, SharePoint, OneDrive and Teams.',price:'Request Pricing',icon:'\ud83d\udcbe',badge:'badge-backup',badgeLabel:'Backup',cat:'backup'}\n];\n\nconst REC_MAP = {\n  microsoft: ['sentinelone-core', 'mimecast-email', 'acronis-cyber'],\n  security:  ['m365-premium', '1password-business', 'veeam-m365'],\n  email:     ['defender-business', '1password-business', 'm365-premium'],\n  identity:  ['m365-premium', 'sentinelone-core', 'mimecast-email'],\n  backup:    ['m365-premium', 'defender-business', 'sentinelone-complete']\n};\n\n\/* CART STORAGE *\/\nlet cart = loadCart();\n\nfunction loadCart(){\n  try{\n    return JSON.parse(localStorage.getItem(CART_STORAGE_KEY)) || [];\n  }catch(e){\n    return [];\n  }\n}\n\nfunction saveCart(){\n  localStorage.setItem(CART_STORAGE_KEY, JSON.stringify(cart));\n  updateHeaderBasketCount();\n}\n\nfunction normaliseProduct(product){\n  return {\n    id: String(product.id || product.name || Date.now()),\n    name: product.name || 'Product',\n    vendor: product.vendor || 'BritHaven Tech',\n    icon: product.icon || '\ud83d\udce6',\n    badge: product.badge || 'badge-sw',\n    badgeLabel: product.badgeLabel || 'Product',\n    desc: product.desc || product.description || 'Product selected for quote.',\n    price: product.price || 'Request Pricing',\n    seats: parseInt(product.seats || 1),\n    qty: parseInt(product.qty || 1),\n    cat: product.cat || 'microsoft'\n  };\n}\n\n\/* USE THIS FUNCTION ON PRODUCT PAGES *\/\nfunction addToBasket(product){\n  const item = normaliseProduct(product);\n  const existing = cart.find(c => c.id === item.id);\n\n  if(existing){\n    existing.qty += item.qty;\n    existing.seats = Math.max(existing.seats || 1, item.seats || 1);\n  }else{\n    cart.push(item);\n  }\n\n  saveCart();\n  showToast('\u2713 ' + item.name + ' added to basket', 'success');\n  renderBasket();\n}\n\n\/* USE THIS FUNCTION ON PRODUCT PAGES WHEN YOU WANT REDIRECT *\/\nfunction addToBasketAndRedirect(product){\n  addToBasket(product);\n  setTimeout(() => {\n    window.location.href = BASKET_PAGE_URL;\n  }, 350);\n}\n\n\/* OPTIONAL: ADD PRODUCT THROUGH URL PARAMETERS *\/\nfunction addFromUrlParams(){\n  const params = new URLSearchParams(window.location.search);\n  if(!params.has('addProduct')) return;\n\n  const product = {\n    id: params.get('id') || params.get('name') || params.get('addProduct'),\n    name: params.get('name') || params.get('addProduct'),\n    vendor: params.get('vendor') || 'BritHaven Tech',\n    icon: params.get('icon') || '\ud83d\udce6',\n    badge: params.get('badge') || 'badge-sw',\n    badgeLabel: params.get('badgeLabel') || 'Product',\n    desc: params.get('desc') || 'Product selected for quote.',\n    price: params.get('price') || 'Request Pricing',\n    seats: params.get('seats') || 1,\n    qty: params.get('qty') || 1,\n    cat: params.get('cat') || 'microsoft'\n  };\n\n  addToBasket(product);\n  window.history.replaceState({}, document.title, window.location.pathname);\n}\n\n\/* HEADER COUNT UPDATE - WORKS WITH YOUR DEFAULT HEADER TEMPLATE *\/\nfunction getCartCount(){\n  return cart.reduce((total, item) => total + (parseInt(item.qty) || 1), 0);\n}\n\nfunction updateHeaderBasketCount(){\n  const count = getCartCount();\n\n  const selectors = [\n    '#headerCartCount',\n    '#cartCount',\n    '.cart-count',\n    '.basket-count',\n    '[data-basket-count]',\n    '[data-cart-count]'\n  ];\n\n  selectors.forEach(selector => {\n    document.querySelectorAll(selector).forEach(el => {\n      el.textContent = count;\n    });\n  });\n\n  window.dispatchEvent(new CustomEvent('brithavenBasketUpdated', {\n    detail: { count, cart }\n  }));\n}\n\n\/* RENDER BASKET PAGE *\/\nfunction renderBasket() {\n  const body = document.getElementById('basketBody');\n  const clearBtn = document.getElementById('clearAllBtn');\n  const subtitle = document.getElementById('basketSubtitle');\n\n  if(!body) return;\n\n  const total = getCartCount();\n\n  document.getElementById('itemCountLabel').textContent = total === 0 ? '0 items' : `${total} item${total !== 1 ? 's' : ''}`;\n  document.getElementById('summaryItemCount').textContent = total;\n  updateHeaderBasketCount();\n\n  if (!cart.length) {\n    clearBtn.style.display = 'none';\n    body.innerHTML = `\n      <div class=\"basket-empty\">\n        <div class=\"be-icon\">\ud83d\uded2<\/div>\n        <div class=\"be-title\">Your basket is empty<\/div>\n        <div class=\"be-sub\">Browse our catalogue of software licences, cloud subscriptions<br>and cybersecurity solutions.<\/div>\n        <button class=\"be-btn\" onclick=\"window.history.back()\">\u2190 Continue Shopping<\/button>\n      <\/div>`;\n    document.getElementById('recPanel').style.display = 'none';\n    subtitle.textContent = 'Review your selected products before requesting a quote';\n    document.getElementById('summaryTotal').textContent = 'Quote Required';\n    return;\n  }\n\n  clearBtn.style.display = '';\n  subtitle.textContent = `${total} item${total !== 1 ? 's' : ''} in your basket \u2014 review and proceed to quote`;\n\n  body.innerHTML = cart.map(item => `\n    <div class=\"basket-item\" id=\"bi-${cssSafeId(item.id)}\">\n      <div class=\"bi-icon-wrap\">${item.icon}<\/div>\n      <div class=\"bi-main\">\n        <div class=\"bi-badges\">\n          <span class=\"bi-vendor-tag\">${escapeHtml(item.vendor)}<\/span>\n          <span class=\"bi-cat-tag ${escapeHtml(item.badge)}\">${escapeHtml(item.badgeLabel)}<\/span>\n        <\/div>\n        <div class=\"bi-name\">${escapeHtml(item.name)}<\/div>\n        <div class=\"bi-desc\">${escapeHtml(item.desc)}<\/div>\n        <div class=\"bi-meta\">\n          <div>\n            <div class=\"bi-price-lbl\">Unit price<\/div>\n            <div class=\"bi-price-val\">${escapeHtml(item.price)}<\/div>\n          <\/div>\n          <div class=\"bi-qty-wrap\">\n            <button class=\"bi-qty-btn\" onclick=\"changeQty('${escapeAttr(item.id)}',-1)\">\u2212<\/button>\n            <div class=\"bi-qty-val\">${item.qty}<\/div>\n            <button class=\"bi-qty-btn\" onclick=\"changeQty('${escapeAttr(item.id)}',1)\">+<\/button>\n          <\/div>\n          <div class=\"bi-seats-wrap\">\n            <span class=\"bi-seats-lbl\">Users \/ seats<\/span>\n            <input class=\"bi-seats-input\" type=\"number\" min=\"1\" value=\"${item.seats}\" onchange=\"updateSeats('${escapeAttr(item.id)}',this.value)\" title=\"Number of users or seats\">\n          <\/div>\n        <\/div>\n      <\/div>\n      <div class=\"bi-actions\">\n        <button class=\"bi-remove\" onclick=\"removeItem('${escapeAttr(item.id)}')\" title=\"Remove from basket\">\u2715<\/button>\n        <span class=\"bi-quote-tag\">\ud83d\udcb7 Quote required<\/span>\n        <button class=\"bi-save\" onclick=\"saveForLater('${escapeAttr(item.id)}')\">Save for later<\/button>\n      <\/div>\n    <\/div>`).join('');\n\n  document.getElementById('summaryTotal').textContent = 'Quote Required';\n  renderRecommendations();\n}\n\nfunction cssSafeId(id){\n  return String(id).replace(\/[^a-zA-Z0-9_-]\/g, '-');\n}\n\nfunction escapeHtml(value){\n  return String(value ?? '').replace(\/[&<>\"']\/g, function(match){\n    return {\n      '&':'&amp;',\n      '<':'&lt;',\n      '>':'&gt;',\n      '\"':'&quot;',\n      \"'\":'&#039;'\n    }[match];\n  });\n}\n\nfunction escapeAttr(value){\n  return String(value ?? '').replace(\/\\\\\/g, '\\\\\\\\').replace(\/'\/g, \"\\\\'\");\n}\n\nfunction renderRecommendations() {\n  const cats = [...new Set(cart.map(c => c.cat).filter(Boolean))];\n\n  let recIds = [];\n  cats.forEach(cat => {\n    if (REC_MAP[cat]) recIds = recIds.concat(REC_MAP[cat]);\n  });\n\n  const inCart = cart.map(c => c.id);\n  const uniqueRecs = [...new Set(recIds)].filter(id => !inCart.includes(id)).slice(0, 3);\n\n  const recPanel = document.getElementById('recPanel');\n  const recGrid = document.getElementById('recGrid');\n  if (!uniqueRecs.length) {\n    recPanel.style.display = 'none';\n    return;\n  }\n\n  recPanel.style.display = '';\n  recGrid.innerHTML = uniqueRecs.map(id => {\n    const p = CATALOGUE.find(x => x.id === id);\n    if (!p) return '';\n    return `\n      <div class=\"rec-card\">\n        <div class=\"rc-icon\">${p.icon}<\/div>\n        <div class=\"rc-vendor\">${escapeHtml(p.vendor)}<\/div>\n        <div class=\"rc-name\">${escapeHtml(p.name)}<\/div>\n        <button class=\"rc-add\" onclick=\"addRec('${escapeAttr(p.id)}')\">+ Add to Basket<\/button>\n      <\/div>`;\n  }).join('');\n}\n\n\/* CART ACTIONS *\/\nfunction removeItem(id) {\n  const el = document.getElementById('bi-' + cssSafeId(id));\n  if (el) {\n    el.style.opacity='0';\n    el.style.transform='translateX(20px)';\n    el.style.transition='all 0.25s';\n  }\n\n  setTimeout(() => {\n    cart = cart.filter(c => c.id !== id);\n    saveCart();\n    renderBasket();\n  }, 220);\n\n  showToast('Item removed from basket', '');\n}\n\nfunction changeQty(id, delta) {\n  const item = cart.find(c => c.id === id);\n  if (!item) return;\n  item.qty = Math.max(1, (parseInt(item.qty) || 1) + delta);\n  saveCart();\n  renderBasket();\n}\n\nfunction updateSeats(id, val) {\n  const item = cart.find(c => c.id === id);\n  if (!item) return;\n  item.seats = Math.max(1, parseInt(val) || 1);\n  saveCart();\n}\n\nfunction clearAll() {\n  if (!confirm('Remove all items from your basket?')) return;\n  cart = [];\n  saveCart();\n  renderBasket();\n  showToast('Basket cleared', '');\n}\n\nfunction saveForLater(id) {\n  showToast('\u2713 Item saved for later', 'success');\n}\n\nfunction addRec(id) {\n  const p = CATALOGUE.find(x => x.id === id);\n  if (!p) return;\n  addToBasket({...p, seats:10, qty:1});\n}\n\n\/* CHECKOUT \/ QUOTE *\/\nfunction proceedCheckout() {\n  if (!cart.length) {\n    showToast('Your basket is empty', 'error');\n    return;\n  }\n  openQuote();\n}\n\nfunction openQuote() {\n  if (!cart.length) {\n    showToast('Your basket is empty', 'error');\n    return;\n  }\n\n  const ta = document.getElementById('quoteProductList');\n  ta.value = cart.map(c => `\u2022 ${c.name} (${c.vendor}) \u2014 ${c.seats} users \/ Qty ${c.qty}`).join('\\n');\n  document.getElementById('quoteModal').classList.add('open');\n}\n\nfunction closeQuote() {\n  document.getElementById('quoteModal').classList.remove('open');\n}\n\nfunction submitQuote() {\n  showToast('\u2713 Quote submitted! We will respond within 4 business hours.', 'success');\n  closeQuote();\n\n  \/* Optional: clear basket after submit *\/\n  \/* cart = []; saveCart(); renderBasket(); *\/\n}\n\nconst quoteModal = document.getElementById('quoteModal');\nif(quoteModal){\n  quoteModal.addEventListener('click', e => {\n    if (e.target === quoteModal) closeQuote();\n  });\n}\n\n\/* PROMO *\/\nfunction applyPromo() {\n  const v = document.getElementById('promoInput').value.trim();\n  if (!v) {\n    showToast('Please enter a promo or framework code', 'error');\n    return;\n  }\n  showToast(`Code \"${v}\" applied \u2014 our team will honour this on your quote`, 'success');\n}\n\n\/* TOAST *\/\nfunction showToast(msg, type='') {\n  const t = document.getElementById('toast');\n  if(!t) return;\n  t.textContent = msg;\n  t.className = 'toast' + (type ? ' ' + type : '');\n  t.classList.add('show');\n  setTimeout(() => t.classList.remove('show'), 3200);\n}\n\n\/* SEARCH *\/\nfunction handleSearch(val) {\n  if (val.trim().length > 1) showToast('\ud83d\udd0d Searching the catalogue\u2026', '');\n}\n\n\/* KEYBOARD *\/\ndocument.addEventListener('keydown', e => {\n  if (e.key === 'Escape') closeQuote();\n});\n\n\/* INIT *\/\naddFromUrlParams();\nrenderBasket();\nupdateHeaderBasketCount();\n\n\/* Make functions available globally for Elementor\/header buttons *\/\nwindow.addToBasket = addToBasket;\nwindow.addToBasketAndRedirect = addToBasketAndRedirect;\nwindow.updateHeaderBasketCount = updateHeaderBasketCount;\nwindow.getBritHavenCartCount = getCartCount;\n<\/script>\n\n<\/body>\n<\/html><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Basket \u2014 BritHaven Tech 1 Basket 2 Quote \/ Details 3 Review 4 Confirmation Home \u203a Products \u203a Basket Step 1 of 4 Your Basket Review your selected products before requesting a quote \u2190 Continue Shopping \ud83d\uded2 Basket Items 0 items Clear all \ud83d\udca1 You May Also Need Commonly paired with your selection \ud83d\udc68\u200d\ud83d\udcbc UK [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-262","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Basket - Brithaventech<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/brithaventech.co.uk\/index.php\/basket\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Basket - Brithaventech\" \/>\n<meta property=\"og:description\" content=\"Basket \u2014 BritHaven Tech 1 Basket 2 Quote \/ Details 3 Review 4 Confirmation Home \u203a Products \u203a Basket Step 1 of 4 Your Basket Review your selected products before requesting a quote \u2190 Continue Shopping \ud83d\uded2 Basket Items 0 items Clear all \ud83d\udca1 You May Also Need Commonly paired with your selection \ud83d\udc68\u200d\ud83d\udcbc UK [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/brithaventech.co.uk\/index.php\/basket\/\" \/>\n<meta property=\"og:site_name\" content=\"Brithaventech\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-26T11:54:18+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/brithaventech.co.uk\\\/index.php\\\/basket\\\/\",\"url\":\"https:\\\/\\\/brithaventech.co.uk\\\/index.php\\\/basket\\\/\",\"name\":\"Basket - Brithaventech\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/brithaventech.co.uk\\\/#website\"},\"datePublished\":\"2026-05-26T11:04:32+00:00\",\"dateModified\":\"2026-05-26T11:54:18+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/brithaventech.co.uk\\\/index.php\\\/basket\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/brithaventech.co.uk\\\/index.php\\\/basket\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/brithaventech.co.uk\\\/index.php\\\/basket\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/brithaventech.co.uk\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Basket\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/brithaventech.co.uk\\\/#website\",\"url\":\"https:\\\/\\\/brithaventech.co.uk\\\/\",\"name\":\"Brithaventech\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/brithaventech.co.uk\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Basket - Brithaventech","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/brithaventech.co.uk\/index.php\/basket\/","og_locale":"en_US","og_type":"article","og_title":"Basket - Brithaventech","og_description":"Basket \u2014 BritHaven Tech 1 Basket 2 Quote \/ Details 3 Review 4 Confirmation Home \u203a Products \u203a Basket Step 1 of 4 Your Basket Review your selected products before requesting a quote \u2190 Continue Shopping \ud83d\uded2 Basket Items 0 items Clear all \ud83d\udca1 You May Also Need Commonly paired with your selection \ud83d\udc68\u200d\ud83d\udcbc UK [&hellip;]","og_url":"https:\/\/brithaventech.co.uk\/index.php\/basket\/","og_site_name":"Brithaventech","article_modified_time":"2026-05-26T11:54:18+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/brithaventech.co.uk\/index.php\/basket\/","url":"https:\/\/brithaventech.co.uk\/index.php\/basket\/","name":"Basket - Brithaventech","isPartOf":{"@id":"https:\/\/brithaventech.co.uk\/#website"},"datePublished":"2026-05-26T11:04:32+00:00","dateModified":"2026-05-26T11:54:18+00:00","breadcrumb":{"@id":"https:\/\/brithaventech.co.uk\/index.php\/basket\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/brithaventech.co.uk\/index.php\/basket\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/brithaventech.co.uk\/index.php\/basket\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/brithaventech.co.uk\/"},{"@type":"ListItem","position":2,"name":"Basket"}]},{"@type":"WebSite","@id":"https:\/\/brithaventech.co.uk\/#website","url":"https:\/\/brithaventech.co.uk\/","name":"Brithaventech","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/brithaventech.co.uk\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/brithaventech.co.uk\/index.php\/wp-json\/wp\/v2\/pages\/262","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/brithaventech.co.uk\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/brithaventech.co.uk\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/brithaventech.co.uk\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/brithaventech.co.uk\/index.php\/wp-json\/wp\/v2\/comments?post=262"}],"version-history":[{"count":4,"href":"https:\/\/brithaventech.co.uk\/index.php\/wp-json\/wp\/v2\/pages\/262\/revisions"}],"predecessor-version":[{"id":269,"href":"https:\/\/brithaventech.co.uk\/index.php\/wp-json\/wp\/v2\/pages\/262\/revisions\/269"}],"wp:attachment":[{"href":"https:\/\/brithaventech.co.uk\/index.php\/wp-json\/wp\/v2\/media?parent=262"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}