// Hawaiian Style — Sun School page components.
// Educational content hub. Reuses Primitives.jsx + Nav + TopBar + Footer.
// Per Brand Book §17: Facebook is the educational channel — UV ed, tanning
// tips, SPF guidance. Sun School is the on-site equivalent.

const SunSchoolHero = () => (
  <header style={{ position: 'relative', maxWidth: 1320, margin: '0 auto', padding: '64px 36px 56px' }}>
    <div style={{ display: 'grid', gridTemplateColumns: '1.1fr 0.9fr', gap: 48, alignItems: 'center' }}>
      <div>
        <Eyebrow>Sun School · est. 1995 · class is in session</Eyebrow>
        <h1 style={{
          fontFamily: 'var(--font-display)', fontWeight: 400,
          fontSize: 'clamp(56px, 7.5vw, 128px)', lineHeight: 0.92,
          letterSpacing: '0.005em', textTransform: 'uppercase',
          color: 'var(--brown)', margin: '20px 0 0',
        }}>
          Everything we<br/>
          learned in <span style={{
            fontFamily: 'var(--font-script)', textTransform: 'none',
            color: 'var(--orange)', fontSize: '0.78em',
            transform: 'rotate(-4deg) translateY(-0.08em)', display: 'inline-block',
            lineHeight: 0.9,
          }}>thirty</span><br/>
          summers.
        </h1>
        <p style={{ fontSize: 18, color: 'var(--brown-soft)', maxWidth: 520, marginTop: 28, lineHeight: 1.55 }}>
          Tanning tips. SPF maths. Aftercare rituals. UV index decoded. Everything we've picked up between Phuket and Pattaya — written down, finally.
        </p>
        <p style={{ fontFamily: 'var(--font-thai)', fontSize: 14, color: 'var(--brown-soft)', marginTop: 12, opacity: 0.75 }}>
          เรียนรู้ทุกอย่างเรื่องแสงแดด การเลือก SPF และการดูแลผิวหลังออกแดด
        </p>
        <div style={{ display: 'flex', gap: 14, flexWrap: 'wrap', marginTop: 32 }}>
          <Pill variant="sun" href="#featured">Read the basics</Pill>
          <Pill variant="ghost" href="#uv-today">Today's UV</Pill>
        </div>
        <div style={{
          display: 'flex', gap: 28, marginTop: 40,
          borderTop: '2px solid rgba(61, 47, 35, 0.18)', paddingTop: 22,
        }}>
          {[
            { num: '37',    lbl: 'Articles in the archive' },
            { num: '3 min', lbl: 'Average read time' },
            { num: 'Free',  lbl: 'Always · forever · no signup' },
          ].map(m => (
            <div key={m.lbl}>
              <div style={{ fontFamily: 'var(--font-display)', fontSize: 32, color: 'var(--orange)', lineHeight: 1 }}>{m.num}</div>
              <div style={{ fontSize: 11, color: 'var(--brown-soft)', marginTop: 6, maxWidth: 140, textTransform: 'uppercase', letterSpacing: '0.06em', fontWeight: 600 }}>{m.lbl}</div>
            </div>
          ))}
        </div>
      </div>

      {/* Visual: Kona in classroom / book pose, on bright sun panel */}
      <div style={{
        position: 'relative', borderRadius: 28, overflow: 'hidden',
        background: 'radial-gradient(120% 80% at 30% 25%, #FFE49B 0%, #F7DF4D 35%, #D8721D 80%, #B85C12 100%)',
        boxShadow: 'var(--shadow-lg)', minHeight: 480,
        display: 'flex', alignItems: 'flex-end', justifyContent: 'center',
      }}>
        <div style={{ position: 'absolute', inset: 0, backgroundImage: 'repeating-linear-gradient(135deg, rgba(255,255,255,0.06) 0 2px, transparent 2px 14px)', pointerEvents: 'none' }} />
        <div style={{ position: 'absolute', top: 24, right: 24, zIndex: 6 }}>
          <VintageStamp year="A+" label="UV class" script="passed" />
        </div>
        <div style={{ position: 'absolute', top: 32, left: -20 }}>
          <Doodle.Sun size={120} spin />
        </div>
        {/* Floating "stickers" — fact cards */}
        <div style={{
          position: 'absolute', top: 40, right: 130, zIndex: 5,
          background: 'var(--paper)', padding: '10px 14px', borderRadius: 12,
          border: '2px solid var(--brown)', boxShadow: '0 4px 0 var(--brown)',
          transform: 'rotate(-6deg)', maxWidth: 180,
        }}>
          <div style={{ fontFamily: 'var(--font-mono)', fontSize: 9, letterSpacing: '0.14em', color: 'var(--brown-soft)', textTransform: 'uppercase' }}>Fact 01</div>
          <div style={{ fontFamily: 'var(--font-display)', fontSize: 16, lineHeight: 1, marginTop: 4, color: 'var(--brown)', letterSpacing: '0.02em', textTransform: 'uppercase' }}>SPF 30 blocks ~97%</div>
          <div style={{ fontFamily: 'var(--font-script)', fontSize: 16, color: 'var(--orange)', marginTop: 4, lineHeight: 1 }}>of UVB rays.</div>
        </div>
        <div style={{
          position: 'absolute', bottom: 160, left: 24, zIndex: 5,
          background: 'var(--sun)', padding: '10px 14px', borderRadius: 12,
          border: '2px solid var(--brown)', boxShadow: '0 4px 0 var(--brown)',
          transform: 'rotate(5deg)', maxWidth: 170,
        }}>
          <div style={{ fontFamily: 'var(--font-mono)', fontSize: 9, letterSpacing: '0.14em', color: 'var(--brown-soft)', textTransform: 'uppercase' }}>Fact 02</div>
          <div style={{ fontFamily: 'var(--font-display)', fontSize: 16, lineHeight: 1, marginTop: 4, color: 'var(--brown)', letterSpacing: '0.02em', textTransform: 'uppercase' }}>Reapply every 2 hrs</div>
          <div style={{ fontFamily: 'var(--font-script)', fontSize: 16, color: 'var(--brown)', marginTop: 4, lineHeight: 1 }}>or after a swim.</div>
        </div>
        <div style={{
          position: 'absolute', bottom: 28, right: 28, zIndex: 5,
          background: 'var(--paper)', padding: '10px 14px', borderRadius: 12,
          border: '2px solid var(--brown)', boxShadow: '0 4px 0 var(--brown)',
          transform: 'rotate(-3deg)', maxWidth: 200,
        }}>
          <div style={{ fontFamily: 'var(--font-mono)', fontSize: 9, letterSpacing: '0.14em', color: 'var(--brown-soft)', textTransform: 'uppercase' }}>Fact 03</div>
          <div style={{ fontFamily: 'var(--font-display)', fontSize: 16, lineHeight: 1, marginTop: 4, color: 'var(--brown)', letterSpacing: '0.02em', textTransform: 'uppercase' }}>Coconut + Aloe = ❤</div>
          <div style={{ fontFamily: 'var(--font-script)', fontSize: 16, color: 'var(--orange)', marginTop: 4, lineHeight: 1 }}>nature's pair.</div>
        </div>

        {/* Kona reading */}
        <img src="assets/mascots/kona-sunbath.png" alt="Kona"
          style={{
            position: 'relative', zIndex: 4,
            width: 320, height: 'auto', marginBottom: 0,
            filter: 'drop-shadow(0 20px 24px rgba(0,0,0,0.4))',
          }} />
      </div>
    </div>
  </header>
);

