Make a ppt presentation on intra articular injection in orthopaedic.. includes all points with diagrams and make it simple and doesn’t look like ai generated
intra articular injection orthopaedic technique indications complications anatomy
https://www.aafp.org/afp/2023/0800/joint-soft-tissue-injecti…
mkdir -p /home/daytona/workspace/intra-articular-ppt && ls /home/daytona/workspace/intra-articular-ppt/
Failed to create session: bad request: failed to resolve container IP after 3 attempts: no IP address found. Is the Sandbox started?
We encountered an error while processing your request. Please try again or reach out to us for help.
Try again
mkdir -p /home/daytona/workspace/intra-articular-ppt && echo "dir ready"
Where the ppt
mkdir -p /home/daytona/workspace/intra-articular-ppt && node -e "require('pptxgenjs'); console.log('pptxgenjs ok')"
~/intra-articular-ppt/build.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.title = "Intra-Articular Injections in Orthopaedics";
// ── PALETTE ──────────────────────────────────────────────────────────────────
const C = {
navy: "0A2342", // dominant dark
teal: "1A7A8A", // accent
tealLt: "2DA8BC", // lighter teal
white: "FFFFFF",
offWhite:"F4F8FB",
gray: "546E7A",
grayLt: "B0BEC5",
amber: "F59E0B",
red: "D93025",
green: "1B7A4A",
lightBg: "EBF4F7",
};
// ── HELPERS ───────────────────────────────────────────────────────────────────
function darkSlide(slide) {
slide.background = { color: C.navy };
}
function lightSlide(slide) {
slide.background = { color: C.offWhite };
}
function addAccentBar(slide, color) {
slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 0.18, h: 5.625, fill: { color: color || C.teal }, line: { type: "none" } });
}
function sectionHeader(slide, title, sub) {
darkSlide(slide);
// left bold bar
slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: "100%", h: "100%", fill: { color: C.navy }, line: { type: "none" } });
// teal diagonal strip
slide.addShape(pres.ShapeType.rect, { x: 0, y: 3.8, w: 10, h: 1.825, fill: { color: C.teal }, line: { type: "none" } });
slide.addShape(pres.ShapeType.rect, { x: 0, y: 3.4, w: 10, h: 0.45, fill: { color: C.tealLt }, line: { type: "none" } });
slide.addText(title, { x: 0.6, y: 1.2, w: 8.8, h: 1.6, fontSize: 44, bold: true, color: C.white, fontFace: "Calibri", align: "left" });
if (sub) slide.addText(sub, { x: 0.6, y: 2.9, w: 8.8, h: 0.6, fontSize: 20, color: C.tealLt, fontFace: "Calibri", italic: true });
}
// ── SLIDE 1 — TITLE ───────────────────────────────────────────────────────────
{
const s = pres.addSlide();
darkSlide(s);
// gradient-like layered rects
s.addShape(pres.ShapeType.rect, { x: 6.5, y: 0, w: 3.5, h: 5.625, fill: { color: C.teal }, line: { type: "none" } });
s.addShape(pres.ShapeType.rect, { x: 6.3, y: 0, w: 0.35, h: 5.625, fill: { color: C.tealLt }, line: { type: "none" } });
// red accent dot
s.addShape(pres.ShapeType.ellipse, { x: 0.55, y: 0.55, w: 0.18, h: 0.18, fill: { color: C.amber }, line: { type: "none" } });
s.addShape(pres.ShapeType.ellipse, { x: 0.55, y: 0.95, w: 0.18, h: 0.18, fill: { color: C.tealLt }, line: { type: "none" } });
s.addText("INTRA-ARTICULAR", { x: 0.6, y: 1.0, w: 5.6, h: 0.75, fontSize: 13, bold: true, color: C.tealLt, charSpacing: 5, fontFace: "Calibri" });
s.addText("Injections", { x: 0.6, y: 1.7, w: 5.6, h: 1.3, fontSize: 58, bold: true, color: C.white, fontFace: "Calibri" });
s.addText("in Orthopaedics", { x: 0.6, y: 2.95, w: 5.6, h: 0.75, fontSize: 28, color: C.grayLt, fontFace: "Calibri", italic: true });
s.addShape(pres.ShapeType.line, { x: 0.6, y: 3.85, w: 4.5, h: 0, line: { color: C.tealLt, width: 2 } });
s.addText("Principles • Techniques • Evidence", { x: 0.6, y: 4.05, w: 5.6, h: 0.5, fontSize: 14, color: C.grayLt, fontFace: "Calibri", charSpacing: 2 });
// syringe icon (simplified shapes on right panel)
s.addShape(pres.ShapeType.rect, { x: 7.6, y: 1.4, w: 1.2, h: 0.32, fill: { color: C.white }, line: { type: "none" }, rounding: 0.05 });
s.addShape(pres.ShapeType.rect, { x: 7.9, y: 1.72, w: 0.6, h: 1.6, fill: { color: C.white }, line: { type: "none" }, rounding: 0.05 });
s.addShape(pres.ShapeType.rect, { x: 8.05, y: 3.32, w: 0.3, h: 0.55, fill: { color: C.navy }, line: { type: "none" } });
s.addShape(pres.ShapeType.rect, { x: 8.12, y: 3.87, w: 0.16, h: 0.55, fill: { color: C.navy }, line: { type: "none" } });
// plunger line
s.addShape(pres.ShapeType.line, { x: 8.2, y: 1.75, w: 0, h: 1.3, line: { color: C.teal, width: 3 } });
// barrel markings
s.addShape(pres.ShapeType.line, { x: 7.93, y: 2.15, w: 0.25, h: 0, line: { color: C.tealLt, width: 1.5 } });
s.addShape(pres.ShapeType.line, { x: 7.93, y: 2.55, w: 0.25, h: 0, line: { color: C.tealLt, width: 1.5 } });
s.addShape(pres.ShapeType.line, { x: 7.93, y: 2.95, w: 0.25, h: 0, line: { color: C.tealLt, width: 1.5 } });
}
// ── SLIDE 2 — OVERVIEW / AGENDA ───────────────────────────────────────────────
{
const s = pres.addSlide();
lightSlide(s);
addAccentBar(s, C.teal);
s.addText("What We Will Cover", { x: 0.45, y: 0.22, w: 9.2, h: 0.6, fontSize: 26, bold: true, color: C.navy, fontFace: "Calibri", margin: 0 });
s.addShape(pres.ShapeType.line, { x: 0.45, y: 0.9, w: 9.1, h: 0, line: { color: C.grayLt, width: 1 } });
const topics = [
{ num: "01", label: "Definition & Anatomy" },
{ num: "02", label: "Indications" },
{ num: "03", label: "Contraindications" },
{ num: "04", label: "Types of Injectable Agents" },
{ num: "05", label: "Technique & Approach (Knee, Hip, Shoulder, Ankle)" },
{ num: "06", label: "Ultrasound Guidance" },
{ num: "07", label: "Complications" },
{ num: "08", label: "Post-Injection Care" },
{ num: "09", label: "Key Evidence & Summary" },
];
topics.forEach((t, i) => {
const col = i < 5 ? 0 : 1;
const row = i < 5 ? i : i - 5;
const x = col === 0 ? 0.45 : 5.25;
const y = 1.05 + row * 0.82;
s.addShape(pres.ShapeType.rect, { x, y, w: 0.52, h: 0.52, fill: { color: C.teal }, line: { type: "none" }, rounding: 0.08 });
s.addText(t.num, { x, y, w: 0.52, h: 0.52, fontSize: 13, bold: true, color: C.white, align: "center", valign: "middle", fontFace: "Calibri" });
s.addText(t.label, { x: x + 0.62, y: y + 0.05, w: col === 0 ? 4.0 : 4.5, h: 0.42, fontSize: 15, color: C.navy, fontFace: "Calibri" });
});
}
// ── SLIDE 3 — DEFINITION & ANATOMY ────────────────────────────────────────────
{
const s = pres.addSlide();
lightSlide(s);
addAccentBar(s, C.navy);
s.addText("Definition & Anatomy", { x: 0.45, y: 0.22, w: 9.2, h: 0.6, fontSize: 26, bold: true, color: C.navy, fontFace: "Calibri", margin: 0 });
s.addShape(pres.ShapeType.line, { x: 0.45, y: 0.9, w: 9.1, h: 0, line: { color: C.grayLt, width: 1 } });
// definition box
s.addShape(pres.ShapeType.rect, { x: 0.45, y: 1.0, w: 9.1, h: 0.85, fill: { color: C.teal }, line: { type: "none" }, rounding: 0.1 });
s.addText("Intra-articular (IA) injection is the direct delivery of a therapeutic or diagnostic agent into a synovial joint space, bypassing systemic circulation for localised effect.", {
x: 0.55, y: 1.05, w: 8.9, h: 0.75, fontSize: 14, color: C.white, fontFace: "Calibri", italic: true
});
// joint anatomy diagram (simplified cross-section)
// outer bone shapes
s.addShape(pres.ShapeType.rect, { x: 1.0, y: 2.05, w: 2.8, h: 0.7, fill: { color: C.gray }, line: { type: "none" }, rounding: 0.12 });
s.addShape(pres.ShapeType.rect, { x: 1.0, y: 4.1, w: 2.8, h: 0.7, fill: { color: C.gray }, line: { type: "none" }, rounding: 0.12 });
// cartilage
s.addShape(pres.ShapeType.rect, { x: 1.05, y: 2.72, w: 2.7, h: 0.28, fill: { color: C.tealLt }, line: { type: "none" } });
s.addShape(pres.ShapeType.rect, { x: 1.05, y: 3.85, w: 2.7, h: 0.28, fill: { color: C.tealLt }, line: { type: "none" } });
// synovial fluid space
s.addShape(pres.ShapeType.rect, { x: 1.05, y: 3.0, w: 2.7, h: 0.85, fill: { color: C.lightBg }, line: { color: C.tealLt, width: 1 } });
// synovial membrane lines
s.addShape(pres.ShapeType.line, { x: 1.05, y: 3.0, w: 0, h: 0.85, line: { color: C.amber, width: 2.5 } });
s.addShape(pres.ShapeType.line, { x: 3.75, y: 3.0, w: 0, h: 0.85, line: { color: C.amber, width: 2.5 } });
// needle
s.addShape(pres.ShapeType.line, { x: 3.9, y: 2.8, w: -0.55, h: 0.65, line: { color: C.red, width: 2.5 } });
s.addShape(pres.ShapeType.rect, { x: 3.88, y: 2.72, w: 0.55, h: 0.14, fill: { color: C.red }, line: { type: "none" }, rounding: 0.04 });
// labels
s.addText("Bone (Cortex)", { x: 0.2, y: 2.05, w: 1.7, h: 0.35, fontSize: 10, color: C.gray, fontFace: "Calibri", align: "right" });
s.addText("Articular Cartilage", { x: 0.2, y: 2.72, w: 1.7, h: 0.3, fontSize: 10, color: C.teal, fontFace: "Calibri", align: "right" });
s.addText("Synovial Space", { x: 0.2, y: 3.2, w: 1.7, h: 0.3, fontSize: 10, color: C.navy, fontFace: "Calibri", align: "right" });
s.addText("Synovial Membrane", { x: 0.2, y: 3.55, w: 1.7, h: 0.3, fontSize: 10, color: C.amber, fontFace: "Calibri", align: "right" });
s.addText("Needle", { x: 4.5, y: 2.72, w: 1.0, h: 0.3, fontSize: 10, color: C.red, fontFace: "Calibri", bold: true });
// anatomy key points
const pts = [
"Joints are lined by synovial membrane that produces synovial fluid for lubrication",
"Hyaline cartilage covers articular surfaces — avascular, relies on synovial fluid for nutrition",
"Joint capsule provides mechanical stability and encloses the synovial space",
"Correct needle placement = within the joint space, not in periarticular soft tissue",
];
s.addText(pts.map(p => ({ text: p, options: { bullet: { type: "bullet" }, breakLine: true, paraSpaceAfter: 4 } })),
{ x: 4.8, y: 1.0, w: 4.8, h: 3.9, fontSize: 13.5, color: C.navy, fontFace: "Calibri", valign: "top" });
}
// ── SLIDE 4 — INDICATIONS ─────────────────────────────────────────────────────
{
const s = pres.addSlide();
lightSlide(s);
addAccentBar(s, C.teal);
s.addText("Indications", { x: 0.45, y: 0.22, w: 9.2, h: 0.6, fontSize: 26, bold: true, color: C.navy, fontFace: "Calibri", margin: 0 });
s.addShape(pres.ShapeType.line, { x: 0.45, y: 0.9, w: 9.1, h: 0, line: { color: C.grayLt, width: 1 } });
const boxes = [
{ label: "Degenerative", color: C.teal, items: ["Osteoarthritis (knee, hip, shoulder)", "Chondromalacia patellae", "Post-traumatic arthritis"] },
{ label: "Inflammatory", color: C.navy, items: ["Rheumatoid arthritis", "Gout & Pseudogout (crystalloid arthropathy)", "Psoriatic arthritis", "Reactive arthritis"] },
{ label: "Mechanical", color: C.amber, items: ["Meniscal tears", "Effusion / haemarthrosis", "Synovitis", "Intra-articular derangement"] },
{ label: "Diagnostic", color: C.gray, items: ["Confirm joint-source pain (LA test)", "Arthrography contrast medium", "Pre-operative assessment"] },
];
boxes.forEach((b, i) => {
const x = 0.45 + (i % 2) * 4.6;
const y = 1.0 + Math.floor(i / 2) * 2.25;
s.addShape(pres.ShapeType.rect, { x, y, w: 4.3, h: 2.1, fill: { color: C.white }, line: { color: b.color, width: 2 }, rounding: 0.12 });
s.addShape(pres.ShapeType.rect, { x, y, w: 4.3, h: 0.46, fill: { color: b.color }, line: { type: "none" }, rounding: 0.12 });
s.addShape(pres.ShapeType.rect, { x, y: y + 0.23, w: 4.3, h: 0.23, fill: { color: b.color }, line: { type: "none" } });
s.addText(b.label, { x: x + 0.15, y: y + 0.07, w: 4.0, h: 0.36, fontSize: 15, bold: true, color: C.white, fontFace: "Calibri" });
s.addText(b.items.map(it => ({ text: it, options: { bullet: { type: "bullet" }, breakLine: true } })),
{ x: x + 0.12, y: y + 0.52, w: 4.06, h: 1.52, fontSize: 12.5, color: C.navy, fontFace: "Calibri", valign: "top" });
});
}
// ── SLIDE 5 — CONTRAINDICATIONS ───────────────────────────────────────────────
{
const s = pres.addSlide();
lightSlide(s);
addAccentBar(s, C.red);
s.addText("Contraindications", { x: 0.45, y: 0.22, w: 9.2, h: 0.6, fontSize: 26, bold: true, color: C.navy, fontFace: "Calibri", margin: 0 });
s.addShape(pres.ShapeType.line, { x: 0.45, y: 0.9, w: 9.1, h: 0, line: { color: C.grayLt, width: 1 } });
const abs = [
"Active septic arthritis in the joint",
"Local overlying skin infection (cellulitis, abscess)",
"Bacteraemia / systemic infection",
"Prosthetic joint (risk of seeding)",
"Known allergy to injectable agent",
"Fracture through the joint (acute)",
];
const rel = [
"Anticoagulation / bleeding diathesis",
"Poorly controlled diabetes (steroid injections)",
"Recent injection at same site (< 3 months)",
"Joint instability or ligamentous laxity",
"Immunosuppression",
"Patient refusal / uncooperative patient",
];
// absolute box
s.addShape(pres.ShapeType.rect, { x: 0.45, y: 1.0, w: 4.3, h: 4.2, fill: { color: C.white }, line: { color: C.red, width: 2 }, rounding: 0.12 });
s.addShape(pres.ShapeType.rect, { x: 0.45, y: 1.0, w: 4.3, h: 0.5, fill: { color: C.red }, line: { type: "none" }, rounding: 0.12 });
s.addShape(pres.ShapeType.rect, { x: 0.45, y: 1.25, w: 4.3, h: 0.25, fill: { color: C.red }, line: { type: "none" } });
s.addText("ABSOLUTE", { x: 0.6, y: 1.05, w: 4.0, h: 0.38, fontSize: 15, bold: true, color: C.white, fontFace: "Calibri" });
s.addText(abs.map(it => ({ text: it, options: { bullet: { type: "bullet" }, breakLine: true, paraSpaceAfter: 5 } })),
{ x: 0.6, y: 1.58, w: 4.0, h: 3.5, fontSize: 13, color: C.navy, fontFace: "Calibri", valign: "top" });
// relative box
s.addShape(pres.ShapeType.rect, { x: 5.15, y: 1.0, w: 4.4, h: 4.2, fill: { color: C.white }, line: { color: C.amber, width: 2 }, rounding: 0.12 });
s.addShape(pres.ShapeType.rect, { x: 5.15, y: 1.0, w: 4.4, h: 0.5, fill: { color: C.amber }, line: { type: "none" }, rounding: 0.12 });
s.addShape(pres.ShapeType.rect, { x: 5.15, y: 1.25, w: 4.4, h: 0.25, fill: { color: C.amber }, line: { type: "none" } });
s.addText("RELATIVE", { x: 5.3, y: 1.05, w: 4.0, h: 0.38, fontSize: 15, bold: true, color: C.white, fontFace: "Calibri" });
s.addText(rel.map(it => ({ text: it, options: { bullet: { type: "bullet" }, breakLine: true, paraSpaceAfter: 5 } })),
{ x: 5.3, y: 1.58, w: 4.1, h: 3.5, fontSize: 13, color: C.navy, fontFace: "Calibri", valign: "top" });
}
// ── SLIDE 6 — TYPES OF AGENTS ─────────────────────────────────────────────────
{
const s = pres.addSlide();
lightSlide(s);
addAccentBar(s, C.teal);
s.addText("Types of Injectable Agents", { x: 0.45, y: 0.22, w: 9.2, h: 0.6, fontSize: 26, bold: true, color: C.navy, fontFace: "Calibri", margin: 0 });
s.addShape(pres.ShapeType.line, { x: 0.45, y: 0.9, w: 9.1, h: 0, line: { color: C.grayLt, width: 1 } });
const agents = [
{
icon: "CS", color: C.navy, title: "Corticosteroids",
sub: "Most commonly used",
pts: ["Methylprednisolone, Triamcinolone, Betamethasone", "Reduces synovial inflammation via phospholipase inhibition", "Effect onset: 24–48 hrs; duration: weeks to months", "Limit: max 3–4 injections/year per joint"],
},
{
icon: "HA", color: C.teal, title: "Hyaluronic Acid",
sub: "Viscosupplementation",
pts: ["Restores viscoelasticity of synovial fluid", "Reduces cartilage wear and improves lubrication", "3–5 weekly injections; mainly used in knee OA", "Benefit lasts 3–6 months"],
},
{
icon: "LA", color: C.gray, title: "Local Anaesthetic",
sub: "Diagnostic & adjunct",
pts: ["Lidocaine, Bupivacaine", "Used alone for diagnostic blocks", "Mixed with steroids to reduce post-injection pain", "Short-term relief; can be repeated"],
},
{
icon: "PRP", color: C.amber, title: "Platelet-Rich Plasma",
sub: "Biologics / regenerative",
pts: ["Concentrated autologous growth factors", "Promotes cartilage repair and reduces inflammation", "Best evidence for knee OA and lateral epicondylitis", "2–3 injections; requires centrifugation preparation"],
},
{
icon: "SC", color: C.green, title: "Stem Cells / Biologics",
sub: "Emerging therapy",
pts: ["Mesenchymal stem cells from bone marrow / adipose", "Promotes chondrogenesis and anti-inflammation", "Limited but growing RCT evidence", "Currently off-label in most jurisdictions"],
},
{
icon: "OT", color: "#7B5EA7", title: "Others",
sub: "Specialist use",
pts: ["Radiosynovectomy (Yttrium-90, Rhenium-186)", "Osmic acid — chemical synovectomy", "Contrast agents — for arthrography", "Botulinum toxin A — chronic pain, spasticity"],
},
];
agents.forEach((a, i) => {
const col = i % 3;
const row = Math.floor(i / 3);
const x = 0.45 + col * 3.12;
const y = 1.0 + row * 2.22;
s.addShape(pres.ShapeType.rect, { x, y, w: 3.0, h: 2.1, fill: { color: C.white }, line: { color: a.color, width: 1.5 }, rounding: 0.1 });
s.addShape(pres.ShapeType.ellipse, { x: x + 0.12, y: y + 0.12, w: 0.55, h: 0.55, fill: { color: a.color }, line: { type: "none" } });
s.addText(a.icon, { x: x + 0.12, y: y + 0.12, w: 0.55, h: 0.55, fontSize: 9, bold: true, color: C.white, align: "center", valign: "middle", fontFace: "Calibri" });
s.addText(a.title, { x: x + 0.75, y: y + 0.1, w: 2.15, h: 0.32, fontSize: 13.5, bold: true, color: a.color, fontFace: "Calibri" });
s.addText(a.sub, { x: x + 0.75, y: y + 0.42, w: 2.15, h: 0.26, fontSize: 10.5, color: C.gray, fontFace: "Calibri", italic: true });
s.addText(a.pts.map(p => ({ text: p, options: { bullet: { type: "bullet" }, breakLine: true } })),
{ x: x + 0.12, y: y + 0.73, w: 2.76, h: 1.3, fontSize: 10.5, color: C.navy, fontFace: "Calibri", valign: "top" });
});
}
// ── SLIDE 7 — GENERAL TECHNIQUE ───────────────────────────────────────────────
{
const s = pres.addSlide();
lightSlide(s);
addAccentBar(s, C.navy);
s.addText("General Injection Technique", { x: 0.45, y: 0.22, w: 9.2, h: 0.6, fontSize: 26, bold: true, color: C.navy, fontFace: "Calibri", margin: 0 });
s.addShape(pres.ShapeType.line, { x: 0.45, y: 0.9, w: 9.1, h: 0, line: { color: C.grayLt, width: 1 } });
const steps = [
{ n: "1", title: "Patient Assessment", desc: "Confirm indication, review history, allergy check, informed consent" },
{ n: "2", title: "Positioning", desc: "Comfortable, expose joint; relaxed muscles improve accuracy" },
{ n: "3", title: "Landmark Palpation", desc: "Identify anatomical landmarks; mark entry point with thumbnail or pen" },
{ n: "4", title: "Aseptic Preparation", desc: "Clean technique: gloves, povidone-iodine or chlorhexidine; sterile field" },
{ n: "5", title: "Needle Insertion", desc: "Insert at marked point; angle depends on joint. Advance until loss of resistance felt" },
{ n: "6", title: "Confirm Position", desc: "Aspirate: free flow of fluid or aspiration of existing effusion confirms placement" },
{ n: "7", title: "Injection", desc: "Inject slowly; no resistance should be felt. Stop if patient reports severe pain" },
{ n: "8", title: "Post-Injection", desc: "Apply dressing; gentle ROM; advise rest 24–48 h; document dose/site/batch" },
];
// draw as a flow with connecting arrows
steps.forEach((st, i) => {
const col = i % 2;
const row = Math.floor(i / 2);
const x = 0.45 + col * 4.7;
const y = 1.0 + row * 1.15;
s.addShape(pres.ShapeType.rect, { x, y, w: 0.42, h: 0.62, fill: { color: C.teal }, line: { type: "none" }, rounding: 0.07 });
s.addText(st.n, { x, y, w: 0.42, h: 0.62, fontSize: 17, bold: true, color: C.white, align: "center", valign: "middle", fontFace: "Calibri" });
s.addText(st.title, { x: x + 0.52, y: y, w: 3.95, h: 0.3, fontSize: 13, bold: true, color: C.navy, fontFace: "Calibri", margin: 0 });
s.addText(st.desc, { x: x + 0.52, y: y + 0.3, w: 3.95, h: 0.42, fontSize: 11.5, color: C.gray, fontFace: "Calibri", margin: 0 });
// horizontal connector within same column
if (row < 3 && col === 0) {
s.addShape(pres.ShapeType.line, { x: x + 0.21, y: y + 0.62, w: 0, h: 0.53, line: { color: C.grayLt, width: 1.5 } });
}
});
}
// ── SLIDE 8 — KNEE INJECTION ──────────────────────────────────────────────────
{
const s = pres.addSlide();
lightSlide(s);
addAccentBar(s, C.teal);
s.addText("Knee Joint Injection", { x: 0.45, y: 0.22, w: 9.2, h: 0.6, fontSize: 26, bold: true, color: C.navy, fontFace: "Calibri", margin: 0 });
s.addShape(pres.ShapeType.line, { x: 0.45, y: 0.9, w: 9.1, h: 0, line: { color: C.grayLt, width: 1 } });
// knee diagram (frontal view simplified)
// femur
s.addShape(pres.ShapeType.rect, { x: 1.1, y: 1.0, w: 1.5, h: 1.4, fill: { color: C.gray }, line: { type: "none" }, rounding: 0.18 });
// femoral condyles
s.addShape(pres.ShapeType.ellipse, { x: 1.0, y: 2.2, w: 0.85, h: 0.65, fill: { color: C.gray }, line: { type: "none" } });
s.addShape(pres.ShapeType.ellipse, { x: 1.85, y: 2.2, w: 0.85, h: 0.65, fill: { color: C.gray }, line: { type: "none" } });
// patella
s.addShape(pres.ShapeType.ellipse, { x: 1.35, y: 2.05, w: 1.0, h: 0.55, fill: { color: C.grayLt }, line: { color: C.gray, width: 1 } });
// cartilage
s.addShape(pres.ShapeType.rect, { x: 1.05, y: 2.82, w: 1.6, h: 0.2, fill: { color: C.tealLt }, line: { type: "none" } });
// tibia
s.addShape(pres.ShapeType.rect, { x: 1.05, y: 3.0, w: 1.6, h: 1.5, fill: { color: C.gray }, line: { type: "none" }, rounding: 0.1 });
// joint space
s.addShape(pres.ShapeType.rect, { x: 1.05, y: 2.83, w: 1.6, h: 0.18, fill: { color: C.lightBg }, line: { color: C.tealLt, width: 1 } });
// fibula
s.addShape(pres.ShapeType.rect, { x: 2.72, y: 3.1, w: 0.35, h: 1.35, fill: { color: C.grayLt }, line: { type: "none" }, rounding: 0.07 });
// Approaches arrows
// Superolateral (most common)
s.addShape(pres.ShapeType.line, { x: 3.3, y: 2.18, w: -1.05, h: 0.42, line: { color: C.teal, width: 2.5 } });
s.addShape(pres.ShapeType.ellipse, { x: 2.22, y: 2.57, w: 0.1, h: 0.1, fill: { color: C.teal }, line: { type: "none" } });
// Medial midpatellar
s.addShape(pres.ShapeType.line, { x: 0.55, y: 2.45, w: 0.48, h: 0.2, line: { color: C.amber, width: 2.5 } });
s.addShape(pres.ShapeType.ellipse, { x: 1.0, y: 2.62, w: 0.1, h: 0.1, fill: { color: C.amber }, line: { type: "none" } });
// Inferomedial
s.addShape(pres.ShapeType.line, { x: 0.55, y: 3.15, w: 0.5, h: -0.2, line: { color: C.navy, width: 2.5 } });
s.addShape(pres.ShapeType.ellipse, { x: 1.02, y: 2.92, w: 0.1, h: 0.1, fill: { color: C.navy }, line: { type: "none" } });
// labels
s.addText("Superolateral\n(preferred)", { x: 3.35, y: 2.02, w: 1.8, h: 0.5, fontSize: 11, color: C.teal, fontFace: "Calibri", bold: true });
s.addText("Medial Mid-patellar", { x: 0.0, y: 2.28, w: 0.52, h: 0.45, fontSize: 9, color: C.amber, fontFace: "Calibri", align: "right" });
s.addText("Inferomedial\n(AM approach)", { x: 0.0, y: 3.0, w: 0.52, h: 0.5, fontSize: 9, color: C.navy, fontFace: "Calibri", align: "right" });
// technique points right side
const kpts = [
{ head: "Position:", body: "Supine, knee extended (or 90° flexed for infrapatellar approach)" },
{ head: "Needle:", body: "18–21G, 1.5 inch" },
{ head: "Superolateral approach:", body: "1–2 cm proximal and lateral to patella; angle 45° medial and distal into suprapatellar pouch" },
{ head: "Medial approach:", body: "Medial joint line with knee slightly flexed; aim toward joint space" },
{ head: "Accuracy:", body: "Landmark-guided: 70–80%. US-guided: >95% (preferred for dry joints or obese patients)" },
{ head: "Volume:", body: "Aspirate effusion first; inject 2–5 mL depending on agent" },
];
let ky = 1.0;
kpts.forEach(kp => {
s.addText([
{ text: kp.head + " ", options: { bold: true, color: C.teal } },
{ text: kp.body, options: { color: C.navy } },
], { x: 5.4, y: ky, w: 4.2, h: 0.65, fontSize: 12.5, fontFace: "Calibri", valign: "top" });
ky += 0.68;
});
}
// ── SLIDE 9 — HIP & SHOULDER ──────────────────────────────────────────────────
{
const s = pres.addSlide();
lightSlide(s);
addAccentBar(s, C.navy);
s.addText("Hip & Shoulder Injections", { x: 0.45, y: 0.22, w: 9.2, h: 0.6, fontSize: 26, bold: true, color: C.navy, fontFace: "Calibri", margin: 0 });
s.addShape(pres.ShapeType.line, { x: 0.45, y: 0.9, w: 9.1, h: 0, line: { color: C.grayLt, width: 1 } });
// HIP
s.addShape(pres.ShapeType.rect, { x: 0.45, y: 1.0, w: 4.3, h: 0.45, fill: { color: C.navy }, line: { type: "none" }, rounding: 0.08 });
s.addText("HIP JOINT", { x: 0.55, y: 1.04, w: 4.1, h: 0.36, fontSize: 15, bold: true, color: C.white, fontFace: "Calibri" });
// Hip diagram (simplified frontal)
// acetabulum
s.addShape(pres.ShapeType.ellipse, { x: 0.6, y: 1.55, w: 1.5, h: 1.5, fill: { color: C.grayLt }, line: { color: C.gray, width: 2 } });
s.addShape(pres.ShapeType.ellipse, { x: 0.75, y: 1.7, w: 1.2, h: 1.2, fill: { color: C.lightBg }, line: { type: "none" } });
// femoral head
s.addShape(pres.ShapeType.ellipse, { x: 0.88, y: 1.83, w: 0.95, h: 0.95, fill: { color: C.gray }, line: { type: "none" } });
// femoral neck + shaft
s.addShape(pres.ShapeType.rect, { x: 1.55, y: 2.55, w: 0.6, h: 1.5, fill: { color: C.gray }, line: { type: "none" }, rounding: 0.08 });
// joint space ring
s.addShape(pres.ShapeType.ellipse, { x: 0.86, y: 1.81, w: 0.99, h: 0.99, fill: { color: "transparent" }, line: { color: C.tealLt, width: 1.5, dashType: "dash" } });
// anterior approach needle
s.addShape(pres.ShapeType.line, { x: 2.45, y: 1.75, w: -0.65, h: 0.5, line: { color: C.teal, width: 2.5 } });
s.addText("Anterior\napproach", { x: 2.5, y: 1.65, w: 1.5, h: 0.45, fontSize: 10, color: C.teal, fontFace: "Calibri", bold: true });
// lateral approach
s.addShape(pres.ShapeType.line, { x: 0.52, y: 2.55, w: 0.5, h: -0.35, line: { color: C.amber, width: 2.5 } });
s.addText("Lateral\napproach", { x: 0.0, y: 2.42, w: 0.5, h: 0.42, fontSize: 9, color: C.amber, fontFace: "Calibri", align: "right" });
s.addText([
{ text: "Approaches: ", options: { bold: true, color: C.navy } },
{ text: "Anterior (most used) and Lateral (image-guided preferred)", options: { color: C.gray } },
], { x: 0.45, y: 3.18, w: 4.3, h: 0.38, fontSize: 12, fontFace: "Calibri" });
const hpts = [
"US or fluoroscopy strongly recommended — deep joint, close to femoral NVB",
"Needle: 20–22G spinal needle (3.5 inch)",
"Patient: supine, hip in neutral rotation",
"Inject 5–8 mL; aspirate to confirm placement",
];
s.addText(hpts.map(p => ({ text: p, options: { bullet: { type: "bullet" }, breakLine: true, paraSpaceAfter: 3 } })),
{ x: 0.45, y: 3.58, w: 4.3, h: 1.7, fontSize: 12, color: C.navy, fontFace: "Calibri", valign: "top" });
// SHOULDER
s.addShape(pres.ShapeType.rect, { x: 5.15, y: 1.0, w: 4.4, h: 0.45, fill: { color: C.teal }, line: { type: "none" }, rounding: 0.08 });
s.addText("SHOULDER (Glenohumeral)", { x: 5.25, y: 1.04, w: 4.2, h: 0.36, fontSize: 15, bold: true, color: C.white, fontFace: "Calibri" });
// shoulder diagram
// glenoid
s.addShape(pres.ShapeType.rect, { x: 5.3, y: 1.6, w: 0.35, h: 1.45, fill: { color: C.gray }, line: { type: "none" }, rounding: 0.05 });
// humeral head
s.addShape(pres.ShapeType.ellipse, { x: 5.55, y: 1.52, w: 1.25, h: 1.25, fill: { color: C.gray }, line: { type: "none" } });
s.addShape(pres.ShapeType.ellipse, { x: 5.58, y: 1.55, w: 1.18, h: 1.18, fill: { color: C.grayLt }, line: { type: "none" } });
// joint space
s.addShape(pres.ShapeType.rect, { x: 5.6, y: 1.78, w: 0.22, h: 0.7, fill: { color: C.lightBg }, line: { type: "none" } });
// humeral shaft
s.addShape(pres.ShapeType.rect, { x: 6.2, y: 2.6, w: 0.55, h: 1.6, fill: { color: C.gray }, line: { type: "none" }, rounding: 0.08 });
// acromion
s.addShape(pres.ShapeType.rect, { x: 5.3, y: 1.42, w: 1.5, h: 0.22, fill: { color: C.grayLt }, line: { type: "none" }, rounding: 0.05 });
// posterior approach needle
s.addShape(pres.ShapeType.line, { x: 7.25, y: 2.08, w: -0.9, h: 0.12, line: { color: C.teal, width: 2.5 } });
s.addText("Posterior\n(preferred)", { x: 7.3, y: 1.95, w: 1.7, h: 0.4, fontSize: 10, color: C.teal, fontFace: "Calibri", bold: true });
// anterior approach
s.addShape(pres.ShapeType.line, { x: 5.2, y: 2.1, w: 0.45, h: 0.1, line: { color: C.amber, width: 2.5 } });
s.addText("Anterior", { x: 4.7, y: 2.02, w: 0.45, h: 0.3, fontSize: 9, color: C.amber, fontFace: "Calibri", bold: true });
const spts = [
"Posterior approach: 2 cm inferior and medial to posterolateral acromion corner; aim anteriorly toward coracoid",
"Anterior approach: 1 cm lateral to coracoid process; aim posteriorly",
"Needle: 22G, 1.5–3.5 inch; Volume: 5–10 mL",
"Used in adhesive capsulitis, glenohumeral OA, RA",
"US-guided has higher accuracy; reduces number of attempts",
];
s.addText(spts.map(p => ({ text: p, options: { bullet: { type: "bullet" }, breakLine: true, paraSpaceAfter: 3 } })),
{ x: 5.15, y: 3.18, w: 4.4, h: 2.1, fontSize: 12, color: C.navy, fontFace: "Calibri", valign: "top" });
}
// ── SLIDE 10 — ANKLE, WRIST, ELBOW ────────────────────────────────────────────
{
const s = pres.addSlide();
lightSlide(s);
addAccentBar(s, C.teal);
s.addText("Ankle, Wrist & Elbow Injections", { x: 0.45, y: 0.22, w: 9.2, h: 0.6, fontSize: 26, bold: true, color: C.navy, fontFace: "Calibri", margin: 0 });
s.addShape(pres.ShapeType.line, { x: 0.45, y: 0.9, w: 9.1, h: 0, line: { color: C.grayLt, width: 1 } });
const joints = [
{
name: "ANKLE", color: C.teal,
diag: { type: "ankle" },
pts: [
"Position: supine, foot plantar-flexed",
"Approach: anteromedial — medial to tibialis anterior tendon, 1 cm proximal to tibiotalar joint",
"Needle: 22G, 1.5 inch; Volume: 3–5 mL",
"Avoid dorsalis pedis artery (lateral to EHL)",
"US guidance reduces risk of tendon/vessel injury",
],
},
{
name: "WRIST", color: C.navy,
pts: [
"Approach: dorsal — between EPL and EDC tendons at radiocarpal joint (Lister's tubercle landmark)",
"Slight wrist flexion to open dorsal joint space",
"Needle: 25G, 1 inch; Volume: 2–3 mL",
"Used in RA, SLAC wrist, TFCC pathology",
"Avoid radial artery (volar-radial side)",
],
},
{
name: "ELBOW", color: C.amber,
pts: [
"Lateral approach: enter between radial head, lateral epicondyle and olecranon tip (soft spot)",
"Elbow at 90° flexion; forearm pronated",
"Needle: 22G, 1 inch; Volume: 2–3 mL",
"Used in OA, RA, post-traumatic arthritis, loose bodies",
"Aspiration of effusion first aids placement",
],
},
];
joints.forEach((jt, i) => {
const x = 0.45 + i * 3.12;
s.addShape(pres.ShapeType.rect, { x, y: 1.0, w: 3.0, h: 0.42, fill: { color: jt.color }, line: { type: "none" }, rounding: 0.08 });
s.addText(jt.name, { x: x + 0.1, y: 1.04, w: 2.8, h: 0.34, fontSize: 14, bold: true, color: C.white, fontFace: "Calibri" });
// simple anatomical shape for each joint
if (jt.name === "ANKLE") {
// tibia
s.addShape(pres.ShapeType.rect, { x: x + 0.75, y: 1.52, w: 0.8, h: 0.9, fill: { color: C.gray }, line: { type: "none" }, rounding: 0.06 });
// fibula
s.addShape(pres.ShapeType.rect, { x: x + 1.62, y: 1.6, w: 0.35, h: 0.75, fill: { color: C.grayLt }, line: { type: "none" }, rounding: 0.05 });
// talus
s.addShape(pres.ShapeType.rect, { x: x + 0.7, y: 2.52, w: 1.3, h: 0.55, fill: { color: C.gray }, line: { type: "none" }, rounding: 0.08 });
// joint space
s.addShape(pres.ShapeType.rect, { x: x + 0.72, y: 2.42, w: 0.88, h: 0.12, fill: { color: C.lightBg }, line: { color: C.tealLt, width: 1 } });
// cartilage
s.addShape(pres.ShapeType.rect, { x: x + 0.72, y: 2.39, w: 0.88, h: 0.06, fill: { color: C.tealLt }, line: { type: "none" } });
// needle — anteromedial
s.addShape(pres.ShapeType.line, { x: x + 0.45, y: 2.2, w: 0.35, h: 0.28, line: { color: C.teal, width: 2.5 } });
s.addText("AM\nneedle", { x: x + 0.05, y: 2.08, w: 0.65, h: 0.4, fontSize: 9, color: C.teal, fontFace: "Calibri" });
} else if (jt.name === "WRIST") {
// radius
s.addShape(pres.ShapeType.rect, { x: x + 0.62, y: 1.52, w: 0.65, h: 1.0, fill: { color: C.gray }, line: { type: "none" }, rounding: 0.06 });
// ulna
s.addShape(pres.ShapeType.rect, { x: x + 1.35, y: 1.52, w: 0.5, h: 0.9, fill: { color: C.grayLt }, line: { type: "none" }, rounding: 0.06 });
// carpals row
s.addShape(pres.ShapeType.rect, { x: x + 0.55, y: 2.62, w: 1.5, h: 0.55, fill: { color: C.gray }, line: { type: "none" }, rounding: 0.08 });
// joint space
s.addShape(pres.ShapeType.rect, { x: x + 0.56, y: 2.52, w: 1.25, h: 0.12, fill: { color: C.lightBg }, line: { color: C.tealLt, width: 1 } });
// needle
s.addShape(pres.ShapeType.line, { x: x + 0.88, y: 2.12, w: 0.1, h: 0.38, line: { color: C.navy, width: 2.5 } });
s.addText("Dorsal\nentry", { x: x + 0.7, y: 1.95, w: 0.8, h: 0.4, fontSize: 9, color: C.navy, fontFace: "Calibri" });
} else if (jt.name === "ELBOW") {
// humerus
s.addShape(pres.ShapeType.rect, { x: x + 0.85, y: 1.52, w: 0.7, h: 0.9, fill: { color: C.gray }, line: { type: "none" }, rounding: 0.08 });
// radial head
s.addShape(pres.ShapeType.ellipse, { x: x + 1.62, y: 2.22, w: 0.55, h: 0.55, fill: { color: C.gray }, line: { type: "none" } });
// olecranon
s.addShape(pres.ShapeType.rect, { x: x + 0.82, y: 2.22, w: 0.6, h: 0.6, fill: { color: C.grayLt }, line: { type: "none" }, rounding: 0.06 });
// soft spot / joint space
s.addShape(pres.ShapeType.ellipse, { x: x + 1.42, y: 2.32, w: 0.25, h: 0.25, fill: { color: C.lightBg }, line: { color: C.tealLt, width: 1 } });
// needle
s.addShape(pres.ShapeType.line, { x: x + 2.35, y: 2.22, w: -0.65, h: 0.25, line: { color: C.amber, width: 2.5 } });
s.addText("Lateral\nsoft spot", { x: x + 2.2, y: 2.06, w: 0.8, h: 0.38, fontSize: 9, color: C.amber, fontFace: "Calibri" });
}
s.addText(jt.pts.map(p => ({ text: p, options: { bullet: { type: "bullet" }, breakLine: true, paraSpaceAfter: 3 } })),
{ x: x + 0.05, y: 3.2, w: 2.9, h: 2.1, fontSize: 10.5, color: C.navy, fontFace: "Calibri", valign: "top" });
});
}
// ── SLIDE 11 — ULTRASOUND GUIDANCE ────────────────────────────────────────────
{
const s = pres.addSlide();
lightSlide(s);
addAccentBar(s, C.teal);
s.addText("Ultrasound-Guided Injection", { x: 0.45, y: 0.22, w: 9.2, h: 0.6, fontSize: 26, bold: true, color: C.navy, fontFace: "Calibri", margin: 0 });
s.addShape(pres.ShapeType.line, { x: 0.45, y: 0.9, w: 9.1, h: 0, line: { color: C.grayLt, width: 1 } });
// US screen mock
const ux = 0.5, uy = 1.05;
s.addShape(pres.ShapeType.rect, { x: ux, y: uy, w: 4.0, h: 3.2, fill: { color: "111111" }, line: { color: C.gray, width: 2 }, rounding: 0.12 });
s.addShape(pres.ShapeType.rect, { x: ux+0.15, y: uy+0.18, w: 3.7, h: 2.65, fill: { color: "001122" }, line: { type: "none" } });
// US layers (tissue planes)
s.addShape(pres.ShapeType.rect, { x: ux+0.15, y: uy+0.18, w: 3.7, h: 0.4, fill: { color: "223344" }, line: { type: "none" } }); // skin/subcut
s.addShape(pres.ShapeType.rect, { x: ux+0.15, y: uy+0.58, w: 3.7, h: 0.55, fill: { color: "334455" }, line: { type: "none" } }); // muscle
s.addShape(pres.ShapeType.rect, { x: ux+0.15, y: uy+1.13, w: 3.7, h: 0.18, fill: { color: C.tealLt }, line: { type: "none" } }); // cartilage
s.addShape(pres.ShapeType.rect, { x: ux+0.15, y: uy+1.31, w: 3.7, h: 0.35, fill: { color: "003355" }, line: { type: "none" } }); // joint fluid
s.addShape(pres.ShapeType.rect, { x: ux+0.15, y: uy+1.66, w: 3.7, h: 1.17, fill: { color: "1a2a3a" }, line: { type: "none" } }); // bone shadow
// bone hyperechoic line
s.addShape(pres.ShapeType.line, { x: ux+0.15, y: uy+1.62, w: 3.7, h: 0, line: { color: "DDDDDD", width: 2 } });
// needle echo
s.addShape(pres.ShapeType.line, { x: ux+0.5, y: uy+0.35, w: 1.8, h: 0.98, line: { color: "FFFFFF", width: 1.5 } });
s.addShape(pres.ShapeType.ellipse, { x: ux+2.25, y: uy+1.3, w: 0.1, h: 0.1, fill: { color: "FFFFFF" }, line: { type: "none" } });
// US annotations
s.addText("SKIN", { x: ux+0.2, y: uy+0.2, w: 0.7, h: 0.25, fontSize: 8, color: "AACCEE", fontFace: "Calibri" });
s.addText("MUSCLE", { x: ux+0.2, y: uy+0.62, w: 0.9, h: 0.25, fontSize: 8, color: "AACCEE", fontFace: "Calibri" });
s.addText("CARTILAGE", { x: ux+0.2, y: uy+1.16, w: 1.1, h: 0.2, fontSize: 8, color: C.tealLt, fontFace: "Calibri" });
s.addText("JOINT SPACE", { x: ux+0.2, y: uy+1.35, w: 1.3, h: 0.22, fontSize: 8, color: "6699BB", fontFace: "Calibri" });
s.addText("BONE", { x: ux+0.2, y: uy+1.7, w: 0.7, h: 0.22, fontSize: 8, color: "CCCCCC", fontFace: "Calibri" });
s.addText("NEEDLE", { x: ux+1.1, y: uy+0.5, w: 0.8, h: 0.22, fontSize: 8, color: "FFFFFF", italic: true, fontFace: "Calibri" });
// probe label
s.addShape(pres.ShapeType.rect, { x: ux+1.3, y: uy+3.05, w: 1.1, h: 0.22, fill: { color: C.gray }, line: { type: "none" }, rounding: 0.04 });
s.addText("US PROBE", { x: ux+1.3, y: uy+3.06, w: 1.1, h: 0.2, fontSize: 8, color: C.white, align: "center", fontFace: "Calibri" });
// right side points
const upts = [
{ h: "Real-time visualisation", b: "Needle tip seen throughout procedure; reduces risk of inadvertent vessel or nerve injury" },
{ h: "Higher accuracy", b: "US-guided: 95–100% vs. landmark: 60–80% for shoulder and hip" },
{ h: "In-plane technique", b: "Needle parallel to probe; entire shaft visible on screen — preferred for IA injections" },
{ h: "Out-of-plane technique", b: "Needle perpendicular to probe; tip appears as bright dot — used in tight spaces" },
{ h: "When to use US guidance", b: "Obese patients, failed landmark attempt, deep joints (hip), dry joints, prosthetic joints" },
{ h: "Probe frequency", b: "Superficial joints: 10–15 MHz linear. Deep joints: 3–5 MHz curvilinear" },
];
let ry = 1.05;
upts.forEach(p => {
s.addText([
{ text: p.h + ": ", options: { bold: true, color: C.teal } },
{ text: p.b, options: { color: C.navy } },
], { x: 4.9, y: ry, w: 4.7, h: 0.65, fontSize: 12.5, fontFace: "Calibri", valign: "top" });
ry += 0.68;
});
}
// ── SLIDE 12 — COMPLICATIONS ──────────────────────────────────────────────────
{
const s = pres.addSlide();
lightSlide(s);
addAccentBar(s, C.red);
s.addText("Complications", { x: 0.45, y: 0.22, w: 9.2, h: 0.6, fontSize: 26, bold: true, color: C.navy, fontFace: "Calibri", margin: 0 });
s.addShape(pres.ShapeType.line, { x: 0.45, y: 0.9, w: 9.1, h: 0, line: { color: C.grayLt, width: 1 } });
const comps = [
{
group: "Immediate", color: C.red,
items: [
["Post-injection flare", "Transient pain/swelling 12–24 h after steroid injection; self-limiting in 2–3 days; seen in up to 25%"],
["Vasovagal reaction", "Rare; manage with supine position and reassurance"],
["Haemarthrosis", "Uncommon; direct vessel puncture; risk in anticoagulated patients"],
],
},
{
group: "Short-Term", color: C.amber,
items: [
["Infection / Septic Arthritis", "Most feared; incidence < 1 in 10,000; strict asepsis is key"],
["Skin depigmentation", "Subcutaneous steroid tracking; more common in dark skin; use Z-track or two-needle technique"],
["Fat atrophy", "Localised soft tissue atrophy around injection site"],
],
},
{
group: "Long-Term", color: C.navy,
items: [
["Cartilage degeneration", "Repeated corticosteroid injections (> 3–4/year) can accelerate articular cartilage loss"],
["Tendon rupture", "Avoid direct tendon injection; inject into sheath only"],
["Hyperglycaemia", "Steroid-related; monitor BGL in diabetics for 48–72 h post-injection"],
["HPA axis suppression", "Rare with limited injections; theoretical with frequent use"],
],
},
];
comps.forEach((grp, gi) => {
const y0 = 1.02 + gi * 1.55;
s.addShape(pres.ShapeType.rect, { x: 0.45, y: y0, w: 1.5, h: 1.45, fill: { color: grp.color }, line: { type: "none" }, rounding: 0.08 });
s.addText(grp.group, { x: 0.45, y: y0, w: 1.5, h: 1.45, fontSize: 14, bold: true, color: C.white, fontFace: "Calibri", align: "center", valign: "middle", rotate: 0 });
grp.items.forEach((it, ii) => {
const iy = y0 + ii * 0.46;
s.addShape(pres.ShapeType.rect, { x: 2.05, y: iy + 0.03, w: 7.5, h: 0.42, fill: { color: ii % 2 === 0 ? C.white : C.lightBg }, line: { type: "none" }, rounding: 0.05 });
s.addText([
{ text: it[0] + " ", options: { bold: true, color: grp.color } },
{ text: it[1], options: { color: C.navy } },
], { x: 2.15, y: iy + 0.05, w: 7.3, h: 0.38, fontSize: 12, fontFace: "Calibri" });
});
});
}
// ── SLIDE 13 — POST-INJECTION CARE ────────────────────────────────────────────
{
const s = pres.addSlide();
lightSlide(s);
addAccentBar(s, C.teal);
s.addText("Post-Injection Care & Counselling", { x: 0.45, y: 0.22, w: 9.2, h: 0.6, fontSize: 26, bold: true, color: C.navy, fontFace: "Calibri", margin: 0 });
s.addShape(pres.ShapeType.line, { x: 0.45, y: 0.9, w: 9.1, h: 0, line: { color: C.grayLt, width: 1 } });
const cards = [
{ icon: "REST", color: C.teal, title: "Rest", body: "Avoid strenuous activity for 24–48 hours. Light activity after this is acceptable. For weight-bearing joints, limit loading for 2–3 days." },
{ icon: "ICE", color: C.navy, title: "Ice & Comfort", body: "Apply ice pack (wrapped) for 15–20 mins at a time if soreness develops. NSAIDs may be used short-term for post-injection flare." },
{ icon: "MON", color: C.amber, title: "Monitoring", body: "Warn patient about post-injection flare (24 h). Monitor diabetics for hyperglycaemia. Return if increasing pain, fever, or swelling after 48 h." },
{ icon: "RPT", color: C.gray, title: "Repeat Timing", body: "Steroid: no more than 3–4 per joint per year; minimum 3-month interval. HA: 3–5 weekly injections. PRP: repeat at 6 weeks if needed." },
{ icon: "DOC", color: C.green, title: "Documentation", body: "Record: injection site, agent, batch number, dose/volume, needle gauge, number of attempts, patient response, consent obtained." },
{ icon: "REHAB", color: "#7B5EA7", title: "Rehabilitation", body: "Injection is adjunct to rehabilitation — refer for physiotherapy. Window of reduced pain allows more effective exercise therapy." },
];
cards.forEach((c, i) => {
const col = i % 3;
const row = Math.floor(i / 3);
const x = 0.45 + col * 3.12;
const y = 1.0 + row * 2.28;
s.addShape(pres.ShapeType.rect, { x, y, w: 3.0, h: 2.15, fill: { color: C.white }, line: { color: c.color, width: 1.8 }, rounding: 0.12 });
s.addShape(pres.ShapeType.rect, { x, y, w: 3.0, h: 0.45, fill: { color: c.color }, line: { type: "none" }, rounding: 0.12 });
s.addShape(pres.ShapeType.rect, { x, y: y+0.23, w: 3.0, h: 0.22, fill: { color: c.color }, line: { type: "none" } });
s.addText(c.title, { x: x+0.12, y: y+0.07, w: 2.75, h: 0.33, fontSize: 14, bold: true, color: C.white, fontFace: "Calibri" });
s.addText(c.body, { x: x+0.1, y: y+0.52, w: 2.8, h: 1.6, fontSize: 11.5, color: C.navy, fontFace: "Calibri", valign: "top" });
});
}
// ── SLIDE 14 — EVIDENCE SUMMARY ───────────────────────────────────────────────
{
const s = pres.addSlide();
lightSlide(s);
addAccentBar(s, C.navy);
s.addText("Key Evidence & Clinical Pearls", { x: 0.45, y: 0.22, w: 9.2, h: 0.6, fontSize: 26, bold: true, color: C.navy, fontFace: "Calibri", margin: 0 });
s.addShape(pres.ShapeType.line, { x: 0.45, y: 0.9, w: 9.1, h: 0, line: { color: C.grayLt, width: 1 } });
const evrows = [
{ agent: "Corticosteroid", condition: "Knee OA", evidence: "Strong short-term pain relief (4–6 weeks). No disease modification. Limit to 3–4/year.", level: "HIGH" },
{ agent: "Corticosteroid", condition: "Adhesive capsulitis", evidence: "Best benefit when given early (< 2 months of symptoms) combined with PT.", level: "HIGH" },
{ agent: "Hyaluronic Acid", condition: "Knee OA", evidence: "Modest pain relief, lower risk than steroids, effect up to 6 months.", level: "MOD" },
{ agent: "PRP", condition: "Knee OA", evidence: "Superior to HA and steroids for pain and function at 6 months in RCTs.", level: "MOD" },
{ agent: "PRP", condition: "Lateral epicondylitis", evidence: "Effective, especially single injection; benefit over steroid at 1 year.", level: "MOD" },
{ agent: "Stem cells", condition: "Knee OA / cartilage defects", evidence: "Promising but limited RCT data. Not yet standard of care.", level: "LOW" },
{ agent: "US guidance", condition: "All joints", evidence: "Consistently improves accuracy vs. landmark-guided; reduces number of attempts and complications.", level: "HIGH" },
];
// table header
s.addShape(pres.ShapeType.rect, { x: 0.45, y: 1.0, w: 9.1, h: 0.38, fill: { color: C.navy }, line: { type: "none" }, rounding: 0.06 });
const cols = ["Agent", "Condition", "Evidence Summary", "Level"];
const cw = [1.5, 1.8, 5.0, 0.8];
let cx = 0.55;
cols.forEach((col, ci) => {
s.addText(col, { x: cx, y: 1.02, w: cw[ci], h: 0.32, fontSize: 12, bold: true, color: C.white, fontFace: "Calibri" });
cx += cw[ci];
});
evrows.forEach((row, ri) => {
const ry = 1.4 + ri * 0.54;
s.addShape(pres.ShapeType.rect, { x: 0.45, y: ry - 0.04, w: 9.1, h: 0.5, fill: { color: ri % 2 === 0 ? C.white : C.lightBg }, line: { type: "none" } });
const lvlColor = row.level === "HIGH" ? C.green : row.level === "MOD" ? C.amber : C.gray;
s.addShape(pres.ShapeType.rect, { x: 8.95, y: ry, w: 0.55, h: 0.36, fill: { color: lvlColor }, line: { type: "none" }, rounding: 0.06 });
s.addText(row.level, { x: 8.95, y: ry, w: 0.55, h: 0.36, fontSize: 8.5, bold: true, color: C.white, align: "center", valign: "middle", fontFace: "Calibri" });
s.addText(row.agent, { x: 0.55, y: ry + 0.02, w: 1.4, h: 0.36, fontSize: 11.5, bold: true, color: C.navy, fontFace: "Calibri" });
s.addText(row.condition, { x: 2.05, y: ry + 0.02, w: 1.7, h: 0.36, fontSize: 11, color: C.gray, fontFace: "Calibri" });
s.addText(row.evidence, { x: 3.85, y: ry + 0.02, w: 5.0, h: 0.36, fontSize: 11, color: C.navy, fontFace: "Calibri" });
});
// footer pearl
s.addShape(pres.ShapeType.rect, { x: 0.45, y: 5.05, w: 9.1, h: 0.38, fill: { color: C.teal }, line: { type: "none" }, rounding: 0.08 });
s.addText("Clinical Pearl: Injection is an adjunct — always combine with rehabilitation, activity modification, and patient education for best outcomes.", {
x: 0.55, y: 5.07, w: 8.9, h: 0.32, fontSize: 12, bold: true, color: C.white, fontFace: "Calibri"
});
}
// ── SLIDE 15 — SUMMARY / CLOSE ────────────────────────────────────────────────
{
const s = pres.addSlide();
darkSlide(s);
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.navy }, line: { type: "none" } });
s.addShape(pres.ShapeType.rect, { x: 0, y: 4.0, w: 10, h: 1.625, fill: { color: C.teal }, line: { type: "none" } });
s.addShape(pres.ShapeType.rect, { x: 0, y: 3.65, w: 10, h: 0.38, fill: { color: C.tealLt }, line: { type: "none" } });
s.addText("Key Takeaways", { x: 0.6, y: 0.3, w: 8.8, h: 0.7, fontSize: 30, bold: true, color: C.white, fontFace: "Calibri" });
const takes = [
"IA injections are safe, effective, and minimally invasive tools in orthopaedic practice",
"Strict aseptic technique eliminates most infective risk (< 0.003%)",
"Choose the right agent for the right indication — steroid for inflammation, HA for lubrication, PRP for regeneration",
"Ultrasound guidance improves accuracy in all joints, especially hip and shoulder",
"Limit steroid injections — repeated use risks cartilage damage and tendon changes",
"Always combine injection with rehabilitation for durable, meaningful clinical benefit",
];
takes.forEach((t, i) => {
s.addShape(pres.ShapeType.ellipse, { x: 0.6, y: 1.1 + i * 0.42, w: 0.25, h: 0.25, fill: { color: C.tealLt }, line: { type: "none" } });
s.addText(t, { x: 0.97, y: 1.1 + i * 0.42, w: 8.6, h: 0.38, fontSize: 14, color: C.white, fontFace: "Calibri" });
});
s.addText("Intra-Articular Injections in Orthopaedics", { x: 0.6, y: 4.1, w: 8.8, h: 0.45, fontSize: 16, bold: true, color: C.white, fontFace: "Calibri" });
s.addText("Principles • Techniques • Evidence-Based Practice", { x: 0.6, y: 4.6, w: 8.8, h: 0.35, fontSize: 13, color: C.lightBg, fontFace: "Calibri", italic: true });
}
// ── WRITE FILE ────────────────────────────────────────────────────────────────
pres.writeFile({ fileName: "/home/daytona/workspace/intra-articular-ppt/Intra_Articular_Injections_Orthopaedics.pptx" })
.then(() => console.log("DONE"))
.catch(e => { console.error(e); process.exit(1); });
cd /home/daytona/workspace/intra-articular-ppt && node build.js 2>&1
ls -lh /home/daytona/workspace/intra-articular-ppt/*.pptx
Intra Articular Injections Orthopaedics
Presentation · PPTX
| Slide | Content |
|---|---|
| 1 | Title slide - dark navy + teal design |
| 2 | Agenda / overview |
| 3 | Definition + joint anatomy diagram (bone, cartilage, synovial space, needle) |
| 4 | Indications - 4 categories (degenerative, inflammatory, mechanical, diagnostic) |
| 5 | Contraindications - absolute vs relative, colour-coded |
| 6 | Injectable agents - Corticosteroids, HA, LA, PRP, Stem cells, Others |
| 7 | General technique - 8 step-by-step procedure boxes |
| 8 | Knee injection - diagram with 3 approach arrows + technique points |
| 9 | Hip & Shoulder - side-by-side diagrams with approach labels |
| 10 | Ankle, Wrist & Elbow - 3-column layout with mini diagrams |
| 11 | Ultrasound guidance - mock US screen + in-plane vs out-of-plane technique |
| 12 | Complications - immediate, short-term, long-term in rows |
| 13 | Post-injection care - 6 cards (rest, ice, monitoring, repeat timing, documentation, rehab) |
| 14 | Evidence table with evidence level badges |
| 15 | Key takeaways - dark closing slide |