Hi

Hi! I'm Orris. How can I help you today?

Explain vartmangat roga of eyes

Reading File
Finding Sources
Searching the Web

vartmangat roga Ayurveda eyelid diseases types

Finding Sources
Reading Web Page

https://www.easyayurveda.com/eye-diseases-classification

Finding Sources
Here is a detailed explanation of Vartmangat Roga (also spelled Vartmagata Roga):

Vartmangat Roga - Diseases of the Eyelids (Ayurveda)

Vartma means eyelid, and Vartmangat Roga refers to all diseases that are located in or affecting the eyelids. According to Acharya Sushruta's classical Ayurvedic text (Sushruta Samhita, Uttaratantra), there are 21 Vartmagata Rogas (eyelid diseases) out of the total 76 Netra Rogas (eye diseases).

Classification

Location-based Classification in Netra Roga (76 total):

LocationNameNo. of Diseases
Sandhi (junctions)Sandhi Gata Roga9
Vartma (eyelids)Vartma Gata Roga21
Shukla (sclera/conjunctiva)Shukla Gata Roga11
Krishna (cornea/iris)Krishna Gata Roga4
All over eyeSarvashraya Roga17
Retina/lensDrushti Gata Roga12
External/traumaticBaahyaja2

The 21 Vartmangat Rogas

Ayurvedic NameModern Equivalent
UtsanginiChalazion / Meibomian cyst
KumbhikaHordeolum (Stye)
PothakiTrachoma / follicular conjunctivitis
Vartma SharkaraCalcareous deposits on eyelid (calcified granuloma)
Arsho VartmaPapilloma / warty growth on lid
Shushka ArshaDry wart-like growth (fibroma)
Anjana NamikaInfected meibomian gland / stye-like
Bahala VartmaThickening of eyelid (hypertrophic blepharitis)
Vartma BandhakaSymblepharon (adhesion of eyelid to eyeball)
Klishta VartmaUlcerative blepharitis
Kardama VartmaBlepharitis with discharge/crusting (muddy lids)
Shyaava VartmaDiscoloration of eyelid (pigmentation/ecchymosis)
Praklinna VartmaWatering eye / hyperlacrimation blepharitis
Apariklinna VartmaDry eyelid condition
Vaatahata VartmaPtosis / facial nerve palsy / lagophthalmos
ArbudaTumor/neoplasm of the eyelid
NimeshaBlepharospasm (inability to open eyes)
Shonita ArshaVascular growth / haemangioma on lid
LaganaCystic swelling (painless)
Visa VartmaToxic/allergic eyelid condition (contact dermatitis)
Pakshma KopaTrichiasis, distichiasis, entropion

Causative Factors (Nidana)

Common causative factors mentioned across the vartma rogas:
  • Exposure to smoke, dust, and heat
  • Suppression of natural urges (especially tears - Ashru Vega)
  • Excessive strain on eyes (looking at minute objects)
  • Improper diet (excess carbohydrates, Kapha-aggravating food)
  • Excessive vomiting (Vamana)
  • Trauma to eyelids
  • Disturbed sleep cycles

Dosha Classification of Key Vartma Rogas

DiseasePredominant Dosha
Vaatahata VartmaVata
Klishta VartmaPitta
Bahala VartmaKapha
UtsanginiTridoshaja (all three doshas)
KumbhikaPitta + Kapha
PothakiKapha
Pakshma KopaSannipataja (all doshas)

Treatment Principles (Chikitsa)

Ayurvedic treatments are categorized based on the surgical/non-surgical approach:

1. Lekhya (Scraping) - for:

Utsangini, Bahala Vartma, Kardama Vartma, Shyaava Vartma, Klishta Vartma, Pothaki, Kumbhika, Vartma Sharkara

2. Bhedhya (Incision) - for:

Lagana, Visa Vartma, Anjana Namika (surgical drainage)

3. Medical Management:

  • Tarpana - oil pooling over the eye
  • Putapaka - medicated eye drops
  • Seka - medicated eye wash
  • Anjana - medicated collyrium (eye liner)
  • Virechana - purgation (internal detox)
  • Local fomentation (Sweda) - warm compresses

Important Individual Conditions

Utsangini (Chalazion)

  • Nodular swelling on the lower lid with opening directed inward
  • Tridoshaja condition - treated by Lekhana (scraping/curetting)
  • Corresponds to Meibomian cyst in modern medicine

Kumbhika (Stye/Hordeolum)

  • Acute painful swelling at lid margin with pus
  • Caused by Staphylococcus aureus in modern terms
  • Treated with hot compresses, drainage, antibiotics (modern) / Seka + Virechana (Ayurvedic)

Pakshma Kopa (Trichiasis/Entropion)

  • Misdirected eyelashes rubbing the cornea
  • Sannipataja - requires lifelong management
  • Modern treatment: epilation, electrolysis, surgery

Vaatahata Vartma (Ptosis/Lagophthalmos)

  • Vata-dominant condition
  • Corresponds to 7th cranial nerve palsy or ptosis from 3rd nerve palsy
  • Incurable (Asaadhya) in classical Ayurveda

Prognosis (Sadhyasadhyata)

CategoryExamples
Sadhya (Curable)Utsangini, Kumbhika, Bahala Vartma, Lagana
Yapya (Manageable/lifelong)Pakshma Kopa
Asaadhya (Incurable)Vaatahata Vartma, Nimesha, Arbuda (malignant)

This classification from Sushruta Samhita is remarkably aligned with modern ophthalmology - covering lid infections, lid malpositions, lid tumors, and inflammatory disorders. The Ayurvedic approach integrates dosha-based pathogenesis with both surgical (Shalya) and non-surgical (Shalakya) management, making it a comprehensive system for eyelid diseases.

Create a quick reference PDF guide on 21 vartmangat rogas for easy consultation

Reading File
Running Command

ls -la /home/daytona/workspace/ 2>/dev/null || echo "workspace empty or not found"

Running Command

mkdir -p /home/daytona/workspace/vartmangat-roga && python3 -c "import reportlab; print('reportlab ok')" && python3 -c "from reportlab.lib.pagesizes import A4; print('A4 ok')"

Writing File

~/vartmangat-roga/generate_pdf.py

from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import mm, cm
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
    HRFlowable, KeepTogether, PageBreak
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import Flowable

