Pemphigus vulgaris
"pemphigus vulgaris"[MeSH Terms] AND treatment



| Sign | Description |
|---|---|
| Nikolsky sign | Lateral shearing of intact epidermis from dermis with slight tangential pressure |
| Asboe-Hansen sign (Nikolsky II) | Gentle pressure on an intact bulla forces fluid to spread laterally under adjacent skin |
Note: In oral biopsies, the blister roof is often absent because it ruptures before biopsy. Diagnosis is still made by the location of the split and "tombstone" basal cells.
| Test | Finding in PV |
|---|---|
| Direct IF (DIF) | IgG (± C3) deposited on the surface of keratinocytes in an intercellular "chicken wire" pattern - perilesional skin or plucked hairs |
| Indirect IF (IIF) | Circulating IgG in intercellular pattern; monkey esophagus is the ideal substrate; positive in 80-90% of patients |
| ELISA | Anti-Dsg3 (mucosal-dominant type); Anti-Dsg1 + Anti-Dsg3 (mucocutaneous type) |
| Condition | Key Distinguishing Feature |
|---|---|
| Bullous pemphigoid | Tense (not flaccid) blisters; subepidermal split; anti-BP180/BP230 antibodies; DIF shows linear IgG at BMZ |
| Paraneoplastic pemphigus | Associated malignancy (lymphoma); anti-envoplakin/periplakin/desmoplakin antibodies |
| Mucous membrane pemphigoid | Scarring; subepithelial blisters; linear IgG/IgA at BMZ |
| Erythema multiforme/SJS | Targetoid lesions; epidermal necrosis; not acantholysis |
| Herpetic gingivostomatitis | Viral prodrome; Tzanck smear positive; HSV serology |
Make power point slide
ls -la /home/daytona/workspace/ 2>/dev/null && mkdir -p /home/daytona/workspace/pemphigus-pptx
~/pemphigus-pptx/make_pptx.js
const pptxgen = require("pptxgenjs");
const { execSync } = require("child_process");
// ── Fetch clinical images ──────────────────────────────────────────────────
const imageUrls = [
"https://cdn.orris.care/cdss_images/6af16bd92697838ed5dbba2893b5c3a5e381dda19ede65e575b409689c87eed8.png", // skin lesion
"https://cdn.orris.care/cdss_images/3a807df59032be3103f9b7fdf19459923d63253e7cbdce57c6f5440915bdbdbf.png", // oral lesion
"https://cdn.orris.care/cdss_images/e71715d927dc7fac97dd0116ba6862abc95b634561c617252b45c93eff285f93.png", // widespread
];
let imgs = [];
try {
const raw = execSync(
`node /home/daytona/skills/shared/scripts/fetch_images.js ${imageUrls.map(u => `"${u}"`).join(" ")}`
).toString();
imgs = JSON.parse(raw);
} catch (e) {
console.error("Image fetch failed:", e.message);
imgs = imageUrls.map(() => ({ base64: null, error: "fetch failed" }));
}
// ── Color palette (medical deep red + dark slate) ──────────────────────────
const C = {
darkBg: "1A1F2E", // dark navy - title/section slides
accentRed: "C0392B", // deep crimson accent
accentGold:"E67E22", // warm gold for highlights
white: "FFFFFF",
lightGray: "F4F5F7",
midGray: "BDC3C7",
textDark: "2C3E50",
cardBg: "FFFFFF",
greenOk: "27AE60",
blueInfo: "2980B9",
};
const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.title = "Pemphigus Vulgaris";
pres.author = "Medical Education";
// ─── Helper: section header bar ───────────────────────────────────────────
function sectionBar(slide, text) {
slide.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0.55, w: 10, h: 0.06, fill: { color: C.accentRed }, line: { color: C.accentRed } });
slide.addText(text.toUpperCase(), {
x: 0.35, y: 0.1, w: 9.3, h: 0.45, fontSize: 11, bold: true, color: C.accentRed,
charSpacing: 3, valign: "middle",
});
}
// ─── Helper: card box ─────────────────────────────────────────────────────
function card(slide, x, y, w, h, fillColor = C.lightGray) {
slide.addShape(pres.shapes.RECTANGLE, {
x, y, w, h,
fill: { color: fillColor },
line: { color: "E0E4E8", width: 0.5 },
shadow: { type: "outer", color: "000000", blur: 8, offset: 2, angle: 135, opacity: 0.10 },
});
}
// ─── Helper: accent dot ───────────────────────────────────────────────────
function dot(slide, x, y, color = C.accentRed) {
slide.addShape(pres.shapes.OVAL, { x, y, w: 0.12, h: 0.12, fill: { color }, line: { color } });
}
// ══════════════════════════════════════════════════════════════════════════
// SLIDE 1 — TITLE
// ══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
// dark background
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.darkBg }, line: { color: C.darkBg } });
// red accent stripe left
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: 0.25, h: 5.625, fill: { color: C.accentRed }, line: { color: C.accentRed } });
// red accent stripe bottom
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 5.15, w: 10, h: 0.475, fill: { color: C.accentRed }, line: { color: C.accentRed } });
// If skin lesion image available, place as background strip
if (imgs[2] && !imgs[2].error) {
s.addImage({ data: imgs[2].base64, x: 5.5, y: 0, w: 4.5, h: 5.15, transparency: 45 });
// dark overlay over image
s.addShape(pres.shapes.RECTANGLE, { x: 5.5, y: 0, w: 4.5, h: 5.15, fill: { color: "1A1F2E", transparency: 40 }, line: { color: "1A1F2E", transparency: 100 } });
}
s.addText("PEMPHIGUS VULGARIS", {
x: 0.5, y: 1.1, w: 5.5, h: 1.1, fontSize: 36, bold: true, color: C.white,
fontFace: "Calibri", charSpacing: 1,
});
s.addText("Autoimmune Blistering Disease", {
x: 0.5, y: 2.2, w: 5.5, h: 0.5, fontSize: 18, color: C.accentGold, fontFace: "Calibri", italic: true,
});
s.addShape(pres.shapes.RECTANGLE, { x: 0.5, y: 2.85, w: 1.6, h: 0.06, fill: { color: C.accentRed }, line: { color: C.accentRed } });
s.addText([
{ text: "Dermatology | Immunology | Clinical Management", options: { color: C.midGray, fontSize: 12 } },
], { x: 0.5, y: 3.1, w: 6.5, h: 0.4 });
// bottom bar text
s.addText("Based on: Andrews' Diseases of the Skin · Fitzpatrick's Dermatology · Dermatology 5e", {
x: 0.3, y: 5.18, w: 9.4, h: 0.38, fontSize: 9, color: "FFFFFF", align: "center", valign: "middle",
});
}
// ══════════════════════════════════════════════════════════════════════════
// SLIDE 2 — OVERVIEW / AT-A-GLANCE
// ══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.lightGray }, line: { color: C.lightGray } });
sectionBar(s, "Overview");
s.addText("At a Glance", { x: 0.35, y: 0.6, w: 9, h: 0.55, fontSize: 22, bold: true, color: C.textDark });
const items = [
{ icon: "⚡", label: "Type", val: "Autoimmune intraepidermal blistering disease" },
{ icon: "🎯", label: "Antigen", val: "Desmoglein 3 (Dsg3) ± Desmoglein 1 (Dsg1)" },
{ icon: "🔬", label: "Histology", val: "Suprabasal acantholysis — 'tombstone row' of basal cells" },
{ icon: "💉", label: "Antibody", val: "IgG autoantibodies (primarily IgG4) against keratinocyte surface" },
{ icon: "📍", label: "Blister level", val: "Suprabasal (above basal cell layer)" },
{ icon: "👤", label: "Demographics", val: "5th–6th decade; equal sex; Jewish & Mediterranean predisposition" },
{ icon: "⚠️", label: "Key sign", val: "Nikolsky sign positive; Asboe-Hansen sign (Nikolsky II)" },
{ icon: "💊", label: "Treatment", val: "Corticosteroids + Rituximab (anti-CD20) ± azathioprine/MMF" },
];
const cols = [[0, 1, 2, 3], [4, 5, 6, 7]];
cols.forEach((idxs, ci) => {
idxs.forEach((idx, ri) => {
const item = items[idx];
const x = 0.3 + ci * 4.9;
const y = 1.25 + ri * 1.0;
card(s, x, y, 4.6, 0.85, C.cardBg);
s.addText(item.icon + " " + item.label.toUpperCase(), {
x: x + 0.15, y: y + 0.07, w: 4.3, h: 0.28, fontSize: 8.5, bold: true, color: C.accentRed, charSpacing: 1,
});
s.addText(item.val, {
x: x + 0.15, y: y + 0.35, w: 4.3, h: 0.42, fontSize: 10.5, color: C.textDark, valign: "top",
});
});
});
}
// ══════════════════════════════════════════════════════════════════════════
// SLIDE 3 — CLINICAL FEATURES (with images)
// ══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.white }, line: { color: C.white } });
sectionBar(s, "Clinical Features");
s.addText("Clinical Presentation", { x: 0.35, y: 0.6, w: 6, h: 0.55, fontSize: 22, bold: true, color: C.textDark });
// Left: text bullets
const leftCols = [
{ head: "Mucous Membranes (ALL patients)", color: C.accentRed, bullets: [
"Painful oral erosions — first sign in 60% of cases",
"Buccal & palatine mucosa most common",
"Extends to lips, throat (hoarseness), esophagus",
"Conjunctivae, nasal, vaginal, penile, anal involvement",
]},
{ head: "Skin Lesions", color: C.blueInfo, bullets: [
"Flaccid, thin-walled easily ruptured bullae",
"Arise on normal or erythematous skin",
"Fluid: initially clear → hemorrhagic/turbid",
"Large, painful erosions; crust-covered; slow to heal",
"Heal with post-inflammatory hyperpigmentation — NO scarring",
]},
];
leftCols.forEach((col, ci) => {
const y = 1.28 + ci * 2.15;
s.addShape(pres.shapes.RECTANGLE, { x: 0.3, y, w: 5.65, h: 0.32, fill: { color: col.color }, line: { color: col.color } });
s.addText(col.head, { x: 0.4, y, w: 5.5, h: 0.32, fontSize: 10, bold: true, color: C.white, valign: "middle" });
s.addText(col.bullets.map(b => ({ text: b, options: { bullet: { type: "bullet", indent: 15 }, breakLine: true, fontSize: 10, color: C.textDark } })),
{ x: 0.4, y: y + 0.34, w: 5.5, h: col.bullets.length * 0.36 + 0.1 });
});
// Right: images
const imgX = 6.2;
if (imgs[0] && !imgs[0].error) {
s.addImage({ data: imgs[0].base64, x: imgX, y: 1.1, w: 3.5, h: 2.2, rounding: false });
s.addText("Flaccid bulla — skin", { x: imgX, y: 3.3, w: 3.5, h: 0.25, fontSize: 8, color: C.midGray, align: "center", italic: true });
}
if (imgs[1] && !imgs[1].error) {
s.addImage({ data: imgs[1].base64, x: imgX, y: 3.6, w: 3.5, h: 1.8 });
s.addText("Oral erosion — gingival", { x: imgX, y: 5.35, w: 3.5, h: 0.2, fontSize: 8, color: C.midGray, align: "center", italic: true });
}
}
// ══════════════════════════════════════════════════════════════════════════
// SLIDE 4 — PATHOGENESIS
// ══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.darkBg }, line: { color: C.darkBg } });
sectionBar(s, "Pathogenesis");
// white bar for heading
s.addText("Immunopathogenesis", { x: 0.35, y: 0.6, w: 9, h: 0.55, fontSize: 22, bold: true, color: C.white });
// Desmoglein compensation theory boxes
const theory = [
{ title: "Anti-Dsg3 ONLY", sub: "Mucosal-dominant disease\n(Mucosa lacks Dsg1 → cannot compensate)", col: C.accentRed },
{ title: "Anti-Dsg3 + Anti-Dsg1", sub: "Mucocutaneous disease\n(Both mucosa & skin affected)", col: C.accentGold },
];
theory.forEach((t, i) => {
const x = 0.4 + i * 4.7;
s.addShape(pres.shapes.ROUNDED_RECTANGLE, { x, y: 1.28, w: 4.3, h: 1.05, fill: { color: t.col }, line: { color: t.col }, rectRadius: 0.08 });
s.addText(t.title, { x: x + 0.15, y: 1.32, w: 4, h: 0.35, fontSize: 13, bold: true, color: C.white });
s.addText(t.sub, { x: x + 0.15, y: 1.65, w: 4, h: 0.6, fontSize: 10, color: C.white });
});
// Mechanism flow
const steps = [
"IgG4 autoantibodies bind Dsg3 on keratinocyte surface",
"Desmosomal adhesion disrupted → acantholysis",
"Complement activation + plasminogen activator",
"Basal cells detach from each other (not from BMZ)",
"Suprabasal blister forms ('tombstone row' remains)",
];
s.addText("Mechanism of Blister Formation", { x: 0.4, y: 2.5, w: 9, h: 0.35, fontSize: 12, bold: true, color: C.accentGold });
steps.forEach((st, i) => {
const x = 0.4 + i * 1.87;
s.addShape(pres.shapes.ROUNDED_RECTANGLE, { x, y: 2.9, w: 1.75, h: 0.9, fill: { color: "243044" }, line: { color: C.accentRed, width: 0.75 }, rectRadius: 0.06 });
s.addText(`${i + 1}`, { x: x + 0.05, y: 2.9, w: 0.35, h: 0.9, fontSize: 20, bold: true, color: C.accentRed, valign: "middle" });
s.addText(st, { x: x + 0.38, y: 2.93, w: 1.32, h: 0.84, fontSize: 8.5, color: C.white, valign: "middle" });
if (i < 4) {
s.addText("→", { x: x + 1.77, y: 3.2, w: 0.15, h: 0.4, fontSize: 14, color: C.accentRed, valign: "middle" });
}
});
// T cell involvement
const tcell = [
{ t: "CD4+ T cells (Th2 dominant)", c: "Drive autoantibody production" },
{ t: "Th1 cells", c: "Chronic disease maintenance" },
{ t: "HLA-DRB1 / DR4 / DR6", c: "Genetic susceptibility" },
];
s.addText("Contributing Factors", { x: 0.4, y: 4.0, w: 9, h: 0.3, fontSize: 12, bold: true, color: C.accentGold });
tcell.forEach((item, i) => {
const x = 0.4 + i * 3.2;
s.addShape(pres.shapes.RECTANGLE, { x, y: 4.35, w: 3.0, h: 0.85, fill: { color: "243044" }, line: { color: "3D5A80", width: 0.5 } });
s.addText(item.t, { x: x + 0.1, y: 4.38, w: 2.8, h: 0.38, fontSize: 10, bold: true, color: C.white });
s.addText(item.c, { x: x + 0.1, y: 4.74, w: 2.8, h: 0.38, fontSize: 9, color: C.midGray });
});
}
// ══════════════════════════════════════════════════════════════════════════
// SLIDE 5 — HISTOPATHOLOGY & IMMUNOFLUORESCENCE
// ══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.lightGray }, line: { color: C.lightGray } });
sectionBar(s, "Histopathology & Immunofluorescence");
s.addText("Diagnosis: Histology & Immunofluorescence", { x: 0.35, y: 0.6, w: 9, h: 0.55, fontSize: 20, bold: true, color: C.textDark });
// Left: Histology
card(s, 0.3, 1.25, 4.5, 4.1, C.cardBg);
s.addShape(pres.shapes.RECTANGLE, { x: 0.3, y: 1.25, w: 4.5, h: 0.35, fill: { color: C.accentRed }, line: { color: C.accentRed } });
s.addText("HISTOPATHOLOGY", { x: 0.4, y: 1.25, w: 4.3, h: 0.35, fontSize: 10, bold: true, color: C.white, valign: "middle", charSpacing: 2 });
const histoItems = [
["Blister level", "Suprabasal — just above basal cell layer"],
["Key feature", "Acantholysis — loss of intercellular adhesion"],
["Tombstone sign", "Basal cells remain attached to basement membrane, protruding upward"],
["Acantholytic cells", "Round, no intercellular bridges"],
["Dermis", "Perivascular mononuclear infiltrate with eosinophils"],
["Early lesions", "Eosinophilic spongiosis (without frank acantholysis)"],
["Oral biopsy", "Blister roof often absent; split level + acantholysis diagnostic"],
];
histoItems.forEach((row, i) => {
const y = 1.68 + i * 0.49;
s.addText(row[0] + ":", { x: 0.45, y, w: 1.4, h: 0.44, fontSize: 9.5, bold: true, color: C.accentRed, valign: "top" });
s.addText(row[1], { x: 1.85, y, w: 2.8, h: 0.44, fontSize: 9.5, color: C.textDark, valign: "top" });
});
// Right: IF table
card(s, 5.0, 1.25, 4.7, 4.1, C.cardBg);
s.addShape(pres.shapes.RECTANGLE, { x: 5.0, y: 1.25, w: 4.7, h: 0.35, fill: { color: C.blueInfo }, line: { color: C.blueInfo } });
s.addText("IMMUNOFLUORESCENCE", { x: 5.1, y: 1.25, w: 4.5, h: 0.35, fontSize: 10, bold: true, color: C.white, valign: "middle", charSpacing: 2 });
const ifRows = [
{ test: "Direct IF (DIF)", finding: "IgG (± C3) on keratinocyte surface — intercellular \"chicken wire\" pattern", note: "Perilesional skin or plucked hairs" },
{ test: "Indirect IF (IIF)", finding: "Circulating IgG intercellular pattern", note: "Positive in 80–90%; monkey esophagus substrate preferred" },
{ test: "ELISA", finding: "Anti-Dsg3 alone = mucosal type\nAnti-Dsg3 + Dsg1 = mucocutaneous type", note: "Quantitative; titer correlates with disease activity" },
{ test: "DIF → negative", finding: "Predicts sustained remission after withdrawal of therapy", note: "Key prognostic indicator" },
];
ifRows.forEach((row, i) => {
const y = 1.68 + i * 0.88;
s.addShape(pres.shapes.RECTANGLE, { x: 5.05, y, w: 4.55, h: 0.82, fill: { color: i % 2 === 0 ? "EBF5FB" : C.white }, line: { color: "D0E8F2", width: 0.5 } });
s.addText(row.test, { x: 5.12, y: y + 0.04, w: 4.3, h: 0.26, fontSize: 9.5, bold: true, color: C.blueInfo });
s.addText(row.finding, { x: 5.12, y: y + 0.29, w: 4.3, h: 0.3, fontSize: 9, color: C.textDark });
s.addText("→ " + row.note, { x: 5.12, y: y + 0.57, w: 4.3, h: 0.22, fontSize: 8, color: "7F8C8D", italic: true });
});
}
// ══════════════════════════════════════════════════════════════════════════
// SLIDE 6 — CLINICAL SIGNS & DIFFERENTIAL DIAGNOSIS
// ══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.white }, line: { color: C.white } });
sectionBar(s, "Clinical Signs & Differential Diagnosis");
s.addText("Signs & Differential Diagnosis", { x: 0.35, y: 0.6, w: 9, h: 0.55, fontSize: 20, bold: true, color: C.textDark });
// Clinical signs
const signs = [
{ name: "Nikolsky Sign", desc: "Slight lateral pressure on intact skin → epidermis shears away from dermis leaving moist surface", color: C.accentRed },
{ name: "Asboe-Hansen Sign", desc: "Pressure on intact bulla → fluid spreads laterally under adjacent skin (Nikolsky II)", color: C.accentGold },
];
signs.forEach((sg, i) => {
const x = 0.3 + i * 4.85;
s.addShape(pres.shapes.ROUNDED_RECTANGLE, { x, y: 1.25, w: 4.55, h: 1.1, fill: { color: sg.color }, line: { color: sg.color }, rectRadius: 0.08 });
s.addText(sg.name, { x: x + 0.15, y: 1.28, w: 4.2, h: 0.4, fontSize: 13, bold: true, color: C.white });
s.addText(sg.desc, { x: x + 0.15, y: 1.66, w: 4.2, h: 0.62, fontSize: 9.5, color: C.white });
});
// Differential table
s.addText("Differential Diagnosis", { x: 0.35, y: 2.5, w: 9, h: 0.35, fontSize: 13, bold: true, color: C.textDark });
const ddx = [
{ condition: "Bullous Pemphigoid", distinction: "Tense blisters (subepidermal); anti-BP180/BP230; linear IgG at BMZ; spares mucosa often" },
{ condition: "Mucous Membrane Pemphigoid", distinction: "Scarring mucosal lesions; subepithelial split; linear IgG/IgA at BMZ" },
{ condition: "Paraneoplastic Pemphigus", distinction: "Occult malignancy (esp. lymphoma); anti-envoplakin/periplakin; severe oral + skin" },
{ condition: "Stevens-Johnson Syndrome", distinction: "Drug trigger; targetoid lesions; epidermal necrosis (not acantholysis); fever/systemic illness" },
{ condition: "Herpetic Gingivostomatitis", distinction: "Viral prodrome; Tzanck positive; HSV serology; grouped vesicles" },
];
// header
s.addShape(pres.shapes.RECTANGLE, { x: 0.3, y: 2.9, w: 9.4, h: 0.32, fill: { color: C.textDark }, line: { color: C.textDark } });
s.addText("Condition", { x: 0.4, y: 2.9, w: 2.5, h: 0.32, fontSize: 9.5, bold: true, color: C.white, valign: "middle" });
s.addText("Key Distinguishing Feature", { x: 3.0, y: 2.9, w: 6.6, h: 0.32, fontSize: 9.5, bold: true, color: C.white, valign: "middle" });
ddx.forEach((row, i) => {
const y = 3.24 + i * 0.44;
s.addShape(pres.shapes.RECTANGLE, { x: 0.3, y, w: 9.4, h: 0.42, fill: { color: i % 2 === 0 ? C.lightGray : C.white }, line: { color: "D0D3D4", width: 0.5 } });
s.addText(row.condition, { x: 0.4, y: y + 0.03, w: 2.5, h: 0.36, fontSize: 9.5, bold: true, color: C.accentRed, valign: "middle" });
s.addText(row.distinction, { x: 3.0, y: y + 0.03, w: 6.6, h: 0.36, fontSize: 9, color: C.textDark, valign: "middle" });
});
}
// ══════════════════════════════════════════════════════════════════════════
// SLIDE 7 — TREATMENT
// ══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.lightGray }, line: { color: C.lightGray } });
sectionBar(s, "Treatment");
s.addText("Management of Pemphigus Vulgaris", { x: 0.35, y: 0.6, w: 9, h: 0.55, fontSize: 20, bold: true, color: C.textDark });
// Three columns: Topical | Systemic Steroids | Adjuvants + Biologics
const cols3 = [
{
title: "Topical / Supportive", color: C.greenOk,
items: [
"Daily baths — remove crusts, reduce odor",
"Silver sulfadiazine 1% (limited disease)",
"Potent topical corticosteroids",
"Topical tacrolimus (limited disease)",
"Viscous lidocaine / diphenhydramine mouthwash (oral pain)",
"Antiseptic mouthwashes",
"Wound dressings / silver nitrate gauze",
],
},
{
title: "Systemic Steroids", color: C.accentRed,
items: [
"Prednisone 1 mg/kg/day — first-line",
"↑ to split dose (1 mg/kg BID) if inadequate",
"High doses: 100–150 mg/day if needed",
"IV pulse methylprednisolone 1 g/day (severe)",
"Start calcium + vitamin D + bisphosphonate early",
"Pneumocystis prophylaxis in combination therapy",
"Monitor antibody titers for treatment response",
],
},
{
title: "Adjuvants & Biologics", color: C.blueInfo,
items: [
"Rituximab (anti-CD20) — first-line for severe PV",
"IVIG — effective; combine with rituximab",
"Azathioprine — steroid-sparing",
"Mycophenolate mofetil (MMF)",
"Cyclophosphamide (refractory disease)",
"Dapsone — mild disease / prophylaxis",
"Plasmapheresis — reduce circulating antibodies",
],
},
];
cols3.forEach((col, ci) => {
const x = 0.28 + ci * 3.24;
card(s, x, 1.25, 3.1, 4.2, C.cardBg);
s.addShape(pres.shapes.RECTANGLE, { x, y: 1.25, w: 3.1, h: 0.38, fill: { color: col.color }, line: { color: col.color } });
s.addText(col.title, { x: x + 0.1, y: 1.25, w: 2.9, h: 0.38, fontSize: 10.5, bold: true, color: C.white, valign: "middle" });
s.addText(col.items.map((it, idx) => ({
text: it,
options: { bullet: { type: "bullet" }, breakLine: idx < col.items.length - 1, fontSize: 9.5, color: C.textDark },
})), { x: x + 0.12, y: 1.68, w: 2.85, h: 3.7 });
});
}
// ══════════════════════════════════════════════════════════════════════════
// SLIDE 8 — PROGNOSIS & KEY TAKEAWAYS
// ══════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.darkBg }, line: { color: C.darkBg } });
// accent stripe
s.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: 0.2, h: 5.625, fill: { color: C.accentRed }, line: { color: C.accentRed } });
sectionBar(s, "Prognosis & Key Takeaways");
s.addText("Prognosis & Key Takeaways", { x: 0.4, y: 0.6, w: 9, h: 0.55, fontSize: 22, bold: true, color: C.white });
// Prognosis boxes
const prog = [
{ era: "Pre-Corticosteroid Era", stat: "~75%", label: "Mortality", col: C.accentRed },
{ era: "Modern Era", stat: "Low", label: "Disease Mortality\n(Treatment complications now dominate)", col: C.accentGold },
{ era: "Remission Predictor", stat: "DIF →\nNegative", label: "Sustained remission after stopping therapy", col: C.greenOk },
];
prog.forEach((p, i) => {
const x = 0.4 + i * 3.15;
s.addShape(pres.shapes.ROUNDED_RECTANGLE, { x, y: 1.28, w: 3.0, h: 1.3, fill: { color: "243044" }, line: { color: p.col, width: 1.5 }, rectRadius: 0.08 });
s.addText(p.era, { x: x + 0.12, y: 1.32, w: 2.75, h: 0.28, fontSize: 9, color: C.midGray });
s.addText(p.stat, { x: x + 0.12, y: 1.6, w: 2.75, h: 0.5, fontSize: 22, bold: true, color: p.col });
s.addText(p.label, { x: x + 0.12, y: 2.08, w: 2.75, h: 0.44, fontSize: 9, color: C.white });
});
// Key takeaways
s.addText("Key Takeaways", { x: 0.4, y: 2.75, w: 9, h: 0.38, fontSize: 14, bold: true, color: C.accentGold });
const takeaways = [
{ num: "01", text: "Oral erosions are the presenting feature in 60% — always consider PV in persistent oral ulceration unresponsive to standard treatment." },
{ num: "02", text: "Flaccid blisters + positive Nikolsky sign = intraepidermal disease. Tense blisters = think bullous pemphigoid (subepidermal)." },
{ num: "03", text: "ELISA for anti-Dsg3/Dsg1 is quantitative and tracks disease activity. DIF conversion to negative signals durable remission." },
{ num: "04", text: "Rituximab is now first-line for severe PV alongside corticosteroids. Monitor for treatment complications closely." },
{ num: "05", text: "Earlier diagnosis and earlier treatment = more favorable prognosis and higher chance of complete remission." },
];
takeaways.forEach((tk, i) => {
const y = 3.2 + i * 0.46;
s.addShape(pres.shapes.RECTANGLE, { x: 0.4, y, w: 0.42, h: 0.38, fill: { color: C.accentRed }, line: { color: C.accentRed } });
s.addText(tk.num, { x: 0.4, y, w: 0.42, h: 0.38, fontSize: 11, bold: true, color: C.white, align: "center", valign: "middle" });
s.addText(tk.text, { x: 0.9, y: y + 0.02, w: 8.8, h: 0.36, fontSize: 10, color: C.white, valign: "middle" });
});
}
// ── Write file ─────────────────────────────────────────────────────────────
const outPath = "/home/daytona/workspace/pemphigus-pptx/Pemphigus_Vulgaris.pptx";
pres.writeFile({ fileName: outPath })
.then(() => console.log("✅ Saved:", outPath))
.catch(err => { console.error("❌ Error:", err); process.exit(1); });
cd /home/daytona/workspace/pemphigus-pptx && node make_pptx.js 2>&1
cd /home/daytona/workspace/pemphigus-pptx && node -e " const {execSync} = require('child_process'); const urls = [ 'https://cdn.orris.care/cdss_images/6af16bd92697838ed5dbba2893b5c3a5e381dda19ede65e575b409689c87eed8.png', 'https://cdn.orris.care/cdss_images/3a807df59032be3103f9b7fdf19459923d63253e7cbdce57c6f5440915bdbdbf.png', 'https://cdn.orris.care/cdss_images/e71715d927dc7fac97dd0116ba6862abc95b634561c617252b45c93eff285f93.png', ]; const results = []; for (const url of urls) { try { const raw = execSync(\`node /home/daytona/skills/shared/scripts/fetch_images.js \"\${url}\"\`, {maxBuffer: 20*1024*1024}).toString(); const parsed = JSON.parse(raw); results.push(parsed[0]); console.log('OK:', url.slice(-20), parsed[0].error ? 'ERROR:'+parsed[0].error : 'base64 len='+parsed[0].base64.length); } catch(e) { results.push({url, base64: null, error: e.message}); console.log('FAIL:', e.message); } } require('fs').writeFileSync('/home/daytona/workspace/pemphigus-pptx/imgs.json', JSON.stringify(results)); console.log('Done'); " 2>&1
~/pemphigus-pptx/make_pptx.js
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/pemphigus-pptx/make_pptx.js'
~/pemphigus-pptx/make_pptx.js
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/pemphigus-pptx/make_pptx.js'
cd /home/daytona/workspace/pemphigus-pptx && node make_pptx.js 2>&1
~/pemphigus-pptx/make_pptx.js
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/pemphigus-pptx/make_pptx.js'
cd /home/daytona/workspace/pemphigus-pptx && node make_pptx.js 2>&1
Pemphigus Vulgaris
Presentation · PPTX
| Slide | Content |
|---|---|
| 1 | Title slide - dark background with widespread PV clinical image |
| 2 | At a Glance - 8 key fact cards (type, antigen, histology, antibody, blister level, demographics, signs, treatment) |
| 3 | Clinical Features - mucosal vs. skin lesions with embedded clinical photos (skin bulla + oral erosion) |
| 4 | Pathogenesis - Dsg compensation theory, 5-step mechanism flow, T cell involvement |
| 5 | Histopathology & Immunofluorescence - side-by-side detailed tables for DIF / IIF / ELISA |
| 6 | Clinical Signs & DDx - Nikolsky/Asboe-Hansen explained + differential diagnosis table |
| 7 | Treatment - 3-column layout: topical, systemic steroids, adjuvants & biologics (rituximab) |
| 8 | Prognosis & Key Takeaways - mortality stats + 5 numbered clinical pearls |