<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Mifo Australia Seasonality Executive Report</title>
  <style>
    :root {
      --ink: #101417;
      --muted: #5d666c;
      --paper: #f6f8f7;
      --panel: #ffffff;
      --line: #dce4e1;
      --mifo: #0a8f7a;
      --mifo-deep: #055c51;
      --coral: #f06449;
      --amber: #f4b942;
      --violet: #6e5bd8;
      --blue: #2f80ed;
      --shadow: 0 24px 70px rgba(15, 35, 34, 0.14);
      --radius: 8px;
    }

    * {
      box-sizing: border-box;
    }

    body {
      margin: 0;
      background: var(--paper);
      color: var(--ink);
      font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
      letter-spacing: 0;
    }

    a {
      color: inherit;
    }

    .page {
      min-height: 100vh;
      overflow: hidden;
    }

    .hero {
      position: relative;
      min-height: 92vh;
      display: grid;
      align-items: end;
      padding: 32px;
      color: #fff;
      background:
        linear-gradient(90deg, rgba(4, 17, 16, 0.92), rgba(5, 37, 34, 0.78) 48%, rgba(8, 67, 60, 0.28)),
        url("https://mifo.com.au/cdn/shop/files/mifo-social-share-image-shopify.jpg?v=1639149271") center / cover no-repeat;
    }

    .hero::after {
      content: "";
      position: absolute;
      inset: auto 0 0 0;
      height: 160px;
      background: linear-gradient(180deg, rgba(246, 248, 247, 0), var(--paper));
      pointer-events: none;
    }

    .nav {
      position: absolute;
      top: 0;
      left: 0;
      right: 0;
      z-index: 2;
      display: flex;
      justify-content: space-between;
      align-items: center;
      padding: 24px 32px;
    }

    .brand {
      display: inline-flex;
      align-items: center;
      gap: 12px;
      font-weight: 800;
      font-size: 20px;
      letter-spacing: 0.02em;
    }

    .brand-mark {
      width: 44px;
      height: 44px;
      border: 2px solid rgba(255, 255, 255, 0.86);
      display: grid;
      place-items: center;
      font-weight: 900;
      border-radius: 50%;
    }

    .nav-meta {
      font-size: 13px;
      color: rgba(255, 255, 255, 0.78);
      text-align: right;
    }

    .hero-inner {
      position: relative;
      z-index: 1;
      width: min(1180px, 100%);
      margin: 0 auto 52px;
      display: grid;
      gap: 26px;
    }

    .eyebrow {
      margin: 0;
      color: var(--mifo);
      text-transform: uppercase;
      font-size: 12px;
      font-weight: 800;
      letter-spacing: 0.14em;
    }

    .hero .eyebrow {
      color: #78f0d6;
    }

    h1 {
      margin: 0;
      max-width: 880px;
      font-size: clamp(46px, 7vw, 96px);
      line-height: 0.93;
      letter-spacing: 0;
    }

    .hero-copy {
      max-width: 730px;
      margin: 0;
      color: rgba(255, 255, 255, 0.84);
      font-size: clamp(18px, 2.3vw, 25px);
      line-height: 1.38;
    }

    .hero-stats {
      display: grid;
      grid-template-columns: repeat(4, minmax(0, 1fr));
      gap: 12px;
      margin-top: 14px;
      max-width: 1060px;
    }

    .stat {
      background: rgba(255, 255, 255, 0.1);
      border: 1px solid rgba(255, 255, 255, 0.2);
      backdrop-filter: blur(18px);
      border-radius: var(--radius);
      padding: 18px;
      min-height: 118px;
    }

    .stat strong {
      display: block;
      font-size: clamp(25px, 3.2vw, 42px);
      line-height: 1;
      margin-bottom: 10px;
    }

    .stat span {
      color: rgba(255, 255, 255, 0.74);
      font-size: 13px;
      line-height: 1.35;
    }

    main {
      position: relative;
      z-index: 3;
    }

    section {
      padding: 74px 32px;
    }

    .inner {
      width: min(1180px, 100%);
      margin: 0 auto;
    }

    .section-head {
      display: grid;
      grid-template-columns: minmax(0, 0.95fr) minmax(280px, 0.55fr);
      gap: 36px;
      align-items: end;
      margin-bottom: 28px;
    }

    h2 {
      margin: 6px 0 0;
      font-size: clamp(32px, 4vw, 58px);
      line-height: 1;
      letter-spacing: 0;
    }

    .section-copy {
      margin: 0;
      color: var(--muted);
      font-size: 16px;
      line-height: 1.55;
    }

    .grid-3 {
      display: grid;
      grid-template-columns: repeat(3, minmax(0, 1fr));
      gap: 16px;
    }

    .insight-card,
    .chart-panel,
    .action-card,
    .moment-card {
      border: 1px solid var(--line);
      border-radius: var(--radius);
      background: var(--panel);
      box-shadow: 0 12px 30px rgba(18, 35, 32, 0.05);
    }

    .insight-card {
      min-height: 228px;
      padding: 24px;
      display: flex;
      flex-direction: column;
      justify-content: space-between;
      overflow: hidden;
      position: relative;
    }

    .insight-card::before {
      content: "";
      position: absolute;
      top: 0;
      left: 0;
      right: 0;
      height: 5px;
      background: var(--mifo);
    }

    .insight-card.coral::before { background: var(--coral); }
    .insight-card.amber::before { background: var(--amber); }
    .insight-card.violet::before { background: var(--violet); }

    .insight-card h3,
    .action-card h3,
    .moment-card h3 {
      margin: 0;
      font-size: 24px;
      line-height: 1.08;
      letter-spacing: 0;
    }

    .metric {
      display: flex;
      align-items: baseline;
      gap: 10px;
      flex-wrap: wrap;
      margin-top: 26px;
    }

    .metric strong {
      font-size: 44px;
      line-height: 0.95;
    }

    .metric span {
      color: var(--muted);
      font-weight: 700;
      font-size: 14px;
    }

    .insight-card p,
    .action-card p,
    .moment-card p {
      margin: 16px 0 0;
      color: var(--muted);
      line-height: 1.48;
      font-size: 15px;
    }

    .chart-grid {
      display: grid;
      grid-template-columns: minmax(0, 1.35fr) minmax(340px, 0.65fr);
      gap: 16px;
      align-items: stretch;
    }

    .chart-panel {
      padding: 22px;
      min-height: 420px;
      display: flex;
      flex-direction: column;
      gap: 18px;
    }

    .chart-panel.compact {
      min-height: 420px;
    }

    .panel-head {
      display: flex;
      align-items: flex-start;
      justify-content: space-between;
      gap: 18px;
    }

    .panel-head h3 {
      margin: 0;
      font-size: 22px;
      line-height: 1.1;
    }

    .badge {
      flex: 0 0 auto;
      color: var(--mifo-deep);
      border: 1px solid rgba(10, 143, 122, 0.24);
      background: rgba(10, 143, 122, 0.08);
      border-radius: 999px;
      padding: 7px 10px;
      font-size: 12px;
      font-weight: 800;
      white-space: nowrap;
    }

    .canvas-wrap {
      position: relative;
      flex: 1;
      min-height: 290px;
    }

    canvas {
      width: 100%;
      height: 100%;
      display: block;
    }

    .legend {
      display: flex;
      gap: 14px;
      flex-wrap: wrap;
      color: var(--muted);
      font-size: 13px;
      font-weight: 700;
    }

    .legend i {
      display: inline-block;
      width: 10px;
      height: 10px;
      border-radius: 2px;
      margin-right: 6px;
      vertical-align: -1px;
    }

    .split-band {
      background: #0d1718;
      color: #fff;
    }

    .split-band .eyebrow {
      color: #78f0d6;
    }

    .split-band h2,
    .split-band h3 {
      color: #fff;
    }

    .split-band .section-copy,
    .split-band .moment-card p {
      color: rgba(255, 255, 255, 0.72);
    }

    .moments {
      display: grid;
      grid-template-columns: 0.8fr 1.2fr;
      gap: 18px;
      align-items: stretch;
    }

    .moment-card {
      background: rgba(255, 255, 255, 0.08);
      border-color: rgba(255, 255, 255, 0.14);
      box-shadow: none;
      padding: 24px;
    }

    .peak-list {
      display: grid;
      gap: 10px;
      margin-top: 20px;
    }

    .peak-row {
      display: grid;
      grid-template-columns: 86px 1fr 72px;
      gap: 12px;
      align-items: center;
      padding: 13px 0;
      border-bottom: 1px solid rgba(255, 255, 255, 0.12);
      font-size: 14px;
    }

    .peak-row:last-child {
      border-bottom: 0;
    }

    .peak-row strong {
      color: #fff;
    }

    .peak-row span {
      color: rgba(255, 255, 255, 0.65);
    }

    .portfolio-grid {
      display: grid;
      grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr);
      gap: 16px;
    }

    .bar-list {
      display: grid;
      gap: 14px;
      margin-top: 12px;
    }

    .bar-row {
      display: grid;
      gap: 7px;
    }

    .bar-meta {
      display: flex;
      justify-content: space-between;
      gap: 12px;
      font-size: 14px;
      font-weight: 800;
    }

    .bar-meta span {
      color: var(--muted);
      font-weight: 700;
    }

    .track {
      height: 13px;
      background: #eaf0ee;
      border-radius: 999px;
      overflow: hidden;
    }

    .fill {
      height: 100%;
      width: var(--w);
      background: linear-gradient(90deg, var(--mifo), var(--blue));
      border-radius: inherit;
    }

    .fill.alt { background: linear-gradient(90deg, var(--coral), var(--amber)); }
    .fill.violet { background: linear-gradient(90deg, var(--violet), var(--blue)); }

    .calendar {
      display: grid;
      grid-template-columns: repeat(4, minmax(0, 1fr));
      gap: 16px;
    }

    .action-card {
      min-height: 256px;
      padding: 24px;
      position: relative;
      overflow: hidden;
    }

    .action-card::after {
      content: attr(data-window);
      position: absolute;
      right: 18px;
      bottom: 18px;
      color: rgba(16, 20, 23, 0.08);
      font-size: 70px;
      font-weight: 900;
      line-height: 1;
    }

    .action-card ul {
      position: relative;
      z-index: 1;
      margin: 18px 0 0;
      padding: 0;
      list-style: none;
      display: grid;
      gap: 10px;
      color: var(--muted);
      font-size: 14px;
      line-height: 1.42;
    }

    .action-card li {
      padding-left: 18px;
      position: relative;
    }

    .action-card li::before {
      content: "";
      position: absolute;
      left: 0;
      top: 8px;
      width: 7px;
      height: 7px;
      border-radius: 50%;
      background: var(--mifo);
    }

    .footer-note {
      padding: 32px;
      background: #101417;
      color: rgba(255, 255, 255, 0.74);
      font-size: 13px;
      line-height: 1.5;
    }

    .footer-note .inner {
      display: flex;
      justify-content: space-between;
      gap: 22px;
      align-items: center;
    }

    @media (max-width: 980px) {
      .hero {
        min-height: 980px;
        padding: 24px;
      }

      .nav {
        padding: 20px 24px;
      }

      .hero-stats,
      .grid-3,
      .chart-grid,
      .moments,
      .portfolio-grid,
      .calendar,
      .section-head {
        grid-template-columns: 1fr;
      }

      .chart-panel,
      .chart-panel.compact {
        min-height: 360px;
      }

      .calendar {
        grid-template-columns: repeat(2, minmax(0, 1fr));
      }
    }

    @media (max-width: 640px) {
      .hero,
      section,
      .footer-note {
        padding-left: 18px;
        padding-right: 18px;
      }

      .nav {
        align-items: flex-start;
        gap: 16px;
      }

      .nav-meta {
        max-width: 180px;
      }

      .hero {
        min-height: 1040px;
      }

      .hero-inner {
        margin-bottom: 34px;
      }

      .hero-stats,
      .calendar {
        grid-template-columns: 1fr;
      }

      .panel-head {
        flex-direction: column;
      }

      .peak-row {
        grid-template-columns: 76px 1fr;
      }

      .peak-row strong:last-child {
        grid-column: 2;
      }

      .footer-note .inner {
        align-items: flex-start;
        flex-direction: column;
      }
    }
  </style>