# ─── Color palette ───────────────────────────────────────────────────────────
DEEP_MAROON    = colors.HexColor("#6B1A2A")
GOLD           = colors.HexColor("#C8963E")
LIGHT_GOLD     = colors.HexColor("#F5E9D0")
CREAM          = colors.HexColor("#FDF6EC")
PALE_GREEN     = colors.HexColor("#E8F5E9")
PALE_BLUE      = colors.HexColor("#E3F2FD")
PALE_YELLOW    = colors.HexColor("#FFFDE7")
PALE_ORANGE    = colors.HexColor("#FFF3E0")
LIGHT_GREY     = colors.HexColor("#F5F5F5")
MID_GREY       = colors.HexColor("#BDBDBD")
DARK_TEXT      = colors.HexColor("#212121")
SECTION_HEAD   = colors.HexColor("#4A0E1A")

W, H = A4

def make_doc(path):
    doc = SimpleDocTemplate(
        path,
        pagesize=A4,
        rightMargin=15*mm, leftMargin=15*mm,
        topMargin=18*mm, bottomMargin=15*mm,
        title="Vartmangat Roga – Quick Reference Guide",
        author="Shalakya Tantra / Ayurvedic Ophthalmology"
    )
    return doc

# ─── Styles ──────────────────────────────────────────────────────────────────
base = getSampleStyleSheet()

def S(name, **kw):
    return ParagraphStyle(name, **kw)

STYLES = {
    "title": S("title", fontName="Helvetica-Bold", fontSize=22,
               textColor=DEEP_MAROON, alignment=TA_CENTER, spaceAfter=4),
    "subtitle": S("subtitle", fontName="Helvetica", fontSize=11,
                  textColor=GOLD, alignment=TA_CENTER, spaceAfter=2),
    "tag": S("tag", fontName="Helvetica-Oblique", fontSize=9,
             textColor=colors.HexColor("#888888"), alignment=TA_CENTER, spaceAfter=10),
    "section": S("section", fontName="Helvetica-Bold", fontSize=13,
                 textColor=SECTION_HEAD, spaceBefore=10, spaceAfter=4),
    "body": S("body", fontName="Helvetica", fontSize=9,
              textColor=DARK_TEXT, leading=13, spaceAfter=3, alignment=TA_JUSTIFY),
    "body_bold": S("body_bold", fontName="Helvetica-Bold", fontSize=9,
                   textColor=DARK_TEXT, leading=13, spaceAfter=2),
    "cell": S("cell", fontName="Helvetica", fontSize=8.5,
              textColor=DARK_TEXT, leading=11),
    "cell_bold": S("cell_bold", fontName="Helvetica-Bold", fontSize=8.5,
                   textColor=DARK_TEXT, leading=11),
    "cell_center": S("cell_center", fontName="Helvetica", fontSize=8.5,
                     textColor=DARK_TEXT, leading=11, alignment=TA_CENTER),
    "cell_center_bold": S("cell_center_bold", fontName="Helvetica-Bold", fontSize=8.5,
                          textColor=DARK_TEXT, leading=11, alignment=TA_CENTER),
    "note": S("note", fontName="Helvetica-Oblique", fontSize=8,
              textColor=colors.HexColor("#555555"), leading=11, spaceAfter=4),
    "card_title": S("card_title", fontName="Helvetica-Bold", fontSize=10,
                    textColor=DEEP_MAROON, leading=13),
    "card_sub": S("card_sub", fontName="Helvetica", fontSize=8.5,
                  textColor=colors.HexColor("#333333"), leading=12),
    "footer": S("footer", fontName="Helvetica", fontSize=7.5,
                textColor=colors.grey, alignment=TA_CENTER),
    "page_title": S("page_title", fontName="Helvetica-Bold", fontSize=15,
                    textColor=DEEP_MAROON, spaceBefore=6, spaceAfter=4, alignment=TA_CENTER),
}

def HR(color=GOLD, thickness=1.2):
    return HRFlowable(width="100%", thickness=thickness, color=color, spaceAfter=4, spaceBefore=2)

def SP(h=4):
    return Spacer(1, h*mm)

# ─── Data ────────────────────────────────────────────────────────────────────