// Featured article — full-width card with big imagery + tags + read time.
const FeaturedArticle = ({ article }) => (
  <section id="featured" style={{ maxWidth: 1320, margin: '0 auto', padding: '40px 36px 0' }}>
    <Eyebrow>★ Class 01 · Required Reading</Eyebrow>
    <a href="#" style={{
      display: 'grid', gridTemplateColumns: '1.1fr 1fr', gap: 0,
      marginTop: 18, borderRadius: 28, overflow: 'hidden',
      background: 'var(--paper-soft)',
      border: '2px solid rgba(61,47,35,0.10)',
      boxShadow: 'var(--shadow-md)', textDecoration: 'none',
      transition: 'transform .25s, box-shadow .25s',
    }}
      onMouseOver={e => { e.currentTarget.style.transform = 'translateY(-3px)'; e.currentTarget.style.boxShadow = 'var(--shadow-lg)'; }}
      onMouseOut={e => { e.currentTarget.style.transform = 'translateY(0)'; e.currentTarget.style.boxShadow = 'var(--shadow-md)'; }}
    >
      <div style={{
        backgroundImage: `url(${article.img})`,
        backgroundSize: 'cover', backgroundPosition: 'center',
        minHeight: 460, position: 'relative',
      }}>
        <span style={{
          position: 'absolute', top: 24, left: 24,
          background: 'var(--brown)', color: 'var(--sun)',
          padding: '7px 14px', borderRadius: 999,
          fontFamily: 'var(--font-body)', fontSize: 10, fontWeight: 800,
          letterSpacing: '0.14em', textTransform: 'uppercase',
        }}>{article.tag}</span>
        <div style={{ position: 'absolute', bottom: 24, right: 24 }}>
          <VintageStamp year="08" label="min read" script="grab a coffee" variant="paper" rotate={-10} size={120} />
        </div>
      </div>
      <div style={{ padding: '48px 44px', display: 'flex', flexDirection: 'column', justifyContent: 'space-between', color: 'var(--brown)' }}>
        <div>
          <div style={{ fontFamily: 'var(--font-mono)', fontSize: 11, letterSpacing: '0.18em', textTransform: 'uppercase', color: 'var(--brown-soft)' }}>{article.category}</div>
          <h3 style={{
            fontFamily: 'var(--font-display)', fontSize: 'clamp(34px, 4.2vw, 56px)',
            letterSpacing: '0.005em', textTransform: 'uppercase',
            lineHeight: 0.94, margin: '12px 0 0', color: 'var(--brown)',
          }}>
            {article.title} <span style={{ fontFamily: 'var(--font-script)', textTransform: 'none', color: 'var(--orange)', fontSize: '0.62em', display: 'inline-block', transform: 'rotate(-3deg)' }}>{article.script}</span>
          </h3>
          <p style={{ fontSize: 16, color: 'var(--brown-soft)', marginTop: 18, lineHeight: 1.6, maxWidth: 440 }}>{article.excerpt}</p>
        </div>
        <div style={{ marginTop: 28, display: 'flex', alignItems: 'center', gap: 16, flexWrap: 'wrap' }}>
          <Pill variant="sun" size="sm">Read the guide →</Pill>
          <span style={{ fontFamily: 'var(--font-mono)', fontSize: 10, letterSpacing: '0.16em', textTransform: 'uppercase', color: 'var(--brown-soft)' }}>
            By {article.author} · {article.date}
          </span>
        </div>
      </div>
    </a>
  </section>
);

