<?xml version="1.0" encoding="UTF-8" ?><!-- generator=Zoho Sites --><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><atom:link href="https://www.taxcart.com.au/blogs/tag/us-economic-nexus-threshold-map/feed" rel="self" type="application/rss+xml"/><title>Taxcart v1.1 - Blog #US Economic Nexus Threshold Map</title><description>Taxcart v1.1 - Blog #US Economic Nexus Threshold Map</description><link>https://www.taxcart.com.au/blogs/tag/us-economic-nexus-threshold-map</link><lastBuildDate>Sun, 20 Sep 2026 02:44:58 +1000</lastBuildDate><generator>http://zoho.com/sites/</generator><item><title><![CDATA[US Economic Nexus Map]]></title><link>https://www.taxcart.com.au/blogs/post/us-economic-nexus-threshold-map</link><description><![CDATA[ ]]></description><content:encoded><![CDATA[<div class="zpcontent-container blogpost-container "><div data-element-id="elm_2JljpdjrR1CEAVygUnuRJw" data-element-type="section" class="zpsection "><style type="text/css"></style><div class="zpcontainer-fluid zpcontainer"><div data-element-id="elm_P9pLQDIzRGiqHoxewEhoHg" data-element-type="row" class="zprow zprow-container zpalign-items- zpjustify-content- " data-equal-column=""><style type="text/css"></style><div data-element-id="elm_JE4HPC9dTHa6d9bc1OWVJg" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-12 zpcol-sm-12 zpalign-self- "><style type="text/css"></style><div data-element-id="elm_pyFyUifZRTqzd4BEJAJ6wg" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-center zptext-align-mobile-center zptext-align-tablet-center " data-editor="true"><p><br/></p></div>
</div><div data-element-id="elm_SaxXXTJ1meKKSj-dpr-agw" data-element-type="codeSnippet" class="zpelement zpelem-codesnippet "><div class="zpsnippet-container"><div id="taxcart-nexus-root" class="tc-nexus"><style> #taxcart-nexus-root.tc-nexus { --tc-ink: #0E2A38; --tc-paper: #F6F4EF; --tc-line: #D8D3C6; --tc-gold: #B8863B; --tc-cat-cy: #7FD8CE; --tc-cat-ye: #F0D24A; --tc-cat-gr: #4E9A72; --tc-cat-pu: #9179B0; --tc-cat-nt: #3E7C93; --tc-muted: #6B7A80; font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; color: var(--tc-ink); background: transparent; border: none; border-radius: 0; padding: 28px 0 24px; max-width: 1180px; margin: 0 auto; box-sizing: border-box; } #taxcart-nexus-root *, #taxcart-nexus-root *::before, #taxcart-nexus-root *::after { box-sizing: border-box; } #taxcart-nexus-root .tc-eyebrow { font-size: 11px; letter-spacing: .14em; text-transform: uppercase; color: var(--tc-gold); font-weight: 600; margin-bottom: 6px; } #taxcart-nexus-root h2 { font-size: 26px; line-height: 1.2; margin: 0 0 6px; font-weight: 700; font-family: Georgia, 'Times New Roman', serif; } #taxcart-nexus-root .tc-sub { font-size: 14px; color: var(--tc-muted); margin: 0 0 20px; max-width: 640px; } #taxcart-nexus-root .tc-layout { display: flex; gap: 28px; align-items: flex-start; flex-wrap: wrap; } #taxcart-nexus-root .tc-map-col { flex: 1 1 620px; min-width: 300px; position: relative; } #taxcart-nexus-root .tc-side-col { flex: 0 0 300px; min-width: 260px; } #taxcart-nexus-root svg { width: 100%; height: auto; display: block; } #taxcart-nexus-root .tc-state { stroke: var(--tc-paper); stroke-width: 1.1; cursor: pointer; transition: opacity .18s ease, filter .18s ease; } #taxcart-nexus-root .tc-state.tc-dim { opacity: .22; } #taxcart-nexus-root .tc-state.tc-hi { filter: drop-shadow(0 0 3px rgba(14,42,56,.55)); stroke: var(--tc-ink); stroke-width: 1.6; } #taxcart-nexus-root .tc-labels { pointer-events: none; } #taxcart-nexus-root .tc-label-abbr { font-size: 13px; font-weight: 700; fill: var(--tc-ink); text-anchor: middle; paint-order: stroke; stroke: #fff; stroke-width: 3px; stroke-linejoin: round; } #taxcart-nexus-root .tc-label-name { font-size: 8px; font-weight: 600; fill: var(--tc-ink); text-anchor: middle; paint-order: stroke; stroke: #fff; stroke-width: 2.5px; stroke-linejoin: round; } #taxcart-nexus-root .tc-label.tc-dim { opacity: .22; } #taxcart-nexus-root .tc-legend { list-style: none; margin: 0 0 18px; padding: 0; display: flex; flex-direction: column; gap: 6px; } #taxcart-nexus-root .tc-legend li { display: flex; align-items: center; gap: 10px; font-size: 13px; padding: 7px 10px; border-radius: 3px; cursor: pointer; border: 1px solid transparent; user-select: none; } #taxcart-nexus-root .tc-legend li:hover, #taxcart-nexus-root .tc-legend li.tc-active { border-color: var(--tc-line); background: rgba(184,134,59,.08); } #taxcart-nexus-root .tc-swatch { width: 14px; height: 14px; border-radius: 3px; flex: none; box-shadow: inset 0 0 0 1px rgba(0,0,0,.12); } #taxcart-nexus-root .tc-legend .tc-label { font-weight: 600; } #taxcart-nexus-root .tc-legend .tc-count { margin-left: auto; color: var(--tc-muted); font-size: 12px; } #taxcart-nexus-root .tc-hint { font-size: 12px; color: var(--tc-muted); margin: 0 0 16px; padding-top: 4px; border-top: 1px dashed var(--tc-line); } #taxcart-nexus-root .tc-detail { border: 1px solid var(--tc-line); border-radius: 4px; padding: 16px; background: #fff; min-height: 108px; } #taxcart-nexus-root .tc-detail .tc-d-state { font-size: 18px; font-weight: 700; margin: 0 0 4px; } #taxcart-nexus-root .tc-detail .tc-d-cat { font-size: 12px; color: var(--tc-muted); margin: 0 0 10px; } #taxcart-nexus-root .tc-detail .tc-d-thresh { font-size: 22px; font-weight: 700; color: var(--tc-gold); margin: 0 0 4px; } #taxcart-nexus-root .tc-detail .tc-d-note { font-size: 12px; color: var(--tc-muted); line-height: 1.5; } #taxcart-nexus-root .tc-detail .tc-d-empty { font-size: 13px; color: var(--tc-muted); } #taxcart-nexus-root .tc-tooltip { position: absolute; pointer-events: none; background: var(--tc-ink); color: #fff; font-size: 12px; padding: 6px 9px; border-radius: 3px; transform: translate(-50%, -110%); white-space: nowrap; opacity: 0; transition: opacity .12s ease; z-index: 5; } #taxcart-nexus-root .tc-tooltip strong { color: var(--tc-gold); } #taxcart-nexus-root .tc-breakdown { margin-top: 24px; padding-top: 18px; border-top: 1px solid var(--tc-line); } #taxcart-nexus-root .tc-breakdown h3 { font-size: 13px; text-transform: uppercase; letter-spacing: .08em; font-weight: 700; color: var(--tc-ink); margin: 0 0 12px; } #taxcart-nexus-root .tc-chips { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 8px; } #taxcart-nexus-root .tc-chip { display: flex; align-items: center; gap: 7px; font-size: 13px; padding: 7px 12px; border-radius: 999px; border: 1px solid var(--tc-line); background: #fff; cursor: pointer; user-select: none; transition: border-color .15s ease, background .15s ease; } #taxcart-nexus-root .tc-chip:hover, #taxcart-nexus-root .tc-chip.tc-active { border-color: var(--tc-gold); background: rgba(184,134,59,.09); } #taxcart-nexus-root .tc-chip .tc-chip-n { font-weight: 700; } #taxcart-nexus-root .tc-chip .tc-chip-count { color: var(--tc-muted); font-size: 12px; } #taxcart-nexus-root .tc-foot { font-size: 11px; color: var(--tc-muted); margin-top: 18px; padding-top: 12px; border-top: 1px solid var(--tc-line); } @media (max-width: 720px) { #taxcart-nexus-root .tc-layout { flex-direction: column; } #taxcart-nexus-root .tc-side-col { width: 100%; } } </style><div class="tc-eyebrow">United States &middot; Sales Tax</div>
<h2>Economic Nexus Threshold Map</h2><p class="tc-sub">Every state is labeled with its abbreviation and name. Hover a state for its exact threshold, or hover a rule in the legend or a chip below to see every state that matches it.</p><div class="tc-layout"><div class="tc-map-col"><svg id="tc-svg" viewBox="0 0 960 600"></svg><div class="tc-tooltip" id="tc-tooltip"></div>
</div><div class="tc-side-col"><ul class="tc-legend" id="tc-legend"></ul><p class="tc-hint">Measurement period shown is how each state counts toward its threshold.</p><div class="tc-detail" id="tc-detail"><p class="tc-d-empty">Hover any state on the map to see its nexus rule here.</p></div>
</div></div><div class="tc-breakdown"><h3>States by exact threshold</h3><ul class="tc-chips" id="tc-chips"></ul></div>
<p class="tc-foot">Thresholds shown are for general reference only and change periodically &mdash; always confirm the current rule with the relevant state Department of Revenue before relying on it. Not tax advice.</p></div>
<script src="https://d3js.org/d3.v7.min.js"></script><script>
(function () {
  var CATS = {
    cy: { label: "Previous Calendar Year OR Current Calendar Year", color: "var(--tc-cat-cy)", swatch: "#7FD8CE" },
    ye: { label: "Previous Calendar Year", color: "var(--tc-cat-ye)", swatch: "#F0D24A" },
    gr: { label: "Prior 12 Months", color: "var(--tc-cat-gr)", swatch: "#4E9A72" },
    pu: { label: "Prior 4 Quarters", color: "var(--tc-cat-pu)", swatch: "#9179B0" },
    nt: { label: "No Statewide Sales Tax", color: "var(--tc-cat-nt)", swatch: "#3E7C93" }
  };

  // ---- EDIT THRESHOLDS HERE ----
  // Each entry: category key (see CATS above), display threshold, optional note.
  var DATA = {
    "Washington":       { cat: "cy", thresh: "$100K" },
    "Oregon":           { cat: "nt", thresh: "No sales tax" },
    "California":       { cat: "cy", thresh: "$500K" },
    "Nevada":           { cat: "cy", thresh: "$100K / 200 txns" },
    "Idaho":            { cat: "cy", thresh: "$100K" },
    "Utah":             { cat: "cy", thresh: "$100K", note: "Dropped its 200-transaction test July 1, 2025 — revenue only now." },
    "Arizona":          { cat: "cy", thresh: "$100K" },
    "Montana":          { cat: "nt", thresh: "No sales tax" },
    "Wyoming":          { cat: "cy", thresh: "$100K", note: "Dropped its 200-transaction test July 1, 2024 — revenue only now." },
    "Colorado":         { cat: "cy", thresh: "$100K" },
    "New Mexico":       { cat: "ye", thresh: "$100K" },
    "Texas":            { cat: "gr", thresh: "$500K" },
    "Oklahoma":         { cat: "cy", thresh: "$100K" },
    "Kansas":           { cat: "cy", thresh: "$100K" },
    "Nebraska":         { cat: "cy", thresh: "$100K / 200 txns" },
    "South Dakota":     { cat: "cy", thresh: "$100K", note: "Revenue only — the state that started the Wayfair case dropped its own 200-transaction test." },
    "North Dakota":     { cat: "cy", thresh: "$100K" },
    "Minnesota":        { cat: "gr", thresh: "$100K / 200 txns" },
    "Iowa":             { cat: "cy", thresh: "$100K" },
    "Missouri":         { cat: "gr", thresh: "$100K", note: "Effective Jan 1, 2023. Measured on a rolling 12-month lookback, checked at each quarter-end — not a calendar year." },
    "Arkansas":         { cat: "cy", thresh: "$100K / 200 txns" },
    "Louisiana":        { cat: "cy", thresh: "$100K", note: "200-transaction test repealed." },
    "Mississippi":      { cat: "gr", thresh: "$250K", note: "Highest threshold after CA/TX/NY — no transaction count." },
    "Alabama":          { cat: "ye", thresh: "$250K" },
    "Georgia":          { cat: "cy", thresh: "$100K / 200 txns" },
    "Florida":          { cat: "ye", thresh: "$100K" },
    "South Carolina":   { cat: "cy", thresh: "$100K" },
    "Tennessee":        { cat: "gr", thresh: "$100K" },
    "Kentucky":         { cat: "cy", thresh: "$100K / 200 txns" },
    "Wisconsin":        { cat: "cy", thresh: "$100K" },
    "Illinois":         { cat: "gr", thresh: "$100K", note: "200-transaction test repealed Jan 1, 2026." },
    "Indiana":          { cat: "cy", thresh: "$100K", note: "200-transaction test repealed Jan 1, 2024." },
    "Michigan":         { cat: "ye", thresh: "$100K / 200 txns" },
    "Ohio":             { cat: "cy", thresh: "$100K / 200 txns" },
    "West Virginia":    { cat: "cy", thresh: "$100K / 200 txns" },
    "Pennsylvania":     { cat: "ye", thresh: "$100K" },
    "New York":         { cat: "pu", thresh: "$500K & 100 txns" },
    "New Jersey":       { cat: "cy", thresh: "$100K / 200 txns" },
    "Delaware":         { cat: "nt", thresh: "No sales tax" },
    "Maryland":         { cat: "cy", thresh: "$100K / 200 txns" },
    "Virginia":         { cat: "cy", thresh: "$100K / 200 txns" },
    "North Carolina":   { cat: "cy", thresh: "$100K", note: "200-transaction test repealed 2024." },
    "District of Columbia": { cat: "cy", thresh: "$100K / 200 txns" },
    "Maine":            { cat: "cy", thresh: "$100K" },
    "New Hampshire":    { cat: "nt", thresh: "No sales tax" },
    "Vermont":          { cat: "gr", thresh: "$100K / 200 txns" },
    "Massachusetts":    { cat: "cy", thresh: "$100K" },
    "Rhode Island":     { cat: "ye", thresh: "$100K / 200 txns" },
    "Connecticut":      { cat: "gr", thresh: "$100K & 200 txns", note: "Both the revenue and transaction test must be met. Measured on the 12 months ending Sep 30 each year." },
    "Alaska":           { cat: "cy", thresh: "$100K", note: "No statewide tax; local jurisdictions apply this via the Remote Seller Sales Tax Commission. Its 200-transaction test was repealed Jan 1, 2025." },
    "Hawaii":           { cat: "cy", thresh: "$100K / 200 txns" }
  };
  // States that should count toward a category in the legend numbers without being
  // colored/highlighted as that category on the map (their own cat/thresh above still drives the map).
  var EXTRA_CAT_COUNTS = { nt: { extra: 1, note: "Alaska has no statewide sales tax; counted here, but shown on the map under its local economic nexus rule." } };

  var ABBR = {
    "Alabama": "AL", "Alaska": "AK", "Arizona": "AZ", "Arkansas": "AR", "California": "CA",
    "Colorado": "CO", "Connecticut": "CT", "Delaware": "DE", "District of Columbia": "DC",
    "Florida": "FL", "Georgia": "GA", "Hawaii": "HI", "Idaho": "ID", "Illinois": "IL",
    "Indiana": "IN", "Iowa": "IA", "Kansas": "KS", "Kentucky": "KY", "Louisiana": "LA",
    "Maine": "ME", "Maryland": "MD", "Massachusetts": "MA", "Michigan": "MI", "Minnesota": "MN",
    "Mississippi": "MS", "Missouri": "MO", "Montana": "MT", "Nebraska": "NE", "Nevada": "NV",
    "New Hampshire": "NH", "New Jersey": "NJ", "New Mexico": "NM", "New York": "NY",
    "North Carolina": "NC", "North Dakota": "ND", "Ohio": "OH", "Oklahoma": "OK", "Oregon": "OR",
    "Pennsylvania": "PA", "Rhode Island": "RI", "South Carolina": "SC", "South Dakota": "SD",
    "Tennessee": "TN", "Texas": "TX", "Utah": "UT", "Vermont": "VT", "Virginia": "VA",
    "Washington": "WA", "West Virginia": "WV", "Wisconsin": "WI", "Wyoming": "WY"
  };
  // States too small on the map to fit their full name legibly - abbreviation only.
  var COMPACT = { "Rhode Island": 1, "Delaware": 1, "Connecticut": 1, "New Jersey": 1,
    "Massachusetts": 1, "New Hampshire": 1, "Vermont": 1, "Maryland": 1,
    "District of Columbia": 1, "Hawaii": 1 };

  var root = document.getElementById("taxcart-nexus-root");
  var svg = d3.select(root.querySelector("#tc-svg"));
  var tooltip = root.querySelector("#tc-tooltip");
  var legendEl = root.querySelector("#tc-legend");
  var chipsEl = root.querySelector("#tc-chips");
  var detailEl = root.querySelector("#tc-detail");
  var mapCol = root.querySelector(".tc-map-col");

  // The one active highlight, whichever group it came from: { type: "cat"|"thresh", value: string } or null
  var lockedFilter = null;

  function catColor(catKey) {
    return getComputedStyle(root).getPropertyValue(
      catKey === "cy" ? "--tc-cat-cy" :
      catKey === "ye" ? "--tc-cat-ye" :
      catKey === "gr" ? "--tc-cat-gr" :
      catKey === "pu" ? "--tc-cat-pu" : "--tc-cat-nt"
    ).trim();
  }

  function renderLegend() {
    var counts = {};
    Object.keys(DATA).forEach(function (name) {
      var c = DATA[name].cat;
      counts[c] = (counts[c] || 0) + 1;
    });
    Object.keys(EXTRA_CAT_COUNTS).forEach(function (key) {
      counts[key] = (counts[key] || 0) + EXTRA_CAT_COUNTS[key].extra;
    });
    Object.keys(CATS).forEach(function (key) {
      var li = document.createElement("li");
      li.dataset.cat = key;
      var extra = EXTRA_CAT_COUNTS[key];
      li.title = extra ? extra.note : "";
      li.innerHTML =
        '<span class="tc-swatch" style="background:' + CATS[key].swatch + '"></span>' +
        '<span class="tc-label">' + CATS[key].label + '</span>' +
        '<span class="tc-count">' + (counts[key] || 0) + '</span>';
      li.addEventListener("mouseenter", function () { applyFilter({ type: "cat", value: key }); });
      li.addEventListener("mouseleave", function () { applyFilter(lockedFilter); });
      li.addEventListener("click", function () {
        var isThisLocked = lockedFilter && lockedFilter.type === "cat" && lockedFilter.value === key;
        lockedFilter = isThisLocked ? null : { type: "cat", value: key };
        applyFilter(lockedFilter);
      });
      legendEl.appendChild(li);
    });
  }

  function parseThreshValue(thresh) {
    var m = thresh.match(/\$([\d,.]+)\s*([KM]?)/i);
    if (!m) return -1; // e.g. "No sales tax" sinks to the bottom
    var num = parseFloat(m[1].replace(/,/g, ""));
    var mult = /M/i.test(m[2]) ? 1000000 : /K/i.test(m[2]) ? 1000 : 1;
    return num * mult;
  }

  function renderBreakdown() {
    var counts = {};
    Object.keys(DATA).forEach(function (name) {
      var t = DATA[name].thresh;
      counts[t] = (counts[t] || 0) + 1;
    });
    var order = Object.keys(counts).sort(function (a, b) {
      var diff = parseThreshValue(b) - parseThreshValue(a);
      if (diff !== 0) return diff;
      return b.length - a.length; // e.g. "$500K & 100 txns" before plain "$500K"
    });
    order.forEach(function (thresh) {
      var li = document.createElement("li");
      li.className = "tc-chip";
      li.dataset.thresh = thresh;
      var n = counts[thresh];
      li.innerHTML =
        '<span class="tc-chip-n">' + thresh + '</span>' +
        '<span class="tc-chip-count">' + n + ' state' + (n === 1 ? "" : "s") + '</span>';
      li.addEventListener("mouseenter", function () { applyFilter({ type: "thresh", value: thresh }); });
      li.addEventListener("mouseleave", function () { applyFilter(lockedFilter); });
      li.addEventListener("click", function () {
        var isThisLocked = lockedFilter && lockedFilter.type === "thresh" && lockedFilter.value === thresh;
        lockedFilter = isThisLocked ? null : { type: "thresh", value: thresh };
        applyFilter(lockedFilter);
      });
      chipsEl.appendChild(li);
    });
  }

  function applyFilter(filter) {
    legendEl.querySelectorAll("li").forEach(function (n) {
      var on = filter && filter.type === "cat" && n.dataset.cat === filter.value;
      n.classList.toggle("tc-active", !!on);
      n.classList.toggle("tc-locked", !!(lockedFilter && lockedFilter.type === "cat" && n.dataset.cat === lockedFilter.value));
    });
    chipsEl.querySelectorAll("li").forEach(function (n) {
      var on = filter && filter.type === "thresh" && n.dataset.thresh === filter.value;
      n.classList.toggle("tc-active", !!on);
    });
    svg.selectAll("path.tc-state").each(function (d) {
      var name = d && d.properties ? d.properties.name : null;
      var info = name ? DATA[name] : null;
      var el = d3.select(this);
      if (!filter) { el.classed("tc-dim", false).classed("tc-hi", false); return; }
      var match = info && (filter.type === "cat" ? info.cat === filter.value : info.thresh === filter.value);
      el.classed("tc-dim", !match).classed("tc-hi", match);
    });
    svg.selectAll("g.tc-label").each(function (d) {
      var name = d && d.properties ? d.properties.name : (this.getAttribute ? this.getAttribute("data-name") : null);
      var info = name ? DATA[name] : null;
      var el = d3.select(this);
      if (!filter) { el.classed("tc-dim", false); return; }
      var match = info && (filter.type === "cat" ? info.cat === filter.value : info.thresh === filter.value);
      el.classed("tc-dim", !match);
    });
  }

  function showDetail(name, info) {
    if (!info) { detailEl.innerHTML = '<p class="tc-d-empty">No data for ' + name + '.</p>'; return; }
    detailEl.innerHTML =
      '<p class="tc-d-state">' + name + '</p>' +
      '<p class="tc-d-cat">' + CATS[info.cat].label + '</p>' +
      '<p class="tc-d-thresh">' + info.thresh + '</p>' +
      (info.note ? '<p class="tc-d-note">' + info.note + '</p>' : '');
  }

  function resetDetail() {
    detailEl.innerHTML = '<p class="tc-d-empty">Hover any state on the map to see its nexus rule here.</p>';
  }

  renderLegend();
  renderBreakdown();

  d3.json("https://cdn.jsdelivr.net/npm/us-atlas@3/states-10m.json").then(function (us) {
    var topojson = window.topojson;
    if (!topojson) {
      var s = document.createElement("script");
      s.src = "https://d3js.org/topojson.v3.min.js";
      s.onload = function () { draw(us); };
      document.head.appendChild(s);
    } else {
      draw(us);
    }
  }).catch(function (err) {
    mapCol.innerHTML = '<p style="font-size:13px;color:#8a3b3b;">Map data failed to load (' + err + '). Check that this page can reach cdn.jsdelivr.net.</p>';
  });

  function draw(us) {
    var topojson = window.topojson;
    var states = topojson.feature(us, us.objects.states);
    var projection = d3.geoAlbersUsa().fitSize([960, 580], states);
    var path = d3.geoPath().projection(projection);

    svg.selectAll("path.tc-state")
      .data(states.features)
      .join("path")
      .attr("class", "tc-state")
      .attr("d", path)
      .attr("fill", function (d) {
        var info = DATA[d.properties.name];
        return info ? catColor(info.cat) : "#e4e0d5";
      })
      .on("mousemove", function (event, d) {
        var info = DATA[d.properties.name];
        var box = mapCol.getBoundingClientRect();
        tooltip.style.left = (event.clientX - box.left) + "px";
        tooltip.style.top = (event.clientY - box.top) + "px";
        tooltip.style.opacity = 1;
        tooltip.innerHTML = "<strong>" + d.properties.name + "</strong> &nbsp; " + (info ? info.thresh : "n/a");
      })
      .on("mouseenter", function (event, d) {
        var info = DATA[d.properties.name];
        if (!lockedFilter) {
          svg.selectAll("path.tc-state").classed("tc-dim", true).classed("tc-hi", false);
          d3.select(this).classed("tc-dim", false).classed("tc-hi", true);
          svg.selectAll("g.tc-label").classed("tc-dim", function (ld) {
            return !ld || ld.properties.name !== d.properties.name;
          });
        }
        showDetail(d.properties.name, info);
      })
      .on("mouseleave", function () {
        tooltip.style.opacity = 0;
        if (!lockedFilter) {
          svg.selectAll("path.tc-state").classed("tc-dim", false).classed("tc-hi", false);
          svg.selectAll("g.tc-label").classed("tc-dim", false);
          resetDetail();
        }
      });

    var labelLayer = svg.append("g").attr("class", "tc-labels");
    var labelGroups = labelLayer.selectAll("g.tc-label")
      .data(states.features)
      .join("g")
      .attr("class", "tc-label")
      .attr("data-name", function (d) { return d.properties.name; })
      .attr("transform", function (d) {
        var c = path.centroid(d);
        return "translate(" + c[0] + "," + c[1] + ")";
      });

    labelGroups.each(function (d) {
      var name = d.properties.name;
      var abbr = ABBR[name] || "";
      var g = d3.select(this);
      if (COMPACT[name]) {
        g.append("text").attr("class", "tc-label-abbr").attr("dy", "0.32em").text(abbr);
      } else {
        g.append("text").attr("class", "tc-label-abbr").attr("dy", "-0.05em").text(abbr);
        g.append("text").attr("class", "tc-label-name").attr("dy", "1.05em").text(name);
      }
    });
  }
})();
</script></div>
</div><div data-element-id="elm_ddZIFYowRuyA-CGbYs4rYQ" data-element-type="button" class="zpelement zpelem-button "><style></style><div class="zpbutton-container zpbutton-align-center zpbutton-align-mobile-center zpbutton-align-tablet-center"><style type="text/css"></style><a class="zpbutton-wrapper zpbutton zpbutton-type-primary zpbutton-size-md " href="javascript:;" target="_blank"><span class="zpbutton-content">Get Started Now</span></a></div>
</div></div></div></div></div></div> ]]></content:encoded><pubDate>Thu, 01 Jan 2026 06:01:00 +0000</pubDate></item></channel></rss>