ROGAS = [
    {
        "no": 1, "name": "Utsangini", "sanskrit": "उत्सङ्गिनी",
        "modern": "Chalazion / Meibomian Cyst",
        "dosha": "Tridoshaja", "sadhyata": "Sadhya (Curable)",
        "location": "Lower eyelid", "chikitsa": "Lekhana (Scraping / Curetting)",
        "symptoms": "Painless nodular swelling on lower lid; opening directed inward; non-tender, firm",
        "note": "Only in lower lid. Tridoshaja – all three doshas vitiated."
    },
    {
        "no": 2, "name": "Kumbhika", "sanskrit": "कुम्भिका",
        "modern": "Hordeolum / Stye",
        "dosha": "Pitta + Kapha", "sadhyata": "Sadhya (Curable)",
        "location": "Lid margin (follicle/gland)", "chikitsa": "Lekhana; hot compress; drainage",
        "symptoms": "Acute painful swelling at lid margin; pus point visible; photophobia; watering",
        "note": "Organism: Staphylococcus aureus (modern). Two stages: cellulitis → abscess."
    },
    {
        "no": 3, "name": "Pothaki", "sanskrit": "पोथकी",
        "modern": "Trachoma / Follicular conjunctivitis",
        "dosha": "Kapha", "sadhyata": "Sadhya (Curable)",
        "location": "Palpebral conjunctiva / lid", "chikitsa": "Lekhana; Anjana; antibiotics (modern)",
        "symptoms": "Multiple follicle-like elevations on inner lid surface; discharge; foreign body sensation",
        "note": "Corresponds to trachomatous follicles. Infective cause in modern medicine."
    },
    {
        "no": 4, "name": "Vartma Sharkara", "sanskrit": "वर्त्मशर्करा",
        "modern": "Calcareous / Calcified deposits on lid",
        "dosha": "Kapha + Vata", "sadhyata": "Sadhya (Curable)",
        "location": "Eyelid (tarsal plate)", "chikitsa": "Lekhana (scraping off deposits)",
        "symptoms": "Hard gritty nodules on lid margin/conjunctival surface; roughness; irritation",
        "note": "Gritty sensation due to calcareous concretions, similar to chalky deposits."
    },
    {
        "no": 5, "name": "Arsho Vartma", "sanskrit": "अर्शो वर्त्म",
        "modern": "Papilloma / Warty growth on lid",
        "dosha": "Kapha + Rakta", "sadhyata": "Sadhya (Curable)",
        "location": "Eyelid skin or margin", "chikitsa": "Excision; Kshara Karma",
        "symptoms": "Fleshy/warty pedunculated or sessile growth; irregular surface; mild irritation",
        "note": "Resembles haemorrhoidal tissue texture – hence 'Arsha'. Benign lid growth."
    },
    {
        "no": 6, "name": "Shushka Arsha", "sanskrit": "शुष्क अर्श",
        "modern": "Fibroma / Dry warty lid growth",
        "dosha": "Vata + Kapha", "sadhyata": "Sadhya (Curable)",
        "location": "Eyelid", "chikitsa": "Excision; Agni Karma (cautery)",
        "symptoms": "Dry, hard, non-vascular lid growth; no secretion; painless; rough surface",
        "note": "Dry variant of Arsho Vartma – no secretion, non-fleshy."
    },
    {
        "no": 7, "name": "Anjana Namika", "sanskrit": "अञ्जन नामिका",
        "modern": "Infected meibomian/sebaceous gland (internal hordeolum variant)",
        "dosha": "Pitta + Kapha", "sadhyata": "Sadhya (Curable)",
        "location": "Deep lid (tarsal glands)", "chikitsa": "Bhedana (incision & drainage)",
        "symptoms": "Suppurative swelling pointing inward; purulent discharge; pain; lid oedema",
        "note": "Deeper than Kumbhika; requires incision. Named for resemblance to kohl applicator."
    },
    {
        "no": 8, "name": "Bahala Vartma", "sanskrit": "बहल वर्त्म",
        "modern": "Hypertrophic Blepharitis / Lid thickening",
        "dosha": "Kapha", "sadhyata": "Sadhya (Curable)",
        "location": "Whole eyelid", "chikitsa": "Lekhana (scraping); Virechana",
        "symptoms": "Diffuse painless thickening of eyelid; heaviness; blurred vision if severe",
        "note": "Kapha dominant – lid is thick, soft, heavy. Lekhana is primary treatment."
    },
    {
        "no": 9, "name": "Vartma Bandhaka", "sanskrit": "वर्त्म बन्धक",
        "modern": "Symblepharon (adhesion of lid to globe)",
        "dosha": "Vata + Pitta", "sadhyata": "Yapya / Asadhya",
        "location": "Palpebral-bulbar junction", "chikitsa": "Surgical separation; Tarpana",
        "symptoms": "Eyelid adherent to eyeball; restricted ocular movements; chronic discharge",
        "note": "Adhesion between palpebral and bulbar conjunctiva. Often post-inflammatory/chemical burn."
    },
    {
        "no": 10, "name": "Klishta Vartma", "sanskrit": "क्लिष्ट वर्त्म",
        "modern": "Ulcerative Blepharitis",
        "dosha": "Pitta + Rakta", "sadhyata": "Sadhya (Curable)",
        "location": "Lid margin", "chikitsa": "Lekhana; Seka (eye wash); antibiotics",
        "symptoms": "Ulceration at lid margins; bleeding; crusts; lash loss; burning pain",
        "note": "Pitta-Rakta vitiation leads to ulceration. Corresponds to staphylococcal ulcerative blepharitis."
    },
    {
        "no": 11, "name": "Kardama Vartma", "sanskrit": "कर्दम वर्त्म",
        "modern": "Seborrhoeic / Squamous Blepharitis (with discharge)",
        "dosha": "Kapha + Rakta", "sadhyata": "Sadhya (Curable)",
        "location": "Lid margin", "chikitsa": "Lekhana; lid hygiene; Seka",
        "symptoms": "Muddy/greasy discharge from lid margin; crusting; itching; mild redness",
        "note": "'Kardama' = mud. Greasy scales/crusts at base of lashes like seborrhoeic blepharitis."
    },
    {
        "no": 12, "name": "Shyaava Vartma", "sanskrit": "श्याव वर्त्म",
        "modern": "Lid Discolouration / Ecchymosis / Pigmentation",
        "dosha": "Vata + Rakta", "sadhyata": "Sadhya (Curable)",
        "location": "Eyelid skin", "chikitsa": "Lekhana; Rakta mokshana (blood-letting)",
        "symptoms": "Dark/bluish discolouration of eyelid; no significant swelling; cosmetic concern",
        "note": "'Shyaava' = dark/black. Corresponds to post-traumatic ecchymosis or chronic pigmentation."
    },
    {
        "no": 13, "name": "Praklinna Vartma", "sanskrit": "प्रक्लिन्न वर्त्म",
        "modern": "Hyperlacrimation / Wet blepharitis / Epiphora",
        "dosha": "Kapha + Vata", "sadhyata": "Sadhya (Curable)",
        "location": "Eyelid / lacrimal region", "chikitsa": "Seka; Virechana; drying agents",
        "symptoms": "Constant watering; lid oedema; macerations of skin; sticky discharge",
        "note": "'Praklinna' = excessively wet. Lid is waterlogged due to Kapha excess."
    },
    {
        "no": 14, "name": "Apariklinna Vartma", "sanskrit": "अपरिक्लिन्न वर्त्म",
        "modern": "Dry Eye / Keratoconjunctivitis sicca (lid component)",
        "dosha": "Vata + Pitta", "sadhyata": "Yapya (Manageable)",
        "location": "Eyelid / conjunctiva", "chikitsa": "Tarpana; Snehana; lubricating drops",
        "symptoms": "Dry, rough eyelid; burning; gritty sensation; reduced tear film; photophobia",
        "note": "Opposite of Praklinna – lid is dry. Vata-Pitta dominance leads to dryness."
    },
    {
        "no": 15, "name": "Vaatahata Vartma", "sanskrit": "वातहत वर्त्म",
        "modern": "Ptosis / Facial nerve palsy / Lagophthalmos",
        "dosha": "Vata", "sadhyata": "Asadhya (Incurable)",
        "location": "Eyelid (levator mechanism)", "chikitsa": "Nasya; Vata-pacifying oils; surgery",
        "symptoms": "Drooping of upper eyelid; inability to close lid fully; loss of lid function",
        "note": "Corresponds to 7th CN palsy (lagophthalmos) or 3rd CN palsy (ptosis). Vata dominant – incurable."
    },
    {
        "no": 16, "name": "Arbuda", "sanskrit": "अर्बुद",
        "modern": "Lid Tumour (benign/malignant neoplasm)",
        "dosha": "Tridoshaja / Mamsaja", "sadhyata": "Sadhya/Asadhya (depends on type)",
        "location": "Eyelid (skin, margin, tarsal)", "chikitsa": "Surgical excision; Kshara Karma",
        "symptoms": "Painless/painful lid mass; ulceration in malignant type; lid distortion; lash loss",
        "note": "Benign Arbuda = curable; malignant = incurable. Includes BCC, SCC, sebaceous gland CA."
    },
    {
        "no": 17, "name": "Nimesha", "sanskrit": "निमेष",
        "modern": "Blepharospasm",
        "dosha": "Vata", "sadhyata": "Asadhya (Incurable)",
        "location": "Orbicularis oculi muscle", "chikitsa": "Vata-pacifying; Nasya; Shirodhara; Botox (modern)",
        "symptoms": "Involuntary forceful blinking; inability to keep eyes open; photophobia; tearing",
        "note": "Vata dominant neurological condition. Modern: botulinum toxin injection is treatment of choice."
    },
    {
        "no": 18, "name": "Shonita Arsha", "sanskrit": "शोणित अर्श",
        "modern": "Haemangioma / Vascular growth on lid",
        "dosha": "Rakta + Pitta", "sadhyata": "Sadhya (Curable)",
        "location": "Eyelid skin/margin", "chikitsa": "Rakta mokshana; excision; sclerotherapy",
        "symptoms": "Red/bluish vascular soft growth on eyelid; bleeds on touch; soft compressible",
        "note": "Blood-filled growth. Shonita = blood. Corresponds to capillary/cavernous haemangioma."
    },
    {
        "no": 19, "name": "Lagana", "sanskrit": "लगण",
        "modern": "Cyst of lid (dermoid / sebaceous cyst)",
        "dosha": "Kapha + Vata", "sadhyata": "Sadhya (Curable)",
        "location": "Eyelid (subcutaneous)", "chikitsa": "Bhedana (incision); complete excision",
        "symptoms": "Painless, smooth, cystic, mobile swelling; no inflammation; slow growing",
        "note": "Painless cyst – Kapha dominant. Requires complete excision to prevent recurrence."
    },
    {
        "no": 20, "name": "Visa Vartma", "sanskrit": "विष वर्त्म",
        "modern": "Toxic / Allergic Eyelid (contact dermatitis / angioedema)",
        "dosha": "Vata + Pitta + Rakta", "sadhyata": "Sadhya (Curable)",
        "location": "Eyelid (skin)", "chikitsa": "Bhedana; Virechana; anti-allergen treatment",
        "symptoms": "Acute oedema; redness; itching; blistering; discharge; may be bilateral",
        "note": "'Visa' = poison/toxin. Allergic/toxic reaction – corresponds to angioneurotic oedema or contact dermatitis."
    },
    {
        "no": 21, "name": "Pakshma Kopa", "sanskrit": "पक्ष्मकोप",
        "modern": "Trichiasis / Distichiasis / Entropion",
        "dosha": "Sannipataja (all doshas)", "sadhyata": "Yapya (Lifelong management)",
        "location": "Lid margin (lash follicles)", "chikitsa": "Epilation; electrolysis; lid surgery",
        "symptoms": "Misdirected lashes rubbing cornea; foreign body sensation; corneal ulcer risk; watering",
        "note": "Sannipataja – all three doshas. Lifelong management needed. Corneal damage is the main risk."
    },
]