// Article grid — 6 smaller cards organised by category.
const ArticleGrid = ({ articles }) => (
  <section style={{ maxWidth: 1320, margin: '0 auto', padding: '80px 36px 0' }}>
    <SectionHead
      eyebrow="02 / The Syllabus"
      title={
        <h2 style={{
          fontFamily: 'var(--font-display)', fontSize: 'clamp(40px, 5.6vw, 88px)',
          lineHeight: 0.94, textTransform: 'uppercase', letterSpacing: '0.005em',
          color: 'var(--brown)', margin: 0,
        }}>
          Six lessons<br/>
          before <span style={{ fontFamily: 'var(--font-script)', textTransform: 'none', color: 'var(--orange)', fontSize: '0.82em', display: 'inline-block', transform: 'rotate(-3deg)' }}>tomorrow's</span> beach.
        </h2>
      }
      right="From sun protection basics to the perfect aftercare ritual. Pick one, save the rest for the next rainy afternoon."
    />
    <div style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gap: 22 }}>
      {articles.map((a, i) => (
        <a key={i} href="#" style={{
          background: 'var(--paper-soft)',
          borderRadius: 18, overflow: 'hidden',
          border: '1.5px solid rgba(61,47,35,0.10)',
          textDecoration: 'none', color: 'var(--brown)',
          transition: 'transform .2s, box-shadow .2s',
          display: 'flex', flexDirection: 'column',
        }}
          onMouseOver={e => { e.currentTarget.style.transform = 'translateY(-4px)'; e.currentTarget.style.boxShadow = 'var(--shadow-md)'; }}
          onMouseOut={e => { e.currentTarget.style.transform = 'translateY(0)'; e.currentTarget.style.boxShadow = 'none'; }}
        >
          <div style={{
            aspectRatio: '16 / 11',
            backgroundImage: a.img ? `url(${a.img})` : a.gradient,
            backgroundSize: 'cover', backgroundPosition: 'center',
            backgroundColor: 'var(--beige)',
            position: 'relative',
          }}>
            <span style={{
              position: 'absolute', top: 14, left: 14,
              background: a.tagBg || 'var(--brown)', color: a.tagColor || 'var(--sun)',
              padding: '5px 11px', borderRadius: 999,
              fontFamily: 'var(--font-body)', fontSize: 9.5, fontWeight: 800,
              letterSpacing: '0.14em', textTransform: 'uppercase',
            }}>{a.tag}</span>
            <span style={{
              position: 'absolute', bottom: 14, right: 14,
              background: 'var(--paper)', color: 'var(--brown)',
              padding: '4px 10px', borderRadius: 999,
              fontFamily: 'var(--font-mono)', fontSize: 9.5, letterSpacing: '0.14em', textTransform: 'uppercase',
            }}>{a.read}</span>
          </div>
          <div style={{ padding: '20px 22px 22px', flex: 1, display: 'flex', flexDirection: 'column' }}>
            <div style={{ fontFamily: 'var(--font-mono)', fontSize: 10, letterSpacing: '0.16em', textTransform: 'uppercase', color: 'var(--brown-soft)' }}>{a.category}</div>
            <h4 style={{
              fontFamily: 'var(--font-display)', fontSize: 22, lineHeight: 1.05,
              letterSpacing: '0.02em', textTransform: 'uppercase',
              marginTop: 10, color: 'var(--brown)',
            }}>{a.title}</h4>
            <p style={{ fontSize: 13.5, color: 'var(--brown-soft)', marginTop: 8, lineHeight: 1.55, flex: 1 }}>{a.excerpt}</p>
            <div style={{ marginTop: 16, display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
              <span style={{ fontFamily: 'var(--font-mono)', fontSize: 10, letterSpacing: '0.14em', textTransform: 'uppercase', color: 'var(--brown-soft)' }}>By {a.author}</span>
              <span style={{ fontFamily: 'var(--font-display)', fontSize: 14, color: 'var(--orange)', letterSpacing: '0.04em' }}>Read →</span>
            </div>
          </div>
        </a>
      ))}
    </div>
  </section>
);

// UV-index quick reference — fun playground card with current Bangkok UV
// and an "if it's X, do Y" lookup table.
//
// Today's UV reading is fetched live from Open-Meteo (free, no API key) for
// Bangkok (lat 13.75, lon 100.52) once per page load. If the fetch fails we
// fall back to a sensible "Very High" default so the card always tells a story.
const UVIndexCard = () => {
  const { useState, useEffect } = React;

  const levels = [
    { range: '0–2', name: 'Low',       color: '#7D9A5C', advice: 'SPF 15 is plenty. Hat optional.' },
    { range: '3–5', name: 'Moderate',  color: '#F7DF4D', advice: 'SPF 30. Hat and shades.' },
    { range: '6–7', name: 'High',      color: '#E89236', advice: 'SPF 50, reapply every 90 min.' },
    { range: '8–10',name: 'Very High', color: '#D8721D', advice: 'SPF 50+, seek shade 11–3 PM.' },
    { range: '11+', name: 'Extreme',   color: '#C8362C', advice: 'SPF 50+, cover up, postpone the beach.' },
  ];

  // Map a numeric UV value → which level bucket + a friendly tagline.
  const classify = (uv) => {
    if (uv <= 2)  return { name: 'Low',       color: '#7D9A5C', tag: 'SPF 15 will do.' };
    if (uv <= 5)  return { name: 'Moderate',  color: '#F7DF4D', tag: 'SPF 30 today.' };
    if (uv <= 7)  return { name: 'High',      color: '#E89236', tag: 'SPF 50, reapply.' };
    if (uv <= 10) return { name: 'Very High', color: '#D8721D', tag: 'full SPF 50, friend.' };
    return            { name: 'Extreme',   color: '#C8362C', tag: 'cover up, postpone the beach.' };
  };

  // Fallback shown before fetch resolves or if the API is unreachable.
  const FALLBACK = { uv: 9, ...classify(9), date: null };
  const [uvNow, setUvNow] = useState(FALLBACK);

  useEffect(() => {
    let cancelled = false;
    const url = 'https://api.open-meteo.com/v1/forecast'
      + '?latitude=13.75&longitude=100.52'
      + '&daily=uv_index_max&timezone=Asia%2FBangkok&forecast_days=1';
    fetch(url)
      .then(r => r.ok ? r.json() : Promise.reject(new Error('UV fetch failed')))
      .then(data => {
        if (cancelled) return;
        const raw = data?.daily?.uv_index_max?.[0];
        const day = data?.daily?.time?.[0];
        if (typeof raw !== 'number') return; // keep fallback
        const uv = Math.round(raw);
        setUvNow({ uv, ...classify(uv), date: day });
      })
      .catch(() => { /* keep fallback silently */ });
    return () => { cancelled = true; };
  }, []);

  // Format the API date (YYYY-MM-DD) as "15 May"; fall back to today.
  const dateLabel = (() => {
    const d = uvNow.date ? new Date(uvNow.date + 'T00:00:00') : new Date();
    return d.toLocaleDateString('en-GB', { day: 'numeric', month: 'short' });
  })();

  return (
    <section id="uv-today" style={{ maxWidth: 1320, margin: '0 auto', padding: '80px 36px 0' }}>
      <div style={{
        background: 'var(--brown)', borderRadius: 32,
        padding: '56px 56px', color: 'var(--paper)',
        position: 'relative', overflow: 'hidden',
        display: 'grid', gridTemplateColumns: '1.1fr 1.4fr', gap: 48, alignItems: 'center',
      }}>
        <div style={{ position: 'absolute', bottom: -80, right: -80, width: 280, height: 280, borderRadius: '50%',
          background: 'radial-gradient(circle, rgba(247, 223, 77, 0.35) 0%, transparent 70%)' }} />
        <div style={{ position: 'relative' }}>
          <Eyebrow color="rgba(252, 213, 182, 0.85)">Quick Reference · Bangkok</Eyebrow>
          <h3 style={{
            fontFamily: 'var(--font-display)', fontSize: 'clamp(34px, 4.2vw, 64px)',
            lineHeight: 0.94, letterSpacing: '0.005em', textTransform: 'uppercase',
            margin: '14px 0 0', color: 'var(--paper)',
          }}>
            Today's UV.<br/>
            <span style={{ fontFamily: 'var(--font-script)', textTransform: 'none', color: 'var(--sun)', fontSize: '0.78em', display: 'inline-block', transform: 'rotate(-3deg)' }}>read it.</span> respect it.
          </h3>
          <p style={{ fontSize: 15, opacity: 0.85, marginTop: 18, maxWidth: 380, lineHeight: 1.6 }}>
            The UV index is just a number — but it tells you exactly how much sunscreen you need today.
          </p>
          <div style={{
            marginTop: 28, display: 'inline-flex', flexDirection: 'column',
            background: 'rgba(252, 213, 182, 0.08)',
            border: '2px solid rgba(252, 213, 182, 0.2)',
            borderRadius: 18, padding: '20px 26px', minWidth: 220,
          }}>
            <span style={{ fontFamily: 'var(--font-mono)', fontSize: 10, letterSpacing: '0.18em', textTransform: 'uppercase', opacity: 0.7 }}>Today · {dateLabel}</span>
            <span style={{ fontFamily: 'var(--font-display)', fontSize: 72, color: 'var(--sun)', lineHeight: 0.95, letterSpacing: '0.005em', marginTop: 4 }}>{uvNow.uv}</span>
            <span style={{ fontFamily: 'var(--font-display)', fontSize: 18, letterSpacing: '0.04em', textTransform: 'uppercase' }}>{uvNow.name}</span>
            <span style={{ fontFamily: 'var(--font-script)', fontSize: 18, color: 'var(--sun)', marginTop: 4, lineHeight: 1 }}>{uvNow.tag}</span>
          </div>
        </div>

        <div style={{ display: 'flex', flexDirection: 'column', gap: 8, position: 'relative' }}>
          {levels.map((l) => (
            <div key={l.range} style={{
              display: 'grid', gridTemplateColumns: '70px 120px 1fr', alignItems: 'center', gap: 16,
              background: 'rgba(252, 213, 182, 0.06)',
              border: '1.5px solid rgba(252, 213, 182, 0.15)',
              borderRadius: 12, padding: '12px 18px',
            }}>
              <span style={{
                background: l.color,
                color: l.range === '3–5' ? 'var(--brown)' : 'var(--paper)',
                fontFamily: 'var(--font-display)', fontSize: 14, padding: '4px 10px',
                borderRadius: 999, textAlign: 'center', letterSpacing: '0.02em',
              }}>{l.range}</span>
              <span style={{ fontFamily: 'var(--font-display)', fontSize: 16, letterSpacing: '0.04em', textTransform: 'uppercase' }}>{l.name}</span>
              <span style={{ fontSize: 13, opacity: 0.88, lineHeight: 1.5 }}>{l.advice}</span>
            </div>
          ))}
        </div>
      </div>
    </section>
  );
};

// Newsletter / Kona Club call-to-action specific to Sun School.
const KonaClubEmailCTA = () => (
  <section style={{ maxWidth: 1320, margin: '0 auto', padding: '80px 36px 0' }}>
    <div style={{
      background: 'var(--paper-soft)', border: '2px solid rgba(61,47,35,0.10)',
      borderRadius: 32, padding: '56px 56px',
      display: 'grid', gridTemplateColumns: '1.4fr 1fr', gap: 48, alignItems: 'center',
      position: 'relative', overflow: 'hidden',
    }}>
      <div style={{ position: 'absolute', top: -60, right: -60, width: 220, height: 220, borderRadius: '50%',
        background: 'radial-gradient(circle, rgba(247, 223, 77, 0.5) 0%, transparent 70%)' }} />
      <div style={{ position: 'relative' }}>
        <Eyebrow>Kona Club · Sun School Email</Eyebrow>
        <h3 style={{
          fontFamily: 'var(--font-display)', fontSize: 'clamp(34px, 4.4vw, 64px)',
          lineHeight: 0.94, letterSpacing: '0.005em', textTransform: 'uppercase',
          margin: '14px 0 0', color: 'var(--brown)',
        }}>
          One <span style={{ fontFamily: 'var(--font-script)', textTransform: 'none', color: 'var(--orange)', fontSize: '0.78em', display: 'inline-block', transform: 'rotate(-3deg)' }}>summer-ready</span><br/>
          email a month.
        </h3>
        <p style={{ fontSize: 16, color: 'var(--brown-soft)', marginTop: 18, lineHeight: 1.6, maxWidth: 460 }}>
          One new Sun School lesson, plus members-only discounts and early bottle drops. Twice a month, never more. Free to leave whenever you head home.
        </p>
        <form onSubmit={(e) => { e.preventDefault(); alert('Aloha! You\'re in.'); }}
          style={{ marginTop: 24, display: 'flex', gap: 10, flexWrap: 'wrap' }}>
          <input type="email" placeholder="your@email.com" required
            style={{
              flex: 1, minWidth: 260,
              padding: '14px 18px', borderRadius: 999,
              border: '2px solid var(--brown)',
              background: 'var(--paper)',
              fontFamily: 'inherit', fontSize: 14, color: 'var(--brown)',
            }} />
          <Pill as="button" type="submit" variant="sun">Join the class</Pill>
        </form>
        <p style={{ fontFamily: 'var(--font-mono)', fontSize: 10, letterSpacing: '0.14em', textTransform: 'uppercase', color: 'var(--brown-soft)', marginTop: 14 }}>
          No spam · unsubscribe in one click · ★ 4.8 from 2,400+ subscribers
        </p>
      </div>
      <div style={{ position: 'relative', display: 'flex', justifyContent: 'center' }}>
        <img src="assets/mascots/kona-letsgo.png" alt="Kona"
          style={{
            width: 280, height: 'auto',
            filter: 'drop-shadow(0 16px 18px rgba(0,0,0,0.25))',
            transform: 'rotate(4deg)',
          }} />
        <div style={{
          position: 'absolute', top: 14, right: 0,
          fontFamily: 'var(--font-script)', color: 'var(--orange)',
          fontSize: 30, transform: 'rotate(-6deg)', lineHeight: 0.95,
        }}>see you in class!</div>
      </div>
    </div>
  </section>
);

Object.assign(window, { SunSchoolHero, FeaturedArticle, ArticleGrid, UVIndexCard, KonaClubEmailCTA });