</head>
<body>
  <div class="page">
    <header class="hero">
      <div class="nav">
        <div class="brand"><span class="brand-mark">M</span><span>Mifo</span></div>
        <div class="nav-meta">Australia ecommerce seasonality<br>GA4 purchase revenue, 2023-06-13 to 2026-06-28</div>
      </div>
      <div class="hero-inner">
        <p class="eyebrow">Executive readout</p>
        <h1>Demand is seasonal, but the strongest signal is the moment.</h1>
        <p class="hero-copy">Mifo buyers concentrate around sale and gift windows, then show a second high-intent buying wave through Australian winter. The opportunity is to build earlier, protect conversion windows, and treat weak months as demand-creation periods.</p>
        <div class="hero-stats">
          <div class="stat"><strong>A$8.42M</strong><span>GA4 purchase revenue in available history</span></div>
          <div class="stat"><strong>52.3K</strong><span>transactions captured in the same period</span></div>
          <div class="stat"><strong>Nov</strong><span>highest revenue velocity at A$12.7K per day</span></div>
          <div class="stat"><strong>2.27%</strong><span>winter conversion rate, best of all seasons</span></div>
        </div>
      </div>
    </header>

    <main>
      <section>
        <div class="inner">
          <div class="section-head">
            <div>
              <p class="eyebrow">Signals that matter</p>
              <h2>The buying calendar has three distinct jobs.</h2>
            </div>
            <p class="section-copy">The data was pooled by month and season, normalized by calendar day, and not compared year over year. The result is a behavior view: when buyers are most likely to show up, convert, and spend.</p>
          </div>
          <div class="grid-3">
            <article class="insight-card">
              <div>
                <h3>Gift and promo demand is the largest revenue engine.</h3>
                <p>November and December dominate the calendar. The highest days cluster around Black Friday, Cyber Monday, and Boxing Day.</p>
              </div>
              <div class="metric"><strong>A$12.7K</strong><span>Nov revenue per day</span></div>
            </article>
            <article class="insight-card coral">
              <div>
                <h3>Winter brings the cleanest conversion intent.</h3>
                <p>June through August is not the biggest revenue period, but it is the best season for decisive purchasing behavior.</p>
              </div>
              <div class="metric"><strong>2.27%</strong><span>winter conversion rate</span></div>
            </article>
            <article class="insight-card amber">
              <div>
                <h3>Autumn is the demand-creation window.</h3>
                <p>March through May trails the rest of the calendar. This is where content, offers, and retargeting have to work harder.</p>
              </div>
              <div class="metric"><strong>A$5.6K</strong><span>autumn revenue per day</span></div>
            </article>
          </div>
        </div>
      </section>

      <section>
        <div class="inner">
          <div class="section-head">
            <div>
              <p class="eyebrow">Seasonal curve</p>
              <h2>Revenue rises before the holiday peak, then winter converts efficiently.</h2>
            </div>
            <p class="section-copy">AOV stays tight through the year, so the seasonal story is mostly about order volume and conversion rate rather than larger baskets.</p>
          </div>
          <div class="chart-grid">
            <article class="chart-panel">
              <div class="panel-head">
                <h3>Monthly revenue velocity</h3>
                <span class="badge">A$ per calendar day</span>
              </div>
              <div class="canvas-wrap"><canvas id="monthlyChart" aria-label="Monthly revenue per day chart"></canvas></div>
              <div class="legend"><span><i style="background:#0a8f7a"></i>Revenue per day</span><span><i style="background:#f06449"></i>Conversion rate line</span></div>
            </article>
            <article class="chart-panel compact">
              <div class="panel-head">
                <h3>Season rank</h3>
                <span class="badge">Revenue and intent</span>
              </div>
              <div class="canvas-wrap"><canvas id="seasonChart" aria-label="Seasonal performance chart"></canvas></div>
              <div class="legend"><span><i style="background:#6e5bd8"></i>Revenue per day</span><span><i style="background:#f4b942"></i>Transactions per day</span></div>
            </article>
          </div>
        </div>
      </section>

      <section class="split-band">
        <div class="inner">
          <div class="section-head">
            <div>
              <p class="eyebrow">Peak moments</p>
              <h2>The top days are not random. They are retail events.</h2>
            </div>
            <p class="section-copy">The largest revenue days are concentrated around Black Friday, Cyber Monday, late December, and major promotional windows. That makes calendar readiness as important as bidding efficiency.</p>
          </div>
          <div class="moments">
            <article class="moment-card">
              <h3>Highest revenue days</h3>
              <p>These moments show how strongly shoppers wait for, respond to, or are conditioned by high-attention retail events.</p>
              <div class="peak-list">
                <div class="peak-row"><span>2024-11-29</span><strong>Black Friday</strong><strong>A$36.1K</strong></div>
                <div class="peak-row"><span>2024-12-02</span><strong>Cyber Monday</strong><strong>A$30.2K</strong></div>
                <div class="peak-row"><span>2024-12-01</span><strong>Promo weekend</strong><strong>A$29.0K</strong></div>
                <div class="peak-row"><span>2025-11-30</span><strong>Promo weekend</strong><strong>A$27.8K</strong></div>
                <div class="peak-row"><span>2024-12-26</span><strong>Boxing Day</strong><strong>A$24.9K</strong></div>
              </div>
            </article>
            <article class="chart-panel" style="background:rgba(255,255,255,0.08);border-color:rgba(255,255,255,0.14);box-shadow:none;">
              <div class="panel-head">
                <h3>Buying rhythm by weekday</h3>
                <span class="badge" style="color:#d9fff4;background:rgba(120,240,214,0.12);border-color:rgba(120,240,214,0.25);">Average revenue per day</span>
              </div>
              <div class="canvas-wrap"><canvas id="weekdayChart" aria-label="Weekday revenue chart"></canvas></div>
              <div class="legend"><span><i style="background:#78f0d6"></i>Sunday and Monday lead average purchasing</span></div>
            </article>
          </div>
        </div>
      </section>

      <section>
        <div class="inner">
          <div class="section-head">
            <div>
              <p class="eyebrow">Product portfolio</p>
              <h2>Earbuds carry the portfolio, but adjacent categories reveal useful timing.</h2>
            </div>
            <p class="section-copy">Mifo should plan around the product-specific timing: earbuds for promo and gift periods, swim products for summer intent, accessories for owner behavior, and cameras for spring-to-holiday buying.</p>
          </div>
          <div class="portfolio-grid">
            <article class="chart-panel">
              <div class="panel-head">
                <h3>Revenue by product group</h3>
                <span class="badge">GA4 item revenue</span>
              </div>
              <div class="bar-list">
                <div class="bar-row"><div class="bar-meta">Earbuds <span>A$3.63M</span></div><div class="track"><div class="fill" style="--w:100%"></div></div></div>
                <div class="bar-row"><div class="bar-meta">ANC/headphones <span>A$1.29M</span></div><div class="track"><div class="fill alt" style="--w:36%"></div></div></div>
                <div class="bar-row"><div class="bar-meta">Baby monitor <span>A$712K</span></div><div class="track"><div class="fill violet" style="--w:20%"></div></div></div>
                <div class="bar-row"><div class="bar-meta">Cameras <span>A$491K</span></div><div class="track"><div class="fill" style="--w:14%"></div></div></div>
                <div class="bar-row"><div class="bar-meta">Swim earbuds <span>A$336K</span></div><div class="track"><div class="fill alt" style="--w:9%"></div></div></div>
                <div class="bar-row"><div class="bar-meta">Sleep earbuds <span>A$332K</span></div><div class="track"><div class="fill violet" style="--w:9%"></div></div></div>
                <div class="bar-row"><div class="bar-meta">Accessories <span>A$311K</span></div><div class="track"><div class="fill" style="--w:9%"></div></div></div>
              </div>
            </article>
            <article class="chart-panel">
              <div class="panel-head">
                <h3>Category timing map</h3>
                <span class="badge">Top seasonal windows</span>
              </div>
              <div class="bar-list">
                <div class="bar-row"><div class="bar-meta">Earbuds <span>Oct-Dec, Aug</span></div><div class="track"><div class="fill" style="--w:88%"></div></div></div>
                <div class="bar-row"><div class="bar-meta">ANC/headphones <span>Nov-Dec, Mar</span></div><div class="track"><div class="fill alt" style="--w:74%"></div></div></div>
                <div class="bar-row"><div class="bar-meta">Swim earbuds <span>Nov-Feb</span></div><div class="track"><div class="fill violet" style="--w:69%"></div></div></div>
                <div class="bar-row"><div class="bar-meta">Cameras <span>Sep-Dec</span></div><div class="track"><div class="fill" style="--w:64%"></div></div></div>
                <div class="bar-row"><div class="bar-meta">Baby monitors <span>Jul-Aug, Oct</span></div><div class="track"><div class="fill alt" style="--w:59%"></div></div></div>
                <div class="bar-row"><div class="bar-meta">Accessories <span>May-Jul</span></div><div class="track"><div class="fill violet" style="--w:53%"></div></div></div>
              </div>
            </article>
          </div>
        </div>
      </section>

      <section>
        <div class="inner">
          <div class="section-head">
            <div>
              <p class="eyebrow">Executive calendar</p>
              <h2>Operate the year as a sequence of buying jobs.</h2>
            </div>
            <p class="section-copy">The practical implication is not simply spend more in November. It is to stage creative, inventory, landing pages, bids, and retargeting for each intent window.</p>
          </div>
          <div class="calendar">
            <article class="action-card" data-window="01">
              <h3>January-February</h3>
              <p>Capture summer use cases and post-holiday intent.</p>
              <ul>
                <li>Lean into swim, active, travel, and replacement earbuds.</li>
                <li>Use gift-card and upgrade messaging.</li>
                <li>Keep remarketing active after December buyers browse.</li>
              </ul>
            </article>
            <article class="action-card" data-window="02">
              <h3>March-May</h3>
              <p>Build demand while natural buying slows.</p>
              <ul>
                <li>Shift toward education, comparisons, and problem-solution pages.</li>
                <li>Measure assisted paths, not only last-click sales.</li>
                <li>Use offers carefully; protect margin in weaker months.</li>
              </ul>
            </article>
            <article class="action-card" data-window="03">
              <h3>June-August</h3>
              <p>Exploit the high-conversion winter window.</p>
              <ul>
                <li>Protect coverage on earbuds and ANC terms.</li>
                <li>Increase confidence on high-intent shopping queries.</li>
                <li>Retain budgets on Sundays and Mondays.</li>
              </ul>
            </article>
            <article class="action-card" data-window="04">
              <h3>September-December</h3>
              <p>Prepare early for the largest buying cycle.</p>
              <ul>
                <li>Start holiday audience building in September.</li>
                <li>Use October as the ramp, not a waiting period.</li>
                <li>Lock creative, offers, and inventory before Black Friday.</li>
              </ul>
            </article>
          </div>
        </div>
      </section>
    </main>

    <footer class="footer-note">
      <div class="inner">
        <div>Source: GA4 Mifo Australia property G-Q200DHF727. Requested 2022-06-29 to 2026-06-28; actual available purchase data begins 2023-06-13.</div>
        <div>No year-over-year comparison. Metrics are pooled and normalized to show buying behavior.</div>
      </div>
    </footer>
  </div>

  <script>
    const months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
    const monthlyRevenue = [6059.64, 6157.25, 6060.49, 5481.76, 5377.88, 6899.47, 7154.34, 7424.06, 7122.64, 9502.24, 12705.59, 10948.32];
    const monthlyCvr = [1.76, 1.82, 1.68, 1.73, 2.01, 2.39, 2.08, 2.36, 1.93, 1.87, 2.18, 2.15];
    const seasonLabels = ["Spring", "Summer", "Winter", "Autumn"];
    const seasonRevenue = [9773.81, 7767.92, 7147.72, 5641.76];
    const seasonTransactions = [60.89, 47.38, 45.41, 34.88];
    const weekdayLabels = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"];
    const weekdayRevenue = [7940.82, 7294.58, 7253.64, 7574.72, 7164.94, 7445.16, 8317.06];

    function setupCanvas(canvas) {
      const rect = canvas.getBoundingClientRect();
      const dpr = window.devicePixelRatio || 1;
      canvas.width = Math.max(1, Math.floor(rect.width * dpr));
      canvas.height = Math.max(1, Math.floor(rect.height * dpr));
      const ctx = canvas.getContext("2d");
      ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
      return { ctx, width: rect.width, height: rect.height };
    }

    function moneyShort(value) {
      return "$" + Math.round(value / 1000) + "K";
    }

    function drawMonthly() {
      const { ctx, width, height } = setupCanvas(document.getElementById("monthlyChart"));
      ctx.clearRect(0, 0, width, height);
      const pad = { top: 18, right: 22, bottom: 42, left: 54 };
      const chartW = width - pad.left - pad.right;
      const chartH = height - pad.top - pad.bottom;
      const maxRev = 13500;
      const barGap = 8;
      const barW = Math.max(12, (chartW - barGap * (monthlyRevenue.length - 1)) / monthlyRevenue.length);

      ctx.strokeStyle = "#dce4e1";
      ctx.lineWidth = 1;
      ctx.fillStyle = "#5d666c";
      ctx.font = "12px Inter, sans-serif";
      for (let i = 0; i <= 4; i++) {
        const y = pad.top + chartH - (chartH * i / 4);
        ctx.beginPath();
        ctx.moveTo(pad.left, y);
        ctx.lineTo(width - pad.right, y);
        ctx.stroke();
        ctx.fillText(moneyShort(maxRev * i / 4), 6, y + 4);
      }

      monthlyRevenue.forEach((value, i) => {
        const x = pad.left + i * (barW + barGap);
        const h = chartH * value / maxRev;
        const y = pad.top + chartH - h;
        const grad = ctx.createLinearGradient(0, y, 0, y + h);
        grad.addColorStop(0, "#0a8f7a");
        grad.addColorStop(1, "#78d8c6");
        ctx.fillStyle = grad;
        roundRect(ctx, x, y, barW, h, 6);
        ctx.fill();
        ctx.save();
        ctx.translate(x + barW / 2, height - 14);
        ctx.rotate(-Math.PI / 7);
        ctx.fillStyle = "#5d666c";
        ctx.textAlign = "right";
        ctx.fillText(months[i], 0, 0);
        ctx.restore();
      });

      ctx.beginPath();
      monthlyCvr.forEach((value, i) => {
        const x = pad.left + i * (barW + barGap) + barW / 2;
        const y = pad.top + chartH - ((value - 1.55) / (2.5 - 1.55)) * chartH;
        if (i === 0) ctx.moveTo(x, y);
        else ctx.lineTo(x, y);
      });
      ctx.strokeStyle = "#f06449";
      ctx.lineWidth = 3;
      ctx.stroke();
      monthlyCvr.forEach((value, i) => {
        const x = pad.left + i * (barW + barGap) + barW / 2;
        const y = pad.top + chartH - ((value - 1.55) / (2.5 - 1.55)) * chartH;
        ctx.fillStyle = "#fff";
        ctx.beginPath();
        ctx.arc(x, y, 5, 0, Math.PI * 2);
        ctx.fill();
        ctx.strokeStyle = "#f06449";
        ctx.lineWidth = 2;
        ctx.stroke();
      });
    }

    function drawSeason() {
      const { ctx, width, height } = setupCanvas(document.getElementById("seasonChart"));
      ctx.clearRect(0, 0, width, height);
      const pad = { top: 20, right: 20, bottom: 38, left: 54 };
      const chartW = width - pad.left - pad.right;
      const chartH = height - pad.top - pad.bottom;
      const maxRev = 10500;
      const maxTx = 70;
      const groupW = chartW / seasonLabels.length;

      ctx.strokeStyle = "#dce4e1";
      ctx.fillStyle = "#5d666c";
      ctx.font = "12px Inter, sans-serif";
      for (let i = 0; i <= 4; i++) {
        const y = pad.top + chartH - chartH * i / 4;
        ctx.beginPath();
        ctx.moveTo(pad.left, y);
        ctx.lineTo(width - pad.right, y);
        ctx.stroke();
      }

      seasonLabels.forEach((label, i) => {
        const x = pad.left + i * groupW + 14;
        const revH = chartH * seasonRevenue[i] / maxRev;
        const txH = chartH * seasonTransactions[i] / maxTx;
        ctx.fillStyle = "#6e5bd8";
        roundRect(ctx, x, pad.top + chartH - revH, Math.max(22, groupW * 0.28), revH, 6);
        ctx.fill();
        ctx.fillStyle = "#f4b942";
        roundRect(ctx, x + Math.max(28, groupW * 0.32), pad.top + chartH - txH, Math.max(18, groupW * 0.22), txH, 6);
        ctx.fill();
        ctx.fillStyle = "#5d666c";
        ctx.textAlign = "center";
        ctx.fillText(label, pad.left + i * groupW + groupW / 2, height - 14);
      });
    }

    function drawWeekday() {
      const { ctx, width, height } = setupCanvas(document.getElementById("weekdayChart"));
      ctx.clearRect(0, 0, width, height);
      const pad = { top: 20, right: 22, bottom: 36, left: 52 };
      const chartW = width - pad.left - pad.right;
      const chartH = height - pad.top - pad.bottom;
      const max = 9000;
      const barGap = 10;
      const barW = Math.max(14, (chartW - barGap * 6) / 7);

      ctx.strokeStyle = "rgba(255,255,255,0.14)";
      ctx.fillStyle = "rgba(255,255,255,0.7)";
      ctx.font = "12px Inter, sans-serif";
      for (let i = 0; i <= 3; i++) {
        const y = pad.top + chartH - chartH * i / 3;
        ctx.beginPath();
        ctx.moveTo(pad.left, y);
        ctx.lineTo(width - pad.right, y);
        ctx.stroke();
      }

      weekdayRevenue.forEach((value, i) => {
        const x = pad.left + i * (barW + barGap);
        const h = chartH * value / max;
        const y = pad.top + chartH - h;
        ctx.fillStyle = i === 6 || i === 0 ? "#78f0d6" : "rgba(255,255,255,0.36)";
        roundRect(ctx, x, y, barW, h, 6);
        ctx.fill();
        ctx.fillStyle = "rgba(255,255,255,0.78)";
        ctx.textAlign = "center";
        ctx.fillText(weekdayLabels[i], x + barW / 2, height - 12);
      });
    }

    function roundRect(ctx, x, y, w, h, r) {
      const radius = Math.min(r, w / 2, h / 2);
      ctx.beginPath();
      ctx.moveTo(x + radius, y);
      ctx.arcTo(x + w, y, x + w, y + h, radius);
      ctx.arcTo(x + w, y + h, x, y + h, radius);
      ctx.arcTo(x, y + h, x, y, radius);
      ctx.arcTo(x, y, x + w, y, radius);
      ctx.closePath();
    }

    function drawAll() {
      drawMonthly();
      drawSeason();
      drawWeekday();
    }

    window.addEventListener("load", drawAll);
    window.addEventListener("resize", () => {
      clearTimeout(window.__mifoResize);
      window.__mifoResize = setTimeout(drawAll, 120);
    });
  </script>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="//techbest.com.au/wp-content/plugins/wordpress-seo/css/main-sitemap.xsl"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
	<sitemap>
		<loc>https://techbest.com.au/post-sitemap.xml</loc>
		<lastmod>2026-07-03T08:12:16+00:00</lastmod>
	</sitemap>
	<sitemap>
		<loc>https://techbest.com.au/post-sitemap2.xml</loc>
		<lastmod>2025-12-30T12:12:24+00:00</lastmod>
	</sitemap>
	<sitemap>
		<loc>https://techbest.com.au/post-sitemap3.xml</loc>
		<lastmod>2026-07-03T08:12:16+00:00</lastmod>
	</sitemap>
	<sitemap>
		<loc>https://techbest.com.au/page-sitemap.xml</loc>
		<lastmod>2026-06-01T14:23:07+00:00</lastmod>
	</sitemap>
	<sitemap>
		<loc>https://techbest.com.au/category-sitemap.xml</loc>
		<lastmod>2026-07-03T08:12:16+00:00</lastmod>
	</sitemap>
	<sitemap>
		<loc>https://techbest.com.au/author-sitemap.xml</loc>
		<lastmod>2026-04-23T23:26:14+00:00</lastmod>
	</sitemap>
</sitemapindex>
<!-- XML Sitemap generated by Yoast SEO -->