NIDANA = [
    "Exposure to smoke (Dhumanishevana)",
    "Suppression of tears (Ashru Vega Dharana)",
    "Excessive observation of minute objects",
    "Trauma / injury to eyelids",
    "Improper or excessive Vamana (emesis therapy)",
    "Suppression of vomiting",
    "Kapha-aggravating diet (excess carbohydrates, sweets)",
    "Excessive exposure to dust, wind, heat",
    "Irregular sleep patterns",
    "Eye strain / prolonged visual tasks",
]

CHIKITSA_CATS = [
    ("Lekhya (Scraping)", "Utsangini, Kumbhika, Pothaki, Vartma Sharkara, Bahala Vartma, Klishta Vartma, Kardama Vartma, Shyaava Vartma"),
    ("Bhedhya (Incision)", "Lagana, Visa Vartma, Anjana Namika"),
    ("Vyadhya (Puncture)", "Arbuda (vascular type), Shonita Arsha"),
    ("Tarpana (Oil pooling)", "Apariklinna Vartma, Klishta Vartma, dry conditions"),
    ("Seka (Eye wash)", "Klishta Vartma, Kardama Vartma, Praklinna Vartma"),
    ("Anjana (Collyrium)", "Pothaki, Kumbhika, infectious types"),
    ("Nasya (Nasal drops)", "Vaatahata Vartma, Nimesha (Vata conditions)"),
    ("Virechana (Purgation)", "Pitta-dominant conditions; Klishta, Arsho Vartma"),
]

# ─── Build PDF ────────────────────────────────────────────────────────────────

