<style>
@import url('https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700;800&family=Lora:ital,wght@0,400;0,500;0,600;0,700;1,400;1,500&display=swap');
#ct-winter {
/* Crystal-pool aqua + fynbos + sandstone palette */
--bg: #ffffff !important;
--ink: #14211a !important;
--slate: #455146 !important;
--muted: #f3f7f4 !important;
--line: #e1ebe5 !important;
--card: #ffffff !important;
--primary: #14756b !important; /* deep teal, water under canopy */
--primary-dark: #0a3a36 !important;
--primary-light: #d4ece8 !important;
--accent: #c89132 !important; /* sandstone gold */
--accent-dark: #8a5e1d !important;
--accent-light: #f6ead0 !important;
--granite: #3a4a5c !important;
--granite-light: #e3e7ec !important;
--good: #2d6a4f !important;
--good-light: #ddeee3 !important;
--warn: #b07c1a !important;
--warn-light: #f6ead0 !important;
--danger: #a8271c !important;
--danger-light: #f6dad7 !important;
--info: #1a5f7a !important;
--info-light: #e0eef4 !important;
font-family: 'Outfit', system-ui, -apple-system, sans-serif !important;
color: var(--ink) !important;
background: var(--bg) !important;
line-height: 1.76 !important;
-webkit-font-smoothing: antialiased !important;
font-size: 18.5px !important;
}
#ct-winter * { box-sizing: border-box; }
#ct-winter a { color: var(--primary); text-decoration: none; border-bottom: 1px solid rgba(31,77,58,0.25); transition: color .2s, border-color .2s; }
#ct-winter a:hover { color: var(--accent-dark); border-color: var(--accent); }
#ct-winter .wrap { max-width: 1100px; margin: 0 auto; padding: 0 24px; }
/* ===================== HERO ===================== */
#ct-winter .hero {
position: relative;
background:
linear-gradient(135deg, rgba(15,30,42,0.95) 0%, rgba(36,68,86,0.85) 50%, rgba(20,40,55,0.95) 100%),
radial-gradient(ellipse at 22% 18%, rgba(180,200,215,0.18) 0%, transparent 55%),
radial-gradient(ellipse at 78% 80%, rgba(200,145,50,0.16) 0%, transparent 60%),
linear-gradient(180deg, #0c1f2a 0%, #1a3548 50%, #0e2535 100%);
color: #fff;
padding: 5rem 24px 4rem;
position: relative;
overflow: hidden;
}
#ct-winter .hero::before {
content: "";
position: absolute; inset: 0;
background-image:
radial-gradient(circle at 14% 28%, rgba(255,255,255,0.06) 1px, transparent 1.5px),
radial-gradient(circle at 68% 72%, rgba(180,200,215,0.07) 1px, transparent 1.5px);
background-size: 30px 30px, 42px 42px;
opacity: 0.7;
pointer-events: none;
}
/* Faint vertical "rain" pattern as second overlay */
#ct-winter .hero::after {
content: "";
position: absolute; inset: 0;
background-image:
repeating-linear-gradient(80deg,
transparent 0,
transparent 80px,
rgba(180,200,215,0.04) 80px,
rgba(180,200,215,0.04) 82px);
pointer-events: none;
opacity: 0.85;
}
#ct-winter .hero-inner { position: relative; max-width: 1100px; margin: 0 auto; }
#ct-winter .hero-badge {
display: inline-flex;
align-items: center;
gap: 8px;
font-size: 0.78rem;
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
color: rgba(255,255,255,0.92);
background: rgba(200,145,50,0.18);
border: 1px solid rgba(200,145,50,0.45);
padding: 6px 14px;
border-radius: 99px;
margin-bottom: 1.4rem;
}
#ct-winter .hero-badge .pulse {
width: 7px; height: 7px;
background: #f5c265;
border-radius: 50%;
box-shadow: 0 0 0 0 rgba(245,194,101,0.6);
animation: pulse-dot 2s infinite;
}
@keyframes pulse-dot {
0% { box-shadow: 0 0 0 0 rgba(245,194,101,0.7); }
70% { box-shadow: 0 0 0 8px rgba(245,194,101,0); }
100% { box-shadow: 0 0 0 0 rgba(245,194,101,0); }
}
#ct-winter .hero h1 {
font-family: 'Lora', Georgia, serif;
font-size: clamp(2.1rem, 4.5vw + 0.8rem, 3.4rem);
font-weight: 700;
line-height: 1.1;
margin: 0 0 1rem 0;
letter-spacing: -0.02em;
}
#ct-winter .hero h1 .accent { color: #f5c265; font-style: italic; font-weight: 600; }
#ct-winter .hero-deck {
font-family: 'Outfit', system-ui, -apple-system, sans-serif;
font-style: normal;
font-weight: 500;
font-size: clamp(1.08rem, 1vw + 0.75rem, 1.3rem);
color: rgba(255,255,255,0.96);
max-width: 720px;
margin: 0 0 2rem 0;
line-height: 1.6;
letter-spacing: -0.005em;
}
#ct-winter .hero-meta {
font-size: 0.82rem;
color: rgba(255,255,255,0.65);
font-weight: 500;
letter-spacing: 0.04em;
margin-bottom: 2.5rem;
}
#ct-winter .hero-meta span { margin-right: 18px; }
/* KPI tiles */
#ct-winter .kpi-row {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
gap: 12px;
margin-top: 0.5rem;
}
#ct-winter .kpi {
background: rgba(255,255,255,0.06);
border: 1px solid rgba(255,255,255,0.14);
border-radius: 14px;
padding: 1rem 1.1rem;
backdrop-filter: blur(6px);
transition: transform .2s, background .2s;
}
#ct-winter .kpi:hover { transform: translateY(-2px); background: rgba(255,255,255,0.1); }
#ct-winter .kpi-label {
font-size: 0.66rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.1em;
color: #f5c265;
margin-bottom: 0.3rem;
}
#ct-winter .kpi-value {
font-family: 'Lora', Georgia, serif;
font-size: 1.85rem;
font-weight: 700;
line-height: 1.1;
color: #fff;
margin-bottom: 0.2rem;
}
#ct-winter .kpi-sub {
font-size: 0.78rem;
color: rgba(255,255,255,0.7);
font-weight: 500;
}
/* ===================== QUICK NAV ===================== */
#ct-winter .quick-nav {
background: var(--card);
border: 1px solid var(--line);
border-radius: 16px;
padding: 14px 18px;
margin: -2.2rem auto 2.2rem;
position: relative;
z-index: 10;
display: flex;
flex-wrap: wrap;
gap: 8px;
box-shadow: 0 8px 30px rgba(10,30,22,0.10);
max-width: 1052px;
}
#ct-winter .chip {
display: inline-flex; align-items: center; gap: 6px;
font-size: 0.82rem;
font-weight: 600;
padding: 7px 14px;
border-radius: 99px;
background: var(--muted);
color: var(--ink);
border: 1px solid transparent;
text-decoration: none !important;
transition: all .15s;
}
#ct-winter .chip:hover { background: var(--primary); color: #fff !important; }
#ct-winter .chip.gold { background: var(--accent-light); color: var(--accent-dark); }
#ct-winter .chip.gold:hover { background: var(--accent); color: #fff !important; }
#ct-winter .chip.danger { background: var(--danger-light); color: var(--danger); }
#ct-winter .chip.danger:hover { background: var(--danger); color: #fff !important; }
/* ===================== TYPOGRAPHY ===================== */
#ct-winter article.content { max-width: 100%; }
#ct-winter h2 {
font-family: 'Lora', Georgia, serif !important;
font-size: clamp(1.6rem, 2.5vw + 0.7rem, 2.05rem) !important;
font-weight: 700 !important;
color: var(--ink) !important;
margin: 3rem 0 1.2rem !important;
line-height: 1.18 !important;
letter-spacing: -0.012em !important;
display: flex;
align-items: center;
gap: 0.85rem;
}
#ct-winter h2:first-of-type { margin-top: 0 !important; }
#ct-winter h2 .h2-icon {
display: inline-flex;
align-items: center;
justify-content: center;
width: 44px; height: 44px;
background: linear-gradient(135deg, var(--primary) 0%, var(--accent-dark) 100%);
color: #fff;
border-radius: 12px;
flex-shrink: 0;
font-size: 1.05rem;
}
#ct-winter h3 {
font-family: 'Outfit', sans-serif !important;
font-size: 1.22rem !important;
font-weight: 700 !important;
color: var(--ink) !important;
margin: 1.8rem 0 0.7rem !important;
letter-spacing: -0.01em;
}
#ct-winter h4 {
font-family: 'Outfit', sans-serif !important;
font-size: 1.05rem !important;
font-weight: 700 !important;
color: var(--ink) !important;
margin: 0 0 0.55rem !important;
letter-spacing: -0.005em;
}
#ct-winter .eyebrow {
display: inline-block;
font-size: 0.72rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.13em;
color: var(--accent-dark);
margin-bottom: 0.3rem;
}
#ct-winter article.content p {
font-size: 1.09rem;
line-height: 1.82;
margin: 0 0 1.5rem;
color: var(--ink);
}
#ct-winter article.content p:last-child { margin-bottom: 0; }
#ct-winter article.content li {
font-size: 1.05rem;
line-height: 1.78;
margin-bottom: 0.55rem;
}
/* Inline highlights */
#ct-winter .hl {
background: linear-gradient(180deg, transparent 60%, rgba(200,145,50,0.32) 60%);
padding: 0 2px;
font-weight: 600;
}
#ct-winter .hl-g {
background: linear-gradient(180deg, transparent 60%, rgba(45,106,79,0.28) 60%);
padding: 0 2px;
font-weight: 600;
}
#ct-winter .hl-d {
background: linear-gradient(180deg, transparent 60%, rgba(168,39,28,0.22) 60%);
padding: 0 2px;
font-weight: 600;
}
#ct-winter .hl-i {
background: linear-gradient(180deg, transparent 60%, rgba(26,95,122,0.22) 60%);
padding: 0 2px;
font-weight: 600;
}
#ct-winter strong { font-weight: 700; color: var(--ink); }
/* ===================== TOC ===================== */
#ct-winter .toc {
background: var(--card);
border: 1px solid var(--line);
border-radius: 16px;
padding: 1.6rem 1.8rem;
margin: 2rem 0;
}
#ct-winter .toc-title {
font-family: 'Outfit', sans-serif;
font-size: 0.78rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.12em;
color: var(--accent-dark);
margin-bottom: 1rem;
}
#ct-winter .toc ul {
list-style: none;
padding: 0;
margin: 0;
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 0.55rem 2rem;
}
#ct-winter .toc a {
display: block;
padding: 0.4rem 0;
font-size: 0.96rem;
color: var(--ink) !important;
border-bottom: none !important;
font-weight: 500;
}
#ct-winter .toc a::before { content: "→ "; color: var(--accent); margin-right: 4px; }
#ct-winter .toc a:hover { color: var(--primary) !important; }
/* ===================== HIGHLIGHT BOX & ALERTS ===================== */
#ct-winter .highlight-box {
background: var(--muted);
border-left: 4px solid var(--accent);
padding: 1.4rem 1.6rem;
border-radius: 12px;
margin: 1.5rem 0;
font-size: 1rem;
line-height: 1.72;
}
#ct-winter .key-takeaway {
background: var(--primary-light);
border-left: 4px solid var(--primary);
padding: 0.95rem 1.2rem;
border-radius: 10px;
margin: 1.4rem 0;
font-size: 0.97rem;
line-height: 1.65;
color: var(--ink);
}
#ct-winter .key-takeaway strong { color: var(--primary-dark); }
#ct-winter .pull-quote {
font-family: 'Lora', Georgia, serif;
font-style: italic;
font-size: 1.4rem;
line-height: 1.45;
color: var(--primary-dark);
text-align: center;
border-top: 2px solid var(--accent);
border-bottom: 2px solid var(--accent);
padding: 1.6rem 1rem 1.2rem;
margin: 2.2rem auto;
max-width: 760px;
position: relative;
}
#ct-winter .pq-source {
display: block;
font-family: 'Outfit', sans-serif;
font-style: normal;
font-size: 0.78rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--accent-dark);
margin-top: 0.8rem;
}
#ct-winter .alert {
border-radius: 12px;
padding: 1.15rem 1.35rem;
margin: 1.5rem 0;
border-left: 4px solid;
font-size: 0.98rem;
line-height: 1.65;
}
#ct-winter .alert h4 {
font-size: 0.98rem !important;
margin: 0 0 0.45rem !important;
}
#ct-winter .alert.info { background: var(--info-light); border-color: var(--info); color: #0d3a4a; }
#ct-winter .alert.info h4 { color: #0d3a4a !important; }
#ct-winter .alert.warn { background: var(--warn-light); border-color: var(--warn); color: #5a3d0a; }
#ct-winter .alert.warn h4 { color: #5a3d0a !important; }
#ct-winter .alert.danger { background: var(--danger-light); border-color: var(--danger); color: #5a140d; }
#ct-winter .alert.danger h4 { color: #5a140d !important; }
#ct-winter .alert.good { background: var(--good-light); border-color: var(--good); color: #14361f; }
#ct-winter .alert.good h4 { color: #14361f !important; }
/* ===================== TYPE CARDS (3-up) ===================== */
#ct-winter .type-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 14px;
margin: 1.8rem 0;
}
#ct-winter .type-card {
background: var(--card);
border: 1px solid var(--line);
border-radius: 16px;
padding: 1.4rem 1.3rem;
position: relative;
border-top: 4px solid var(--primary);
transition: transform .2s, box-shadow .2s;
}
#ct-winter .type-card:hover { transform: translateY(-3px); box-shadow: 0 12px 36px rgba(10,30,22,0.10); }
#ct-winter .type-card.gold { border-top-color: var(--accent); }
#ct-winter .type-card.granite { border-top-color: var(--granite); }
#ct-winter .type-tag {
font-size: 0.7rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--primary);
margin-bottom: 0.4rem;
}
#ct-winter .type-card.gold .type-tag { color: var(--accent-dark); }
#ct-winter .type-card.granite .type-tag { color: var(--granite); }
#ct-winter .type-card h4 {
font-family: 'Lora', Georgia, serif !important;
font-size: 1.2rem !important;
font-weight: 700 !important;
margin: 0 0 0.6rem !important;
}
#ct-winter .type-card p { font-size: 0.92rem; line-height: 1.6; margin: 0; color: var(--slate); }
#ct-winter .type-stat {
display: flex;
justify-content: space-between;
align-items: baseline;
padding-top: 0.85rem;
margin-top: 0.85rem;
border-top: 1px solid var(--line);
font-size: 0.78rem;
color: var(--slate);
font-weight: 500;
}
#ct-winter .type-stat strong {
font-family: 'Lora', Georgia, serif;
font-size: 1.1rem;
color: var(--ink);
}
/* ===================== RANKED MATRIX ===================== */
#ct-winter .matrix-wrap {
background: var(--card);
border: 1px solid var(--line);
border-radius: 16px;
padding: 1.4rem;
margin: 1.8rem 0;
overflow-x: auto;
}
#ct-winter .matrix {
width: 100%;
border-collapse: collapse;
font-size: 0.92rem;
min-width: 720px;
}
#ct-winter .matrix thead {
background: var(--primary-dark);
color: #fff;
}
#ct-winter .matrix th {
padding: 0.85rem 0.7rem;
text-align: left;
font-weight: 600;
font-size: 0.74rem;
text-transform: uppercase;
letter-spacing: 0.07em;
}
#ct-winter .matrix th:first-child { border-top-left-radius: 10px; }
#ct-winter .matrix th:last-child { border-top-right-radius: 10px; text-align: center; }
#ct-winter .matrix td {
padding: 0.95rem 0.7rem;
border-bottom: 1px solid var(--line);
vertical-align: middle;
}
#ct-winter .matrix tr:last-child td { border-bottom: none; }
#ct-winter .matrix tr:hover { background: var(--muted); }
#ct-winter .matrix .rank-cell {
font-family: 'Lora', Georgia, serif;
font-size: 1.4rem;
font-weight: 700;
color: var(--accent-dark);
width: 36px;
}
#ct-winter .matrix .name-cell { font-weight: 700; color: var(--ink); font-size: 1rem; }
#ct-winter .matrix .score-cell {
text-align: center;
font-family: 'Lora', Georgia, serif;
font-size: 1.4rem;
font-weight: 700;
color: var(--primary);
}
#ct-winter .pill {
display: inline-block;
padding: 3px 10px;
border-radius: 99px;
font-size: 0.74rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.04em;
}
#ct-winter .pill.green { background: var(--good-light); color: var(--good); }
#ct-winter .pill.gold { background: var(--warn-light); color: var(--warn); }
#ct-winter .pill.red { background: var(--danger-light); color: var(--danger); }
#ct-winter .pill.blue { background: var(--info-light); color: var(--info); }
/* Mobile fallback for matrix */
#ct-winter .matrix-cards { display: none; }
#ct-winter .mc-card {
background: var(--card);
border: 1px solid var(--line);
border-left: 4px solid var(--accent);
border-radius: 12px;
padding: 1rem 1.1rem;
margin-bottom: 0.7rem;
}
#ct-winter .mc-head {
display: flex; justify-content: space-between; align-items: baseline;
margin-bottom: 0.5rem;
}
#ct-winter .mc-head .rk {
font-family: 'Lora', serif; font-size: 1.4rem; font-weight: 700; color: var(--accent-dark);
}
#ct-winter .mc-head .nm { font-weight: 700; flex: 1; margin: 0 10px; }
#ct-winter .mc-head .sc {
font-family: 'Lora', serif; font-size: 1.4rem; font-weight: 700; color: var(--primary);
}
#ct-winter .mc-grid {
display: grid; grid-template-columns: repeat(2,1fr); gap: 0.4rem 0.8rem;
font-size: 0.82rem;
}
#ct-winter .mc-grid div { color: var(--slate); }
#ct-winter .mc-grid div b { color: var(--ink); }
/* ===================== CHARTS ===================== */
#ct-winter .chart-wrap {
background: var(--card);
border: 1px solid var(--line);
border-radius: 16px;
padding: 1.6rem 1.4rem 1.2rem;
margin: 2rem 0;
position: relative;
}
#ct-winter .chart-title {
font-family: 'Outfit', sans-serif;
font-size: 1.08rem;
font-weight: 700;
color: var(--ink);
margin: 0 0 0.3rem;
}
#ct-winter .chart-sub {
font-size: 0.84rem;
color: var(--slate);
margin: 0 0 1rem;
}
#ct-winter .chart-wrap svg { width: 100%; height: auto; display: block; }
#ct-winter .chart-source {
font-size: 0.75rem;
color: var(--slate);
margin-top: 0.6rem;
font-style: italic;
}
#ct-winter .chart-wrap::after {
content: "capetowndata.com";
position: absolute;
bottom: 8px; right: 14px;
font-size: 0.66rem;
color: rgba(0,0,0,0.25);
font-weight: 500;
letter-spacing: 0.04em;
}
/* ===================== NUMBERED DETAIL CARDS ===================== */
#ct-winter .route-card {
background: var(--card);
border: 1px solid var(--line);
border-radius: 18px;
padding: 1.8rem;
margin: 1.8rem 0;
position: relative;
border-left: 6px solid var(--primary);
box-shadow: 0 6px 24px rgba(10,30,22,0.05);
}
#ct-winter .route-card.r2 { border-left-color: var(--granite); }
#ct-winter .route-card.r3 { border-left-color: var(--accent); }
#ct-winter .route-card.r4 { border-left-color: var(--info); }
#ct-winter .route-head {
display: flex;
align-items: flex-start;
gap: 1.2rem;
margin-bottom: 1rem;
}
#ct-winter .route-rank {
flex-shrink: 0;
width: 64px; height: 64px;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-dark) 100%);
color: #fff;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-family: 'Lora', Georgia, serif;
font-size: 1.9rem;
font-weight: 700;
box-shadow: 0 4px 14px rgba(31,77,58,0.3);
}
#ct-winter .route-card.r2 .route-rank { background: linear-gradient(135deg, var(--granite) 0%, #2a3543 100%); }
#ct-winter .route-card.r3 .route-rank { background: linear-gradient(135deg, var(--accent) 0%, var(--accent-dark) 100%); }
#ct-winter .route-card.r4 .route-rank { background: linear-gradient(135deg, var(--info) 0%, #0d3a4a 100%); }
#ct-winter .route-meta { flex: 1; }
#ct-winter .route-name {
font-family: 'Lora', Georgia, serif;
font-size: 1.7rem;
font-weight: 700;
color: var(--ink);
margin: 0 0 0.4rem;
line-height: 1.15;
}
#ct-winter .route-tags { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 0.6rem; }
#ct-winter .route-summary {
font-family: 'Lora', Georgia, serif;
font-style: italic;
font-size: 1.06rem;
color: var(--primary-dark);
margin: 0 0 0.8rem;
line-height: 1.5;
}
#ct-winter .route-card p {
font-size: 0.98rem;
line-height: 1.72;
margin: 0 0 0.85rem;
color: var(--ink);
}
#ct-winter .route-stats {
display: grid;
grid-template-columns: repeat(6, 1fr);
gap: 0.5rem;
margin-top: 1.2rem;
padding-top: 1.2rem;
border-top: 1px solid var(--line);
}
#ct-winter .rs {
text-align: center;
}
#ct-winter .rs-label {
font-size: 0.62rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.08em;
color: var(--slate);
margin-bottom: 0.2rem;
}
#ct-winter .rs-val {
font-family: 'Lora', Georgia, serif;
font-size: 1.1rem;
font-weight: 700;
color: var(--ink);
line-height: 1.1;
}
#ct-winter .rs-val.green { color: var(--good); }
#ct-winter .rs-val.gold { color: var(--warn); }
#ct-winter .rs-val.red { color: var(--danger); }
/* Maps pill */
#ct-winter .maps-pill {
display: inline-flex;
align-items: center;
gap: 6px;
background: linear-gradient(135deg, var(--primary) 0%, var(--accent-dark) 100%);
color: #fff !important;
padding: 7px 14px;
border-radius: 99px;
font-size: 0.78rem;
font-weight: 600;
text-decoration: none !important;
border-bottom: none !important;
transition: transform .15s;
}
#ct-winter .maps-pill:hover { transform: translateY(-1px); color: #fff !important; }
/* ===================== VERDICT (light editorial card) ===================== */
#ct-winter .verdict {
background: var(--card);
color: var(--ink);
border: 1px solid var(--line);
border-left: 5px solid var(--primary);
border-radius: 14px;
padding: 2.2rem 2rem;
margin: 2.5rem 0;
position: relative;
overflow: hidden;
box-shadow: 0 1px 3px rgba(20,33,26,0.04), 0 8px 24px rgba(20,33,26,0.05);
}
#ct-winter .verdict::before {
content: "";
position: absolute;
top: -60px; right: -60px;
width: 220px; height: 220px;
background: radial-gradient(circle, rgba(20,117,107,0.08) 0%, transparent 70%);
pointer-events: none;
}
#ct-winter .verdict-eyebrow {
font-size: 0.78rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.14em;
color: var(--accent-dark);
margin-bottom: 0.6rem;
}
#ct-winter .verdict h2 {
color: var(--ink) !important;
font-family: 'Lora', Georgia, serif !important;
margin: 0 0 1.3rem !important;
display: block !important;
border-top: none !important;
padding-top: 0 !important;
}
#ct-winter .verdict > p {
font-size: 1.08rem;
line-height: 1.78;
color: var(--ink);
}
#ct-winter .verdict-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1.2rem;
margin-top: 1.5rem;
}
#ct-winter .vc {
background: var(--muted);
border: 1px solid var(--line);
border-radius: 10px;
padding: 1.15rem 1.3rem;
}
#ct-winter .vc h4 {
color: var(--primary) !important;
font-size: 0.82rem !important;
font-weight: 700 !important;
text-transform: uppercase;
letter-spacing: 0.1em;
margin: 0 0 0.55rem !important;
}
#ct-winter .vc p {
font-size: 0.99rem;
line-height: 1.66;
color: var(--ink);
margin: 0;
}
/* ===================== FAQ ===================== */
#ct-winter .faq-item {
background: var(--card);
border: 1px solid var(--line);
border-radius: 12px;
margin-bottom: 0.7rem;
overflow: hidden;
}
#ct-winter .faq-item summary {
cursor: pointer;
padding: 1.1rem 1.4rem;
font-weight: 600;
font-size: 1.01rem;
color: var(--ink);
list-style: none;
position: relative;
padding-right: 3rem;
}
#ct-winter .faq-item summary::after {
content: "+";
position: absolute;
right: 1.4rem; top: 50%;
transform: translateY(-50%);
font-size: 1.5rem;
color: var(--accent);
font-weight: 300;
transition: transform .2s;
}
#ct-winter .faq-item[open] summary::after { transform: translateY(-50%) rotate(45deg); }
#ct-winter .faq-item p {
padding: 0 1.4rem 1.2rem;
margin: 0;
font-size: 0.96rem;
line-height: 1.7;
color: var(--slate);
}
/* ===================== NEWS ===================== */
#ct-winter .news-item {
background: var(--card);
border: 1px solid var(--line);
border-left: 3px solid var(--accent);
border-radius: 10px;
padding: 1.1rem 1.3rem;
margin-bottom: 0.85rem;
}
#ct-winter .news-date {
font-size: 0.68rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--accent-dark);
margin-bottom: 0.3rem;
}
#ct-winter .news-item h4 { font-size: 1.02rem !important; margin: 0 0 0.4rem !important; }
#ct-winter .news-item p { font-size: 0.9rem; line-height: 1.6; margin: 0 0 0.4rem; color: var(--slate); }
#ct-winter .news-source { font-size: 0.74rem; color: var(--slate); font-style: italic; }
/* ===================== CTA BANNER ===================== */
#ct-winter article.content .cta-banner {
background: linear-gradient(135deg, var(--primary) 0%, var(--accent-dark) 100%) !important;
color: #fff !important;
border-radius: 18px;
padding: 2.4rem 2rem;
text-align: center;
margin: 2.5rem 0;
position: relative;
overflow: hidden;
}
#ct-winter article.content .cta-banner h3 {
color: #fff !important;
font-family: 'Lora', Georgia, serif !important;
font-size: 1.5rem !important;
margin: 0 0 0.6rem !important;
}
#ct-winter article.content .cta-banner p {
color: rgba(255,255,255,0.9) !important;
margin: 0 0 1.3rem !important;
font-size: 1.02rem !important;
}
#ct-winter article.content .cta-banner .cta-btn {
display: inline-block;
background: #fff;
color: var(--primary-dark) !important;
padding: 12px 28px;
border-radius: 99px;
font-weight: 700;
text-decoration: none !important;
border-bottom: none !important;
transition: transform .15s;
}
#ct-winter article.content .cta-banner .cta-btn:hover { transform: translateY(-2px); }
/* ===================== SOURCES ===================== */
#ct-winter .sources-box {
background: var(--muted);
border-radius: 12px;
padding: 1.4rem 1.6rem;
margin: 2rem 0;
font-size: 0.88rem;
}
#ct-winter .sources-box h4 { font-size: 0.96rem !important; margin-bottom: 0.6rem !important; }
#ct-winter .sources-box ul { padding-left: 1.2rem; line-height: 1.75; }
#ct-winter .sources-box li { margin-bottom: 0.3rem; }
#ct-winter .legal {
font-size: 0.78rem;
color: var(--slate);
background: var(--muted);
border-radius: 10px;
padding: 1rem 1.2rem;
margin: 1.5rem 0;
line-height: 1.6;
}
#ct-winter footer.site-foot {
text-align: center;
padding: 2rem 24px 3rem;
font-size: 0.85rem;
color: var(--slate);
border-top: 1px solid var(--line);
margin-top: 3rem;
}
/* ===================== VIDEO/MAP EMBEDS ===================== */
#ct-winter .vid-wrap, #ct-winter .map-wrap {
position: relative;
padding-bottom: 56.25%;
height: 0;
overflow: hidden;
border-radius: 14px;
margin: 1.4rem 0;
background: #000;
}
#ct-winter .vid-wrap iframe, #ct-winter .map-wrap iframe {
position: absolute; top: 0; left: 0;
width: 100%; height: 100%;
border: 0;
}
#ct-winter .wikiloc-wrap {
border-radius: 14px;
overflow: hidden;
margin: 1.4rem 0;
border: 1px solid var(--line);
background: #1a2520;
line-height: 0;
}
#ct-winter .wikiloc-wrap iframe {
display: block;
width: 100%;
border: 0;
}
#ct-winter .caption {
font-size: 0.84rem;
color: var(--slate);
font-style: italic;
margin: -0.6rem 0 1.4rem;
text-align: center;
}
/* ===================== SHARE BAR ===================== */
#ct-winter .share-bar {
display: flex; flex-wrap: wrap; gap: 8px;
padding: 1rem 0;
margin: 1.2rem 0;
border-top: 1px solid var(--line);
border-bottom: 1px solid var(--line);
align-items: center;
}
#ct-winter .share-bar .sb-label {
font-size: 0.75rem; font-weight: 700;
text-transform: uppercase; letter-spacing: 0.1em;
color: var(--accent-dark);
margin-right: 6px;
}
#ct-winter .share-btn {
display: inline-flex; align-items: center; gap: 6px;
padding: 7px 12px;
border-radius: 99px;
font-size: 0.82rem; font-weight: 600;
background: var(--muted);
color: var(--ink) !important;
border-bottom: none !important;
text-decoration: none !important;
border: 1px solid transparent;
cursor: pointer;
transition: all .15s;
}
#ct-winter .share-btn:hover { background: var(--primary); color: #fff !important; }
#ct-winter .share-btn svg { width: 14px; height: 14px; }
/* ===================== RESPONSIVE ===================== */
@media (max-width: 900px) {
#ct-winter .type-grid { grid-template-columns: 1fr; }
#ct-winter .verdict-grid { grid-template-columns: 1fr; }
#ct-winter .route-stats { grid-template-columns: repeat(3, 1fr); }
#ct-winter .matrix { display: none; }
#ct-winter .matrix-cards { display: block; }
}
@media (max-width: 640px) {
#ct-winter { font-size: 17px !important; }
#ct-winter .wrap { padding: 0 16px; }
#ct-winter .hero { padding: 3.5rem 16px 3rem; }
#ct-winter .toc ul { grid-template-columns: 1fr; }
#ct-winter .route-stats { grid-template-columns: repeat(2, 1fr); }
#ct-winter .route-head { flex-direction: column; gap: 0.8rem; }
#ct-winter .route-rank { width: 52px; height: 52px; font-size: 1.5rem; }
#ct-winter .route-name { font-size: 1.4rem; }
#ct-winter .kpi-value { font-size: 1.55rem; }
#ct-winter h2 { font-size: 1.5rem !important; }
#ct-winter .pull-quote { font-size: 1.15rem; }
#ct-winter .quick-nav { padding: 12px; }
#ct-winter .chart-wrap { padding: 1rem 0.7rem 0.9rem; }
#ct-winter .verdict { padding: 1.6rem 1.3rem; }
}
</style>
<div id="ct-winter">
<!-- ============== HERO ============== -->
<header class="hero">
<div class="hero-inner">
<span class="hero-badge"><span class="pulse"></span>2026 Field Guide · Cape Town · June–August</span>
<h1>Cape Town in winter,<br><span class="accent">what you need, backed by data.</span></h1>
<p class="hero-deck">Cape Town's winter is mild on paper and brutal in practice if you misread it. Average highs of 16.8°C, 98 mm of rain in June alone, and a wind that will turn any cheap umbrella inside out before lunch. Here is what the data actually demands of your suitcase.</p>
<div class="hero-meta">
<span>📅 Updated 04 May 2026</span>
<span>⏱ 9 min read</span>
<span>📍 Cape Town · 33.92°S, 18.42°E</span>
</div>
<div class="kpi-row">
<div class="kpi">
<div class="kpi-label">Avg June high</div>
<div class="kpi-value">16.8°C</div>
<div class="kpi-sub">62°F · short-sleeve weather, in the sun</div>
</div>
<div class="kpi">
<div class="kpi-label">Avg June low</div>
<div class="kpi-value">11°C</div>
<div class="kpi-sub">52°F · jacket nights</div>
</div>
<div class="kpi">
<div class="kpi-label">June rainfall</div>
<div class="kpi-value">98 mm</div>
<div class="kpi-sub">3.86 in · the wettest month, by far</div>
</div>
<div class="kpi">
<div class="kpi-label">Rainy days / month</div>
<div class="kpi-value">~14</div>
<div class="kpi-sub">peak in June; ~11 in July, ~10 in Aug</div>
</div>
<div class="kpi">
<div class="kpi-label">Daylight in June</div>
<div class="kpi-value">9h 54m</div>
<div class="kpi-sub">sunrise ~07:48, sunset ~17:42</div>
</div>
</div>
</div>
</header>
<main class="wrap">
<!-- ============== QUICK NAV ============== -->
<nav class="quick-nav" aria-label="Section quick links">
<a class="chip" href="#climate">The actual weather</a>
<a class="chip gold" href="#priorities">Ranked priorities</a>
<a class="chip" href="#essentials">The essentials list</a>
<a class="chip" href="#cost">Cost of buying locally</a>
<a class="chip danger" href="#dont-bring">What to skip</a>
<a class="chip" href="#scenarios">Day-by-day outfit logic</a>
<a class="chip" href="#whales">Whale season</a>
<a class="chip" href="#electronics">Electronics & load-shedding</a>
<a class="chip" href="#faq">FAQ</a>
</nav>
<article class="content">
<!-- ============== TOC ============== -->
<section class="toc" aria-label="Table of contents">
<div class="toc-title">In this guide</div>
<ul>
<li><a href="#climate">What Cape Town's winter actually feels like</a></li>
<li><a href="#priorities">Packing priorities, ranked by data</a></li>
<li><a href="#essentials">The essentials list, by category</a></li>
<li><a href="#cost">What it costs to buy locally if you under-pack</a></li>
<li><a href="#dont-bring">What you don't need to bring</a></li>
<li><a href="#scenarios">Outfit logic by day type</a></li>
<li><a href="#whales">Whale-season add-ons (June–November)</a></li>
<li><a href="#electronics">Electronics & the load-shedding update</a></li>
<li><a href="#verdict">The bottom line</a></li>
<li><a href="#faq">FAQ</a></li>
<li><a href="#sources">Sources</a></li>
</ul>
</section>
<!-- Share bar -->
<div class="share-bar" aria-label="Share this article">
<span class="sb-label">Share</span>
<a class="share-btn" href="https://twitter.com/intent/tweet?text=Cape%20Town%20winter%20packing%2C%20by%20the%20numbers&url=https%3A%2F%2Fcapetowndata.com" target="_blank" rel="noopener" aria-label="Share on X">
<svg viewBox="0 0 24 24" fill="currentColor"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg>
X
</a>
<a class="share-btn" href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fcapetowndata.com" target="_blank" rel="noopener" aria-label="Share on Facebook">
<svg viewBox="0 0 24 24" fill="currentColor"><path d="M9.198 21.5h4v-8.01h3.604l.396-3.98h-4V7.5a1 1 0 0 1 1-1h3v-4h-3a5 5 0 0 0-5 5v2.01h-2l-.396 3.98h2.396V21.5z"/></svg>
Facebook
</a>
<a class="share-btn" href="https://api.whatsapp.com/send?text=Cape%20Town%20winter%20packing%20guide%3A%20https%3A%2F%2Fcapetowndata.com" target="_blank" rel="noopener" aria-label="Share on WhatsApp">
<svg viewBox="0 0 24 24" fill="currentColor"><path d="M17.6 6.32A7.85 7.85 0 0 0 12.05 4 7.94 7.94 0 0 0 4.1 11.95a7.86 7.86 0 0 0 1.06 3.95L4 20l4.2-1.1a7.93 7.93 0 0 0 3.85.98h.01a7.94 7.94 0 0 0 7.94-7.94 7.86 7.86 0 0 0-2.4-5.62m-5.55 12.21h-.01a6.61 6.61 0 0 1-3.36-.92l-.24-.14-2.49.65.66-2.43-.16-.25a6.6 6.6 0 0 1-1.01-3.49 6.6 6.6 0 0 1 6.61-6.6 6.55 6.55 0 0 1 4.66 1.93 6.55 6.55 0 0 1 1.93 4.67 6.6 6.6 0 0 1-6.59 6.58m3.62-4.93c-.2-.1-1.17-.58-1.36-.64-.18-.07-.31-.1-.45.1s-.51.64-.62.77c-.12.13-.23.15-.42.05a5.45 5.45 0 0 1-1.6-.99 6 6 0 0 1-1.11-1.38c-.12-.2 0-.3.09-.4.09-.09.2-.23.3-.35.1-.11.13-.2.2-.33.07-.13.04-.25-.02-.35-.05-.1-.45-1.08-.62-1.48-.16-.39-.33-.34-.45-.34l-.39-.01c-.13 0-.35.05-.53.25s-.7.69-.7 1.67.72 1.94.82 2.07c.1.13 1.41 2.16 3.43 3.03.48.21.85.33 1.14.42.48.15.91.13 1.26.08.38-.06 1.17-.48 1.34-.94.16-.46.16-.86.11-.94-.05-.08-.18-.13-.38-.23"/></svg>
WhatsApp
</a>
<a class="share-btn" href="mailto:?subject=Cape%20Town%20winter%20packing%20guide&body=Data-driven%20what-to-bring%20for%20Cape%20Town%2C%20June%E2%80%93August%3A%20https%3A%2F%2Fcapetowndata.com" aria-label="Share by email">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="4" width="20" height="16" rx="2"/><path d="m22 7-10 5L2 7"/></svg>
Email
</a>
</div>
<!-- ============== CLIMATE ============== -->
<span class="eyebrow">The actual weather</span>
<h2 id="climate">
<span class="h2-icon">🌧️</span>
What Cape Town's winter actually feels like
</h2>
<p>Cape Town's winter is technically Mediterranean: mild, wet, never freezing in the city, never properly snowing below the mountain summits. That shorthand is both correct and useless. The two things that actually shape your packing are <strong>volatility</strong> (any single day can swap weather three times) and <strong>wind</strong> (the cold-front southerlies turn 11°C into something that feels closer to 4°C). Locals describe it as "all four seasons in one day" and they are not exaggerating.</p>
<p>Here is what 30 years of climate data say about the three winter months.</p>
<div class="chart-wrap">
<p class="chart-title">Cape Town winter: average daily highs & lows, monthly rainfall</p>
<p class="chart-sub">June is the wettest month of the year (98 mm). July is the coldest (avg low 10.2°C). August begins the slow drift back to spring.</p>
<svg viewBox="0 0 700 360" xmlns="http://www.w3.org/2000/svg" font-family="Outfit, sans-serif">
<defs>
<linearGradient id="ctw-rain" x1="0" x2="0" y1="0" y2="1">
<stop offset="0%" stop-color="#3a8aa7"/>
<stop offset="100%" stop-color="#1a5570"/>
</linearGradient>
</defs>
<!-- Title and axes -->
<g stroke="#d6e2dc" stroke-width="1">
<line x1="160" y1="40" x2="160" y2="300"/>
<line x1="160" y1="300" x2="660" y2="300"/>
</g>
<!-- Y-axis (left), temperature 0–25°C, scale 10px per °C, baseline y=300 -->
<g font-size="10" fill="#455146" text-anchor="end">
<line x1="160" y1="50" x2="660" y2="50" stroke="#ebf3ee" stroke-dasharray="3 3"/>
<text x="155" y="54">25°C</text>
<line x1="160" y1="100" x2="660" y2="100" stroke="#ebf3ee" stroke-dasharray="3 3"/>
<text x="155" y="104">20°C</text>
<line x1="160" y1="150" x2="660" y2="150" stroke="#ebf3ee" stroke-dasharray="3 3"/>
<text x="155" y="154">15°C</text>
<line x1="160" y1="200" x2="660" y2="200" stroke="#ebf3ee" stroke-dasharray="3 3"/>
<text x="155" y="204">10°C</text>
<line x1="160" y1="250" x2="660" y2="250" stroke="#ebf3ee" stroke-dasharray="3 3"/>
<text x="155" y="254">5°C</text>
<text x="155" y="304">0°C</text>
</g>
<!-- Right Y-axis (rainfall mm) – scale 0–120 mm. Reuse same y-pixels: 250mm matches 0°C, 300y=0mm. mm_to_y: y=300-(mm*2.083) so 120mm→300-250=50, 60mm→175, 100mm→ 91.7. We'll scale to a max of 120mm: mm/120*250 px above baseline -->
<g font-size="10" fill="#1a5570" text-anchor="start">
<text x="665" y="54">120</text>
<text x="665" y="104">90</text>
<text x="665" y="154">60</text>
<text x="665" y="204">30</text>
<text x="665" y="304">0 mm</text>
</g>
<!-- Three months: x positions June 250, July 410, Aug 570; cluster width ~110px -->
<!-- For each month: two thinner temperature bars (high, low) on left, one rain bar on right -->
<!-- ===== JUNE ===== high 16.8, low 11, rain 98 -->
<!-- High bar: y = 300 - 16.8*10 = 132 -->
<rect x="208" y="132" width="22" height="168" fill="#c89132" rx="2"/>
<text x="219" y="125" font-size="11" font-weight="700" fill="#14211a" text-anchor="middle">16.8</text>
<!-- Low bar: y = 300 - 11*10 = 190 -->
<rect x="234" y="190" width="22" height="110" fill="#7d6a4a" rx="2"/>
<text x="245" y="183" font-size="11" font-weight="700" fill="#14211a" text-anchor="middle">11</text>
<!-- Rain bar: 98mm → 98/120*250 = 204px → y = 300-204 = 96 -->
<rect x="262" y="96" width="22" height="204" fill="url(#ctw-rain)" rx="2"/>
<text x="273" y="89" font-size="11" font-weight="700" fill="#1a5570" text-anchor="middle">98</text>
<text x="246" y="320" font-size="12" font-weight="700" fill="#14211a" text-anchor="middle">June</text>
<text x="246" y="335" font-size="9" fill="#455146" text-anchor="middle">~14 rainy days</text>
<!-- ===== JULY ===== high 17.2, low 10.2, rain 82 (typical avg) -->
<rect x="368" y="128" width="22" height="172" fill="#c89132" rx="2"/>
<text x="379" y="121" font-size="11" font-weight="700" fill="#14211a" text-anchor="middle">17.2</text>
<rect x="394" y="198" width="22" height="102" fill="#7d6a4a" rx="2"/>
<text x="405" y="191" font-size="11" font-weight="700" fill="#14211a" text-anchor="middle">10.2</text>
<!-- 82mm → 82/120*250 = 170.8 → y = 129.2 -->
<rect x="422" y="129" width="22" height="171" fill="url(#ctw-rain)" rx="2"/>
<text x="433" y="122" font-size="11" font-weight="700" fill="#1a5570" text-anchor="middle">82</text>
<text x="406" y="320" font-size="12" font-weight="700" fill="#14211a" text-anchor="middle">July</text>
<text x="406" y="335" font-size="9" fill="#455146" text-anchor="middle">~11 rainy days</text>
<!-- ===== AUGUST ===== high 17.8, low 10.5, rain 77 -->
<rect x="528" y="122" width="22" height="178" fill="#c89132" rx="2"/>
<text x="539" y="115" font-size="11" font-weight="700" fill="#14211a" text-anchor="middle">17.8</text>
<rect x="554" y="195" width="22" height="105" fill="#7d6a4a" rx="2"/>
<text x="565" y="188" font-size="11" font-weight="700" fill="#14211a" text-anchor="middle">10.5</text>
<!-- 77mm → 77/120*250 = 160.4 → y = 139.6 -->
<rect x="582" y="139" width="22" height="161" fill="url(#ctw-rain)" rx="2"/>
<text x="593" y="132" font-size="11" font-weight="700" fill="#1a5570" text-anchor="middle">77</text>
<text x="566" y="320" font-size="12" font-weight="700" fill="#14211a" text-anchor="middle">August</text>
<text x="566" y="335" font-size="9" fill="#455146" text-anchor="middle">~10 rainy days</text>
<!-- Legend -->
<g font-size="10" fill="#14211a">
<rect x="180" y="20" width="14" height="10" fill="#c89132" rx="1"/>
<text x="200" y="29">avg high °C</text>
<rect x="280" y="20" width="14" height="10" fill="#7d6a4a" rx="1"/>
<text x="300" y="29">avg low °C</text>
<rect x="380" y="20" width="14" height="10" fill="url(#ctw-rain)" rx="1"/>
<text x="400" y="29">rainfall (mm)</text>
</g>
<text x="80" y="170" font-size="11" font-weight="600" fill="#14211a" text-anchor="middle" transform="rotate(-90, 80, 170)">Temperature (°C) · Rainfall (mm)</text>
</svg>
<p class="chart-source">Source: Weather Atlas (Cape Town climate normals, 30-year averages); SAWS station data via Climate-Data.org. June rainfall figure: 98 mm (3.86 in), the highest of any month.</p>
</div>
<div class="key-takeaway">
<strong>Key takeaway:</strong> Daytime is comfortably mild but rarely warm. Nights are jacket-cold. The rain isn't constant, it arrives in cold-front pulses with high wind. Pack for layered swings, not a fixed temperature.
</div>
<!-- ============== PRIORITIES ============== -->
<span class="eyebrow">Triage</span>
<h2 id="priorities">
<span class="h2-icon">📊</span>
Packing priorities, ranked by impact
</h2>
<p>If your suitcase has limited space, this is the order in which items earn it. We weighted each by how often you'll actually use it across a 7-day Cape Town winter trip and how much misery a missing version causes.</p>
<div class="chart-wrap">
<p class="chart-title">What you'll use, ranked by daily-impact score</p>
<p class="chart-sub">A score of 100 means "you'll wish you had this every single day." Below 30 means optional.</p>
<svg viewBox="0 0 700 380" xmlns="http://www.w3.org/2000/svg" font-family="Outfit, sans-serif">
<defs>
<linearGradient id="ctw-pri-1" x1="0" x2="1">
<stop offset="0%" stop-color="#14756b"/>
<stop offset="100%" stop-color="#0a3a36"/>
</linearGradient>
<linearGradient id="ctw-pri-2" x1="0" x2="1">
<stop offset="0%" stop-color="#c89132"/>
<stop offset="100%" stop-color="#8a5e1d"/>
</linearGradient>
<linearGradient id="ctw-pri-3" x1="0" x2="1">
<stop offset="0%" stop-color="#9aa19c"/>
<stop offset="100%" stop-color="#6a716c"/>
</linearGradient>
</defs>
<!-- Y axis labels (right-aligned, multi-line where needed) -->
<g font-size="12" fill="#14211a" text-anchor="end">
<text x="220" y="56" font-weight="700">Waterproof shell jacket</text>
<text x="220" y="86" font-weight="700">Layered warm tops (3–4)</text>
<text x="220" y="116" font-weight="700">Sturdy waterproof shoes</text>
<text x="220" y="146" font-weight="700">Type M plug adapter</text>
<text x="220" y="176" font-weight="700">Long pants (jeans, chinos)</text>
<text x="220" y="206" font-weight="700">Beanie + scarf</text>
<text x="220" y="236" font-weight="700">Smart-casual outfit</text>
<text x="220" y="266" font-weight="700">Sunglasses + SPF</text>
<text x="220" y="296" font-weight="700">Swimwear (heated pool/spa)</text>
<text x="220" y="326" font-weight="700">Binoculars</text>
</g>
<!-- X axis 0–100, x_start=230, x_end=620, so 1 score unit = 3.9px. ticks every 25 -->
<line x1="230" y1="345" x2="620" y2="345" stroke="#d6e2dc"/>
<g font-size="10" fill="#455146" text-anchor="middle">
<line x1="230" y1="345" x2="230" y2="350" stroke="#d6e2dc"/>
<text x="230" y="362">0</text>
<line x1="327.5" y1="345" x2="327.5" y2="350" stroke="#d6e2dc"/>
<text x="327.5" y="362">25</text>
<line x1="425" y1="345" x2="425" y2="350" stroke="#d6e2dc"/>
<text x="425" y="362">50</text>
<line x1="522.5" y1="345" x2="522.5" y2="350" stroke="#d6e2dc"/>
<text x="522.5" y="362">75</text>
<line x1="620" y1="345" x2="620" y2="350" stroke="#d6e2dc"/>
<text x="620" y="362">100</text>
</g>
<!-- Bars: width = score × 3.9, y = label_y - 11, height = 18 -->
<!-- Tier 1 (essential, score ≥ 80): teal -->
<rect x="230" y="45" width="370.5" height="18" fill="url(#ctw-pri-1)" rx="3"/>
<text x="608" y="59" font-size="12" font-weight="700" fill="#14756b">95</text>
<rect x="230" y="75" width="358.8" height="18" fill="url(#ctw-pri-1)" rx="3"/>
<text x="596" y="89" font-size="12" font-weight="700" fill="#14756b">92</text>
<rect x="230" y="105" width="343.2" height="18" fill="url(#ctw-pri-1)" rx="3"/>
<text x="581" y="119" font-size="12" font-weight="700" fill="#14756b">88</text>
<rect x="230" y="135" width="335.4" height="18" fill="url(#ctw-pri-1)" rx="3"/>
<text x="573" y="149" font-size="12" font-weight="700" fill="#14756b">86</text>
<!-- Tier 2 (important, 50–79): gold -->
<rect x="230" y="165" width="288.6" height="18" fill="url(#ctw-pri-2)" rx="3"/>
<text x="526" y="179" font-size="12" font-weight="700" fill="#8a5e1d">74</text>
<rect x="230" y="195" width="253.5" height="18" fill="url(#ctw-pri-2)" rx="3"/>
<text x="491" y="209" font-size="12" font-weight="700" fill="#8a5e1d">65</text>
<rect x="230" y="225" width="222.3" height="18" fill="url(#ctw-pri-2)" rx="3"/>
<text x="460" y="239" font-size="12" font-weight="700" fill="#8a5e1d">57</text>
<rect x="230" y="255" width="206.7" height="18" fill="url(#ctw-pri-2)" rx="3"/>
<text x="444" y="269" font-size="12" font-weight="700" fill="#8a5e1d">53</text>
<!-- Tier 3 (optional, < 50): grey -->
<rect x="230" y="285" width="124.8" height="18" fill="url(#ctw-pri-3)" rx="3"/>
<text x="362" y="299" font-size="12" font-weight="700" fill="#6a716c">32</text>
<rect x="230" y="315" width="93.6" height="18" fill="url(#ctw-pri-3)" rx="3"/>
<text x="331" y="329" font-size="12" font-weight="700" fill="#6a716c">24</text>
<text x="425" y="22" font-size="11" font-weight="700" fill="#14211a" text-anchor="middle">Daily-impact score (0–100)</text>
</svg>
<p class="chart-source">capetowndata composite: frequency of use × misery cost of absence × cost-to-buy-locally factor. A 7-day winter trip with mixed indoor/outdoor activities assumed.</p>
</div>
<div class="alert info">
<h4>How to read the tiers</h4>
<ul style="margin:0.4rem 0 0 1.2rem;line-height:1.75;">
<li><strong>Tier 1 (score 80+):</strong> non-negotiable. Bring or buy on day one.</li>
<li><strong>Tier 2 (50–79):</strong> bring if you have space; otherwise easy and cheap to source locally.</li>
<li><strong>Tier 3 (under 50):</strong> nice-to-have. Only pack if it's something you specifically want for an activity (whale-watching binoculars, a heated-pool swim).</li>
</ul>
</div>
<!-- ============== ESSENTIALS ============== -->
<span class="eyebrow">The list, by category</span>
<h2 id="essentials">
<span class="h2-icon">🎒</span>
The essentials list
</h2>
<div class="grid-2" style="display:grid;grid-template-columns:repeat(2,1fr);gap:0.85rem;margin:1.4rem 0;">
<div class="type-card">
<div class="type-tag">Outerwear</div>
<h4>The shell + the warm layer</h4>
<p><strong>Waterproof hooded shell</strong> with a real zip and taped seams (the wind will defeat anything else). Plus one <strong>insulated layer</strong>: a down or synthetic puffer, a fleece, or a heavy wool cardigan. The shell goes over the warm layer when it rains; either alone is rarely enough.</p>
</div>
<div class="type-card">
<div class="type-tag">Tops</div>
<h4>Three to four layerable shirts</h4>
<p>Two long-sleeve tops (one merino base if you have one), one or two T-shirts for warmer afternoons or as base layers. One sweater or hoodie for the mid-layer slot. Pack thin shirts that stack rather than one bulky knit.</p>
</div>
<div class="type-card">
<div class="type-tag">Bottoms</div>
<h4>Long pants only, two pairs minimum</h4>
<p>Jeans, chinos, or warm trousers. <span class="hl-d">Leave shorts at home.</span> If you're hiking, add quick-dry hiking pants. Thermal leggings are useful only for cold-morning game drives or the higher mountain trails.</p>
</div>
<div class="type-card">
<div class="type-tag">Shoes</div>
<h4>Waterproof, closed-toe, two pairs</h4>
<p>One pair of waterproof trainers or city boots for daily use. One pair of <strong>hiking boots with grip</strong> if you'll do Table Mountain, Lion's Head, or coastal trails. Trails are slick after rain and the rocks here are unforgiving. Indoor slippers are a small luxury worth the space.</p>
</div>
<div class="type-card">
<div class="type-tag">Accessories</div>
<h4>Beanie, scarf, light gloves</h4>
<p>Cape Town wind makes uncovered ears and necks miserable fast. A beanie and a scarf weigh nothing and earn their space. Light gloves only if you're hiking before sunrise or cold-sensitive. Skip the heavy snow mittens.</p>
</div>
<div class="type-card">
<div class="type-tag">Rain gear</div>
<h4>Wind-proof umbrella OR a poncho</h4>
<p>The Cape Doctor wind will turn cheap umbrellas inside out within ten seconds. Bring a sturdy storm-rated travel umbrella (Senz, Blunt, or similar) or a hooded rain poncho. Most locals just rely on the jacket hood.</p>
</div>
<div class="type-card">
<div class="type-tag">Sun</div>
<h4>Sunglasses + SPF 30+</h4>
<p>Cape Town's UV index is 4 in midwinter, low by summer standards but still strong enough to burn pale skin in 30–40 minutes of direct sun. The post-rain glare off wet streets is intense. Pack both.</p>
</div>
<div class="type-card">
<div class="type-tag">Skin</div>
<h4>Rich moisturiser, lip balm, hand cream</h4>
<p>Cold air outdoors plus electric heaters or fireplaces indoors dry skin out fast. A good moisturiser, a lip balm with SPF, and hand cream make the trip noticeably more comfortable. Travel sizes only.</p>
</div>
</div>
<!-- ============== COST OF BUYING LOCALLY ============== -->
<span class="eyebrow">If you under-pack</span>
<h2 id="cost">
<span class="h2-icon">💰</span>
What it costs to buy locally
</h2>
<p>Cape Town has Cape Union Mart on every other corner and K-Way is the local hero brand. You can replace anything you forgot, but here is what that actually costs in 2026 prices, with EUR and USD context.</p>
<div class="chart-wrap">
<p class="chart-title">Replacement cost in Cape Town for forgotten items, mid-range options</p>
<p class="chart-sub">Cape Union Mart (K-Way house brand) and Mr Price prices, May 2026. ZAR with EUR/USD reference.</p>
<svg viewBox="0 0 700 360" xmlns="http://www.w3.org/2000/svg" font-family="Outfit, sans-serif">
<defs>
<linearGradient id="ctw-cost-grad" x1="0" x2="1">
<stop offset="0%" stop-color="#14756b"/>
<stop offset="100%" stop-color="#0a3a36"/>
</linearGradient>
<linearGradient id="ctw-cost-alt" x1="0" x2="1">
<stop offset="0%" stop-color="#c89132"/>
<stop offset="100%" stop-color="#8a5e1d"/>
</linearGradient>
</defs>
<!-- Y labels -->
<g font-size="12" fill="#14211a" text-anchor="end">
<text x="220" y="60" font-weight="700">K-Way fleece</text>
<text x="220" y="76" font-size="10" fill="#455146">300g, the local classic</text>
<text x="220" y="105" font-weight="700">K-Way rain shell</text>
<text x="220" y="121" font-size="10" fill="#455146">waterproof, taped seams</text>
<text x="220" y="150" font-weight="700">Beanie</text>
<text x="220" y="166" font-size="10" fill="#455146">Mr Price or Woolworths</text>
<text x="220" y="195" font-weight="700">Storm umbrella</text>
<text x="220" y="211" font-size="10" fill="#455146">wind-resistant travel</text>
<text x="220" y="240" font-weight="700">Plug adapter (Type M)</text>
<text x="220" y="256" font-size="10" fill="#455146">Pick n Pay / Clicks</text>
<text x="220" y="285" font-weight="700">Hiking boots</text>
<text x="220" y="301" font-size="10" fill="#455146">K-Way or Hi-Tec mid-range</text>
</g>
<!-- X axis 0–2500 ZAR; x_start=230, x_end=660 → 1 ZAR = 0.172px -->
<line x1="230" y1="320" x2="660" y2="320" stroke="#d6e2dc"/>
<g font-size="10" fill="#455146" text-anchor="middle">
<line x1="230" y1="320" x2="230" y2="325" stroke="#d6e2dc"/>
<text x="230" y="338">R0</text>
<line x1="316" y1="320" x2="316" y2="325" stroke="#d6e2dc"/>
<text x="316" y="338">R500</text>
<line x1="402" y1="320" x2="402" y2="325" stroke="#d6e2dc"/>
<text x="402" y="338">R1,000</text>
<line x1="488" y1="320" x2="488" y2="325" stroke="#d6e2dc"/>
<text x="488" y="338">R1,500</text>
<line x1="574" y1="320" x2="574" y2="325" stroke="#d6e2dc"/>
<text x="574" y="338">R2,000</text>
<line x1="660" y1="320" x2="660" y2="325" stroke="#d6e2dc"/>
<text x="660" y="338">R2,500</text>
</g>
<!-- K-Way fleece R899 → 0.172 × 899 = 154.6px → bar from x=230 to 384.6 -->
<rect x="230" y="50" width="154.6" height="22" fill="url(#ctw-cost-grad)" rx="3"/>
<text x="395" y="65" font-size="12" font-weight="700" fill="#14756b">R899</text>
<text x="455" y="65" font-size="10" fill="#455146">€46.70 · $54.80</text>
<!-- K-Way rain shell R1899 → 326.6px -->
<rect x="230" y="95" width="326.6" height="22" fill="url(#ctw-cost-grad)" rx="3"/>
<text x="565" y="110" font-size="12" font-weight="700" fill="#14756b">R1,899</text>
<text x="615" y="110" font-size="10" fill="#455146">€98.70 · $115.80</text>
<!-- Beanie R149 → 25.6px -->
<rect x="230" y="140" width="25.6" height="22" fill="url(#ctw-cost-alt)" rx="3"/>
<text x="270" y="155" font-size="12" font-weight="700" fill="#14211a">R149</text>
<text x="315" y="155" font-size="10" fill="#455146">€7.75 · $9.10</text>
<!-- Storm umbrella R449 → 77.2px -->
<rect x="230" y="185" width="77.2" height="22" fill="url(#ctw-cost-alt)" rx="3"/>
<text x="320" y="200" font-size="12" font-weight="700" fill="#14211a">R449</text>
<text x="365" y="200" font-size="10" fill="#455146">€23.30 · $27.40</text>
<!-- Plug adapter R89 → 15.3px -->
<rect x="230" y="230" width="15.3" height="22" fill="url(#ctw-cost-alt)" rx="3"/>
<text x="262" y="245" font-size="12" font-weight="700" fill="#14211a">R89</text>
<text x="295" y="245" font-size="10" fill="#455146">€4.65 · $5.45</text>
<!-- Hiking boots R1599 → 275px -->
<rect x="230" y="275" width="275" height="22" fill="url(#ctw-cost-alt)" rx="3"/>
<text x="515" y="290" font-size="12" font-weight="700" fill="#14211a">R1,599</text>
<text x="565" y="290" font-size="10" fill="#455146">€83.10 · $97.50</text>
</svg>
<p class="chart-source">Cape Union Mart and Mr Price online catalogues, May 2026. FX: R1 ≈ €0.052 ≈ $0.061 (Xe / Trading Economics, mid-market).</p>
</div>
<div class="key-takeaway">
<strong>The K-Way truth:</strong> a K-Way fleece at ~R899 is genuinely cheaper than the equivalent in Europe or North America, and it's everywhere. Many travellers deliberately under-pack the warm layer and treat it as a souvenir purchase on day one. The shell jacket and hiking boots, however, are <em>not</em> notably cheaper here, so bring those if you have them.
</div>
<!-- ============== DON'T BRING ============== -->
<span class="eyebrow">Skip these</span>
<h2 id="dont-bring">
<span class="h2-icon">🚫</span>
What you don't need to bring
</h2>
<div class="alert warn">
<h4>Genuine pack-list myths</h4>
<ol style="margin:0.5rem 0 0 1.4rem;line-height:1.75;">
<li><strong>A heavy winter parka.</strong> Cape Town never gets cold enough for a Canada-Goose-grade coat. A mid-weight puffer plus a shell is plenty. Anything heavier just takes up suitcase space and looks faintly absurd at 14°C.</li>
<li><strong>Snow boots.</strong> The city has not seen snow since records began. Snow only falls on the surrounding mountain tops and only briefly. Waterproof trainers and a pair of grippy hiking boots cover everything.</li>
<li><strong>Heavy gloves.</strong> Light knit gloves are fine for an early hike. The heavy ski mittens stay home.</li>
<li><strong>Multiple bulky umbrellas.</strong> One good storm umbrella, or just relying on the jacket hood. Cheap umbrellas die on day one to the wind.</li>
<li><strong>A thermos for hot drinks.</strong> Cape Town has a coffee culture rivalling Melbourne's. You're never more than 200 metres from a flat white. The thermos is dead weight unless you're going on long road trips into the Karoo.</li>
<li><strong>An extensive medical kit.</strong> The pharmacies (Clicks, Dis-Chem) are well stocked, English-speaking, and significantly cheaper than US or UK equivalents. Bring prescription meds, leave the cold-flu hoard at home.</li>
<li><strong>A massive power bank.</strong> See the load-shedding section below. The grid in 2026 is stable; one small power bank is fine.</li>
</ol>
</div>
<!-- ============== SCENARIOS ============== -->
<span class="eyebrow">Outfit logic</span>
<h2 id="scenarios">
<span class="h2-icon">👕</span>
Day-by-day outfit logic
</h2>
<p>Cape Town winter rewards specific outfit recipes for specific day types. Here are the four day patterns you'll actually encounter and what to wear for each.</p>
<div class="grid-2" style="display:grid;grid-template-columns:repeat(2,1fr);gap:0.85rem;margin:1.4rem 0;">
<div class="type-card">
<div class="type-tag">Day type 1</div>
<h4>Bright, dry, 18°C "winter sun" day</h4>
<p>Roughly 30% of winter days fit this. Long-sleeve T-shirt or thin sweater, jeans, comfortable walking shoes, sunglasses. Carry the shell jacket in your daypack but you probably won't wear it. Perfect for the V&A, Bo-Kaap walking, Kirstenbosch.</p>
</div>
<div class="type-card gold">
<div class="type-tag">Day type 2</div>
<h4>Cold front, full rain, strong wind</h4>
<p>Roughly 25% of winter days. Base layer, sweater, shell over the top with hood up, jeans (or quick-dry trousers), waterproof shoes. Indoor day: museums, wine farms with fireplaces, long lunches. The art galleries do their best business in this weather.</p>
</div>
<div class="type-card">
<div class="type-tag">Day type 3</div>
<h4>Variable: sunny morning, wet afternoon</h4>
<p>The classic "all four seasons" day, around 35% of winter days. Layered tops you can shed and re-add. Always carry the shell. A small daypack to stash layers. Plan outdoor stuff (hike, beach walk, Cape Point drive) for morning, indoor for afternoon.</p>
</div>
<div class="type-card granite">
<div class="type-tag">Day type 4</div>
<h4>Wine-farm dinner, smart-casual evening</h4>
<p>Many winter restaurants and wine estates lean cosy with fireplaces. One smart-casual outfit (chinos or dark jeans + a button-down shirt or a nice knit, plus a blazer or smart coat) covers nearly all evenings. No need for full formal wear; Cape Town is relaxed.</p>
</div>
</div>
<!-- ============== WHALES ============== -->
<span class="eyebrow">Seasonal bonus</span>
<h2 id="whales">
<span class="h2-icon">🐋</span>
Whale-season add-ons (June–November)
</h2>
<p>Cape Town's winter coincides with one of the world's most spectacular wildlife events: the southern right whale migration into the bays around Hermanus, Walker Bay, and False Bay. The season runs from <span class="hl">June through late November</span>, with peak sightings between <span class="hl">August and October</span>. The Hermanus Whale Festival is held in late September. If you're visiting in June you'll catch the early arrivals; July onwards is reliable.</p>
<div class="alert good">
<h4>What to add to your packing list for whales</h4>
<ul style="margin:0.4rem 0 0 1.2rem;line-height:1.75;">
<li><strong>Binoculars.</strong> 8×42 are the sweet spot: enough magnification to see behaviour, wide enough field-of-view to track a breaching whale. Even modest pairs (Nikon Aculon, Bushnell H2O) work well.</li>
<li><strong>A camera with at least 200mm zoom.</strong> Phones won't capture this. A bridge camera or a mirrorless with a telephoto is what you want.</li>
<li><strong>Wind-resistant outer layers.</strong> The Hermanus cliff path is exposed; on a southerly it can feel ten degrees colder than the city.</li>
<li><strong>Walker Bay is land-based:</strong> Hermanus has the world's only official "whale crier" who alerts onlookers to sightings. You don't need a boat trip to see whales properly.</li>
</ul>
</div>
<!-- ============== ELECTRONICS / LOAD-SHEDDING ============== -->
<span class="eyebrow">The 2026 update</span>
<h2 id="electronics">
<span class="h2-icon">⚡</span>
Electronics, plugs, and the load-shedding update
</h2>
<p>This is the section most other travel guides have not updated. The picture in 2026 is materially different from 2022–2023, and your packing should reflect that.</p>
<div class="alert info">
<h4>Cape Town's load-shedding status, May 2026</h4>
<p style="margin:0.4rem 0 0 0;">Eskom's official Winter 2026 Outlook (published 24 April 2026) projects <strong>no load-shedding</strong> for the period 1 April–31 August 2026. The Western Cape has been <span class="hl-g">fully removed from load reduction schedules</span>. South Africa has logged <strong><span data-live-loadshedding="days_since">483</span> consecutive days without load-shedding</strong> (<span data-live-loadshedding="status_text">Stage 0 as of 11 September 2026</span>). The Energy Availability Factor sits around 65%, up from 55% in 2023; unplanned outages are down by roughly 7 GW year-on-year. <span class="hl-i">A small power bank is still wise for travel generally, but the panic-buying-of-power-stations advice from older guides is now outdated.</span></p>
</div>
<div class="grid-2" style="display:grid;grid-template-columns:repeat(2,1fr);gap:0.85rem;margin:1.4rem 0;">
<div class="type-card">
<div class="type-tag">Plug</div>
<h4>Type M adapter, the big three-pin</h4>
<p>South Africa uses the Type M plug, a 15-amp three-round-pin design unique to the region. Most universal travel adapters cover it, but a dedicated Type M is more reliable. Available locally for ~R89 (€4.65 / $5.45) at any Pick n Pay or Clicks if you forget. Mains voltage is 230V/50Hz; nearly all phone and laptop chargers handle this automatically.</p>
</div>
<div class="type-card">
<div class="type-tag">Power bank</div>
<h4>One 10,000 mAh bank is plenty</h4>
<p>Down from the 20,000+ mAh advice of the load-shedding era. With grid stability restored, your only real need is for long day-trips (Cape Point, the wine lands, whale-watching). One mid-sized bank covers a full day of phone-as-camera-and-GPS use comfortably.</p>
</div>
<div class="type-card">
<div class="type-tag">Camera</div>
<h4>Phone is fine for most things</h4>
<p>Modern phone cameras handle Cape Town's dramatic light beautifully. If you'll do whale-watching, sunsets at Camps Bay, or wildlife on a day trip to Aquila or Inverdoorn, a camera with a real zoom (200mm+) is worth bringing.</p>
</div>
<div class="type-card">
<div class="type-tag">Connectivity</div>
<h4>Local SIM or eSIM at the airport</h4>
<p>Vodacom and MTN have SIM kiosks at Cape Town International. R200–300 (~€10–15) gets you 5–10 GB of data for a week. eSIM offerings (Airalo, Holafly) work seamlessly. Free Wi-Fi is widespread in cafés, malls, and most accommodation.</p>
</div>
</div>
<!-- ============== VERDICT ============== -->
<section class="verdict" id="verdict">
<div class="verdict-eyebrow">The bottom line</div>
<h2>The honest packing summary</h2>
<p style="font-size:1.08rem;line-height:1.78;color:var(--ink);">If you remember three things, you'll be comfortable. First, a real <strong>waterproof shell with a hood</strong> beats any other single item. Second, <strong>layer thin tops</strong> rather than packing one bulky knit. Third, <strong>waterproof shoes with grip</strong> turn a wet walk from miserable to fun. Everything else is optional or buyable on the ground at competitive prices. Cape Town in winter is one of the best-value travel periods of the year: fewer crowds, lower hotel rates, dramatic light, peak whale season, and the wine-farm fireplaces are properly worth it.</p>
<div class="verdict-grid">
<div class="vc">
<h4>Pack heavy if</h4>
<p>You're doing serious hiking (Table Mountain, Cape Peninsula trails), heading inland to higher altitude (Cederberg, Karoo, where nights drop near freezing), or you're cold-sensitive. Add merino base layers, proper hiking boots, and gloves.</p>
</div>
<div class="vc">
<h4>Pack light if</h4>
<p>You're a city visitor (V&A, museums, wine farms, restaurants). One shell, one warm layer, two pairs of trousers, three tops, comfortable shoes. Buy the K-Way fleece on day one if you want extra warmth, treat it as the souvenir.</p>
</div>
</div>
</section>
<!-- ============== FAQ ============== -->
<span class="eyebrow">Quick answers</span>
<h2 id="faq">
<span class="h2-icon">❓</span>
Frequently asked questions
</h2>
<details class="faq-item">
<summary>Will I need a heavy coat?</summary>
<p>No. Cape Town's coldest July nights average 10°C, with extremes rarely below 5°C in the city. A mid-weight puffer or fleece under a waterproof shell handles every condition you'll encounter. A heavy parka would be both unused and conspicuous.</p>
</details>
<details class="faq-item">
<summary>Does it actually rain that much?</summary>
<p>Cape Town gets about 98 mm in June, 82 mm in July, and 77 mm in August (the monthly averages). That's spread across roughly 10–14 rainy days per month. So yes, expect rain, but not constantly: it arrives in cold-front pulses lasting a day or two, separated by clear days. The "all four seasons" effect is real.</p>
</details>
<details class="faq-item">
<summary>Do I really need a power bank in 2026?</summary>
<p>Less urgently than older guides suggest. The Western Cape has been fully removed from load-reduction schedules and South Africa has gone <span data-live-loadshedding="days_since">483</span> consecutive days without national load-shedding (<span data-live-loadshedding="status_text">Stage 0 as of 11 September 2026</span>). A small power bank is still useful for long days out (using your phone as a GPS, camera, and translator), but the era of stockpiling battery capacity for nightly outages is genuinely over.</p>
</details>
<details class="faq-item">
<summary>Is it warm enough to swim?</summary>
<p>Sea temperatures average 15–16°C in winter, which is cold-shock territory for most. You'll see surfers in wetsuits and the occasional very brave swimmer at Muizenberg, but most visitors save ocean swimming for summer. Heated hotel pools, the Sea Point Pavilion (heated saltwater), and spa pools are open. Swimwear earns its space if your accommodation has a heated pool or you're booking a spa day.</p>
</details>
<details class="faq-item">
<summary>What about hiking?</summary>
<p>Winter hiking is excellent on clear days; less crowded and the air is crisp. After heavy rain trails are slippery and dangerous, particularly on Table Mountain's gullies. Always check the forecast and the SANParks alert page before heading up. Bring waterproof boots with real grip, layered tops, and a shell. Don't go alone, and tell someone your route.</p>
</details>
<details class="faq-item">
<summary>Will I see whales in June?</summary>
<p>Early arrivals, yes. The southern rights start arriving in June; by July the population is established. Peak sightings are August through October. If whales are a primary motivator, aim for September, which also coincides with the Hermanus Whale Festival (late September to early October).</p>
</details>
<details class="faq-item">
<summary>What about the wind?</summary>
<p>Cape Town's winter southerlies are real. Wind speeds in the 30–50 km/h range are common during cold fronts. This is what makes 11°C feel like 4°C. The single best defence is a hooded shell jacket; the second is just spending the windiest hours indoors. Cheap umbrellas don't survive the first gust.</p>
</details>
<details class="faq-item">
<summary>What plug adapter do I need?</summary>
<p>Type M, the large three-round-pin design unique to South Africa. A universal adapter covering Type M works fine; otherwise grab a dedicated one for ~R89 at any Pick n Pay, Clicks, or Cape Town International airport on arrival. Mains voltage is 230V/50Hz, which all modern multi-voltage chargers handle automatically.</p>
</details>
<!-- ============== CTA ============== -->
<div class="cta-banner">
<h3>Planning the rest of your Cape Town trip?</h3>
<p>Our full Cape Town crime map analysis breaks down which neighbourhoods, beaches, and trails to prioritise, and which to plan around, useful in any season.</p>
<a class="cta-btn" href="https://capetowndata.com/en/products/blogpost/140/">Open the Cape Town crime map →</a>
</div>
<!-- ============== SOURCES ============== -->
<div class="sources-box" id="sources">
<h4>Sources & references</h4>
<ul>
<li>Weather Atlas · Cape Town climate normals (30-year averages, daylight hours, rainfall, sea temperature)</li>
<li>Climate-Data.org · Cape Town monthly weather statistics (1991–2021)</li>
<li>South African Weather Service (SAWS) · station data via Climate-Data.org</li>
<li>Cape Town Tourism · official seasonal weather guidance (capetown.travel)</li>
<li>Eskom · "Winter Outlook 2026" media statement, 24 April 2026 (eskom.co.za)</li>
<li>The Citizen · "Lights on this winter: No loadshedding expected as Eskom reports 6GW surplus", April 2026</li>
<li>Hermanus Tourism · Whale season schedule and Whale Festival dates</li>
<li>Hermanus Whale Watchers · Walker Bay viewing guide (June–November)</li>
<li>Cape Union Mart & Mr Price online catalogues · prices May 2026</li>
<li>FX rates: Xe / Trading Economics, mid-market, May 2026 (R1 ≈ €0.052 ≈ $0.061)</li>
</ul>
</div>
<!-- Legal -->
<div class="legal">
<strong>Disclaimer.</strong> This guide is provided for general information. Climate averages are 30-year norms; actual conditions on any given day can vary substantially. Always check current forecasts and trail/route conditions before heading out. Prices and product availability change; verify before relying on specific costs. capetowndata.com accepts no liability for travel decisions made on the basis of this guide.
</div>
</article>
</main>
<footer class="site-foot">
Last updated 04 May 2026 · A capetowndata.com field guide<br>
Data: <a href="https://www.weather-atlas.com/en/south-africa/cape-town-climate" target="_blank" rel="noopener">Weather Atlas</a> · <a href="https://en.climate-data.org/africa/south-africa/western-cape/cape-town-788/" target="_blank" rel="noopener">Climate-Data.org</a> · <a href="https://www.eskom.co.za" target="_blank" rel="noopener">Eskom</a> · <a href="https://www.capetown.travel" target="_blank" rel="noopener">Cape Town Tourism</a>
</footer>
</div><!-- /#ct-winter -->
This article was produced with AI assistance and reviewed and verified by humans.