Description
BS8599-1:2019 Large Catering Kit in Green Aura3 Box
- LOW RISK 1 kit per 100 employees.
- HIGH RISK 1 kit per 25 employees.
- Box is 100% recycled and recyclable plastic.
- Compliant to latest BSi standard.
- All content HSE approved.
- Ensures best practice is observed.
Our range of Catering Kits is unique! For many years it has been a legal requirement to use only Blue Detectable plasters in food preparation areas. Our kits go above and beyond this requirement by providing you for the first time with a kit where every single product, even the dressings and wipes, are all Blue. With one of our Blue Catering Kits in your workplace, there is no better way to demonstrate to the authorities that you are taking your responsibilities seriously.
AURA3 The latest evolution of our industry leading box.
SUSTAINABLE Now made from 100% recycled and recyclable plastic. Kit information is laser etched directly onto the box, so no is labelling required - helping to reduce our carbon footprint.*
CONVENIENT The single clip closure enables quicker access with one hand in an emergency. Features an integral bracket for secure wall fixing and easy portability. The new design includes a tamper seal tucked neatly under the handle. Contents can be visually monitored by Health and Safety managers in an instant.
OUTSTANDING Aura3 stands out from a distance, enabling quick identification in an emergency, especially in a busy workplace. Embossed and printed iconography help with easy identification across all languages.
All our kits are manufactured and packed in full compliance with the CE regulations.
2x Bandages, Blue Conforming
4x Bandages, Blue Triangular
2x Dressings, Burn
4x Dressings, Blue Eye Pad
4x Dressings, Blue Finger
6x Dressings, Blue HSE Medium
4x Dressings, Blue HSE Large
3x Foil Blankets, Adult
12x Gloves, Blue Pairs
1x Guidance Leaflet
100x Plasters, Blue Assorted
2x Resuscitation Face Shield
1x Shears
3x Tapes, Blue Microporous
40x Wipes, Blue Cleansing
Frequently Asked Questions
What standard does this kit comply with? ▼
Is this first aid kit suited for kitchens and food handling areas? ▼
How many people does this catering first aid kit support? ▼
What major items are included in this first aid kit? ▼
Can this kit be fixed to a wall or easily transported? ▼
How often should this first aid kit be inspected or restocked? ▼
If you have any further questions about this product feel free to ask a question in our customer question box below, or contact our sales team.
<div><button id="pdfBtn" style="background-color: #ff7a00 !important; color: #fff !important; padding: 12px 22px !important; font-size: 16px !important; font-weight: bold !important; border: none !important; border-radius: 6px !important; cursor: pointer !important; display: inline-block !important; margin: 10px 0 !important;" onclick="createPDF()"> Download PDF </button></div>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jspdf-autotable/3.5.31/jspdf.plugin.autotable.min.js"></script>
<script type="text/javascript">// <![CDATA[
/* ============================================================
IMAGE → BASE64
============================================================ */
function loadImageAsBase64(url) {
return new Promise(resolve => {
const img = new Image();
img.crossOrigin = "anonymous";
img.onload = () => {
const c = document.createElement("canvas");
c.width = img.width;
c.height = img.height;
c.getContext("2d").drawImage(img, 0, 0);
resolve({ data: c.toDataURL("image/png"), w: img.width, h: img.height });
};
img.onerror = () => resolve({ data: null });
img.src = url;
});
}
/* ============================================================
TEXT CLEANING UTILITIES
============================================================ */
function cleanFAQAnswer(text) {
if (!text) return "";
text = text.replace(/[\u00A0\u202F\u2007\u2060]/g, " ");
text = text.replace(/[\u200B-\u200D\uFEFF]/g, "");
return text.replace(/\s+/g, " ").trim();
}
function removeCustomerQA(text) {
text = text.replace(/questions?\s*\(\d+\)/gi, "");
text = text.replace(/ask a question[\s\S]*$/gi, "");
text = text.replace(/download\s*pdf/gi, "");
text = text.replace(/\b\d{1,2}(st|nd|rd|th)?\s+[A-Za-z]{3,12}\s+\d{4}\b/gi, "");
text = text.replace(/[A-Z][a-z]+(?:\s+[A-Z][a-z]+){0,2}\s*[-–·]\s*/g, "");
text = text.replace(/\(\d+\)/g, "");
text = text.replace(/show more|show less/gi, "");
text = text.replace(/PDF Instruction Sheet/gi, "");
text = text.replace(/If you have any further questions about this product feel free to/gi, "");
return text.trim();
}
/* ============================================================
CLEAN DESCRIPTION
============================================================ */
function cleanDescription(raw) {
if (!raw) return "";
raw = raw.replace(/%¼/g, "");
raw = raw.replace(/%\s*¼/g, "");
raw = raw.replace(/[ \t]+/g, " ");
["description", "frequently asked questions"].forEach(str => {
raw = raw.replace(new RegExp(str, "gi"), "");
});
raw = removeCustomerQA(raw);
// FIX MISSING "INCLUDED" HEADER
const includedRegex = /(Manikin\s*10 Lung bags\s*Carry bag)/i;
if (includedRegex.test(raw) && !/Included:/i.test(raw)) {
raw = raw.replace(includedRegex, "\nIncluded:\n$1");
}
let lines = raw.split("\n");
// FILTERING LOGIC
lines = lines.filter(line => {
let t = line.trim();
let tLower = t.toLowerCase();
if (t.length === 0) return true;
// 1. DELETE SPACED OUT TEXT
if (/^(\s*[a-zA-Z]\s+){5,}/.test(t)) return false;
// 2. DELETE QUESTIONS
const isQuestion = /^(what|how|is|are|do|does|did|can|could|should|would|will|where|why|when|which|who)\s/i.test(tLower);
if (isQuestion && t.includes("?")) return false;
if (t.endsWith("?") && t.length > 10 && t.length < 150) return false;
// 3. REMOVE EMPTY BULLETS
if (t === "•" || t === "-") return false;
return true;
});
raw = lines.join("\n");
raw = raw.replace(/\n\s*\n/g, "\n");
return raw.trim();
}
function splitInlineBullets(text) {
text = text.replace(/<br\s*\/?>/gi, "\n");
text = text.replace(/(^|\s)-\s+(?=[A-Za-z])/g, "\n- ");
return text;
}
function splitBulletFollowedBySentence(text) {
return text.replace(
/(-\s+[A-Za-z0-9 ,.'"-]+?)(\s+)([A-Z][a-zA-Z].+)/g,
"$1\n$3"
);
}
function convertBullets(linesArray) {
return linesArray.map((line, index) => {
const trimmed = line.trim();
let isBullet = /^[•\-\*●▪♦►▶]/.test(trimmed);
if (!isBullet && index > 0 && trimmed.length < 100) {
if (!/[.!?:]$/.test(trimmed)) {
isBullet = true;
}
}
if (trimmed.toLowerCase().includes("included:")) {
isBullet = false;
}
return {
type: isBullet ? "bullet" : "normal",
text: trimmed.replace(/^[•\-\*●▪♦►▶]\s*/, "")
};
});
}
/* ============================================================
CONTENTS/QTY TEXT FALLBACK (FIXES "BIG LIST" ISSUE)
============================================================ */
function normalizeLine(t) {
return (t || "")
.replace(/[\u00A0\u202F\u2007\u2060]/g, " ")
.replace(/[\u200B-\u200D\uFEFF]/g, "")
.replace(/\s+/g, " ")
.trim();
}
function stripBulletPrefix(t) {
return normalizeLine(t).replace(/^[•\-\*●▪♦►▶]\s*/, "").trim();
}
function isNumberLine(t) {
const s = normalizeLine(t);
return /^[0-9]+$/.test(s);
}
function isLikelySectionHeading(t) {
const s = stripBulletPrefix(t);
if (!s) return true;
if (/bs\s*8599/i.test(s)) return true;
if (/grab\s*&\s*go\s*bag/i.test(s)) return true;
const hasComma = s.includes(",");
const hasMeasurement = /\b(mm|cm|ml|l|x)\b/i.test(s);
const hasDigits = /\d/.test(s);
const wordCount = s.split(" ").filter(Boolean).length;
const titley = /^[A-Z0-9]/.test(s);
if (!hasComma && !hasDigits && !hasMeasurement && wordCount <= 5 && titley) {
const obviousItemWords =
/(gloves|wipes|plasters|shears|tape|blankets|shield|bags|compass|whistle|forceps|torch|ice pack|eye wash|dressing|bandages)/i;
if (!obviousItemWords.test(s)) return true;
}
return false;
}
function extractContentsFromFlattenedText(descText) {
const text = descText || "";
const lines = text.split("\n").map(l => normalizeLine(l)).filter(l => l.length > 0);
const idxContents = lines.findIndex(l => l.toLowerCase() === "contents");
const idxQuantity = lines.findIndex(l => l.toLowerCase() === "quantity");
if (idxContents === -1 || idxQuantity === -1 || idxQuantity <= idxContents) {
return { rows: [], cleanedText: descText || "" };
}
const leftRaw = lines
.slice(idxContents + 1, idxQuantity)
.map(stripBulletPrefix)
.filter(Boolean);
const rightRawAll = lines.slice(idxQuantity + 1).map(stripBulletPrefix).filter(Boolean);
const qty = [];
for (const l of rightRawAll) {
if (isNumberLine(l)) qty.push(normalizeLine(l));
else break;
}
if (leftRaw.length === 0 || qty.length === 0) {
return { rows: [], cleanedText: descText || "" };
}
const rows = [];
let qi = 0;
for (let i = 0; i < leftRaw.length; i++) {
const item = leftRaw[i];
if (isLikelySectionHeading(item)) {
rows.push({ item, qty: "", isSection: true });
continue;
}
const q = qi < qty.length ? qty[qi++] : "";
rows.push({ item, qty: q, isSection: false });
}
const removeStart = idxContents;
const removeEnd = idxQuantity + 1 + qty.length;
const cleanedLines = lines.slice(0, removeStart).concat(lines.slice(removeEnd));
const cleanedText = cleanedLines.join("\n");
return { rows, cleanedText };
}
function rowsToAutoTableBody(rows) {
return rows.map(r => {
if (r.isSection || r.qty === "") {
return [{ content: r.item, colSpan: 2, styles: { fontStyle: "bold" } }];
}
return [r.item, r.qty];
});
}
/* ============================================================
MAIN PDF GENERATOR
============================================================ */
async function createPDF() {
const { jsPDF } = window.jspdf;
const pdf = new jsPDF({ lineHeight: 1.5 });
/* ---------------- HEADER ---------------- */
const logoUrl =
"https://cdn11.bigcommerce.com/s-4ti9l0ea6w/images/stencil/200x44/jax_first_aid_supplies_logo_1735726362__19967.original.png";
const logo = await loadImageAsBase64(logoUrl);
if (logo.data) {
pdf.addImage(logo.data, "PNG", 10, 10, 60, 13);
pdf.link(10, 10, 60, 13, { url: "https://www.jaxfirstaid.co.uk/" });
}
pdf.setFontSize(12);
pdf.text("www.jaxfirstaid.co.uk", 105, 17, { align: "center", url: "https://www.jaxfirstaid.co.uk/" });
pdf.text("Need Help? 01207 272854", 200, 12, { align: "right" });
pdf.text("sales@jaxfirstaid.co.uk", 200, 18, { align: "right" });
pdf.setDrawColor(0, 0, 0);
pdf.setLineWidth(0.3);
pdf.line(10, 25, 200, 25);
/* ---------------- PRODUCT DATA ---------------- */
const productName = document.querySelector(".productView-title")?.innerText.trim() || "Product";
const sku = document.querySelector("[data-product-sku]")?.innerText.trim() || "N/A";
const productLink = window.location.href;
/* ---------------- MINI BULLET SUMMARY ---------------- */
let miniBullets = [];
const summaryNode = document.querySelector(".productView-info") || document.querySelector(".productView-details");
if (summaryNode) {
miniBullets = summaryNode.innerText
.split("\n")
.map(l => l.trim())
.filter(l => /^[•\-\*●▪♦►▶]\s*/.test(l));
}
/* ---------------- IMAGES ---------------- */
const imgNodes = document.querySelectorAll(".productView-image img, .productView-thumbnail img");
const images = [];
for (let img of imgNodes) {
if (img.src) images.push(await loadImageAsBase64(img.src));
}
let y = 30;
/* ---------------- MAIN IMAGE ---------------- */
const main = images[0] || { w: 100, h: 100, data: null };
const mainW = 90;
const scale = main.w > 0 ? mainW / main.w : 1;
const mainH = main.h * scale;
if (main.data) {
pdf.addImage(main.data, "PNG", 10, y, mainW, mainH);
pdf.link(10, y, mainW, mainH, { url: productLink });
}
pdf.rect(10, y, mainW, mainH);
let imageBottom = y + mainH;
/* ---------------- SMALL THUMBNAILS ---------------- */
const thumbImages = images.slice(1).slice(0, 5);
const thumbW = 18;
const thumbH = 18;
let thumbX = 10;
let thumbY = imageBottom;
thumbImages.forEach(im => {
if (im.data) {
const s = Math.min(thumbW / im.w, thumbH / im.h);
const w = im.w * s;
const h = im.h * s;
const offX = thumbX + (thumbW - w) / 2;
const offY = thumbY + (thumbH - h) / 2;
pdf.addImage(im.data, "PNG", offX, offY, w, h);
pdf.rect(thumbX, thumbY, thumbW, thumbH);
pdf.link(thumbX, thumbY, thumbW, thumbH, { url: productLink });
thumbX += thumbW;
}
});
imageBottom = thumbY + thumbH + 10;
/* ---------------- RIGHT COLUMN ---------------- */
let rX = 110;
let rY = 35;
pdf.setFontSize(18);
const titleLines = pdf.splitTextToSize(productName, 90);
titleLines.forEach(line => {
pdf.text(line, rX, rY);
rY += 8;
});
rY += 2;
pdf.setFontSize(12);
pdf.text("SKU: " + sku, rX, rY);
rY += 8;
pdf.setTextColor(0, 0, 255);
pdf.textWithLink("(View Product Online)", rX, rY, { url: productLink });
pdf.setTextColor(0, 0, 0);
rY += 12;
pdf.setFontSize(14);
pdf.text("Description:", rX, rY);
rY += 8;
/* ---------------- MINI BULLETS FIRST ---------------- */
if (miniBullets.length > 0) {
pdf.setFontSize(11);
miniBullets.forEach(b => {
const txt = "• " + b.replace(/^[•\-\*●▪♦►▶]\s*/, "");
const wrapped = pdf.splitTextToSize(txt, 90);
wrapped.forEach(w => {
pdf.text(w, rX, rY);
rY += 7;
});
rY += 2;
});
rY += 6;
}
/* ---------------- DESCRIPTION (REMOVE CONTENTS/QTY BLOCK FIRST) ---------------- */
const rawDesc = document.querySelector(".productView-description")?.innerText || "";
// NEW: Extract flattened Contents/Quantity block and remove it from description
const extracted = extractContentsFromFlattenedText(rawDesc);
const contentsRows = extracted.rows;
let cleanedDesc = cleanDescription(extracted.cleanedText || "");
cleanedDesc = splitInlineBullets(cleanedDesc);
cleanedDesc = splitBulletFollowedBySentence(cleanedDesc);
const descLines = cleanedDesc.split(/\n+/g).map(l => l.trim()).filter(l => l.length > 0);
const parsed = convertBullets(descLines);
let consumptionIndex = 0;
// --- RENDER RIGHT COLUMN DESCRIPTION ---
for (let i = 0; i < parsed.length; i++) {
if (rY > imageBottom - 5) break;
if (parsed[i].text.includes("Included:")) pdf.setFont(undefined, "bold");
else pdf.setFont(undefined, "normal");
const prefix = parsed[i].type === "bullet" ? "• " : "";
const wrapped = pdf.splitTextToSize(prefix + parsed[i].text, 90);
wrapped.forEach(w => {
pdf.text(w, rX, rY);
rY += 7;
});
if (parsed[i].type === "normal") rY += 3;
consumptionIndex = i + 1;
}
/* ---------------- FULL-WIDTH DESCRIPTION ---------------- */
let remaining = parsed.slice(consumptionIndex);
let yFW = Math.max(rY, imageBottom) + 10;
remaining.forEach(item => {
if (yFW > 270) {
pdf.addPage();
yFW = 20;
}
if (item.text.includes("Included:")) pdf.setFont(undefined, "bold");
else pdf.setFont(undefined, "normal");
const prefix = item.type === "bullet" ? "• " : "";
const wrapped = pdf.splitTextToSize(prefix + item.text, 190);
wrapped.forEach(w => {
pdf.text(w, 10, yFW);
yFW += 7;
});
if (item.type === "normal") yFW += 4;
});
/* ---------------- CONTENTS TABLE (REAL TABLE OUTPUT) ---------------- */
if (contentsRows && contentsRows.length > 0 && typeof pdf.autoTable === "function") {
yFW += 8;
if (yFW > 250) { pdf.addPage(); yFW = 20; }
pdf.setFontSize(14);
pdf.setFont(undefined, "bold");
pdf.text("Contents:", 10, yFW);
yFW += 6;
const body = rowsToAutoTableBody(contentsRows);
pdf.setFontSize(10);
pdf.setFont(undefined, "normal");
pdf.autoTable({
startY: yFW,
head: [["Contents", "Quantity"]],
body,
theme: "grid",
styles: { fontSize: 10, cellPadding: 2, overflow: "linebreak", valign: "top" },
headStyles: { fontStyle: "bold" },
columnStyles: {
0: { cellWidth: 160 },
1: { cellWidth: 30, halign: "right" }
}
});
yFW = (pdf.lastAutoTable && pdf.lastAutoTable.finalY ? pdf.lastAutoTable.finalY : yFW) + 10;
}
/* ---------------- FAQ SECTION ---------------- */
const faqBlocks = document.querySelectorAll('[onclick*="this.nextElementSibling"]');
if (faqBlocks.length > 0) {
yFW += 10;
if (yFW > 270) { pdf.addPage(); yFW = 20; }
pdf.setDrawColor(255, 122, 0);
pdf.setLineWidth(0.7);
pdf.line(10, yFW, 200, yFW);
yFW += 10;
pdf.setFontSize(14);
pdf.setFont(undefined, "bold");
pdf.text("Frequently Asked Questions:", 10, yFW);
yFW += 12;
pdf.setFontSize(11);
faqBlocks.forEach(block => {
const q = block.querySelector("h3")?.innerText.replace("▼", "").trim();
let a = block.nextElementSibling?.innerText.trim();
a = cleanFAQAnswer(a);
if (!q || !a) return;
if (yFW > 260) { pdf.addPage(); yFW = 20; }
pdf.setFont(undefined, "bold");
const wrappedQ = pdf.splitTextToSize("Q: " + q, 190);
wrappedQ.forEach(l => { pdf.text(l, 10, yFW); yFW += 6; });
pdf.setFont(undefined, "normal");
const wrappedA = pdf.splitTextToSize("A: " + a, 190);
wrappedA.forEach(line => {
if (yFW > 275) { pdf.addPage(); yFW = 20; }
pdf.text(line, 10, yFW);
yFW += 6;
});
yFW += 6;
});
}
pdf.save(productName.replace(/[^a-z0-9]/gi, "_") + ".pdf");
}
// ]]></script>