def build_cover(story):
    story.append(SP(10))
    # decorative top bar
    story.append(HRFlowable(width="100%", thickness=6, color=DEEP_MAROON, spaceAfter=6))
    story.append(SP(4))
    story.append(Paragraph("वर्त्मगत रोग", ParagraphStyle("dev", fontName="Helvetica-Bold",
        fontSize=26, textColor=GOLD, alignment=TA_CENTER, spaceAfter=2)))
    story.append(Paragraph("VARTMANGAT ROGA", STYLES["title"]))
    story.append(Paragraph("Quick Reference Guide", STYLES["subtitle"]))
    story.append(Paragraph("21 Diseases of the Eyelids · Shalakya Tantra · Ayurvedic Ophthalmology", STYLES["tag"]))
    story.append(HRFlowable(width="100%", thickness=3, color=GOLD, spaceAfter=8))
    story.append(SP(3))

    # intro box
    intro_data = [[Paragraph(
        "<b>Vartma</b> (eyelid) diseases form one of the six anatomical groups of the 76 Netra Rogas "
        "described in <b>Sushruta Samhita, Uttaratantra</b>. Acharya Sushruta enumerates <b>21 Vartmagata Rogas</b>, "
        "covering a wide spectrum of eyelid pathologies corresponding closely to modern ophthalmological conditions. "
        "This guide provides at-a-glance reference for each roga: Ayurvedic name, modern equivalent, dosha, "
        "key symptoms, treatment approach, and prognosis.",
        STYLES["body"])]]
    t = Table(intro_data, colWidths=[170*mm])
    t.setStyle(TableStyle([
        ("BACKGROUND", (0,0), (-1,-1), LIGHT_GOLD),
        ("BOX", (0,0), (-1,-1), 1.2, GOLD),
        ("TOPPADDING", (0,0), (-1,-1), 10),
        ("BOTTOMPADDING", (0,0), (-1,-1), 10),
        ("LEFTPADDING", (0,0), (-1,-1), 12),
        ("RIGHTPADDING", (0,0), (-1,-1), 12),
    ]))
    story.append(t)
    story.append(SP(5))

    # stat boxes
    stats = [
        ("76", "Total Netra\nRogas"),
        ("21", "Vartmagata\nRogas"),
        ("10", "Vataja\nRogas"),
        ("10", "Pittaja\nRogas"),
        ("6", "Kaphaja\nRogas"),
        ("16", "Raktaja\nRogas"),
    ]
    stat_cells = []
    for val, label in stats:
        cell = [
            Paragraph(f"<b>{val}</b>", ParagraphStyle("sv", fontName="Helvetica-Bold",
                fontSize=22, textColor=DEEP_MAROON, alignment=TA_CENTER)),
            Paragraph(label, ParagraphStyle("sl", fontName="Helvetica", fontSize=7.5,
                textColor=DARK_TEXT, alignment=TA_CENTER, leading=10)),
        ]
        stat_cells.append(cell)
    stat_row = [stat_cells]
    st = Table([[c[0], c[1]] if False else c for c in stat_cells],
               colWidths=[28*mm]*6)
    # Actually build as one row
    st = Table([stat_cells], colWidths=[28*mm]*6)
    st.setStyle(TableStyle([
        ("BACKGROUND", (0,0), (-1,-1), CREAM),
        ("BOX", (0,0), (-1,-1), 0.8, MID_GREY),
        ("INNERGRID", (0,0), (-1,-1), 0.5, MID_GREY),
        ("TOPPADDING", (0,0), (-1,-1), 8),
        ("BOTTOMPADDING", (0,0), (-1,-1), 8),
        ("ALIGN", (0,0), (-1,-1), "CENTER"),
        ("VALIGN", (0,0), (-1,-1), "MIDDLE"),
    ]))
    story.append(st)
    story.append(SP(5))
    story.append(Paragraph(
        "<b>Reference:</b> Sushruta Samhita, Uttaratantra, Chapter 3 (Vartma Roga Vijnaniya Adhyaya)",
        STYLES["note"]))
    story.append(HRFlowable(width="100%", thickness=1, color=MID_GREY, spaceAfter=4))


def build_classification_table(story):
    story.append(PageBreak())
    story.append(Paragraph("Classification & Overview", STYLES["page_title"]))
    story.append(HR())
    story.append(SP(2))

    # Anatomical classification
    story.append(Paragraph("A. Anatomical Classification of 76 Netra Rogas", STYLES["section"]))
    anat_data = [
        [Paragraph("<b>Location (Ashaya)</b>", STYLES["cell_center_bold"]),
         Paragraph("<b>Name</b>", STYLES["cell_center_bold"]),
         Paragraph("<b>No.</b>", STYLES["cell_center_bold"])],
        [Paragraph("Sandhi (Junctions)", STYLES["cell_center"]), Paragraph("Sandhi Gata Roga", STYLES["cell"]), Paragraph("9", STYLES["cell_center"])],
        [Paragraph("Vartma (Eyelids)", STYLES["cell_center"]), Paragraph("Vartma Gata Roga", STYLES["cell"]), Paragraph("21", STYLES["cell_center"])],
        [Paragraph("Shukla (Sclera/Conjunctiva)", STYLES["cell_center"]), Paragraph("Shukla Gata Roga", STYLES["cell"]), Paragraph("11", STYLES["cell_center"])],
        [Paragraph("Krishna (Cornea/Iris)", STYLES["cell_center"]), Paragraph("Krishna Gata Roga", STYLES["cell"]), Paragraph("4", STYLES["cell_center"])],
        [Paragraph("Sarvashraya (Whole eye)", STYLES["cell_center"]), Paragraph("Sarvashraya Roga", STYLES["cell"]), Paragraph("17", STYLES["cell_center"])],
        [Paragraph("Drushti (Retina/Lens)", STYLES["cell_center"]), Paragraph("Drushti Gata Roga", STYLES["cell"]), Paragraph("12", STYLES["cell_center"])],
        [Paragraph("Baahyaja (External/Traumatic)", STYLES["cell_center"]), Paragraph("Baahyaja Roga", STYLES["cell"]), Paragraph("2", STYLES["cell_center"])],
    ]
    at = Table(anat_data, colWidths=[65*mm, 70*mm, 20*mm])
    at.setStyle(TableStyle([
        ("BACKGROUND", (0,0), (-1,0), DEEP_MAROON),
        ("TEXTCOLOR", (0,0), (-1,0), colors.white),
        ("BACKGROUND", (0,2), (-1,2), LIGHT_GOLD),  # highlight vartma row
        ("ROWBACKGROUNDS", (0,1), (-1,-1), [LIGHT_GREY, colors.white]),
        ("BACKGROUND", (0,2), (-1,2), colors.HexColor("#FADADD")),
        ("BOX", (0,0), (-1,-1), 1, DEEP_MAROON),
        ("INNERGRID", (0,0), (-1,-1), 0.4, MID_GREY),
        ("TOPPADDING", (0,0), (-1,-1), 5),
        ("BOTTOMPADDING", (0,0), (-1,-1), 5),
        ("LEFTPADDING", (0,0), (-1,-1), 6),
        ("RIGHTPADDING", (0,0), (-1,-1), 6),
        ("ALIGN", (2,0), (2,-1), "CENTER"),
        ("VALIGN", (0,0), (-1,-1), "MIDDLE"),
    ]))
    story.append(at)
    story.append(SP(4))

    # Doshic classification
    story.append(Paragraph("B. Doshic Classification of Netra Rogas", STYLES["section"]))
    dosha_data = [
        [Paragraph("<b>Dosha</b>", STYLES["cell_center_bold"]),
         Paragraph("<b>Count</b>", STYLES["cell_center_bold"]),
         Paragraph("<b>Prognosis Note</b>", STYLES["cell_center_bold"])],
        [Paragraph("Vataja", STYLES["cell_center"]), Paragraph("10", STYLES["cell_center"]),
         Paragraph("Several Asadhya (incurable) – nerve-related", STYLES["cell"])],
        [Paragraph("Pittaja", STYLES["cell_center"]), Paragraph("10", STYLES["cell_center"]),
         Paragraph("Inflammatory; mostly Sadhya with prompt treatment", STYLES["cell"])],
        [Paragraph("Kaphaja", STYLES["cell_center"]), Paragraph("6", STYLES["cell_center"]),
         Paragraph("Chronic; respond to Lekhana and Virechana", STYLES["cell"])],
        [Paragraph("Raktaja", STYLES["cell_center"]), Paragraph("16", STYLES["cell_center"]),
         Paragraph("Vascular; Rakta Mokshana often needed", STYLES["cell"])],
        [Paragraph("Sannipataja", STYLES["cell_center"]), Paragraph("25", STYLES["cell_center"]),
         Paragraph("Mixed; some Asadhya / Yapya (lifelong management)", STYLES["cell"])],
        [Paragraph("External (Baahyaja)", STYLES["cell_center"]), Paragraph("9", STYLES["cell_center"]),
         Paragraph("Traumatic / external cause; usually treatable", STYLES["cell"])],
    ]
    dt = Table(dosha_data, colWidths=[35*mm, 20*mm, 110*mm])
    dt.setStyle(TableStyle([
        ("BACKGROUND", (0,0), (-1,0), DEEP_MAROON),
        ("TEXTCOLOR", (0,0), (-1,0), colors.white),
        ("ROWBACKGROUNDS", (0,1), (-1,-1), [LIGHT_GREY, colors.white]),
        ("BOX", (0,0), (-1,-1), 1, DEEP_MAROON),
        ("INNERGRID", (0,0), (-1,-1), 0.4, MID_GREY),
        ("TOPPADDING", (0,0), (-1,-1), 5),
        ("BOTTOMPADDING", (0,0), (-1,-1), 5),
        ("LEFTPADDING", (0,0), (-1,-1), 6),
        ("RIGHTPADDING", (0,0), (-1,-1), 6),
        ("ALIGN", (0,0), (1,-1), "CENTER"),
        ("VALIGN", (0,0), (-1,-1), "MIDDLE"),
    ]))
    story.append(dt)
    story.append(SP(4))

    # All 21 names quick list
    story.append(Paragraph("C. All 21 Vartmangat Rogas – Quick Name Index", STYLES["section"]))
    rows = []
    for i in range(0, 21, 3):
        row = []
        for j in range(3):
            if i+j < 21:
                r = ROGAS[i+j]
                row.append(Paragraph(
                    f"<b>{r['no']}. {r['name']}</b><br/><font size='7.5'>{r['sanskrit']}</font><br/>"
                    f"<font size='7' color='#555555'>{r['modern']}</font>",
                    STYLES["cell"]))
            else:
                row.append(Paragraph("", STYLES["cell"]))
        rows.append(row)
    qt = Table(rows, colWidths=[56*mm, 56*mm, 56*mm])
    qt.setStyle(TableStyle([
        ("BOX", (0,0), (-1,-1), 1, DEEP_MAROON),
        ("INNERGRID", (0,0), (-1,-1), 0.4, MID_GREY),
        ("ROWBACKGROUNDS", (0,0), (-1,-1), [CREAM, colors.white]),
        ("TOPPADDING", (0,0), (-1,-1), 6),
        ("BOTTOMPADDING", (0,0), (-1,-1), 6),
        ("LEFTPADDING", (0,0), (-1,-1), 6),
        ("RIGHTPADDING", (0,0), (-1,-1), 6),
        ("VALIGN", (0,0), (-1,-1), "TOP"),
    ]))
    story.append(qt)


