make me flow charts
cd /home/daytona/workspace/attachments/ad50edf4-84f8-48ba-9750-81feac6f2c7a && python3 -c " import pdfplumber with pdfplumber.open('JOINTS (2).pdf') as pdf: print(f'Total pages: {len(pdf.pages)}') for i, page in enumerate(pdf.pages): text = page.extract_text() print(f'--- PAGE {i+1} ---') print(text[:2000] if text else '[no text]') print() "
mkdir -p /home/daytona/workspace/joints-flowcharts
~/joints-flowcharts/joints_flowcharts.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Joints - Classification, Types & Functions</title>
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: 'Segoe UI', Arial, sans-serif;
background: #f0f4f8;
color: #1a2340;
padding: 30px 20px;
}
h1 {
text-align: center;
font-size: 2rem;
color: #1a2340;
margin-bottom: 6px;
letter-spacing: 1px;
}
.subtitle {
text-align: center;
font-size: 0.9rem;
color: #5a6a8a;
margin-bottom: 40px;
}
.section-title {
font-size: 1.3rem;
font-weight: 700;
color: #1a2340;
margin: 40px 0 20px 0;
padding-left: 14px;
border-left: 5px solid #3b82f6;
}
/* ===== FLOWCHART 1: Classification Tree ===== */
.tree-container {
background: white;
border-radius: 16px;
padding: 30px 20px;
box-shadow: 0 4px 20px rgba(0,0,0,0.08);
overflow-x: auto;
}
.tree {
display: flex;
flex-direction: column;
align-items: center;
}
.node-root {
background: linear-gradient(135deg, #1a2340, #2e4080);
color: white;
border-radius: 12px;
padding: 14px 40px;
font-size: 1.1rem;
font-weight: 700;
letter-spacing: 1px;
box-shadow: 0 4px 14px rgba(30,40,100,0.3);
}
.v-line {
width: 2px;
height: 28px;
background: #94a3b8;
}
.h-branch {
display: flex;
align-items: flex-start;
gap: 0;
position: relative;
width: 100%;
justify-content: center;
}
.h-branch::before {
content: '';
position: absolute;
top: 0;
left: 50%;
transform: translateX(-50%);
width: 60%;
height: 2px;
background: #94a3b8;
}
.branch-col {
display: flex;
flex-direction: column;
align-items: center;
flex: 1;
max-width: 340px;
padding: 0 10px;
position: relative;
}
.branch-col::before {
content: '';
position: absolute;
top: 0;
left: 50%;
transform: translateX(-50%);
width: 2px;
height: 28px;
background: #94a3b8;
}
.node-false {
background: linear-gradient(135deg, #dc2626, #b91c1c);
color: white;
border-radius: 10px;
padding: 10px 22px;
font-weight: 700;
font-size: 0.95rem;
text-align: center;
margin-top: 28px;
box-shadow: 0 3px 10px rgba(185,28,28,0.3);
min-width: 180px;
}
.node-true {
background: linear-gradient(135deg, #2563eb, #1d4ed8);
color: white;
border-radius: 10px;
padding: 10px 22px;
font-weight: 700;
font-size: 0.95rem;
text-align: center;
margin-top: 28px;
box-shadow: 0 3px 10px rgba(29,78,216,0.3);
min-width: 180px;
}
.sub-branch {
display: flex;
gap: 12px;
margin-top: 14px;
justify-content: center;
flex-wrap: wrap;
}
.leaf-card {
background: #f8fafc;
border: 2px solid #e2e8f0;
border-radius: 10px;
padding: 10px 14px;
font-size: 0.82rem;
text-align: center;
min-width: 120px;
box-shadow: 0 2px 6px rgba(0,0,0,0.05);
}
.leaf-card .leaf-title {
font-weight: 700;
color: #1a2340;
margin-bottom: 5px;
font-size: 0.88rem;
}
.leaf-card .leaf-examples {
color: #64748b;
font-size: 0.78rem;
line-height: 1.5;
}
.leaf-card.red { border-color: #fca5a5; }
.leaf-card.blue { border-color: #93c5fd; }
.leaf-card.green { border-color: #6ee7b7; }
.leaf-card .leaf-title.red { color: #dc2626; }
.leaf-card .leaf-title.blue { color: #2563eb; }
.leaf-card .leaf-title.green { color: #059669; }
/* ===== FLOWCHART 2: True Joint Structure ===== */
.structure-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 16px;
background: white;
border-radius: 16px;
padding: 30px;
box-shadow: 0 4px 20px rgba(0,0,0,0.08);
}
.struct-center {
grid-column: 1 / -1;
display: flex;
justify-content: center;
margin-bottom: 8px;
}
.struct-root {
background: linear-gradient(135deg, #7c3aed, #5b21b6);
color: white;
border-radius: 12px;
padding: 14px 36px;
font-size: 1.05rem;
font-weight: 700;
box-shadow: 0 4px 14px rgba(91,33,182,0.3);
text-align: center;
}
.struct-card {
background: white;
border-radius: 12px;
border: 2px solid #e2e8f0;
padding: 16px;
box-shadow: 0 2px 8px rgba(0,0,0,0.06);
transition: transform 0.2s;
}
.struct-card:hover { transform: translateY(-2px); }
.struct-card .sc-num {
width: 28px;
height: 28px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 0.8rem;
font-weight: 700;
color: white;
margin-bottom: 8px;
}
.struct-card .sc-title {
font-weight: 700;
font-size: 0.9rem;
color: #1a2340;
margin-bottom: 5px;
}
.struct-card .sc-desc {
font-size: 0.78rem;
color: #64748b;
line-height: 1.5;
}
.c1 { background: #3b82f6; } .c2 { background: #10b981; } .c3 { background: #f59e0b; }
.c4 { background: #ef4444; } .c5 { background: #8b5cf6; } .c6 { background: #ec4899; }
.c7 { background: #06b6d4; } .c8 { background: #84cc16; }
.bd1 { border-color: #bfdbfe; } .bd2 { border-color: #a7f3d0; } .bd3 { border-color: #fde68a; }
.bd4 { border-color: #fecaca; } .bd5 { border-color: #ddd6fe; } .bd6 { border-color: #fbcfe8; }
.bd7 { border-color: #a5f3fc; } .bd8 { border-color: #d9f99d; }
/* ===== FLOWCHART 3: Synovial Joint Types ===== */
.joints-table {
background: white;
border-radius: 16px;
padding: 30px;
box-shadow: 0 4px 20px rgba(0,0,0,0.08);
overflow-x: auto;
}
table {
width: 100%;
border-collapse: collapse;
font-size: 0.88rem;
}
thead tr { background: linear-gradient(135deg, #1a2340, #2e4080); color: white; }
thead th {
padding: 12px 14px;
text-align: left;
font-size: 0.85rem;
letter-spacing: 0.5px;
font-weight: 700;
}
tbody tr:nth-child(even) { background: #f8fafc; }
tbody tr:hover { background: #eff6ff; }
tbody td { padding: 10px 14px; border-bottom: 1px solid #e2e8f0; vertical-align: top; }
.type-badge {
display: inline-block;
padding: 3px 10px;
border-radius: 20px;
font-size: 0.78rem;
font-weight: 700;
white-space: nowrap;
}
.axes-1 { background: #dbeafe; color: #1d4ed8; }
.axes-2 { background: #d1fae5; color: #065f46; }
.axes-3 { background: #ede9fe; color: #5b21b6; }
.axes-t { background: #fef3c7; color: #92400e; }
.example-tag {
display: inline-block;
background: #f1f5f9;
border: 1px solid #cbd5e1;
border-radius: 6px;
padding: 2px 8px;
font-size: 0.78rem;
color: #475569;
margin-top: 3px;
}
/* ===== FLOWCHART 4: Joint Stability ===== */
.stability-flow {
background: white;
border-radius: 16px;
padding: 30px;
box-shadow: 0 4px 20px rgba(0,0,0,0.08);
}
.sf-row {
display: flex;
align-items: center;
justify-content: center;
flex-wrap: wrap;
gap: 0;
margin-bottom: 10px;
}
.sf-box {
background: #f1f5f9;
border: 2px solid #e2e8f0;
border-radius: 10px;
padding: 12px 16px;
text-align: center;
min-width: 150px;
max-width: 180px;
}
.sf-box .sf-icon { font-size: 1.5rem; margin-bottom: 4px; }
.sf-box .sf-title { font-weight: 700; font-size: 0.85rem; color: #1a2340; margin-bottom: 3px; }
.sf-box .sf-sub { font-size: 0.76rem; color: #64748b; line-height: 1.4; }
.sf-arrow {
font-size: 1.5rem;
color: #94a3b8;
padding: 0 6px;
font-weight: 300;
}
.sf-result {
background: linear-gradient(135deg, #059669, #047857);
color: white;
border-radius: 12px;
padding: 14px 24px;
text-align: center;
max-width: 500px;
margin: 18px auto 0;
font-weight: 700;
font-size: 0.95rem;
box-shadow: 0 4px 14px rgba(5,150,105,0.3);
}
.muscles-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
gap: 12px;
margin-top: 22px;
}
.muscle-card {
background: #fafafa;
border: 2px solid #e2e8f0;
border-radius: 10px;
padding: 12px 16px;
display: flex;
align-items: flex-start;
gap: 10px;
}
.muscle-dot {
width: 10px;
height: 10px;
border-radius: 50%;
margin-top: 4px;
flex-shrink: 0;
}
.muscle-card .mc-name { font-weight: 700; font-size: 0.85rem; color: #1a2340; }
.muscle-card .mc-role { font-size: 0.78rem; color: #64748b; margin-top: 2px; }
/* ===== FLOWCHART 5: Decision Flowchart ===== */
.decision-flow {
background: white;
border-radius: 16px;
padding: 30px;
box-shadow: 0 4px 20px rgba(0,0,0,0.08);
display: flex;
flex-direction: column;
align-items: center;
gap: 0;
}
.df-start {
background: linear-gradient(135deg, #1a2340, #2e4080);
color: white;
border-radius: 30px;
padding: 12px 36px;
font-weight: 700;
font-size: 1rem;
box-shadow: 0 4px 12px rgba(30,40,100,0.25);
}
.df-arrow-down {
width: 2px;
height: 24px;
background: #94a3b8;
position: relative;
}
.df-arrow-down::after {
content: '▼';
position: absolute;
bottom: -14px;
left: 50%;
transform: translateX(-50%);
color: #94a3b8;
font-size: 0.8rem;
}
.df-diamond {
background: white;
border: 3px solid #f59e0b;
transform: rotate(45deg);
width: 140px;
height: 140px;
display: flex;
align-items: center;
justify-content: center;
margin: 20px 0;
box-shadow: 0 3px 10px rgba(245,158,11,0.2);
flex-shrink: 0;
}
.df-diamond-text {
transform: rotate(-45deg);
text-align: center;
font-size: 0.78rem;
font-weight: 700;
color: #92400e;
padding: 8px;
line-height: 1.4;
}
.df-branches {
display: flex;
gap: 60px;
align-items: flex-start;
flex-wrap: wrap;
justify-content: center;
margin-top: 10px;
}
.df-branch {
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
}
.df-branch-label {
font-size: 0.78rem;
font-weight: 700;
padding: 3px 14px;
border-radius: 20px;
}
.label-yes { background: #dcfce7; color: #166534; }
.label-no { background: #fee2e2; color: #991b1b; }
.df-end-box {
border-radius: 10px;
padding: 10px 18px;
font-size: 0.85rem;
font-weight: 700;
text-align: center;
max-width: 200px;
}
.df-end-false { background: #fee2e2; border: 2px solid #fca5a5; color: #991b1b; }
.df-end-true { background: #dbeafe; border: 2px solid #93c5fd; color: #1e40af; }
.df-sub-flow {
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
margin-top: 6px;
}
.df-sub-box {
border-radius: 8px;
padding: 7px 14px;
font-size: 0.78rem;
font-weight: 600;
text-align: center;
width: 180px;
}
.dsb1 { background: #fef3c7; border: 2px solid #fde68a; color: #78350f; }
.dsb2 { background: #e0e7ff; border: 2px solid #a5b4fc; color: #3730a3; }
.dsb3 { background: #fce7f3; border: 2px solid #f9a8d4; color: #831843; }
.arrow-sm { color: #94a3b8; font-size: 1rem; }
footer {
text-align: center;
margin-top: 50px;
font-size: 0.8rem;
color: #94a3b8;
}
</style>
</head>
<body>
<h1>JOINTS</h1>
<p class="subtitle">Classification, Types & Functions | THIEME Atlas of Anatomy</p>
<!-- ======= CHART 1: Classification Tree ======= -->
<div class="section-title">Chart 1: Classification of Joints</div>
<div class="tree-container">
<div class="tree">
<div class="node-root">JOINTS</div>
<div class="v-line"></div>
<div style="display:flex; gap:60px; flex-wrap:wrap; justify-content:center; width:100%; position:relative;">
<!-- Horizontal connector -->
<div style="position:absolute;top:0;left:50%;transform:translateX(-50%);width:55%;height:2px;background:#94a3b8;"></div>
<!-- FALSE JOINTS -->
<div class="branch-col">
<div class="node-false">FALSE JOINTS<br><span style="font-size:0.78rem;font-weight:400;">(Synarthroses)</span><br><span style="font-size:0.75rem;font-weight:400;">No joint cavity</span></div>
<div class="v-line" style="margin-top:6px;"></div>
<div class="sub-branch">
<div class="leaf-card red">
<div class="leaf-title red">Syndesmoses</div>
<div class="leaf-examples">
Fibrous joints<br>
Interosseous membranes<br>
Tibiofibular syndesmosis<br>
Fontanelles (newborn)<br>
Gomphosis (teeth)
</div>
</div>
<div class="leaf-card red">
<div class="leaf-title red">Synchondroses</div>
<div class="leaf-examples">
Cartilaginous joints<br>
Epiphyseal growth plates<br>
Costal cartilage<br>
Pubic symphysis<br>
Intervertebral discs
</div>
</div>
<div class="leaf-card red">
<div class="leaf-title red">Synostoses</div>
<div class="leaf-examples">
Bony fusion<br>
Sacral vertebrae<br>
Hip bone (ilium/ischium/pubis)<br>
Ossified epiphyseal plates
</div>
</div>
</div>
</div>
<!-- TRUE JOINTS -->
<div class="branch-col">
<div class="node-true">TRUE JOINTS<br><span style="font-size:0.78rem;font-weight:400;">(Diarthroses)</span><br><span style="font-size:0.75rem;font-weight:400;">Joint cavity present</span></div>
<div class="v-line" style="margin-top:6px;"></div>
<div class="sub-branch">
<div class="leaf-card blue">
<div class="leaf-title blue">Diarthroses</div>
<div class="leaf-examples">
<b>Translational:</b><br>Plane joints<br><br>
<b>Rotational (1 axis):</b><br>Hinge, Pivot<br><br>
<b>Rotational (2 axes):</b><br>Ellipsoidal, Saddle<br><br>
<b>Rotational (3 axes):</b><br>Spheroidal (hip, shoulder)
</div>
</div>
<div class="leaf-card blue">
<div class="leaf-title blue">Amphiarthroses</div>
<div class="leaf-examples">
Stiff true joints<br>
Very limited movement<br>
Tight ligamentous constraints<br><br>
Example:<br>
Sacroiliac joint
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- ======= CHART 2: True Joint Structure ======= -->
<div class="section-title">Chart 2: Components of a True (Synovial) Joint</div>
<div class="structure-grid">
<div class="struct-center">
<div class="struct-root">TRUE JOINT — 8 Key Components</div>
</div>
<div class="struct-card bd1">
<div class="sc-num c1">1</div>
<div class="sc-title">Articular Surfaces</div>
<div class="sc-desc">Covered by hyaline cartilage (1-2 mm in phalanges; 5-7 mm in femoropatellar). Exception: jaw & sternoclavicular covered by fibrous cartilage.</div>
</div>
<div class="struct-card bd2">
<div class="sc-num c2">2</div>
<div class="sc-title">Joint Cavity</div>
<div class="sc-desc">Narrow space (few mm wide) with articular recesses. Separated articular surfaces define the true joint.</div>
</div>
<div class="struct-card bd3">
<div class="sc-num c3">3</div>
<div class="sc-title">Joint Capsule</div>
<div class="sc-desc">Closed capsule with alar folds, synovial folds & villi. Inner synovial membrane is highly vascular and produces synovial fluid.</div>
</div>
<div class="struct-card bd4">
<div class="sc-num c4">4</div>
<div class="sc-title">Synovial Fluid</div>
<div class="sc-desc">Highly viscous. Lubricates & nourishes avascular cartilage by diffusion and convection. Produced by synovial membrane.</div>
</div>
<div class="struct-card bd5">
<div class="sc-num c5">5</div>
<div class="sc-title">Intra-articular Structures</div>
<div class="sc-desc">
<b>Menisci</b> - crescent-shaped; knee only<br>
<b>Articular discs</b> - divide joint chambers; jaw, sternoclavicular, wrist<br>
<b>Labra</b> - fibrocartilage at margins; hip & shoulder
</div>
</div>
<div class="struct-card bd6">
<div class="sc-num c6">6</div>
<div class="sc-title">Ligaments</div>
<div class="sc-desc">Intra- and extracapsular. Primary joint stabilizers limiting range of motion.</div>
</div>
<div class="struct-card bd7">
<div class="sc-num c7">7</div>
<div class="sc-title">Muscles</div>
<div class="sc-desc">Agonist & antagonist pairs crossing the joint. Move joint in opposite directions.</div>
</div>
<div class="struct-card bd8">
<div class="sc-num c8">8</div>
<div class="sc-title">Synovial Bursae</div>
<div class="sc-desc">Fluid-filled sacs near the joint. May communicate with the joint cavity. Reduce friction.</div>
</div>
<div style="grid-column:1/-1; background:#fffbeb; border:2px dashed #fde68a; border-radius:10px; padding:12px 18px; font-size:0.83rem; color:#78350f;">
<b>Important:</b> The synovial membrane can regenerate through adjoining connective tissue. Hyaline cartilage <em>cannot</em> regenerate - it is avascular, lacks perichondrium, and is nourished exclusively by synovial fluid.
</div>
</div>
<!-- ======= CHART 3: Synovial Joint Types ======= -->
<div class="section-title">Chart 3: Types of Synovial Joints by Shape & Movement</div>
<div class="joints-table">
<table>
<thead>
<tr>
<th>Joint Type</th>
<th>Axes of Motion</th>
<th>Degrees of Freedom</th>
<th>Primary Movements</th>
<th>Example</th>
</tr>
</thead>
<tbody>
<tr>
<td><b>Plane Joint (Femoropatellar)</b></td>
<td><span class="type-badge axes-t">1 translational</span></td>
<td style="text-align:center;"><b>1</b></td>
<td>Slide up/down in femoral groove</td>
<td><span class="example-tag">Patella in femoral groove</span></td>
</tr>
<tr>
<td><b>Plane Joint (Vertebral)</b></td>
<td><span class="type-badge axes-t">1-2 translational</span></td>
<td style="text-align:center;"><b>2-4</b></td>
<td>Gliding in multiple directions</td>
<td><span class="example-tag">Facet joints of spine</span></td>
</tr>
<tr>
<td><b>Hinge Joint</b></td>
<td><span class="type-badge axes-1">1 rotational</span></td>
<td style="text-align:center;"><b>2</b></td>
<td>Flexion, Extension</td>
<td><span class="example-tag">Elbow</span> <span class="example-tag">Knee</span></td>
</tr>
<tr>
<td><b>Pivot Joint</b></td>
<td><span class="type-badge axes-1">1 rotational</span></td>
<td style="text-align:center;"><b>2</b></td>
<td>Rotation (axial)</td>
<td><span class="example-tag">Atlanto-axial joint</span> <span class="example-tag">Proximal radioulnar</span></td>
</tr>
<tr>
<td><b>Ellipsoidal Joint</b></td>
<td><span class="type-badge axes-2">2 rotational</span></td>
<td style="text-align:center;"><b>4</b></td>
<td>Flexion, Extension, Abduction, Adduction</td>
<td><span class="example-tag">Radiocarpal (wrist) joint</span></td>
</tr>
<tr>
<td><b>Saddle Joint</b></td>
<td><span class="type-badge axes-2">2 rotational</span></td>
<td style="text-align:center;"><b>4</b></td>
<td>Flexion, Extension, Abduction, Adduction</td>
<td><span class="example-tag">CMC joint of thumb</span></td>
</tr>
<tr>
<td><b>Spheroidal (Deep Socket)</b></td>
<td><span class="type-badge axes-3">3 rotational</span></td>
<td style="text-align:center;"><b>6</b></td>
<td>Flex, Extend, Abduct, Adduct, Internal & External Rotation</td>
<td><span class="example-tag">Hip joint</span></td>
</tr>
<tr>
<td><b>Spheroidal (Shallow Socket)</b></td>
<td><span class="type-badge axes-3">3 rotational</span></td>
<td style="text-align:center;"><b>6+</b></td>
<td>All 6 movements + greater range</td>
<td><span class="example-tag">Glenohumeral (shoulder)</span></td>
</tr>
</tbody>
</table>
<div style="margin-top:18px;background:#f0fdf4;border:2px solid #bbf7d0;border-radius:10px;padding:12px 18px;font-size:0.83rem;color:#14532d;">
<b>Key Principle:</b> The more <em>congruent</em> the articular surfaces (similar radius of curvature, e.g., shoulder), the more they <em>slide</em> onto each other. The less congruent, the more they <em>roll</em> off each other (e.g., knee). Most joints use a combination - <b>roll-slide</b>.
</div>
</div>
<!-- ======= CHART 4: Joint Stability ======= -->
<div class="section-title">Chart 4: Joint Stability - Constraints & Posture Muscles</div>
<div class="stability-flow">
<div style="text-align:center;font-weight:700;font-size:1rem;color:#1a2340;margin-bottom:20px;">4 Constraints on Joint Motion</div>
<div class="sf-row">
<div class="sf-box" style="border-color:#bfdbfe;">
<div class="sf-icon">🦴</div>
<div class="sf-title">Bony Constraint</div>
<div class="sf-sub">Shape of articular surfaces determines motion limits</div>
</div>
<div class="sf-arrow">+</div>
<div class="sf-box" style="border-color:#a7f3d0;">
<div class="sf-icon">💪</div>
<div class="sf-title">Muscular Constraint</div>
<div class="sf-sub">Muscles crossing the joint provide dynamic stability</div>
</div>
<div class="sf-arrow">+</div>
<div class="sf-box" style="border-color:#ddd6fe;">
<div class="sf-icon">🔗</div>
<div class="sf-title">Ligamentous Constraint</div>
<div class="sf-sub">Ligaments limit range of motion passively</div>
</div>
<div class="sf-arrow">+</div>
<div class="sf-box" style="border-color:#fde68a;">
<div class="sf-icon">🛡️</div>
<div class="sf-title">Soft-Tissue Constraint</div>
<div class="sf-sub">Joint capsule & surrounding tissue provide enclosure</div>
</div>
</div>
<div class="sf-result">= JOINT STABILITY & CONTROLLED RANGE OF MOTION</div>
<div style="margin-top:30px;font-weight:700;font-size:1rem;color:#1a2340;text-align:center;margin-bottom:14px;">Key Muscles for Erect Posture</div>
<div class="muscles-grid">
<div class="muscle-card">
<div class="muscle-dot" style="background:#3b82f6;"></div>
<div>
<div class="mc-name">Triceps Surae + Tibialis Anterior</div>
<div class="mc-role">Stabilize the ankle in the sagittal plane</div>
</div>
</div>
<div class="muscle-card">
<div class="muscle-dot" style="background:#10b981;"></div>
<div>
<div class="mc-name">Quadriceps Femoris</div>
<div class="mc-role">Stabilizes the knee joint</div>
</div>
</div>
<div class="muscle-card">
<div class="muscle-dot" style="background:#f59e0b;"></div>
<div>
<div class="mc-name">Gluteal Muscles</div>
<div class="mc-role">Stabilize the hip in the sagittal plane</div>
</div>
</div>
<div class="muscle-card">
<div class="muscle-dot" style="background:#ef4444;"></div>
<div>
<div class="mc-name">Gluteus Medius & Minimus</div>
<div class="mc-role">Stabilize the hip in the frontal plane</div>
</div>
</div>
<div class="muscle-card">
<div class="muscle-dot" style="background:#8b5cf6;"></div>
<div>
<div class="mc-name">Intrinsic Back Muscles</div>
<div class="mc-role">Stabilize the spinal column</div>
</div>
</div>
</div>
</div>
<!-- ======= CHART 5: Decision Flowchart ======= -->
<div class="section-title">Chart 5: Clinical Decision Flowchart - Identifying Joint Type</div>
<div class="decision-flow">
<div class="df-start">Examine a Joint</div>
<div class="df-arrow-down" style="margin: 6px 0 18px 0;"></div>
<!-- Q1 -->
<div style="position:relative;display:flex;flex-direction:column;align-items:center;width:100%;">
<div class="df-diamond">
<div class="df-diamond-text">Is there a<br>joint cavity?</div>
</div>
<div style="display:flex;gap:120px;flex-wrap:wrap;justify-content:center;margin-top:8px;width:100%;">
<!-- NO branch -->
<div class="df-branch">
<div class="df-branch-label label-no">NO</div>
<div style="width:2px;height:20px;background:#94a3b8;margin:4px auto;"></div>
<div class="df-end-false" style="font-size:0.9rem;padding:12px 16px;">FALSE JOINT<br><span style="font-weight:400;font-size:0.78rem;">(Synarthrosis)</span></div>
<div style="width:2px;height:14px;background:#94a3b8;margin:4px auto;"></div>
<div class="df-sub-flow">
<div style="display:flex;flex-direction:column;align-items:center;gap:6px;">
<div class="df-sub-box dsb1">Fibrous connection?<br>→ Syndesmosis</div>
<div class="df-sub-box dsb1">Cartilage connection?<br>→ Synchondrosis</div>
<div class="df-sub-box dsb1">Bony fusion?<br>→ Synostosis</div>
</div>
</div>
</div>
<!-- YES branch -->
<div class="df-branch">
<div class="df-branch-label label-yes">YES</div>
<div style="width:2px;height:20px;background:#94a3b8;margin:4px auto;"></div>
<div class="df-end-true" style="font-size:0.9rem;padding:12px 16px;">TRUE JOINT<br><span style="font-weight:400;font-size:0.78rem;">(Diarthrosis)</span></div>
<div style="width:2px;height:14px;background:#94a3b8;margin:4px auto;"></div>
<div class="df-sub-flow">
<div style="text-align:center;font-size:0.78rem;font-weight:700;color:#1e40af;margin-bottom:4px;">How many axes?</div>
<div class="df-sub-box dsb2">0 axes (very stiff)<br>→ Amphiarthrosis</div>
<div class="arrow-sm" style="text-align:center;">↓</div>
<div class="df-sub-box dsb2">Translational motion<br>→ Plane Joint</div>
<div class="arrow-sm" style="text-align:center;">↓</div>
<div class="df-sub-box dsb2">1 rotational axis<br>→ Hinge / Pivot</div>
<div class="arrow-sm" style="text-align:center;">↓</div>
<div class="df-sub-box dsb2">2 rotational axes<br>→ Ellipsoidal / Saddle</div>
<div class="arrow-sm" style="text-align:center;">↓</div>
<div class="df-sub-box dsb2">3 rotational axes<br>→ Spheroidal (ball & socket)</div>
</div>
</div>
</div>
</div>
</div>
<footer>
Source: THIEME Atlas of Anatomy - General Anatomy and Musculoskeletal System (ISBN 9781626237186), Sections 4.2-4.7, pp. 60-71
</footer>
</body>
</html>
joints flowcharts
HTML File · HTML
Convert these flowcharts into a professional PowerPoint presentation
~/joints-flowcharts/build_pptx.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_WIDE"; // 13.3 x 7.5
pres.title = "Joints - Classification, Types & Functions";
pres.author = "THIEME Atlas of Anatomy";
// ─── PALETTE ────────────────────────────────────────────────────────────────
const C = {
navy: "1A2340",
blue: "2563EB",
red: "DC2626",
green: "059669",
amber: "D97706",
purple: "7C3AED",
teal: "0891B2",
slate: "475569",
light: "F1F5F9",
white: "FFFFFF",
gold: "F59E0B",
muted: "94A3B8",
darkbg: "0F172A",
};
// ─── HELPER: slide background ────────────────────────────────────────────────
function darkSlide(slide) {
slide.background = { color: C.darkbg };
}
function lightSlide(slide) {
slide.background = { color: "F8FAFC" };
}
// ─── HELPER: accent bar at top ───────────────────────────────────────────────
function topBar(slide, color) {
slide.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 13.3, h: 0.08, fill: { color }, line: { color } });
}
// ─── HELPER: section label pill ──────────────────────────────────────────────
function pill(slide, label, x, y, color, textColor) {
slide.addShape(pres.ShapeType.roundRect, {
x, y, w: label.length * 0.11 + 0.5, h: 0.3,
fill: { color },
line: { color },
rectRadius: 0.15,
});
slide.addText(label, {
x, y, w: label.length * 0.11 + 0.5, h: 0.3,
fontSize: 9, bold: true, color: textColor || C.white,
align: "center", valign: "middle", margin: 0,
});
}
// ─── HELPER: card (rounded rect + content) ───────────────────────────────────
function card(slide, x, y, w, h, fillColor, borderColor, radius) {
slide.addShape(pres.ShapeType.roundRect, {
x, y, w, h,
fill: { color: fillColor || C.white },
line: { color: borderColor || "E2E8F0", pt: 1.5 },
rectRadius: radius || 0.12,
shadow: { type: "outer", color: "00000018", blur: 8, offset: 3, angle: 45 },
});
}
// ─── HELPER: connector arrow (right-pointing) ────────────────────────────────
function arrowRight(slide, x, y, w) {
slide.addShape(pres.ShapeType.rightArrow, {
x, y, w: w || 0.35, h: 0.22,
fill: { color: C.muted },
line: { color: C.muted },
});
}
// ─── HELPER: down arrow ──────────────────────────────────────────────────────
function arrowDown(slide, x, y, h) {
slide.addShape(pres.ShapeType.downArrow, {
x, y, w: 0.22, h: h || 0.3,
fill: { color: C.muted },
line: { color: C.muted },
});
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 1 — TITLE
// ─────────────────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
darkSlide(s);
// Decorative side strip
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 0.6, h: 7.5, fill: { color: C.blue }, line: { color: C.blue } });
s.addShape(pres.ShapeType.rect, { x: 0.6, y: 0, w: 0.12, h: 7.5, fill: { color: C.teal }, line: { color: C.teal } });
// Large decorative circle
s.addShape(pres.ShapeType.ellipse, {
x: 9.5, y: -1.5, w: 5, h: 5,
fill: { color: "1E3A5F" },
line: { color: "1E3A5F" },
});
s.addShape(pres.ShapeType.ellipse, {
x: 10.8, y: 3.5, w: 3.5, h: 3.5,
fill: { color: "162030" },
line: { color: "162030" },
});
// Title
s.addText("JOINTS", {
x: 1.2, y: 1.6, w: 8, h: 1.6,
fontSize: 72, bold: true, color: C.white,
charSpacing: 12,
});
// Subtitle
s.addText("Classification · Types · Functions", {
x: 1.2, y: 3.3, w: 8.5, h: 0.6,
fontSize: 22, color: C.muted, charSpacing: 2,
});
// Divider line
s.addShape(pres.ShapeType.line, {
x: 1.2, y: 4.05, w: 6, h: 0,
line: { color: C.blue, pt: 2 },
});
// Source
s.addText("THIEME Atlas of Anatomy | General Anatomy & Musculoskeletal System", {
x: 1.2, y: 4.3, w: 9, h: 0.4,
fontSize: 11, color: "5A7A9A", italic: true,
});
// Slide count labels along bottom
const labels = ["Classification", "False Joints", "True Joints", "Joint Structure", "Joint Types", "Stability"];
labels.forEach((lbl, i) => {
const bx = 1.2 + i * 1.9;
s.addShape(pres.ShapeType.rect, { x: bx, y: 6.9, w: 1.7, h: 0.04, fill: { color: i === 0 ? C.blue : "2A3A5A" }, line: { color: "00000000" } });
s.addText(lbl, { x: bx, y: 6.95, w: 1.7, h: 0.35, fontSize: 7.5, color: "4A6A8A", align: "center" });
});
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 2 — CLASSIFICATION OVERVIEW
// ─────────────────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
lightSlide(s);
topBar(s, C.navy);
// Header band
s.addShape(pres.ShapeType.rect, { x: 0, y: 0.08, w: 13.3, h: 1.05, fill: { color: C.navy }, line: { color: C.navy } });
s.addText("CLASSIFICATION OF JOINTS", {
x: 0.4, y: 0.1, w: 10, h: 0.9,
fontSize: 26, bold: true, color: C.white, charSpacing: 3, valign: "middle",
});
pill(s, "Chart 1", 11.8, 0.38, C.blue);
// Root node
card(s, 5.15, 1.35, 3.0, 0.72, C.navy, C.navy, 0.35);
s.addText("JOINTS", {
x: 5.15, y: 1.35, w: 3.0, h: 0.72,
fontSize: 20, bold: true, color: C.white, align: "center", valign: "middle", charSpacing: 4,
});
// Vertical line from root
s.addShape(pres.ShapeType.line, { x: 6.65, y: 2.07, w: 0, h: 0.38, line: { color: C.muted, pt: 2 } });
// Horizontal splitter
s.addShape(pres.ShapeType.line, { x: 2.8, y: 2.45, w: 7.7, h: 0, line: { color: C.muted, pt: 2 } });
// Down to false
s.addShape(pres.ShapeType.line, { x: 3.5, y: 2.45, w: 0, h: 0.38, line: { color: C.red, pt: 2 } });
// Down to true
s.addShape(pres.ShapeType.line, { x: 9.8, y: 2.45, w: 0, h: 0.38, line: { color: C.blue, pt: 2 } });
// FALSE JOINTS node
card(s, 1.6, 2.83, 3.8, 0.82, "FEF2F2", C.red, 0.12);
s.addText([
{ text: "FALSE JOINTS ", options: { bold: true, color: C.red } },
{ text: "(Synarthroses)", options: { color: C.slate, fontSize: 11 } },
{ text: "\nNo joint cavity", options: { color: C.slate, fontSize: 10, breakLine: false } },
], { x: 1.6, y: 2.83, w: 3.8, h: 0.82, fontSize: 13, align: "center", valign: "middle" });
// TRUE JOINTS node
card(s, 7.9, 2.83, 3.8, 0.82, "EFF6FF", C.blue, 0.12);
s.addText([
{ text: "TRUE JOINTS ", options: { bold: true, color: C.blue } },
{ text: "(Diarthroses)", options: { color: C.slate, fontSize: 11 } },
{ text: "\nJoint cavity present", options: { color: C.slate, fontSize: 10, breakLine: false } },
], { x: 7.9, y: 2.83, w: 3.8, h: 0.82, fontSize: 13, align: "center", valign: "middle" });
// Lines from FALSE down
const falseCols = [1.65, 3.35, 5.05];
const falseW = 1.5;
s.addShape(pres.ShapeType.line, { x: 3.5, y: 3.65, w: 0, h: 0.35, line: { color: C.red, pt: 1.5 } });
s.addShape(pres.ShapeType.line, { x: falseCols[0] + falseW / 2, y: 4.0, w: falseCols[2] + falseW / 2 - (falseCols[0] + falseW / 2), h: 0, line: { color: C.red, pt: 1.5 } });
falseCols.forEach(fx => s.addShape(pres.ShapeType.line, { x: fx + falseW / 2, y: 4.0, w: 0, h: 0.3, line: { color: C.red, pt: 1.5 } }));
// FALSE sub-cards
const falseTypes = [
{ title: "Syndesmoses", sub: "Fibrous joints\nInterosseous membranes\nFontanelles · Gomphosis" },
{ title: "Synchondroses", sub: "Cartilaginous joints\nEpiphyseal plates\nCostal cartilage · Symphyses" },
{ title: "Synostoses", sub: "Bony fusion\nSacrum · Hip bone\nOssified epiphyseal plates" },
];
falseTypes.forEach((ft, i) => {
card(s, falseCols[i], 4.3, falseW, 1.38, "FFF5F5", "FECACA", 0.1);
s.addText(ft.title, { x: falseCols[i], y: 4.3, w: falseW, h: 0.38, fontSize: 10.5, bold: true, color: C.red, align: "center", valign: "middle" });
s.addShape(pres.ShapeType.line, { x: falseCols[i] + 0.1, y: 4.68, w: falseW - 0.2, h: 0, line: { color: "FECACA", pt: 1 } });
s.addText(ft.sub, { x: falseCols[i] + 0.08, y: 4.72, w: falseW - 0.16, h: 0.88, fontSize: 8.5, color: C.slate, valign: "top" });
});
// Lines from TRUE down
const trueCols = [7.95, 9.65];
const trueW = 1.6;
s.addShape(pres.ShapeType.line, { x: 9.8, y: 3.65, w: 0, h: 0.35, line: { color: C.blue, pt: 1.5 } });
s.addShape(pres.ShapeType.line, { x: trueCols[0] + trueW / 2, y: 4.0, w: trueCols[1] + trueW / 2 - (trueCols[0] + trueW / 2), h: 0, line: { color: C.blue, pt: 1.5 } });
trueCols.forEach(tx => s.addShape(pres.ShapeType.line, { x: tx + trueW / 2, y: 4.0, w: 0, h: 0.3, line: { color: C.blue, pt: 1.5 } }));
const trueTypes = [
{ title: "Diarthroses", sub: "Plane · Hinge · Pivot\nEllipsoidal · Saddle\nSpherical (ball & socket)" },
{ title: "Amphiarthroses", sub: "Stiff true joints\nTight ligamentous constraints\nExample: Sacroiliac joint" },
];
trueTypes.forEach((tt, i) => {
card(s, trueCols[i], 4.3, trueW, 1.38, "EFF6FF", "BFDBFE", 0.1);
s.addText(tt.title, { x: trueCols[i], y: 4.3, w: trueW, h: 0.38, fontSize: 10.5, bold: true, color: C.blue, align: "center", valign: "middle" });
s.addShape(pres.ShapeType.line, { x: trueCols[i] + 0.1, y: 4.68, w: trueW - 0.2, h: 0, line: { color: "BFDBFE", pt: 1 } });
s.addText(tt.sub, { x: trueCols[i] + 0.08, y: 4.72, w: trueW - 0.16, h: 0.88, fontSize: 8.5, color: C.slate, valign: "top" });
});
// Footer
s.addShape(pres.ShapeType.line, { x: 0, y: 7.2, w: 13.3, h: 0, line: { color: "E2E8F0", pt: 1 } });
s.addText("THIEME Atlas of Anatomy | Sections 4.2–4.7", { x: 0.3, y: 7.23, w: 10, h: 0.25, fontSize: 8, color: C.muted });
s.addText("2 / 7", { x: 12.6, y: 7.23, w: 0.5, h: 0.25, fontSize: 8, color: C.muted, align: "right" });
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 3 — FALSE JOINTS DEEP DIVE
// ─────────────────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
lightSlide(s);
topBar(s, C.red);
s.addShape(pres.ShapeType.rect, { x: 0, y: 0.08, w: 13.3, h: 1.05, fill: { color: "7F1D1D" }, line: { color: "7F1D1D" } });
s.addText("FALSE JOINTS (SYNARTHROSES)", {
x: 0.4, y: 0.1, w: 10, h: 0.9,
fontSize: 24, bold: true, color: C.white, charSpacing: 3, valign: "middle",
});
pill(s, "No Joint Cavity", 9.8, 0.38, C.red);
pill(s, "Chart 1", 11.4, 0.38, "991B1B");
const cols = [
{ x: 0.35, color: C.red, border: "FECACA", bg: "FFF5F5", accent: "FEE2E2",
icon: "🔗", title: "SYNDESMOSES", sub: "Fibrous Joints",
items: [
{ bold: "Definition:", rest: " Two bones connected by fibrous connective tissue" },
{ bold: "Mobility:", rest: " Variable, depends on length of fibers" },
{ bold: "Examples:", rest: "" },
{ bold: "", rest: " • Interosseous membrane (radius-ulna; tibia-fibula)" },
{ bold: "", rest: " • Tibiofibular syndesmosis" },
{ bold: "", rest: " • Fontanelles (newborn skull)" },
{ bold: "", rest: " • Gomphosis – tooth in bony socket via periodontal ligament" },
]
},
{ x: 4.65, color: "B45309", border: "FDE68A", bg: "FFFBEB", accent: "FEF3C7",
icon: "🦷", title: "SYNCHONDROSES", sub: "Cartilaginous Joints",
items: [
{ bold: "Definition:", rest: " Bones connected by cartilage" },
{ bold: "Mobility:", rest: " Low; eventually ossify" },
{ bold: "Examples:", rest: "" },
{ bold: "", rest: " • Epiphyseal growth plates (allow bone growth)" },
{ bold: "", rest: " • Hip bone – growth plates (ilium, ischium, pubis)" },
{ bold: "", rest: " • Costal cartilage – ribs to sternum" },
{ bold: "", rest: " • Pubic symphysis & intervertebral discs" },
]
},
{ x: 8.95, color: "065F46", border: "6EE7B7", bg: "F0FDF4", accent: "D1FAE5",
icon: "🦴", title: "SYNOSTOSES", sub: "Bony Fusion",
items: [
{ bold: "Definition:", rest: " Cartilage/fibrous tissue replaced by bone" },
{ bold: "Mobility:", rest: " None — complete stiffness" },
{ bold: "Examples:", rest: "" },
{ bold: "", rest: " • Sacrum – fused sacral vertebrae" },
{ bold: "", rest: " • Hip bone – fusion of ilium, ischium & pubis" },
{ bold: "", rest: " • Ossified and closed epiphyseal plates in adults" },
{ bold: "", rest: " • Cranial sutures (adults)" },
]
},
];
cols.forEach(col => {
const cw = 4.15;
// Main card
card(s, col.x, 1.32, cw, 5.55, col.bg, col.border, 0.15);
// Colored header strip inside card
s.addShape(pres.ShapeType.roundRect, {
x: col.x, y: 1.32, w: cw, h: 1.05,
fill: { color: col.accent }, line: { color: col.border, pt: 1.5 }, rectRadius: 0.15,
});
// Icon circle
s.addShape(pres.ShapeType.ellipse, {
x: col.x + 0.18, y: 1.43, w: 0.65, h: 0.65,
fill: { color: col.color }, line: { color: col.color },
});
s.addText(col.icon, { x: col.x + 0.18, y: 1.43, w: 0.65, h: 0.65, fontSize: 18, align: "center", valign: "middle" });
// Title
s.addText(col.title, {
x: col.x + 0.95, y: 1.45, w: cw - 1.1, h: 0.4,
fontSize: 13, bold: true, color: col.color,
});
s.addText(col.sub, {
x: col.x + 0.95, y: 1.84, w: cw - 1.1, h: 0.28,
fontSize: 9.5, color: C.slate, italic: true,
});
// Divider
s.addShape(pres.ShapeType.line, { x: col.x + 0.15, y: 2.42, w: cw - 0.3, h: 0, line: { color: col.border, pt: 1 } });
// Items
const richItems = col.items.map((item, idx) => {
const parts = [];
if (item.bold) parts.push({ text: item.bold, options: { bold: true, color: col.color } });
if (item.rest) parts.push({ text: item.rest, options: { color: C.slate } });
parts.push({ text: "", options: { breakLine: true } });
return parts;
}).flat();
s.addText(richItems, {
x: col.x + 0.18, y: 2.5, w: cw - 0.36, h: 4.1,
fontSize: 9.5, valign: "top", lineSpacingMultiple: 1.3,
});
});
// Footer
s.addShape(pres.ShapeType.line, { x: 0, y: 7.2, w: 13.3, h: 0, line: { color: "E2E8F0", pt: 1 } });
s.addText("THIEME Atlas of Anatomy | Sections 4.2–4.3", { x: 0.3, y: 7.23, w: 10, h: 0.25, fontSize: 8, color: C.muted });
s.addText("3 / 7", { x: 12.6, y: 7.23, w: 0.5, h: 0.25, fontSize: 8, color: C.muted, align: "right" });
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 4 — TRUE JOINT STRUCTURE (Components)
// ─────────────────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
lightSlide(s);
topBar(s, C.purple);
s.addShape(pres.ShapeType.rect, { x: 0, y: 0.08, w: 13.3, h: 1.05, fill: { color: "4C1D95" }, line: { color: "4C1D95" } });
s.addText("COMPONENTS OF A TRUE (SYNOVIAL) JOINT", {
x: 0.4, y: 0.1, w: 10, h: 0.9,
fontSize: 22, bold: true, color: C.white, charSpacing: 2, valign: "middle",
});
pill(s, "Chart 2", 11.8, 0.38, C.purple);
const components = [
{ num: "1", title: "Articular Surfaces", desc: "Hyaline cartilage (1–2 mm phalanges; 5–7 mm femoropatellar). Jaw & sternoclavicular: fibrous cartilage.", color: "3B82F6", border: "BFDBFE", bg: "EFF6FF" },
{ num: "2", title: "Joint Cavity", desc: "Narrow space (a few mm) with articular recesses. Separated surfaces define the true joint.", color: "10B981", border: "A7F3D0", bg: "F0FDF4" },
{ num: "3", title: "Joint Capsule", desc: "Closed capsule with alar folds, synovial folds & villi. Inner synovial membrane is highly vascular.", color: "F59E0B", border: "FDE68A", bg: "FFFBEB" },
{ num: "4", title: "Synovial Fluid", desc: "Highly viscous. Lubricates & nourishes avascular cartilage by diffusion and convection.", color: "EF4444", border: "FECACA", bg: "FEF2F2" },
{ num: "5", title: "Intra-articular Structures", desc: "Menisci (knee); Articular discs (jaw, sternoclavicular, wrist); Labra (hip & shoulder).", color: "8B5CF6", border: "DDD6FE", bg: "F5F3FF" },
{ num: "6", title: "Ligaments", desc: "Intra- and extracapsular. Primary joint stabilizers limiting range of motion.", color: "EC4899", border: "FBCFE8", bg: "FDF2F8" },
{ num: "7", title: "Muscles", desc: "Agonist & antagonist pairs crossing the joint. Move joint in opposite directions.", color: "06B6D4", border: "A5F3FC", bg: "ECFEFF" },
{ num: "8", title: "Synovial Bursae", desc: "Fluid-filled sacs near the joint. May communicate with joint cavity. Reduce friction.", color: "84CC16", border: "D9F99D", bg: "F7FEE7" },
];
const cols = 4;
const cw = 3.05, ch = 1.38, gx = 0.32, gy = 1.32, padx = 0.17, pady = 0.15;
components.forEach((c, i) => {
const col = i % cols;
const row = Math.floor(i / cols);
const x = gx + col * (cw + padx);
const y = gy + row * (ch + pady);
card(s, x, y, cw, ch, c.bg, c.border, 0.1);
// Number badge
s.addShape(pres.ShapeType.ellipse, {
x: x + 0.12, y: y + 0.14, w: 0.45, h: 0.45,
fill: { color: c.color }, line: { color: c.color },
});
s.addText(c.num, { x: x + 0.12, y: y + 0.14, w: 0.45, h: 0.45, fontSize: 12, bold: true, color: C.white, align: "center", valign: "middle" });
// Title
s.addText(c.title, { x: x + 0.65, y: y + 0.12, w: cw - 0.78, h: 0.42, fontSize: 11, bold: true, color: c.color, valign: "middle" });
// Desc
s.addText(c.desc, { x: x + 0.12, y: y + 0.64, w: cw - 0.24, h: 0.68, fontSize: 8.5, color: C.slate, valign: "top", lineSpacingMultiple: 1.3 });
});
// Important note
s.addShape(pres.ShapeType.roundRect, {
x: 0.32, y: 6.45, w: 12.66, h: 0.62,
fill: { color: "FFFBEB" }, line: { color: "FDE68A", pt: 2 }, rectRadius: 0.1,
});
s.addText([
{ text: "⚠ Important: ", options: { bold: true, color: "92400E" } },
{ text: "Synovial membrane can regenerate. Hyaline cartilage ", options: { color: "78350F" } },
{ text: "cannot regenerate", options: { bold: true, color: C.red } },
{ text: " — avascular, lacks perichondrium, nourished exclusively by synovial fluid.", options: { color: "78350F" } },
], { x: 0.32, y: 6.45, w: 12.66, h: 0.62, fontSize: 10, valign: "middle", margin: [0, 12, 0, 12] });
s.addShape(pres.ShapeType.line, { x: 0, y: 7.2, w: 13.3, h: 0, line: { color: "E2E8F0", pt: 1 } });
s.addText("THIEME Atlas of Anatomy | Fig. 4.3A", { x: 0.3, y: 7.23, w: 10, h: 0.25, fontSize: 8, color: C.muted });
s.addText("4 / 7", { x: 12.6, y: 7.23, w: 0.5, h: 0.25, fontSize: 8, color: C.muted, align: "right" });
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 5 — TYPES OF SYNOVIAL JOINTS (Table)
// ─────────────────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
lightSlide(s);
topBar(s, C.teal);
s.addShape(pres.ShapeType.rect, { x: 0, y: 0.08, w: 13.3, h: 1.05, fill: { color: "164E63" }, line: { color: "164E63" } });
s.addText("TYPES OF SYNOVIAL JOINTS", {
x: 0.4, y: 0.1, w: 10, h: 0.9,
fontSize: 24, bold: true, color: C.white, charSpacing: 3, valign: "middle",
});
pill(s, "By Shape & Movement", 9.3, 0.38, C.teal);
pill(s, "Chart 3", 11.8, 0.38, "0E7490");
// Table header
const headers = ["Joint Type", "Axes", "DoF", "Primary Movements", "Example"];
const colX = [0.3, 2.95, 4.2, 5.2, 9.75];
const colW = [2.6, 1.2, 0.95, 4.5, 3.25];
s.addShape(pres.ShapeType.rect, { x: 0.3, y: 1.32, w: 12.7, h: 0.42, fill: { color: "0E7490" }, line: { color: "0E7490" } });
headers.forEach((h, i) => {
s.addText(h, { x: colX[i], y: 1.32, w: colW[i], h: 0.42, fontSize: 10, bold: true, color: C.white, valign: "middle", margin: [0, 6, 0, 6] });
});
const rows = [
{ type: "Plane (Femoropatellar)", axes: "1 translational", dof: "1", moves: "Slide up/down in femoral groove", ex: "Patella in femoral groove", axColor: "F59E0B", axBg: "FFFBEB" },
{ type: "Plane (Vertebral)", axes: "1–2 translational", dof: "2–4", moves: "Gliding in multiple directions", ex: "Facet joints of spine", axColor: "F59E0B", axBg: "FFFBEB" },
{ type: "Hinge Joint", axes: "1 rotational", dof: "2", moves: "Flexion, Extension", ex: "Elbow, Knee", axColor: "3B82F6", axBg: "EFF6FF" },
{ type: "Pivot Joint", axes: "1 rotational", dof: "2", moves: "Rotation (axial)", ex: "Atlanto-axial, Proximal radioulnar", axColor: "3B82F6", axBg: "EFF6FF" },
{ type: "Ellipsoidal Joint", axes: "2 rotational", dof: "4", moves: "Flex, Extend, Abduct, Adduct", ex: "Radiocarpal (wrist) joint", axColor: "10B981", axBg: "F0FDF4" },
{ type: "Saddle Joint", axes: "2 rotational", dof: "4", moves: "Flex, Extend, Abduct, Adduct", ex: "CMC joint of thumb", axColor: "10B981", axBg: "F0FDF4" },
{ type: "Spheroidal (Deep)", axes: "3 rotational", dof: "6", moves: "All 6 movements", ex: "Hip joint", axColor: "8B5CF6", axBg: "F5F3FF" },
{ type: "Spheroidal (Shallow)", axes: "3 rotational", dof: "6+", moves: "All 6 movements + greater range", ex: "Glenohumeral (shoulder)", axColor: "8B5CF6", axBg: "F5F3FF" },
];
const rowH = 0.52;
rows.forEach((r, i) => {
const ry = 1.74 + i * rowH;
const bg = i % 2 === 0 ? C.white : "F8FAFC";
s.addShape(pres.ShapeType.rect, { x: 0.3, y: ry, w: 12.7, h: rowH, fill: { color: bg }, line: { color: "E2E8F0", pt: 0.5 } });
s.addText(r.type, { x: colX[0], y: ry, w: colW[0], h: rowH, fontSize: 9.5, bold: true, color: C.navy, valign: "middle", margin: [0, 6, 0, 6] });
// Axes pill
s.addShape(pres.ShapeType.roundRect, { x: colX[1] + 0.05, y: ry + 0.1, w: colW[1] - 0.1, h: 0.3, fill: { color: r.axBg }, line: { color: r.axColor, pt: 1 }, rectRadius: 0.15 });
s.addText(r.axes, { x: colX[1] + 0.05, y: ry + 0.1, w: colW[1] - 0.1, h: 0.3, fontSize: 8, bold: true, color: r.axColor, align: "center", valign: "middle" });
s.addText(r.dof, { x: colX[2], y: ry, w: colW[2], h: rowH, fontSize: 12, bold: true, color: C.teal, align: "center", valign: "middle" });
s.addText(r.moves, { x: colX[3], y: ry, w: colW[3], h: rowH, fontSize: 9, color: C.slate, valign: "middle", margin: [0, 6, 0, 6] });
s.addText(r.ex, { x: colX[4], y: ry, w: colW[4], h: rowH, fontSize: 9, color: C.slate, valign: "middle", margin: [0, 6, 0, 6], italic: true });
});
// Roll-slide note
s.addShape(pres.ShapeType.roundRect, {
x: 0.3, y: 6.67, w: 12.7, h: 0.38,
fill: { color: "ECFEFF" }, line: { color: "A5F3FC", pt: 1.5 }, rectRadius: 0.08,
});
s.addText([
{ text: "Key Principle: ", options: { bold: true, color: "0E7490" } },
{ text: "Congruent surfaces → slide. Less congruent → roll. Most joints use a combination: ", options: { color: C.slate } },
{ text: "roll-slide.", options: { bold: true, color: C.navy } },
], { x: 0.3, y: 6.67, w: 12.7, h: 0.38, fontSize: 9.5, valign: "middle", margin: [0, 10, 0, 10] });
s.addShape(pres.ShapeType.line, { x: 0, y: 7.2, w: 13.3, h: 0, line: { color: "E2E8F0", pt: 1 } });
s.addText("THIEME Atlas of Anatomy | Sections 4.4–4.6", { x: 0.3, y: 7.23, w: 10, h: 0.25, fontSize: 8, color: C.muted });
s.addText("5 / 7", { x: 12.6, y: 7.23, w: 0.5, h: 0.25, fontSize: 8, color: C.muted, align: "right" });
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 6 — JOINT STABILITY
// ─────────────────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
lightSlide(s);
topBar(s, C.green);
s.addShape(pres.ShapeType.rect, { x: 0, y: 0.08, w: 13.3, h: 1.05, fill: { color: "064E3B" }, line: { color: "064E3B" } });
s.addText("JOINT STABILITY — CONSTRAINTS & POSTURE", {
x: 0.4, y: 0.1, w: 10, h: 0.9,
fontSize: 22, bold: true, color: C.white, charSpacing: 2, valign: "middle",
});
pill(s, "Chart 4", 11.8, 0.38, C.green);
// Section A label
s.addText("4 Constraints on Joint Motion", {
x: 0.35, y: 1.28, w: 7, h: 0.35,
fontSize: 12, bold: true, color: C.navy,
});
// 4 constraint cards in a row with arrows between them
const constraints = [
{ icon: "🦴", title: "Bony", desc: "Shape of articular surfaces determines motion limits", color: "3B82F6", border: "BFDBFE", bg: "EFF6FF" },
{ icon: "💪", title: "Muscular", desc: "Muscles crossing the joint provide dynamic stability", color: "10B981", border: "A7F3D0", bg: "F0FDF4" },
{ icon: "🔗", title: "Ligamentous", desc: "Ligaments passively limit range of motion", color: "8B5CF6", border: "DDD6FE", bg: "F5F3FF" },
{ icon: "🛡️", title: "Soft-Tissue", desc: "Joint capsule & surrounding tissue provide enclosure", color: "F59E0B", border: "FDE68A", bg: "FFFBEB" },
];
constraints.forEach((c, i) => {
const cx = 0.35 + i * 3.12;
card(s, cx, 1.68, 2.75, 1.5, c.bg, c.border, 0.12);
// Icon circle
s.addShape(pres.ShapeType.ellipse, { x: cx + 0.15, y: 1.78, w: 0.6, h: 0.6, fill: { color: c.color }, line: { color: c.color } });
s.addText(c.icon, { x: cx + 0.15, y: 1.78, w: 0.6, h: 0.6, fontSize: 17, align: "center", valign: "middle" });
s.addText(c.title, { x: cx + 0.85, y: 1.82, w: 1.8, h: 0.38, fontSize: 12.5, bold: true, color: c.color, valign: "middle" });
s.addShape(pres.ShapeType.line, { x: cx + 0.15, y: 2.42, w: 2.45, h: 0, line: { color: c.border, pt: 1 } });
s.addText(c.desc, { x: cx + 0.12, y: 2.48, w: 2.52, h: 0.62, fontSize: 9, color: C.slate, valign: "top", lineSpacingMultiple: 1.3 });
// Plus/arrow between cards
if (i < 3) {
s.addText("+", { x: cx + 2.79, y: 1.9, w: 0.3, h: 0.5, fontSize: 20, bold: true, color: C.muted, align: "center", valign: "middle" });
}
});
// Result box
s.addShape(pres.ShapeType.roundRect, {
x: 2.5, y: 3.28, w: 8.3, h: 0.58,
fill: { color: "064E3B" }, line: { color: C.green, pt: 2 }, rectRadius: 0.3,
shadow: { type: "outer", color: "05966930", blur: 10, offset: 3, angle: 45 },
});
s.addText("= JOINT STABILITY & CONTROLLED RANGE OF MOTION", {
x: 2.5, y: 3.28, w: 8.3, h: 0.58,
fontSize: 13, bold: true, color: C.white, align: "center", valign: "middle", charSpacing: 1,
});
// Section B — Posture Muscles
s.addShape(pres.ShapeType.line, { x: 0.35, y: 4.1, w: 12.6, h: 0, line: { color: "E2E8F0", pt: 1 } });
s.addText("Key Muscles for Erect Posture", {
x: 0.35, y: 4.15, w: 7, h: 0.35,
fontSize: 12, bold: true, color: C.navy,
});
const muscles = [
{ name: "Triceps Surae + Tibialis Anterior", role: "Stabilize the ankle in the sagittal plane", color: "3B82F6" },
{ name: "Quadriceps Femoris", role: "Stabilizes the knee joint", color: "10B981" },
{ name: "Gluteal Muscles", role: "Stabilize the hip in the sagittal plane", color: "F59E0B" },
{ name: "Gluteus Medius & Minimus", role: "Stabilize the hip in the frontal plane", color: "EF4444" },
{ name: "Intrinsic Back Muscles", role: "Stabilize the spinal column", color: "8B5CF6" },
];
muscles.forEach((m, i) => {
const mx = 0.35 + (i % 3) * 4.3;
const my = 4.55 + Math.floor(i / 3) * 0.85;
card(s, mx, my, 4.0, 0.72, C.white, "E2E8F0", 0.1);
s.addShape(pres.ShapeType.ellipse, { x: mx + 0.12, y: my + 0.14, w: 0.44, h: 0.44, fill: { color: m.color }, line: { color: m.color } });
s.addText(m.name, { x: mx + 0.65, y: my + 0.06, w: 3.25, h: 0.35, fontSize: 9.5, bold: true, color: C.navy, valign: "middle" });
s.addText(m.role, { x: mx + 0.65, y: my + 0.39, w: 3.25, h: 0.28, fontSize: 8.5, color: C.slate });
});
s.addShape(pres.ShapeType.line, { x: 0, y: 7.2, w: 13.3, h: 0, line: { color: "E2E8F0", pt: 1 } });
s.addText("THIEME Atlas of Anatomy | Section 4.7", { x: 0.3, y: 7.23, w: 10, h: 0.25, fontSize: 8, color: C.muted });
s.addText("6 / 7", { x: 12.6, y: 7.23, w: 0.5, h: 0.25, fontSize: 8, color: C.muted, align: "right" });
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 7 — CLINICAL DECISION FLOWCHART
// ─────────────────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
lightSlide(s);
topBar(s, C.amber);
s.addShape(pres.ShapeType.rect, { x: 0, y: 0.08, w: 13.3, h: 1.05, fill: { color: "78350F" }, line: { color: "78350F" } });
s.addText("CLINICAL DECISION FLOWCHART — IDENTIFY JOINT TYPE", {
x: 0.4, y: 0.1, w: 10, h: 0.9,
fontSize: 21, bold: true, color: C.white, charSpacing: 2, valign: "middle",
});
pill(s, "Chart 5", 11.8, 0.38, C.amber);
// Start node
s.addShape(pres.ShapeType.roundRect, {
x: 4.9, y: 1.3, w: 3.5, h: 0.55,
fill: { color: C.navy }, line: { color: C.navy }, rectRadius: 0.28,
});
s.addText("EXAMINE A JOINT", { x: 4.9, y: 1.3, w: 3.5, h: 0.55, fontSize: 11.5, bold: true, color: C.white, align: "center", valign: "middle", charSpacing: 1 });
// Arrow down
arrowDown(s, 6.54, 1.85, 0.32);
// Diamond
s.addShape(pres.ShapeType.diamond, {
x: 5.1, y: 2.17, w: 3.1, h: 0.9,
fill: { color: "FFFBEB" }, line: { color: C.amber, pt: 2 },
});
s.addText("Is there a joint cavity?", { x: 5.1, y: 2.17, w: 3.1, h: 0.9, fontSize: 10, bold: true, color: "78350F", align: "center", valign: "middle" });
// NO label and line (left)
s.addShape(pres.ShapeType.line, { x: 5.1, y: 2.62, w: -1.6, h: 0, line: { color: C.red, pt: 2 } });
arrowDown(s, 3.39, 2.62, 0.32);
s.addText("NO", { x: 3.5, y: 2.45, w: 0.6, h: 0.28, fontSize: 9.5, bold: true, color: C.red, align: "center" });
// YES label and line (right)
s.addShape(pres.ShapeType.line, { x: 8.2, y: 2.62, w: 1.6, h: 0, line: { color: C.green, pt: 2 } });
arrowDown(s, 9.69, 2.62, 0.32);
s.addText("YES", { x: 8.45, y: 2.45, w: 0.6, h: 0.28, fontSize: 9.5, bold: true, color: C.green, align: "center" });
// FALSE JOINT box
card(s, 2.3, 2.94, 2.3, 0.5, "FEF2F2", C.red, 0.1);
s.addText("FALSE JOINT\n(Synarthrosis)", { x: 2.3, y: 2.94, w: 2.3, h: 0.5, fontSize: 10, bold: true, color: C.red, align: "center", valign: "middle" });
// TRUE JOINT box
card(s, 8.7, 2.94, 2.3, 0.5, "EFF6FF", C.blue, 0.1);
s.addText("TRUE JOINT\n(Diarthrosis)", { x: 8.7, y: 2.94, w: 2.3, h: 0.5, fontSize: 10, bold: true, color: C.blue, align: "center", valign: "middle" });
// FALSE sub-flow
arrowDown(s, 3.34, 3.44, 0.25);
s.addText("What connects the bones?", { x: 1.8, y: 3.69, w: 3.2, h: 0.28, fontSize: 9, bold: true, color: C.slate, align: "center" });
const falsePaths = [
{ label: "Fibrous tissue", result: "→ Syndesmosis", color: C.red },
{ label: "Cartilage", result: "→ Synchondrosis", color: "B45309" },
{ label: "Bone", result: "→ Synostosis", color: "065F46" },
];
falsePaths.forEach((fp, i) => {
const fy = 4.1 + i * 0.66;
s.addShape(pres.ShapeType.roundRect, { x: 1.5, y: fy, w: 3.9, h: 0.55, fill: { color: "F8FAFC" }, line: { color: "E2E8F0", pt: 1 }, rectRadius: 0.08 });
s.addText([
{ text: fp.label, options: { bold: true, color: fp.color } },
{ text: " " + fp.result, options: { color: C.slate } },
], { x: 1.6, y: fy, w: 3.7, h: 0.55, fontSize: 10, valign: "middle" });
if (i < 2) arrowDown(s, 3.39, fy + 0.55, 0.1);
});
// TRUE sub-flow — axis decision tree
arrowDown(s, 9.74, 3.44, 0.25);
s.addText("How many axes?", { x: 8.2, y: 3.69, w: 3.3, h: 0.28, fontSize: 9, bold: true, color: C.slate, align: "center" });
const truePaths = [
{ axes: "0 axes (very stiff)", result: "Amphiarthrosis", color: "6B7280", border: "D1D5DB", bg: "F9FAFB" },
{ axes: "Translational", result: "Plane Joint", color: "F59E0B", border: "FDE68A", bg: "FFFBEB" },
{ axes: "1 rotational", result: "Hinge / Pivot", color: "3B82F6", border: "BFDBFE", bg: "EFF6FF" },
{ axes: "2 rotational", result: "Ellipsoidal / Saddle", color: "10B981", border: "A7F3D0", bg: "F0FDF4" },
{ axes: "3 rotational", result: "Spheroidal (Ball & Socket)", color: "8B5CF6", border: "DDD6FE", bg: "F5F3FF" },
];
truePaths.forEach((tp, i) => {
const ty = 4.08 + i * 0.62;
s.addShape(pres.ShapeType.roundRect, { x: 7.9, y: ty, w: 4.3, h: 0.52, fill: { color: tp.bg }, line: { color: tp.border, pt: 1.5 }, rectRadius: 0.08 });
s.addText([
{ text: tp.axes, options: { bold: true, color: tp.color, fontSize: 9.5 } },
{ text: " → ", options: { color: C.muted, fontSize: 9.5 } },
{ text: tp.result, options: { color: C.navy, fontSize: 9.5 } },
], { x: 7.98, y: ty, w: 4.14, h: 0.52, valign: "middle" });
if (i < 4) arrowDown(s, 9.94, ty + 0.52, 0.1);
});
s.addShape(pres.ShapeType.line, { x: 0, y: 7.2, w: 13.3, h: 0, line: { color: "E2E8F0", pt: 1 } });
s.addText("THIEME Atlas of Anatomy | General Anatomy & Musculoskeletal System", { x: 0.3, y: 7.23, w: 10, h: 0.25, fontSize: 8, color: C.muted });
s.addText("7 / 7", { x: 12.6, y: 7.23, w: 0.5, h: 0.25, fontSize: 8, color: C.muted, align: "right" });
}
// ─── WRITE FILE ───────────────────────────────────────────────────────────────
pres.writeFile({ fileName: "/home/daytona/workspace/joints-flowcharts/Joints_Presentation.pptx" })
.then(() => console.log("SUCCESS: Joints_Presentation.pptx written."))
.catch(err => { console.error("ERROR:", err); process.exit(1); });
cd /home/daytona/workspace/joints-flowcharts && node build_pptx.js
sed -i 's/color: "00000000"/color: "FFFFFF"/g' /home/daytona/workspace/joints-flowcharts/build_pptx.js && cd /home/daytona/workspace/joints-flowcharts && node build_pptx.js
ls -lh /home/daytona/workspace/joints-flowcharts/Joints_Presentation.pptx
Joints Presentation
Presentation · PPTX
| Slide | Content | Design |
|---|---|---|
| 1 - Title | "JOINTS" with subtitle and topic navigation strip | Dark navy background, blue side strip, decorative circles |
| 2 - Classification | Full branching tree: Joints → False/True → all subtypes with examples | Light background, red/blue color-coded branches |
| 3 - False Joints | Three-column deep-dive: Syndesmoses, Synchondroses, Synostoses | Red/amber/green columns with icon badges and bulleted details |
| 4 - True Joint Components | 8 numbered component cards in a 4×2 grid | Purple-accented, with the cartilage regeneration warning box |
| 5 - Synovial Joint Types | Full table: all 8 joint types with axes, DoF, movements, examples | Teal header, color-coded axes pills, roll-slide principle note |
| 6 - Joint Stability | 4 constraint cards (+) → result banner, then 5 posture muscle cards | Green theme |
| 7 - Clinical Decision Flowchart | "Examine joint" → diamond → YES/TRUE path (5 axis levels) / NO/FALSE path (3 tissue types) | Amber theme with arrows and color-coded end nodes |
Generate a one-page quick reference cheat sheet on joints
~/joints-flowcharts/joints_cheatsheet.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Joints Quick Reference Cheat Sheet</title>
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap');
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: 'Inter', 'Segoe UI', Arial, sans-serif;
background: #e8ecf0;
display: flex;
justify-content: center;
align-items: flex-start;
padding: 24px;
}
.page {
width: 297mm;
min-height: 210mm;
background: #ffffff;
box-shadow: 0 6px 40px rgba(0,0,0,0.18);
display: grid;
grid-template-rows: auto 1fr;
overflow: hidden;
}
/* ── HEADER ── */
.header {
background: #0f172a;
display: grid;
grid-template-columns: auto 1fr auto;
align-items: center;
padding: 10px 18px;
gap: 14px;
border-bottom: 3px solid #2563eb;
}
.header-accent {
width: 6px;
height: 42px;
background: linear-gradient(180deg, #2563eb, #7c3aed);
border-radius: 3px;
}
.header-title { color: #ffffff; }
.header-title h1 { font-size: 22px; font-weight: 800; letter-spacing: 3px; line-height: 1; }
.header-title p { font-size: 9.5px; color: #94a3b8; margin-top: 3px; letter-spacing: 1px; font-weight: 500; }
.header-source {
text-align: right;
font-size: 7.5px;
color: #64748b;
line-height: 1.6;
}
.header-source strong { color: #94a3b8; }
/* ── BODY GRID ── */
.body {
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr;
grid-template-rows: auto auto auto;
gap: 0;
background: #e2e8f0;
}
/* ── GENERIC PANEL ── */
.panel {
background: #ffffff;
margin: 2px;
border-radius: 5px;
overflow: hidden;
display: flex;
flex-direction: column;
}
.panel-header {
display: flex;
align-items: center;
gap: 6px;
padding: 5px 8px;
font-size: 8.5px;
font-weight: 800;
letter-spacing: 1px;
text-transform: uppercase;
color: #ffffff;
}
.panel-header .ph-dot {
width: 7px; height: 7px; border-radius: 50%; background: rgba(255,255,255,0.45); flex-shrink: 0;
}
.panel-body { padding: 7px 8px; flex: 1; }
/* colors */
.ph-navy { background: #1e3a5f; }
.ph-red { background: #991b1b; }
.ph-amber { background: #92400e; }
.ph-green { background: #065f46; }
.ph-blue { background: #1e40af; }
.ph-purple{ background: #4c1d95; }
.ph-teal { background: #0e7490; }
.ph-dark { background: #0f172a; }
/* ── SPAN HELPERS ── */
.col-span-2 { grid-column: span 2; }
.col-span-3 { grid-column: span 3; }
.col-span-4 { grid-column: span 4; }
.row-span-2 { grid-row: span 2; }
/* ── CLASSIFICATION TREE ── */
.tree-row {
display: flex;
align-items: center;
margin-bottom: 4px;
font-size: 8px;
line-height: 1.4;
}
.tree-root {
background: #0f172a;
color: #fff;
border-radius: 14px;
padding: 3px 10px;
font-size: 9px;
font-weight: 800;
letter-spacing: 1.5px;
display: inline-block;
}
.branch-connector {
width: 14px; height: 1.5px; background: #94a3b8; flex-shrink: 0; margin: 0 2px;
}
.v-tree {
display: flex;
flex-direction: column;
margin-left: 4px;
}
.tree-node {
display: inline-flex;
align-items: center;
padding: 2px 7px;
border-radius: 10px;
font-size: 8px;
font-weight: 700;
margin: 1.5px 0;
white-space: nowrap;
}
.tn-red { background: #fee2e2; color: #991b1b; border: 1px solid #fca5a5; }
.tn-blue { background: #dbeafe; color: #1e40af; border: 1px solid #93c5fd; }
.tn-amber { background: #fef3c7; color: #92400e; border: 1px solid #fde68a; }
.sub-items { margin-left: 14px; border-left: 1.5px dashed #cbd5e1; padding-left: 5px; }
.sub-item { font-size: 7.5px; color: #475569; margin: 1px 0; }
.sub-item::before { content: "• "; color: #94a3b8; }
/* ── TABLE ── */
table { width: 100%; border-collapse: collapse; font-size: 7.5px; }
thead tr { background: #0f172a; }
thead th {
padding: 4px 5px; color: #e2e8f0; font-weight: 700;
font-size: 7px; text-align: left; letter-spacing: 0.4px;
}
tbody tr:nth-child(even) { background: #f8fafc; }
tbody td { padding: 3.5px 5px; color: #334155; border-bottom: 1px solid #f1f5f9; vertical-align: middle; }
.td-bold { font-weight: 700; color: #0f172a; }
.badge {
display: inline-block;
padding: 1px 6px;
border-radius: 8px;
font-size: 7px;
font-weight: 700;
white-space: nowrap;
}
.b-blue { background: #dbeafe; color: #1e40af; }
.b-green { background: #d1fae5; color: #065f46; }
.b-purple { background: #ede9fe; color: #4c1d95; }
.b-amber { background: #fef3c7; color: #92400e; }
.b-gray { background: #f1f5f9; color: #475569; }
/* ── COMPONENT CARDS ── */
.comp-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 4px; }
.comp-card {
border-radius: 4px;
padding: 4px 6px;
border-left: 3px solid;
}
.comp-card .cc-title { font-size: 8px; font-weight: 700; margin-bottom: 1px; }
.comp-card .cc-desc { font-size: 7px; color: #64748b; line-height: 1.4; }
/* ── STABILITY ── */
.constraint-row {
display: flex;
align-items: stretch;
gap: 4px;
margin-bottom: 5px;
}
.constraint-box {
flex: 1;
border-radius: 4px;
padding: 4px 5px;
text-align: center;
border: 1.5px solid;
}
.constraint-box .cb-icon { font-size: 12px; line-height: 1; }
.constraint-box .cb-title { font-size: 7.5px; font-weight: 700; margin-top: 2px; }
.constraint-box .cb-sub { font-size: 6.5px; color: #64748b; margin-top: 1px; line-height: 1.3; }
.plus-sign { font-size: 14px; color: #94a3b8; font-weight: 300; align-self: center; }
.result-bar {
background: #064e3b;
color: #ffffff;
border-radius: 4px;
padding: 4px 8px;
font-size: 8px;
font-weight: 700;
text-align: center;
letter-spacing: 0.5px;
margin-bottom: 5px;
}
.muscle-row {
display: flex;
align-items: center;
gap: 5px;
margin-bottom: 3px;
font-size: 7.5px;
}
.muscle-dot { width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0; }
.muscle-name { font-weight: 700; color: #0f172a; }
.muscle-role { color: #64748b; }
/* ── DECISION FLOW ── */
.flow-step {
display: flex;
align-items: flex-start;
gap: 5px;
margin-bottom: 4px;
font-size: 7.5px;
}
.flow-step .fs-num {
width: 16px; height: 16px;
border-radius: 50%;
display: flex; align-items: center; justify-content: center;
font-size: 7.5px; font-weight: 800; color: #fff;
flex-shrink: 0; margin-top: 0.5px;
}
.flow-step .fs-content { flex: 1; }
.flow-step .fs-q { font-weight: 700; color: #0f172a; }
.flow-step .fs-a { color: #475569; line-height: 1.4; margin-top: 1px; }
.flow-arrow { text-align: center; color: #94a3b8; font-size: 11px; margin: 1px 0 1px 10px; }
.answer-row {
display: flex;
gap: 5px;
margin-top: 5px;
}
.answer-box {
flex: 1;
border-radius: 4px;
padding: 4px 6px;
border: 1.5px solid;
}
.answer-box .ab-label { font-size: 7px; font-weight: 800; letter-spacing: 0.5px; margin-bottom: 2px; }
.answer-box .ab-result { font-size: 8px; font-weight: 700; }
.answer-box .ab-sub { font-size: 6.8px; color: #64748b; margin-top: 1px; line-height: 1.4; }
.ans-no { background: #fff5f5; border-color: #fca5a5; }
.ans-no .ab-label { color: #dc2626; }
.ans-no .ab-result { color: #991b1b; }
.ans-yes { background: #f0fdf4; border-color: #6ee7b7; }
.ans-yes .ab-label { color: #059669; }
.ans-yes .ab-result { color: #065f46; }
/* ── KEY FACTS ── */
.fact-item {
display: flex;
gap: 5px;
margin-bottom: 4px;
font-size: 7.5px;
line-height: 1.4;
}
.fact-item .fi-icon { font-size: 11px; flex-shrink: 0; margin-top: -1px; }
.fact-item strong { color: #0f172a; font-weight: 700; }
.fact-item span { color: #475569; }
/* ── FOOTER ── */
.footer {
grid-column: span 4;
background: #0f172a;
padding: 4px 14px;
display: flex;
justify-content: space-between;
align-items: center;
margin: 2px;
border-radius: 4px;
}
.footer span { font-size: 7px; color: #64748b; }
.footer strong { color: #94a3b8; }
@media print {
body { background: none; padding: 0; }
.page { box-shadow: none; width: 100%; }
}
</style>
</head>
<body>
<div class="page">
<!-- HEADER -->
<div class="header">
<div class="header-accent"></div>
<div class="header-title">
<h1>JOINTS</h1>
<p>QUICK REFERENCE CHEAT SHEET · CLASSIFICATION · STRUCTURE · TYPES · STABILITY</p>
</div>
<div class="header-source">
<strong>Source</strong><br>
THIEME Atlas of Anatomy<br>
General Anatomy & Musculoskeletal System<br>
Sections 4.2–4.7 · pp. 60–71
</div>
</div>
<!-- BODY -->
<div class="body">
<!-- ── PANEL 1: Classification Tree (col 1, row-span 2) ── -->
<div class="panel row-span-2">
<div class="panel-header ph-navy"><div class="ph-dot"></div>CLASSIFICATION</div>
<div class="panel-body">
<div style="text-align:center; margin-bottom:7px;">
<span class="tree-root">JOINTS</span>
</div>
<!-- FALSE JOINTS -->
<div style="display:flex; align-items:flex-start; margin-bottom:6px;">
<div class="branch-connector" style="margin-top:8px;"></div>
<div>
<span class="tree-node tn-red">FALSE JOINTS (Synarthroses)</span>
<div style="font-size:7px; color:#94a3b8; margin:1px 0 3px 6px;">No joint cavity</div>
<div class="sub-items">
<div style="margin-bottom:3px;">
<span style="font-size:7.5px; font-weight:700; color:#991b1b;">Syndesmoses</span>
<span style="font-size:7px; color:#64748b;"> – fibrous</span>
<div class="sub-item">Interosseous membranes (radius-ulna)</div>
<div class="sub-item">Tibiofibular syndesmosis</div>
<div class="sub-item">Fontanelles · Gomphosis (teeth)</div>
</div>
<div style="margin-bottom:3px;">
<span style="font-size:7.5px; font-weight:700; color:#b45309;">Synchondroses</span>
<span style="font-size:7px; color:#64748b;"> – cartilaginous</span>
<div class="sub-item">Epiphyseal growth plates</div>
<div class="sub-item">Costal cartilage · Pubic symphysis</div>
<div class="sub-item">Intervertebral discs</div>
</div>
<div>
<span style="font-size:7.5px; font-weight:700; color:#065f46;">Synostoses</span>
<span style="font-size:7px; color:#64748b;"> – bony fusion</span>
<div class="sub-item">Sacrum · Fused hip bone</div>
<div class="sub-item">Ossified epiphyseal plates (adults)</div>
<div class="sub-item">Cranial sutures (adults)</div>
</div>
</div>
</div>
</div>
<!-- TRUE JOINTS -->
<div style="display:flex; align-items:flex-start;">
<div class="branch-connector" style="margin-top:8px;"></div>
<div>
<span class="tree-node tn-blue">TRUE JOINTS (Diarthroses)</span>
<div style="font-size:7px; color:#94a3b8; margin:1px 0 3px 6px;">Joint cavity present · synovial fluid</div>
<div class="sub-items">
<div style="margin-bottom:3px;">
<span style="font-size:7.5px; font-weight:700; color:#1e40af;">Diarthroses</span>
<span style="font-size:7px; color:#64748b;"> – variable DoF</span>
<div class="sub-item">Plane · Hinge · Pivot</div>
<div class="sub-item">Ellipsoidal · Saddle</div>
<div class="sub-item">Spheroidal (ball & socket)</div>
</div>
<div>
<span style="font-size:7.5px; font-weight:700; color:#7c3aed;">Amphiarthroses</span>
<span style="font-size:7px; color:#64748b;"> – stiff true joints</span>
<div class="sub-item">Very limited movement</div>
<div class="sub-item">Tight ligamentous constraints</div>
<div class="sub-item">Example: Sacroiliac joint</div>
</div>
</div>
</div>
</div>
<!-- Comparison mini-table -->
<div style="margin-top:8px; border:1.5px solid #e2e8f0; border-radius:5px; overflow:hidden;">
<div style="background:#0f172a; color:#e2e8f0; font-size:7px; font-weight:700; padding:3px 6px; letter-spacing:0.5px;">COMPARISON</div>
<table style="font-size:7px;">
<thead>
<tr>
<th></th>
<th style="color:#fca5a5;">False</th>
<th style="color:#93c5fd;">True</th>
</tr>
</thead>
<tbody>
<tr><td class="td-bold">Cavity</td><td>None</td><td>Present</td></tr>
<tr><td class="td-bold">Connection</td><td>Continuous</td><td>Separated</td></tr>
<tr><td class="td-bold">Mobility</td><td>Low–moderate</td><td>Variable</td></tr>
<tr><td class="td-bold">Fluid</td><td>None</td><td>Synovial fluid</td></tr>
</tbody>
</table>
</div>
</div>
</div>
<!-- ── PANEL 2: Synovial Joint Types (col 2-3, row 1) ── -->
<div class="panel col-span-2">
<div class="panel-header ph-teal"><div class="ph-dot"></div>TYPES OF SYNOVIAL JOINTS — Shape, Axes & Movement</div>
<div class="panel-body">
<table>
<thead>
<tr>
<th>Joint Type</th>
<th>Axes</th>
<th>DoF</th>
<th>Primary Movements</th>
<th>Example</th>
</tr>
</thead>
<tbody>
<tr>
<td class="td-bold">Plane (femoropatellar)</td>
<td><span class="badge b-amber">1 translational</span></td>
<td style="font-weight:800;color:#0e7490;text-align:center;">1</td>
<td>Slide up/down in groove</td>
<td style="color:#64748b;font-style:italic;">Patella in femoral groove</td>
</tr>
<tr>
<td class="td-bold">Plane (vertebral)</td>
<td><span class="badge b-amber">1–2 translational</span></td>
<td style="font-weight:800;color:#0e7490;text-align:center;">2–4</td>
<td>Gliding in multiple directions</td>
<td style="color:#64748b;font-style:italic;">Facet joints of spine</td>
</tr>
<tr>
<td class="td-bold">Hinge</td>
<td><span class="badge b-blue">1 rotational</span></td>
<td style="font-weight:800;color:#0e7490;text-align:center;">2</td>
<td>Flexion, Extension</td>
<td style="color:#64748b;font-style:italic;">Elbow, Knee</td>
</tr>
<tr>
<td class="td-bold">Pivot</td>
<td><span class="badge b-blue">1 rotational</span></td>
<td style="font-weight:800;color:#0e7490;text-align:center;">2</td>
<td>Axial rotation</td>
<td style="color:#64748b;font-style:italic;">Atlanto-axial, Proximal radioulnar</td>
</tr>
<tr>
<td class="td-bold">Ellipsoidal</td>
<td><span class="badge b-green">2 rotational</span></td>
<td style="font-weight:800;color:#0e7490;text-align:center;">4</td>
<td>Flex, Ext, Abd, Add</td>
<td style="color:#64748b;font-style:italic;">Radiocarpal (wrist)</td>
</tr>
<tr>
<td class="td-bold">Saddle</td>
<td><span class="badge b-green">2 rotational</span></td>
<td style="font-weight:800;color:#0e7490;text-align:center;">4</td>
<td>Flex, Ext, Abd, Add</td>
<td style="color:#64748b;font-style:italic;">CMC joint of thumb</td>
</tr>
<tr>
<td class="td-bold">Spheroidal – deep socket</td>
<td><span class="badge b-purple">3 rotational</span></td>
<td style="font-weight:800;color:#0e7490;text-align:center;">6</td>
<td>All 6 movements</td>
<td style="color:#64748b;font-style:italic;">Hip joint</td>
</tr>
<tr>
<td class="td-bold">Spheroidal – shallow socket</td>
<td><span class="badge b-purple">3 rotational</span></td>
<td style="font-weight:800;color:#0e7490;text-align:center;">6+</td>
<td>All 6 movements + greater range</td>
<td style="color:#64748b;font-style:italic;">Glenohumeral (shoulder)</td>
</tr>
</tbody>
</table>
<div style="margin-top:5px; background:#ecfeff; border:1.5px solid #a5f3fc; border-radius:4px; padding:4px 7px; font-size:7.5px; color:#0e7490;">
<strong>Roll-Slide Principle:</strong> <span style="color:#334155;">Congruent surfaces (e.g. shoulder) → slide. Less congruent (e.g. knee) → roll. Most joints use a <strong>combination</strong>.</span>
</div>
</div>
</div>
<!-- ── PANEL 3: Joint Stability (col 4, row 1) ── -->
<div class="panel">
<div class="panel-header ph-green"><div class="ph-dot"></div>JOINT STABILITY</div>
<div class="panel-body">
<div style="font-size:7.5px; font-weight:700; color:#0f172a; margin-bottom:4px;">4 Constraints on Motion</div>
<div class="constraint-row">
<div class="constraint-box" style="background:#eff6ff;border-color:#bfdbfe;">
<div class="cb-icon">🦴</div>
<div class="cb-title" style="color:#1e40af;">Bony</div>
<div class="cb-sub">Articular surface shape</div>
</div>
<div class="plus-sign">+</div>
<div class="constraint-box" style="background:#f0fdf4;border-color:#a7f3d0;">
<div class="cb-icon">💪</div>
<div class="cb-title" style="color:#065f46;">Muscular</div>
<div class="cb-sub">Dynamic stabilizers</div>
</div>
</div>
<div class="constraint-row">
<div class="constraint-box" style="background:#f5f3ff;border-color:#ddd6fe;">
<div class="cb-icon">🔗</div>
<div class="cb-title" style="color:#4c1d95;">Ligamentous</div>
<div class="cb-sub">Passive range limits</div>
</div>
<div class="plus-sign">+</div>
<div class="constraint-box" style="background:#fffbeb;border-color:#fde68a;">
<div class="cb-icon">🛡️</div>
<div class="cb-title" style="color:#92400e;">Soft Tissue</div>
<div class="cb-sub">Capsule enclosure</div>
</div>
</div>
<div class="result-bar">▼ JOINT STABILITY</div>
<div style="font-size:7.5px; font-weight:700; color:#0f172a; margin-bottom:4px;">Erect Posture Muscles</div>
<div class="muscle-row"><div class="muscle-dot" style="background:#3b82f6;"></div><div><span class="muscle-name">Triceps Surae + Tibialis Anterior</span><br><span class="muscle-role">Ankle – sagittal plane</span></div></div>
<div class="muscle-row"><div class="muscle-dot" style="background:#10b981;"></div><div><span class="muscle-name">Quadriceps Femoris</span><br><span class="muscle-role">Knee stabilization</span></div></div>
<div class="muscle-row"><div class="muscle-dot" style="background:#f59e0b;"></div><div><span class="muscle-name">Gluteal Muscles</span><br><span class="muscle-role">Hip – sagittal plane</span></div></div>
<div class="muscle-row"><div class="muscle-dot" style="background:#ef4444;"></div><div><span class="muscle-name">Gluteus Medius & Minimus</span><br><span class="muscle-role">Hip – frontal plane</span></div></div>
<div class="muscle-row"><div class="muscle-dot" style="background:#8b5cf6;"></div><div><span class="muscle-name">Intrinsic Back Muscles</span><br><span class="muscle-role">Spinal column</span></div></div>
</div>
</div>
<!-- ── PANEL 4: True Joint Components (col 1-2, row 3) ── -->
<div class="panel col-span-2">
<div class="panel-header ph-purple"><div class="ph-dot"></div>TRUE JOINT — 8 STRUCTURAL COMPONENTS</div>
<div class="panel-body">
<div class="comp-grid">
<div class="comp-card" style="background:#eff6ff; border-color:#3b82f6;">
<div class="cc-title" style="color:#1e40af;">① Articular Surfaces</div>
<div class="cc-desc">Hyaline cartilage: 1–2 mm (phalanges), 5–7 mm (femoropatellar). Exception: jaw & sternoclavicular → fibrous cartilage.</div>
</div>
<div class="comp-card" style="background:#f0fdf4; border-color:#10b981;">
<div class="cc-title" style="color:#065f46;">② Joint Cavity</div>
<div class="cc-desc">Narrow space (few mm) with articular recesses. Defines the true joint.</div>
</div>
<div class="comp-card" style="background:#fffbeb; border-color:#f59e0b;">
<div class="cc-title" style="color:#92400e;">③ Joint Capsule</div>
<div class="cc-desc">Alar folds, synovial folds & villi. Inner synovial membrane is highly vascular → produces synovial fluid.</div>
</div>
<div class="comp-card" style="background:#fff5f5; border-color:#ef4444;">
<div class="cc-title" style="color:#991b1b;">④ Synovial Fluid</div>
<div class="cc-desc">Highly viscous. Lubricates & nourishes avascular cartilage via diffusion & convection.</div>
</div>
<div class="comp-card" style="background:#f5f3ff; border-color:#8b5cf6;">
<div class="cc-title" style="color:#4c1d95;">⑤ Intra-articular Structures</div>
<div class="cc-desc"><strong>Menisci</strong> (knee). <strong>Discs</strong> (jaw, sternoclavicular, wrist). <strong>Labra</strong> (hip, shoulder).</div>
</div>
<div class="comp-card" style="background:#fdf2f8; border-color:#ec4899;">
<div class="cc-title" style="color:#831843;">⑥ Ligaments</div>
<div class="cc-desc">Intra- & extracapsular. Primary stabilizers limiting range of motion.</div>
</div>
<div class="comp-card" style="background:#ecfeff; border-color:#06b6d4;">
<div class="cc-title" style="color:#0e7490;">⑦ Muscles</div>
<div class="cc-desc">Agonist & antagonist pairs crossing the joint. Drive opposite movements.</div>
</div>
<div class="comp-card" style="background:#f7fee7; border-color:#84cc16;">
<div class="cc-title" style="color:#3f6212;">⑧ Synovial Bursae</div>
<div class="cc-desc">Fluid-filled sacs near the joint. May communicate with joint cavity. Reduce friction.</div>
</div>
</div>
<div style="margin-top:5px; background:#fffbeb; border:1.5px dashed #fde68a; border-radius:4px; padding:4px 7px; font-size:7.5px;">
<strong style="color:#92400e;">⚠ Cartilage cannot regenerate</strong><span style="color:#78350f;"> — avascular, no perichondrium. Nourished only by synovial fluid. Synovial membrane can regenerate.</span>
</div>
</div>
</div>
<!-- ── PANEL 5: Decision Flowchart (col 3) ── -->
<div class="panel">
<div class="panel-header ph-amber"><div class="ph-dot"></div>DECISION FLOWCHART</div>
<div class="panel-body">
<!-- Start -->
<div style="text-align:center; margin-bottom:4px;">
<span style="background:#0f172a; color:#fff; border-radius:12px; padding:3px 12px; font-size:8px; font-weight:800; letter-spacing:1px;">EXAMINE A JOINT</span>
</div>
<div class="flow-arrow">▼</div>
<!-- Q1 diamond -->
<div style="background:#fffbeb; border:2px solid #f59e0b; border-radius:5px; padding:5px 8px; text-align:center; font-size:8px; font-weight:700; color:#92400e; margin-bottom:3px;">
Is there a joint cavity?
</div>
<div class="answer-row" style="margin-bottom:5px;">
<div class="answer-box ans-no">
<div class="ab-label">NO</div>
<div class="ab-result">False Joint</div>
<div class="ab-sub">Synarthrosis<br>What connects bones?<br>→ Fibrous: Syndesmosis<br>→ Cartilage: Synchondrosis<br>→ Bone: Synostosis</div>
</div>
<div class="answer-box ans-yes">
<div class="ab-label">YES</div>
<div class="ab-result">True Joint</div>
<div class="ab-sub">Diarthrosis<br>→ next question ▼</div>
</div>
</div>
<!-- Q2 -->
<div style="background:#ecfeff; border:2px solid #06b6d4; border-radius:5px; padding:5px 8px; text-align:center; font-size:8px; font-weight:700; color:#0e7490; margin-bottom:3px;">
Is motion very restricted?
</div>
<div class="answer-row" style="margin-bottom:5px;">
<div class="answer-box" style="background:#f5f3ff; border-color:#ddd6fe;">
<div class="ab-label" style="color:#6d28d9;">YES</div>
<div class="ab-result" style="color:#4c1d95;">Amphiarthrosis</div>
<div class="ab-sub">E.g. sacroiliac joint</div>
</div>
<div class="answer-box ans-yes">
<div class="ab-label">NO</div>
<div class="ab-result">Diarthrosis</div>
<div class="ab-sub">→ count axes ▼</div>
</div>
</div>
<!-- Axis ladder -->
<div style="font-size:7px; font-weight:700; color:#0f172a; margin-bottom:3px; text-align:center;">Number of rotational axes?</div>
<div style="display:flex; flex-direction:column; gap:3px;">
<div style="display:flex; align-items:center; gap:4px; background:#fffbeb; border:1px solid #fde68a; border-radius:4px; padding:3px 6px; font-size:7.5px;">
<span style="font-weight:800; color:#f59e0b; min-width:22px;">0</span><span style="color:#0f172a; font-weight:700;">Translational</span><span style="color:#475569; margin-left:auto;">Plane joint</span>
</div>
<div style="display:flex; align-items:center; gap:4px; background:#eff6ff; border:1px solid #bfdbfe; border-radius:4px; padding:3px 6px; font-size:7.5px;">
<span style="font-weight:800; color:#3b82f6; min-width:22px;">1</span><span style="color:#0f172a; font-weight:700;">1 axis</span><span style="color:#475569; margin-left:auto;">Hinge / Pivot</span>
</div>
<div style="display:flex; align-items:center; gap:4px; background:#f0fdf4; border:1px solid #a7f3d0; border-radius:4px; padding:3px 6px; font-size:7.5px;">
<span style="font-weight:800; color:#10b981; min-width:22px;">2</span><span style="color:#0f172a; font-weight:700;">2 axes</span><span style="color:#475569; margin-left:auto;">Ellipsoidal / Saddle</span>
</div>
<div style="display:flex; align-items:center; gap:4px; background:#f5f3ff; border:1px solid #ddd6fe; border-radius:4px; padding:3px 6px; font-size:7.5px;">
<span style="font-weight:800; color:#8b5cf6; min-width:22px;">3</span><span style="color:#0f172a; font-weight:700;">3 axes</span><span style="color:#475569; margin-left:auto;">Spheroidal (ball & socket)</span>
</div>
</div>
</div>
</div>
<!-- ── PANEL 6: Key Facts (col 4, row 3) ── -->
<div class="panel">
<div class="panel-header ph-dark"><div class="ph-dot"></div>KEY FACTS TO REMEMBER</div>
<div class="panel-body">
<div class="fact-item">
<span class="fi-icon">🔬</span>
<div><strong>Hyaline cartilage</strong> <span>covers most articular surfaces (1–7 mm thick). Cannot regenerate once damaged.</span></div>
</div>
<div class="fact-item">
<span class="fi-icon">💧</span>
<div><strong>Synovial fluid</strong> <span>lubricates AND nourishes cartilage (avascular) by diffusion and convection.</span></div>
</div>
<div class="fact-item">
<span class="fi-icon">🌀</span>
<div><strong>Menisci</strong> <span>are found regularly only in the knee (collagen, connective tissue & fibrocartilage).</span></div>
</div>
<div class="fact-item">
<span class="fi-icon">⚖️</span>
<div><strong>Articular discs</strong> <span>divide joint into 2 chambers (jaw, sternoclavicular, proximal wrist).</span></div>
</div>
<div class="fact-item">
<span class="fi-icon">🧲</span>
<div><strong>Labra</strong> <span>are wedge-shaped fibrocartilage rings that deepen the hip (acetabular) and shoulder (glenoid) sockets.</span></div>
</div>
<div class="fact-item">
<span class="fi-icon">📐</span>
<div><strong>Degrees of freedom (DoF)</strong> <span>= independent movements possible. More axes = more DoF.</span></div>
</div>
<div class="fact-item">
<span class="fi-icon">🔄</span>
<div><strong>Roll vs. Slide</strong> <span>Congruent → slide. Incongruent → roll. Most joints: roll-slide combo.</span></div>
</div>
<div class="fact-item">
<span class="fi-icon">🦷</span>
<div><strong>Gomphosis</strong> <span>is a specialized syndesmosis – tooth anchored in alveolar bone via periodontal ligament.</span></div>
</div>
<div class="fact-item">
<span class="fi-icon">🔩</span>
<div><strong>Amphiarthrosis</strong> <span>= true joint with very limited motion due to tight ligamentous constraints (e.g. sacroiliac).</span></div>
</div>
<!-- Mnemonics box -->
<div style="margin-top:6px; background:#0f172a; border-radius:4px; padding:5px 7px;">
<div style="font-size:7.5px; font-weight:800; color:#f59e0b; letter-spacing:0.5px; margin-bottom:3px;">MNEMONIC – Synovial Joints (least → most DoF)</div>
<div style="font-size:7.5px; color:#e2e8f0; line-height:1.7;">
<strong style="color:#fde68a;">P</strong><span>lane → </span>
<strong style="color:#fde68a;">H</strong><span>inge → </span>
<strong style="color:#fde68a;">P</strong><span>ivot → </span>
<strong style="color:#fde68a;">E</strong><span>llipsoidal → </span>
<strong style="color:#fde68a;">S</strong><span>addle → </span>
<strong style="color:#fde68a;">S</strong><span>pheroidal</span>
</div>
<div style="font-size:7px; color:#94a3b8; margin-top:2px; font-style:italic;">"Please Have Pretty Elbows, Stiff Shoulder"</div>
</div>
</div>
</div>
<!-- FOOTER -->
<div class="footer" style="grid-column: span 4;">
<span><strong>THIEME Atlas of Anatomy</strong> — General Anatomy and Musculoskeletal System (ISBN 9781626237186) | Sections 4.2–4.7, pp. 60–71</span>
<span>For educational use only · <strong>JOINTS QUICK REFERENCE</strong></span>
</div>
</div><!-- /body -->
</div><!-- /page -->
</body>
</html>
cd /home/daytona/workspace/joints-flowcharts && python3 -c " import subprocess result = subprocess.run([ 'chromium', '--headless', '--no-sandbox', '--print-to-pdf=joints_cheatsheet.pdf', '--print-to-pdf-no-header', '--no-pdf-header-footer', '--run-all-compositor-stages-before-draw', '--virtual-time-budget=3000', 'joints_cheatsheet.html' ], capture_output=True, text=True, timeout=30) print('STDOUT:', result.stdout) print('STDERR:', result.stderr[:500]) print('Return code:', result.returncode) "
ls -lh /home/daytona/workspace/joints-flowcharts/joints_cheatsheet.pdf 2>/dev/null && echo "PDF exists" || echo "PDF not found"
joints cheatsheet
HTML File · HTML
joints cheatsheet
PDF Document · PDF
| Section | Contents |
|---|---|
| Classification Tree | Full branching tree - False (Syndesmoses, Synchondroses, Synostoses) vs. True (Diarthroses, Amphiarthroses), with examples and a comparison mini-table |
| Synovial Joint Types | Complete 8-row table - joint type, axes, DoF, movements, clinical example + roll-slide principle |
| Joint Stability | 4 constraint boxes (bony, muscular, ligamentous, soft-tissue) → result bar + 5 erect posture muscles |
| True Joint Components | All 8 components as color-coded cards with the cartilage regeneration warning |
| Decision Flowchart | Step-by-step: cavity? → restricted? → count axes → identify joint type |
| Key Facts + Mnemonic | 9 high-yield facts + mnemonic: "Please Have Pretty Elbows, Stiff Shoulder" for joint types in order of DoF |
maKE PDF DOWNLOADABLE
joints cheatsheet
PDF Document · PDF
PREVIEW IT
cd /home/daytona/workspace/joints-flowcharts && python3 -c " import fitz # PyMuPDF doc = fitz.open('joints_cheatsheet.pdf') page = doc[0] mat = fitz.Matrix(2.5, 2.5) # 2.5x zoom for high quality pix = page.get_pixmap(matrix=mat) pix.save('preview.png') print(f'Saved preview.png: {pix.width}x{pix.height}') doc.close() "
cd /home/daytona/workspace/joints-flowcharts && pdftoppm -r 200 -png joints_cheatsheet.pdf preview && ls preview*.png
joints cheatsheet
PDF Document · PDF