<style>
.gra2-wrap { font-family: system-ui, -apple-system, Segoe UI, Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif; }
.gra2-badge { display: inline-block; font-size: 0.75rem; padding: 2px 6px; border-radius: 999px; border: 1px solid #d4b106; margin-left: 6px; }
.gra2-table { width: 100%; border-collapse: collapse; }
.gra2-table th, .gra2-table td { padding: 10px 12px; border-bottom: 1px solid #e5e7eb; text-align: left; vertical-align: top; }
.gra2-table th { cursor: pointer; user-select: none; white-space: nowrap; }
.gra2-table tr[data-foundation="yes"] td { background: #fffdf2; } /* subtle highlight */
.gra2-table tr:hover td { background: #fafafa; }
@media (max-width: 640px) {
.gra2-table td, .gra2-table th { padding: 8px 10px; }
}
</style>
<div class="gra2-wrap">
<table class="gra2-table" id="gra2Table">
<thead>
<tr>
<th data-col="0">Country/Region ▾</th>
<th data-col="1">Entity</th>
</tr>
</thead>
<tbody>
<!-- Rows are alphabetized by Country/Region for easy editing -->
<tr data-foundation="yes">
<td>Americas</td><td>National Association of Real Estate Investment Trusts (NAREIT) <span class="gra2-badge">Foundation member</span></td>
</tr>
<tr data-foundation="yes">
<td>Asia Pacific</td><td>Asia Pacific Real Assets Association (APREA) <span class="gra2-badge">Foundation member</span></td>
</tr>
<tr data-foundation="no">
<td>Brazil</td><td>Brazilian REIT Alliance</td>
</tr>
<tr data-foundation="yes">
<td>Canada</td><td>Real Property Association of Canada (REALPAC) <span class="gra2-badge">Foundation member</span></td>
</tr>
<tr data-foundation="no">
<td>Belgium</td><td>Belgium REIT Association</td>
</tr>
<tr data-foundation="no">
<td>China</td><td>China REITs Alliance</td>
</tr>
<tr data-foundation="no">
<td>China</td><td>China REITs Forum (Shanghai REITs Institute)</td>
</tr>
<tr data-foundation="yes">
<td>Europe</td><td>European Public Real Estate Association (EPRA) <span class="gra2-badge">Foundation member</span></td>
</tr>
<tr data-foundation="no">
<td>France</td><td>Fédération des Sociétés Immobilières et Foncières (FSIF)</td>
</tr>
<tr data-foundation="no">
<td>Germany</td><td>German Property Federation (ZIA)</td>
</tr>
<tr data-foundation="no">
<td>India</td><td>India REIT Association</td>
</tr>
<tr data-foundation="no">
<td>Ireland</td><td>Irish Institutional Property</td>
</tr>
<tr data-foundation="no">
<td>Israel</td><td>Israel Real Estate Forum</td>
</tr>
<tr data-foundation="yes">
<td>Japan</td><td>Association of Real Estate Securitisation (ARES) <span class="gra2-badge">Foundation member</span></td>
</tr>
<tr data-foundation="no">
<td>Kenya</td><td>REITs Association of Kenya</td>
</tr>
<tr data-foundation="no">
<td>Mexico</td><td>Mexican Association of Real Estate FIBRAs (AMEFIBRA)</td>
</tr>
<tr data-foundation="no">
<td>Netherlands</td><td>FBI REIT Association (FBI)</td>
</tr>
<tr data-foundation="no">
<td>Poland</td><td>REIT Polska Association</td>
</tr>
<tr data-foundation="no">
<td>Portugal</td><td>Portuguese Association of Real Estate Developers and Investors (APPII)</td>
</tr>
<tr data-foundation="no">
<td>Romania</td><td>Romanian Association of Real Estate Investors</td>
</tr>
<tr data-foundation="no">
<td>South Africa</td><td>South African REIT Association (SAREIT)</td>
</tr>
<tr data-foundation="no">
<td>Sweden</td><td>Fastighetsägarna</td>
</tr>
<tr data-foundation="yes">
<td>United Kingdom</td><td>British Property Federation (BPF) <span class="gra2-badge">Foundation member</span></td>
</tr>
<tr data-foundation="yes">
<td>Australia</td><td>Property Council of Australia <span class="gra2-badge">Foundation member</span></td>
</tr>
</tbody>
</table>
</div>
<script>
(function(){
const table = document.getElementById('gra2Table');
const getText = (cell) => (cell?.textContent || '').trim().toLowerCase();
let sort = { col: 0, dir: 1 }; // start by Country asc
function sortBy(colIdx){
const tbody = table.tBodies[0];
const rows = Array.from(tbody.querySelectorAll('tr'));
if (sort.col === colIdx) { sort.dir *= -1; } else { sort.col = colIdx; sort.dir = 1; }
rows.sort((a,b)=>{
const A = getText(a.children[colIdx]);
const B = getText(b.children[colIdx]);
return A.localeCompare(B) * sort.dir;
});
rows.forEach(r => tbody.appendChild(r));
// header indicators
table.querySelectorAll('th').forEach((th,i)=>{
th.textContent = th.textContent.replace(/[\s▾▴]+$/,'');
if (i === colIdx) th.textContent += sort.dir === 1 ? ' ▾' : ' ▴';
});
}
// attach click handlers
table.querySelectorAll('th').forEach(th => {
th.addEventListener('click', () => sortBy(Number(th.dataset.col)));
});
// initial indicator (already alphabetized in HTML)
table.querySelector('th[data-col="0"]').textContent += ' ▾';
})();
</script>