def build_master_table(story):
    story.append(PageBreak())
    story.append(Paragraph("Master Reference Table – All 21 Vartmangat Rogas", STYLES["page_title"]))
    story.append(HR())
    story.append(SP(1))

    hdr = [
        Paragraph("<b>No.</b>", STYLES["cell_center_bold"]),
        Paragraph("<b>Roga Name</b>", STYLES["cell_center_bold"]),
        Paragraph("<b>Modern Equivalent</b>", STYLES["cell_center_bold"]),
        Paragraph("<b>Dosha</b>", STYLES["cell_center_bold"]),
        Paragraph("<b>Key Symptoms</b>", STYLES["cell_center_bold"]),
        Paragraph("<b>Treatment</b>", STYLES["cell_center_bold"]),
        Paragraph("<b>Prognosis</b>", STYLES["cell_center_bold"]),
    ]
    table_data = [hdr]

    dosha_colors = {
        "Vata": colors.HexColor("#E3F2FD"),
        "Pitta": colors.HexColor("#FFF3E0"),
        "Kapha": colors.HexColor("#E8F5E9"),
        "Tridoshaja": colors.HexColor("#F3E5F5"),
        "Sannipataja": colors.HexColor("#FCE4EC"),
        "Rakta": colors.HexColor("#FFEBEE"),
    }

    row_styles = []
    for idx, r in enumerate(ROGAS):
        row_num = idx + 1
        bg = colors.white if row_num % 2 == 0 else LIGHT_GREY
        # pick dosha bg
        for key, col in dosha_colors.items():
            if key.lower() in r["dosha"].lower():
                bg = col
                break

        prog_col = colors.HexColor("#C8E6C9") if "Sadhya" in r["sadhyata"] and "Asa" not in r["sadhyata"] else \
                   colors.HexColor("#FFCCBC") if "Asadhya" in r["sadhyata"] else \
                   colors.HexColor("#FFF9C4")

        row = [
            Paragraph(f"<b>{r['no']}</b>", STYLES["cell_center_bold"]),
            Paragraph(f"<b>{r['name']}</b><br/><font size='7' color='#888888'>{r['sanskrit']}</font>", STYLES["cell"]),
            Paragraph(r["modern"], STYLES["cell"]),
            Paragraph(r["dosha"], STYLES["cell_center"]),
            Paragraph(r["symptoms"][:90] + ("…" if len(r["symptoms"])>90 else ""), STYLES["cell"]),
            Paragraph(r["chikitsa"], STYLES["cell"]),
            Paragraph(r["sadhyata"].replace(" (", "\n("), STYLES["cell_center"]),
        ]
        table_data.append(row)
        row_styles.append(("BACKGROUND", (0, row_num), (-1, row_num), bg))
        row_styles.append(("BACKGROUND", (6, row_num), (6, row_num), prog_col))

    mt = Table(table_data, colWidths=[8*mm, 28*mm, 35*mm, 22*mm, 38*mm, 30*mm, 19*mm])
    style = [
        ("BACKGROUND", (0,0), (-1,0), DEEP_MAROON),
        ("TEXTCOLOR", (0,0), (-1,0), colors.white),
        ("BOX", (0,0), (-1,-1), 1, DEEP_MAROON),
        ("INNERGRID", (0,0), (-1,-1), 0.3, MID_GREY),
        ("TOPPADDING", (0,0), (-1,-1), 4),
        ("BOTTOMPADDING", (0,0), (-1,-1), 4),
        ("LEFTPADDING", (0,0), (-1,-1), 3),
        ("RIGHTPADDING", (0,0), (-1,-1), 3),
        ("VALIGN", (0,0), (-1,-1), "TOP"),
        ("ALIGN", (0,0), (0,-1), "CENTER"),
        ("ALIGN", (3,0), (3,-1), "CENTER"),
        ("ALIGN", (6,0), (6,-1), "CENTER"),
    ] + row_styles
    mt.setStyle(TableStyle(style))
    story.append(mt)

    # legend
    story.append(SP(3))
    legend = [
        [Paragraph("<b>Prognosis Legend:</b>", STYLES["note"]),
         Paragraph("", STYLES["note"]),
         Paragraph("", STYLES["note"]),
         Paragraph("", STYLES["note"])],
        [
            Paragraph("  <font color='#388E3C'>■</font> Sadhya = Curable", STYLES["note"]),
            Paragraph("  <font color='#E64A19'>■</font> Asadhya = Incurable", STYLES["note"]),
            Paragraph("  <font color='#F9A825'>■</font> Yapya = Lifelong management", STYLES["note"]),
            Paragraph("", STYLES["note"]),
        ]
    ]
    lt = Table(legend, colWidths=[45*mm, 45*mm, 55*mm, 35*mm])
    lt.setStyle(TableStyle([("TOPPADDING",(0,0),(-1,-1),2),("BOTTOMPADDING",(0,0),(-1,-1),2)]))
    story.append(lt)


def build_detailed_cards(story):
    story.append(PageBreak())
    story.append(Paragraph("Detailed Disease Cards", STYLES["page_title"]))
    story.append(HR())
    story.append(SP(1))
    story.append(Paragraph(
        "Each card provides: Ayurvedic name · Sanskrit · Modern equivalent · Dosha · Symptoms · Chikitsa · Clinical note.",
        STYLES["note"]))
    story.append(SP(2))

    # Two cards per row layout
    def make_card(r, bg_color):
        prog_sym = "✓" if "Sadhya" in r["sadhyata"] and "Asa" not in r["sadhyata"] else \
                   "✗" if "Asadhya" in r["sadhyata"] else "↺"
        prog_color = "#388E3C" if prog_sym == "✓" else "#C62828" if prog_sym == "✗" else "#F57F17"

        inner = [
            [Paragraph(
                f"<b>{r['no']}. {r['name']}</b> &nbsp; "
                f"<font size='8' color='#888888'>{r['sanskrit']}</font>",
                STYLES["card_title"])],
            [Paragraph(
                f"<font size='8' color='#1565C0'><b>Modern:</b></font> "
                f"<font size='8'>{r['modern']}</font>",
                STYLES["card_sub"])],
            [Paragraph(
                f"<font size='8'><b>Dosha:</b> {r['dosha']} &nbsp;|&nbsp; "
                f"<b>Location:</b> {r['location']}</font>",
                STYLES["card_sub"])],
            [Paragraph(
                f"<font size='8'><b>Symptoms:</b> {r['symptoms']}</font>",
                STYLES["card_sub"])],
            [Paragraph(
                f"<font size='8'><b>Chikitsa:</b> {r['chikitsa']}</font>",
                STYLES["card_sub"])],
            [Paragraph(
                f"<font size='8' color='#555555'><i>{r['note']}</i></font>",
                STYLES["card_sub"])],
            [Paragraph(
                f"<font size='8' color='{prog_color}'><b>Prognosis: {r['sadhyata']}</b></font>",
                STYLES["card_sub"])],
        ]
        inner_t = Table(inner, colWidths=[78*mm])
        inner_t.setStyle(TableStyle([
            ("TOPPADDING", (0,0), (-1,-1), 2),
            ("BOTTOMPADDING", (0,0), (-1,-1), 2),
            ("LEFTPADDING", (0,0), (-1,-1), 4),
            ("RIGHTPADDING", (0,0), (-1,-1), 4),
        ]))

        outer = Table([[inner_t]], colWidths=[84*mm])
        outer.setStyle(TableStyle([
            ("BACKGROUND", (0,0), (-1,-1), bg_color),
            ("BOX", (0,0), (-1,-1), 1, DEEP_MAROON),
            ("TOPPADDING", (0,0), (-1,-1), 5),
            ("BOTTOMPADDING", (0,0), (-1,-1), 5),
            ("LEFTPADDING", (0,0), (-1,-1), 3),
            ("RIGHTPADDING", (0,0), (-1,-1), 3),
        ]))
        return outer

    card_colors = [PALE_BLUE, PALE_GREEN, PALE_YELLOW, PALE_ORANGE, CREAM,
                   PALE_BLUE, PALE_GREEN, PALE_YELLOW, PALE_ORANGE, CREAM,
                   PALE_BLUE, PALE_GREEN, PALE_YELLOW, PALE_ORANGE, CREAM,
                   PALE_BLUE, PALE_GREEN, PALE_YELLOW, PALE_ORANGE, CREAM, PALE_BLUE]

    pairs = []
    for i in range(0, 21, 2):
        c1 = make_card(ROGAS[i], card_colors[i])
        if i+1 < 21:
            c2 = make_card(ROGAS[i+1], card_colors[i+1])
            row = [c1, Spacer(4*mm, 1), c2]
            t = Table([[c1, Spacer(4*mm,1), c2]], colWidths=[84*mm, 4*mm, 84*mm])
        else:
            t = Table([[c1, Spacer(4*mm,1), Paragraph("", STYLES["cell"])]], colWidths=[84*mm, 4*mm, 84*mm])
        t.setStyle(TableStyle([
            ("TOPPADDING",(0,0),(-1,-1),0),
            ("BOTTOMPADDING",(0,0),(-1,-1),4),
            ("LEFTPADDING",(0,0),(-1,-1),0),
            ("RIGHTPADDING",(0,0),(-1,-1),0),
            ("VALIGN",(0,0),(-1,-1),"TOP"),
        ]))
        story.append(t)


def build_nidana_chikitsa(story):
    story.append(PageBreak())
    story.append(Paragraph("Nidana & Chikitsa Overview", STYLES["page_title"]))
    story.append(HR())
    story.append(SP(2))

    # Nidana
    story.append(Paragraph("Causative Factors (Nidana) – Common to Vartmangat Rogas", STYLES["section"]))
    nid_data = []
    for i in range(0, len(NIDANA), 2):
        row = [
            Paragraph(f"• {NIDANA[i]}", STYLES["cell"]),
            Paragraph(f"• {NIDANA[i+1]}" if i+1 < len(NIDANA) else "", STYLES["cell"])
        ]
        nid_data.append(row)
    nt = Table(nid_data, colWidths=[85*mm, 85*mm])
    nt.setStyle(TableStyle([
        ("BOX", (0,0), (-1,-1), 0.8, GOLD),
        ("INNERGRID", (0,0), (-1,-1), 0.3, MID_GREY),
        ("ROWBACKGROUNDS", (0,0), (-1,-1), [LIGHT_GOLD, colors.white]),
        ("TOPPADDING", (0,0), (-1,-1), 5),
        ("BOTTOMPADDING", (0,0), (-1,-1), 5),
        ("LEFTPADDING", (0,0), (-1,-1), 8),
        ("RIGHTPADDING", (0,0), (-1,-1), 8),
    ]))
    story.append(nt)
    story.append(SP(4))

    # Chikitsa categories
    story.append(Paragraph("Treatment Categories (Chikitsa Karma)", STYLES["section"]))
    chik_data = [[
        Paragraph("<b>Treatment Type</b>", STYLES["cell_center_bold"]),
        Paragraph("<b>Applicable Rogas</b>", STYLES["cell_center_bold"]),
    ]]
    for ctype, arogas in CHIKITSA_CATS:
        chik_data.append([
            Paragraph(f"<b>{ctype}</b>", STYLES["cell_bold"]),
            Paragraph(arogas, STYLES["cell"]),
        ])
    ct = Table(chik_data, colWidths=[52*mm, 118*mm])
    ct.setStyle(TableStyle([
        ("BACKGROUND", (0,0), (-1,0), DEEP_MAROON),
        ("TEXTCOLOR", (0,0), (-1,0), colors.white),
        ("ROWBACKGROUNDS", (0,1), (-1,-1), [CREAM, colors.white]),
        ("BOX", (0,0), (-1,-1), 1, DEEP_MAROON),
        ("INNERGRID", (0,0), (-1,-1), 0.4, MID_GREY),
        ("TOPPADDING", (0,0), (-1,-1), 5),
        ("BOTTOMPADDING", (0,0), (-1,-1), 5),
        ("LEFTPADDING", (0,0), (-1,-1), 6),
        ("RIGHTPADDING", (0,0), (-1,-1), 6),
        ("VALIGN", (0,0), (-1,-1), "TOP"),
    ]))
    story.append(ct)
    story.append(SP(4))

    # Prognosis summary
    story.append(Paragraph("Prognosis Summary (Sadhyasadhyata)", STYLES["section"]))
    sadhya = [r["name"] for r in ROGAS if "Sadhya" in r["sadhyata"] and "Asa" not in r["sadhyata"]]
    asadhya = [r["name"] for r in ROGAS if "Asadhya" in r["sadhyata"]]
    yapya = [r["name"] for r in ROGAS if "Yapya" in r["sadhyata"]]

    prog_data = [
        [Paragraph("<b>Category</b>", STYLES["cell_center_bold"]),
         Paragraph("<b>Count</b>", STYLES["cell_center_bold"]),
         Paragraph("<b>Diseases</b>", STYLES["cell_center_bold"])],
        [Paragraph("Sadhya (Curable)", STYLES["cell_bold"]),
         Paragraph(str(len(sadhya)), STYLES["cell_center"]),
         Paragraph(", ".join(sadhya), STYLES["cell"])],
        [Paragraph("Asadhya (Incurable)", STYLES["cell_bold"]),
         Paragraph(str(len(asadhya)), STYLES["cell_center"]),
         Paragraph(", ".join(asadhya) if asadhya else "Vaatahata Vartma, Nimesha, Arbuda (malignant)", STYLES["cell"])],
        [Paragraph("Yapya (Lifelong management)", STYLES["cell_bold"]),
         Paragraph(str(len(yapya)), STYLES["cell_center"]),
         Paragraph(", ".join(yapya) if yapya else "Vartma Bandhaka, Apariklinna Vartma, Pakshma Kopa", STYLES["cell"])],
    ]
    prog_table = Table(prog_data, colWidths=[48*mm, 18*mm, 104*mm])
    prog_table.setStyle(TableStyle([
        ("BACKGROUND", (0,0), (-1,0), DEEP_MAROON),
        ("TEXTCOLOR", (0,0), (-1,0), colors.white),
        ("BACKGROUND", (0,1), (-1,1), colors.HexColor("#C8E6C9")),
        ("BACKGROUND", (0,2), (-1,2), colors.HexColor("#FFCDD2")),
        ("BACKGROUND", (0,3), (-1,3), colors.HexColor("#FFF9C4")),
        ("BOX", (0,0), (-1,-1), 1, DEEP_MAROON),
        ("INNERGRID", (0,0), (-1,-1), 0.4, MID_GREY),
        ("TOPPADDING", (0,0), (-1,-1), 6),
        ("BOTTOMPADDING", (0,0), (-1,-1), 6),
        ("LEFTPADDING", (0,0), (-1,-1), 6),
        ("RIGHTPADDING", (0,0), (-1,-1), 6),
        ("ALIGN", (1,0), (1,-1), "CENTER"),
        ("VALIGN", (0,0), (-1,-1), "TOP"),
    ]))
    story.append(prog_table)

    # Footer
    story.append(SP(8))
    story.append(HRFlowable(width="100%", thickness=2, color=GOLD))
    story.append(SP(2))
    story.append(Paragraph(
        "Reference: Sushruta Samhita, Uttaratantra, Ch. 3 (Vartma Roga Vijnaniya) | "
        "Shalakya Tantra – Ayurvedic Ophthalmology | For academic/clinical reference only.",
        STYLES["footer"]))


def main():
    out = "/home/daytona/workspace/vartmangat-roga/Vartmangat_Roga_Quick_Reference.pdf"
    doc = make_doc(out)
    story = []
    build_cover(story)
    build_classification_table(story)
    build_master_table(story)
    build_detailed_cards(story)
    build_nidana_chikitsa(story)
    doc.build(story)
    print(f"PDF saved: {out}")

if __name__ == "__main__":
    main()
Running Command

cd /home/daytona/workspace/vartmangat-roga && python3 generate_pdf.py 2>&1

Running Command

ls -lh /home/daytona/workspace/vartmangat-roga/

Your credits are exhausted. Your daily credits reset tomorrow, or you can purchase a top-up for more.
This is a shared conversation. Sign in to Orris to start your own chat.