// tgp-community.jsx v3 — Ontdekken dark tile + clean community tiles

// ─── Community tile (clean, no bg image) ──────────────────────────────────
const CommunityTile = ({ name, members, maxMembers, scope, mode, themes, cost, img, creator, active, onClick, dark }) => {
  const scopeColors = { 'Lokaal':'#6B8F6F', 'Nationaal':'#4A7EC4', 'Internationaal':'#C86B4B' };
  const col = scopeColors[scope] || '#6B8F6F';
  return (
    <div onClick={onClick} style={{
      borderRadius:16, overflow:'hidden', cursor:'pointer',
      background: dark ? 'rgba(255,255,255,0.09)' : 'rgba(116,116,128,0.08)',
      border: dark ? '1px solid rgba(255,255,255,0.11)' : '1px solid rgba(116,116,128,0.08)',
    }}>
      {/* Creator-chosen image */}
      <div style={{ width:'100%', height:72, overflow:'hidden', flexShrink:0, background: dark ? 'rgba(255,255,255,0.06)' : 'rgba(116,116,128,0.1)' }}>
        {img && <img src={img} alt="" style={{ width:'100%', height:'100%', objectFit:'cover' }} />}
      </div>

      <div style={{ padding:'10px 11px 12px' }}>
        {/* Name */}
        <div style={{ display:'flex', alignItems:'flex-start', gap:5, marginBottom:5 }}>
          {active != null && active && <div style={{ width:7, height:7, borderRadius:'50%', background:'#34C759', flexShrink:0, marginTop:3 }} />}
          <span style={{ fontSize:12.5, fontWeight:700, color: dark ? '#fff' : '#020100', fontFamily:'Inter,system-ui,sans-serif', letterSpacing:'-0.2px', lineHeight:1.3 }}>{name}</span>
        </div>

        {/* Scope + mode chips */}
        <div style={{ display:'flex', gap:4, flexWrap:'wrap', marginBottom:7 }}>
          <span style={{ fontSize:10, padding:'2px 7px', borderRadius:999, fontFamily:'Inter,system-ui,sans-serif', fontWeight:600, background: dark ? 'rgba(255,255,255,0.14)' : `${col}18`, color: dark ? 'rgba(255,255,255,0.75)' : col }}>{scope}</span>
          <span style={{ fontSize:10, padding:'2px 7px', borderRadius:999, fontFamily:'Inter,system-ui,sans-serif', fontWeight:500, background: dark ? 'rgba(255,255,255,0.08)' : 'rgba(116,116,128,0.1)', color: dark ? 'rgba(255,255,255,0.5)' : '#8E8E93' }}>{mode==='Beide'?'Online & Fysiek':mode}</span>
        </div>

        {/* Members + cost */}
        <div style={{ display:'flex', alignItems:'center', gap:4, marginBottom:7 }}>
          <Ico.Users size={10} color={dark ? 'rgba(255,255,255,0.38)' : '#C7C7CC'} />
          <span style={{ fontSize:11, color: dark ? 'rgba(255,255,255,0.55)' : '#8E8E93', fontFamily:'Inter,system-ui,sans-serif' }}>
            {members}{maxMembers ? `/${maxMembers}` : ''} leden
          </span>
          <span style={{ marginLeft:'auto', fontSize:11, fontWeight:600, color: dark ? (cost?'rgba(255,255,255,0.65)':'rgba(134,239,172,0.8)') : (cost?'#8E8E93':'#34C759'), fontFamily:'Inter,system-ui,sans-serif' }}>
            {cost ? `€${cost}/mnd` : 'Gratis'}
          </span>
        </div>

        {/* Themes */}
        <div style={{ display:'flex', gap:4, flexWrap:'wrap' }}>
          {themes.slice(0,2).map(t=>(
            <span key={t} style={{ fontSize:9.5, padding:'2px 6px', borderRadius:999, fontFamily:'Inter,system-ui,sans-serif', background: dark ? 'rgba(255,255,255,0.07)' : 'rgba(116,116,128,0.1)', color: dark ? 'rgba(255,255,255,0.4)' : '#8E8E93' }}>{t}</span>
          ))}
          {themes.length > 2 && <span style={{ fontSize:9.5, color: dark ? 'rgba(255,255,255,0.3)' : '#C7C7CC', fontFamily:'Inter,system-ui,sans-serif', alignSelf:'center' }}>+{themes.length-2}</span>}
        </div>
      </div>
    </div>
  );
};

// ─── Chevron icon for expand/collapse ─────────────────────────────────────
const ChevronIcon = ({ open, color='currentColor' }) => (
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke={color} strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round"
    style={{ transform: open ? 'rotate(180deg)' : 'rotate(0deg)', transition:'transform 0.2s' }}>
    <polyline points="6 9 12 15 18 9"/>
  </svg>
);

// ─── Ontdekken section (dark) ──────────────────────────────────────────────
const OntdekkenSection = ({ onDetail }) => {
  const [sectionOpen, setSectionOpen] = React.useState(true);
  const [catOpen,  setCatOpen]  = React.useState(false);
  const [modeOpen, setModeOpen] = React.useState(false);
  const [selCats,  setSelCats]  = React.useState([]);
  const [selMode,  setSelMode]  = React.useState(null);

  const CATS = [
    'Bewustzijn','Duurzaamheid','Gezondheid','Spiritualiteit','Voeding',
    'Creativiteit','Natuur','Gemeenschap','Onderwijs','Technologie',
    'Economie','Kunst','Beweging','Meditatie','Verbinding',
    'Permacultuur','Filosofie','Welzijn','Sociale rechtvaardigheid','Zingeving',
  ];
  const MODES = ['Online','Fysiek','Allebei'];

  const toggleCat = (c) => setSelCats(s => s.includes(c) ? s.filter(x=>x!==c) : [...s,c]);

  const discover = [
    { name:'Meditatie Thuis',        members:124, maxMembers:300,  scope:'Nationaal',      mode:'Online', themes:['Meditatie','Welzijn','Stilte'],            cost:null, img:IMG.cMeditatie,   creator:'Sara Ahmed'  },
    { name:'Tinyhouse Nederland',    members:287, maxMembers:500,  scope:'Nationaal',      mode:'Beide',  themes:['Bouwen','Duurzaamheid','Minimalisme'],     cost:8,    img:IMG.cTinyhouse,   creator:'Jelle' },
    { name:'Holacracy Ondernemen',   members:94,  maxMembers:null, scope:'Nationaal',      mode:'Online', themes:['Organisatie','Economie','Governance'],      cost:null, img:IMG.cHolacracy,   creator:'Joep'  },
    { name:'Wildkampeer NL',         members:198, maxMembers:300,  scope:'Internationaal', mode:'Fysiek', themes:['Outdoor','Natuur','Avontuur'],              cost:15,   img:IMG.cWildkampeer, creator:'Melissa'},
    { name:'Homeschool Creatief',    members:67,  maxMembers:120,  scope:'Nationaal',      mode:'Beide',  themes:['Onderwijs','Creativiteit','Gezin'],         cost:6,    img:IMG.cCreatief,    creator:'Eva Smit'    },
    { name:'Bushcraft Collectief',   members:142, maxMembers:null, scope:'Nationaal',      mode:'Fysiek', themes:['Survival','Natuur','Outdoor'],              cost:null, img:IMG.cBushcraft,   creator:'Kees Jan'},
  ];

  const filtered = discover.filter(c => {
    const catMatch  = selCats.length === 0 || c.themes.some(t => selCats.includes(t));
    const modeMatch = !selMode || selMode==='Allebei' || c.mode===selMode || c.mode==='Beide';
    return catMatch && modeMatch;
  });

  const FilterRow = ({ label, open, onToggle, children }) => (
    <div style={{ marginBottom: open ? 12 : 8 }}>
      <button onClick={onToggle} style={{
        display:'flex', alignItems:'center', justifyContent:'space-between', width:'100%',
        background:'rgba(255,255,255,0.1)', border:'1px solid rgba(255,255,255,0.14)',
        borderRadius:12, padding:'10px 14px', cursor:'pointer', color:'#fff',
        fontFamily:'Inter,system-ui,sans-serif', fontSize:13, fontWeight:600,
        marginBottom: open ? 10 : 0,
      }}>
        <span>{label}{(label==='Categorie' && selCats.length>0) ? ` (${selCats.length})` : ''}{(label==='Online / Fysiek' && selMode) ? `: ${selMode}` : ''}</span>
        <ChevronIcon open={open} color="rgba(255,255,255,0.7)" />
      </button>
      {open && children}
    </div>
  );

  return (
    <div style={{ margin:'0 16px 24px', background:'linear-gradient(160deg,#1A1A1A 0%,#020100 100%)', borderRadius:24, padding: sectionOpen ? '18px 16px 20px' : '18px 16px', overflow:'hidden' }}>
      {/* Header (clickable to collapse/expand) */}
      <button onClick={()=>setSectionOpen(v=>!v)} style={{
        display:'flex', alignItems:'center', justifyContent:'space-between', width:'100%',
        background:'none', border:'none', padding:0, cursor:'pointer', textAlign:'left',
        marginBottom: sectionOpen ? 16 : 0,
      }}>
        <div>
          <h2 style={{ fontFamily:'"Instrument Serif",Georgia,serif', fontWeight:400, fontSize:30, color:'#fff', margin:'0 0 4px', letterSpacing:'-0.5px', lineHeight:1 }}>Ontdekken</h2>
          <p style={{ fontSize:13, color:'rgba(255,255,255,0.48)', fontFamily:'Inter,system-ui,sans-serif', margin:0 }}>Vind jouw volgende community</p>
        </div>
        <span style={{
          width:40, height:40, borderRadius:'50%',
          background:'rgba(255,255,255,0.12)',
          border:'1px solid rgba(255,255,255,0.22)',
          display:'flex', alignItems:'center', justifyContent:'center',
          flexShrink:0, transition:'background 0.2s',
          boxShadow:'0 2px 8px rgba(0,0,0,0.15), inset 0 1px 0 rgba(255,255,255,0.18)',
        }}>
          <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="#fff" strokeWidth="2.6" strokeLinecap="round" strokeLinejoin="round"
            style={{ transform: sectionOpen ? 'rotate(180deg)' : 'rotate(0deg)', transition:'transform 0.25s' }}>
            <polyline points="6 9 12 15 18 9"/>
          </svg>
        </span>
      </button>

      {sectionOpen && <>
      {/* Filters */}
      <FilterRow label="Categorie" open={catOpen} onToggle={()=>setCatOpen(v=>!v)}>
        <div style={{ display:'flex', flexWrap:'wrap', gap:6 }}>
          {CATS.map(c=>(
            <button key={c} onClick={()=>toggleCat(c)} style={{
              fontSize:11, padding:'5px 11px', borderRadius:999, border:'none', cursor:'pointer',
              fontFamily:'Inter,system-ui,sans-serif', fontWeight:selCats.includes(c)?700:400,
              background: selCats.includes(c) ? '#fff' : 'rgba(255,255,255,0.1)',
              color: selCats.includes(c) ? '#020100' : 'rgba(255,255,255,0.65)',
              transition:'background 0.15s, color 0.15s',
            }}>{c}</button>
          ))}
        </div>
      </FilterRow>

      <FilterRow label="Online / Fysiek" open={modeOpen} onToggle={()=>setModeOpen(v=>!v)}>
        <div style={{ display:'flex', gap:8 }}>
          {MODES.map(m=>(
            <button key={m} onClick={()=>setSelMode(selMode===m?null:m)} style={{
              flex:1, padding:'9px 0', borderRadius:12, border:'none', cursor:'pointer',
              fontFamily:'Inter,system-ui,sans-serif', fontSize:12, fontWeight:selMode===m?700:400,
              background: selMode===m ? '#fff' : 'rgba(255,255,255,0.1)',
              color: selMode===m ? '#020100' : 'rgba(255,255,255,0.65)',
              transition:'background 0.15s, color 0.15s',
            }}>{m}</button>
          ))}
        </div>
      </FilterRow>

      {/* Community tiles */}
      <div style={{ display:'grid', gridTemplateColumns:'1fr 1fr', gap:10, marginTop:4 }}>
        {filtered.map(c=>(
          <CommunityTile key={c.name} {...c} dark={true} onClick={()=>onDetail(c)} />
        ))}
      </div>
      {filtered.length===0 && (
        <div style={{ textAlign:'center', padding:'24px 0 8px', color:'rgba(255,255,255,0.35)', fontSize:13, fontFamily:'Inter,system-ui,sans-serif' }}>Geen communities gevonden</div>
      )}
      </>}
    </div>
  );
};

// ─── Community list page ───────────────────────────────────────────────────
const CommunityPage = ({ onDetail }) => {
  const mine = [
    { name:'OBE Nederland',          members:186, maxMembers:250,  scope:'Nationaal',       mode:'Beide',  themes:['Bewustzijn','Spiritualiteit','Meditatie'], cost:null, img:IMG.cOBE,        creator:'Kees Jan', active:true  },
    { name:'Holacracy Ondernemen',   members:94,  maxMembers:150,  scope:'Nationaal',       mode:'Online', themes:['Organisatie','Economie'],                   cost:5,    img:IMG.cHolacracy,  creator:'Joep',    active:true  },
    { name:'Homeschooling NL',       members:234, maxMembers:null, scope:'Nationaal',       mode:'Online', themes:['Onderwijs','Gezin'],                        cost:null, img:IMG.cHomeschool, creator:'Melissa', active:true  },
    { name:'4x4 Off-road NL',        members:312, maxMembers:500,  scope:'Internationaal',  mode:'Fysiek', themes:['Avontuur','Outdoor','Techniek'],            cost:12,   img:IMG.cOffroad,    creator:'Eva Smit',      active:true  },
    { name:'Eigen Gym Bouwen',       members:67,  maxMembers:100,  scope:'Lokaal',          mode:'Beide',  themes:['Sport','Bouwen','Gezondheid'],              cost:null, img:IMG.cGym,        creator:'Jelle',   active:false },
    { name:'Tinyhouse Nederland',    members:98,  maxMembers:null, scope:'Nationaal',       mode:'Beide',  themes:['Bouwen','Duurzaamheid'],                    cost:null, img:IMG.cTinyhouse,  creator:'Sara Ahmed',    active:true  },
  ];

  return (
    <div style={{ paddingBottom:120 }}>
      {/* Ontdekken dark section */}
      <OntdekkenSection onDetail={onDetail} />

      {/* Jouw communities */}
      <div style={{ padding:'0 16px' }}>
        {/* Stats */}
        <div style={{ display:'flex', gap:10, marginBottom:20 }}>
          {[['6','Communities'],['12','Verzoeken'],['1056','Archief']].map(([n,l])=>(
            <div key={l} style={{ flex:1, background:'rgba(116,116,128,0.08)', borderRadius:16, padding:'12px 8px', textAlign:'center' }}>
              <div style={{ fontFamily:'"Instrument Serif",Georgia,serif', fontWeight:400, fontSize:28, color:'#020100', letterSpacing:'-0.4px', lineHeight:1 }}>{n}</div>
              <MetaLabel style={{ marginTop:3, display:'block', textAlign:'center' }}>{l}</MetaLabel>
            </div>
          ))}
        </div>

        {/* Title italic serif */}
        <div style={{ display:'flex', alignItems:'center', justifyContent:'space-between', marginBottom:14 }}>
          <h3 style={{ fontFamily:'"Instrument Serif",Georgia,serif', fontWeight:400, fontSize:24, color:'#020100', margin:0, letterSpacing:'-0.3px', lineHeight:1 }}>Jouw communities</h3>
          <button style={{ border:'none', background:'none', color:'var(--accent,#007AFF)', fontSize:13, fontWeight:600, cursor:'pointer', fontFamily:'Inter,system-ui,sans-serif', padding:0 }}>Alles</button>
        </div>

        {/* Community grid */}
        <div style={{ display:'grid', gridTemplateColumns:'1fr 1fr', gap:12, marginBottom:16 }}>
          {mine.map(c=>(
            <CommunityTile key={c.name} {...c} dark={false}
              onClick={()=>onDetail(c)} />
          ))}
        </div>

        <button style={{ width:'100%', padding:'14px 0', borderRadius:16, border:'1.5px dashed rgba(116,116,128,0.3)', background:'transparent', color:'#8E8E93', fontSize:14, fontWeight:500, cursor:'pointer', fontFamily:'Inter,system-ui,sans-serif', display:'flex', alignItems:'center', justifyContent:'center', gap:6 }}>
          <Ico.Plus size={16} /> Nieuwe community starten
        </button>
      </div>
    </div>
  );
};

// ─── Community content map (per-community feed, forum, practicals, info) ──
const makePractical = (id, overrides) => ({
  id,
  type:'Knowledge', status:'new',
  papers:[
    { left:'8%',  top:'3%', rotate:-7, badge:'check', kind:'todos', todos:[{ text:'Eerste stap', done:true },{ text:'Voorbereiden', done:false },{ text:'Delen', done:false }] },
    { left:'32%', top:'2%', rotate:4,  badge:null,    kind:'media', media:['Document','Foto','Link'] },
  ],
  ...overrides,
});

const COMMUNITY_CONTENT = {
  'OBE Nederland': {
    description:'OBE Nederland verbindt mensen die bewustzijn willen exploreren — van eerste ademwerk tot gedeelde astrale reizen. Praktijk-gericht, nuchter, zonder dogma.',
    founded:'mrt 2023',
    contact:[[Ico.Globe,'obenederland.nl'],[Ico.Mail,'info@obenederland.nl'],[Ico.Link,'@OBENederland']],
    feed:[
      { id:1, avatar:IMG.lisa, name:'Kees Jan', time:'2u', type:'text',   text:'Wie wil meedoen met de volgende begeleide OBE-sessie? We starten zaterdag om 20:00 online met ademwerk en body scan.', counts:[4,2,1] },
      { id:2, avatar:IMG.tom,  name:'Joep',    time:'5u', type:'images', text:'Eerste lucide reis deze week — belangrijkste inzicht: vertrouwen laten winnen van angst. Wie herkent dit?', images:[IMG.cOBE, IMG.nature], counts:[18,3,5] },
      { id:3, avatar:IMG.nina, name:'Melissa', time:'1d', type:'quote',  text:'Iets om mee te nemen:', quote:'Het lichaam is de poort, niet de grens.', by:'Robert Monroe', counts:[7,1,2] },
      { id:4, avatar:IMG.sara, name:'Sara Ahmed',    time:'2d', type:'video',  text:'Terugblik op onze workshop "Vibratiestadium herkennen" — 24 deelnemers en veel aha-momenten.', videoSrc:IMG.cOBE, videoDuration:'3:20', counts:[12,5,3] },
    ],
    forum:[
      { cat:'Aankondiging', title:'📢 Begeleide OBE-sessie zaterdag 20:00', excerpt:'Online via Zoom — ademwerk, body scan en een eerste exit-oefening. Beginners welkom, we nemen het rustig.', a:'Sara', src:IMG.sara, t:'2u', replies:23, score:142, flair:'Pinned', thumb:IMG.cOBE },
      { cat:'Poll',         title:'Welke techniek werkt het beste voor jullie eerste keer?', a:'Joep', src:IMG.tom, t:'4u', replies:48, score:87,
        poll:{ total:68, options:[{ label:'Rope technique (Monroe)', votes:29 },{ label:'Phase-shift (Raduga)', votes:22 },{ label:'Ademhaling + trillingen', votes:12 },{ label:'WILD (wake-induced)', votes:5 }] } },
      { cat:'Vraag',        title:'Sleep paralysis — hoe blijven jullie kalm?', excerpt:'Kom er bijna doorheen maar de angst trekt me terug. Iemand tips om te ontspannen in dat moment zonder wakker te worden?', a:'Kees Jan', src:IMG.lisa, t:'3u', replies:12, score:34 },
      { cat:'Discussie',    title:'Hoe weet je of het echt een OBE was of een levendige droom?', excerpt:'Vraag me al een tijdje af wat betrouwbare markers zijn. Controle, hyper-realisme, veto-effect — wat nemen jullie als anker?', a:'Jelle', src:IMG.mark, t:'1d', replies:41, score:28 },
    ],
    practicals:[
      makePractical(1,{ title:'Eerste OBE-poging',         manifest:'Lichaam loslaten, adem volgen, angst observeren.',       count:7, type:'Building', creator:'Kees Jan', creatorImg:IMG.lisa }),
      makePractical(2,{ title:'Vibratiestadium herkennen', manifest:'Signalen in je lichaam lezen, niet paniek krijgen.',     count:4, status:'done', creator:'Joep',  creatorImg:IMG.tom  }),
      makePractical(3,{ title:'OBE-journaal bijhouden',    manifest:'Snel vastleggen voordat details vervagen.',              count:5, creator:'Sara', creatorImg:IMG.sara }),
      makePractical(4,{ title:'Sleep paralysis ontspannen',manifest:'Doorwerken in plaats van wakker worden.',                 count:6, creator:'Melissa', creatorImg:IMG.nina }),
    ],
  },

  'Holacracy Ondernemen': {
    description:'Voor ondernemers die zelf-organisatie willen toepassen in hun bedrijf. Rollen, spanningen, governance — praktisch geleerd uit échte praktijk.',
    founded:'jun 2023',
    contact:[[Ico.Globe,'holacracyonderneem.nl'],[Ico.Mail,'info@holacracyonderneem.nl'],[Ico.Link,'@HolacracyOnd']],
    feed:[
      { id:1, avatar:IMG.tom,  name:'Joep',      time:'1u', type:'text',   text:'Net een rol-evolutie sessie afgerond — 3 spanningen omgezet naar nieuwe accountabilities. Kleine stappen, groot effect.', counts:[8,2,4] },
      { id:2, avatar:IMG.sara, name:'Sara Ahmed',      time:'6u', type:'quote',  text:'Dit bleef hangen deze week:', quote:'Je haalt geen besluit door consensus, maar door afwezigheid van bezwaren.', by:'Brian Robertson', counts:[15,4,3] },
      { id:3, avatar:IMG.mark, name:'Jelle',     time:'1d', type:'images', text:'Eerste circle meeting met nieuwe tooling — werkt veel soepeler dan ons oude stand-up format.', images:[IMG.cHolacracy, IMG.meeting], counts:[22,6,2] },
    ],
    forum:[
      { cat:'Vraag',        title:'Hoe ga je om met een lead link die niet meebeweegt?', excerpt:'Onze lead link houdt vast aan de oude manier van werken. Iemand hier ervaring met dit patroon?', a:'Joep', src:IMG.tom, t:'3u', replies:21, score:67 },
      { cat:'Resource',     title:'Template: check-in vragen die écht werken (10 stuks)', excerpt:'Bundeling uit 2 jaar circles — varieer ze elke week zodat het fris blijft.', a:'Sara', src:IMG.sara, t:'1d', replies:8, score:91, flair:'Pinned' },
      { cat:'Idee',         title:'Voorstel: maandelijkse "rol-speed-date" voor onderlinge feedback', excerpt:'15 min per koppel, kort en scherp. Wie wil pilot draaien?', a:'Melissa', src:IMG.nina, t:'2d', replies:14, score:38 },
      { cat:'Discussie',    title:'Holacracy vs. Sociocracy 3.0 — wat gebruiken jullie?', excerpt:'Lezen ons in op beide. Praktijkervaringen welkom.', a:'Jelle', src:IMG.mark, t:'3d', replies:32, score:45 },
    ],
    practicals:[
      makePractical(1,{ title:'Tactical meeting draaien',    manifest:'Spanningen door, beslissingen snel, iedereen gehoord.',   count:6, creator:'Joep',  creatorImg:IMG.tom,  status:'done' }),
      makePractical(2,{ title:'Rollen helder schrijven',     manifest:'Purpose, accountabilities, domein — concreet formuleren.', count:5, creator:'Sara', creatorImg:IMG.sara }),
      makePractical(3,{ title:'Governance meeting',          manifest:'Regels bijstellen zonder ruzie — via voorstellen en objecties.', count:7, type:'Building', creator:'Jelle', creatorImg:IMG.mark }),
      makePractical(4,{ title:'Onboarding nieuw teamlid',    manifest:'Structuur uitleggen zonder dogma, warm ontvangen.',        count:4, creator:'Melissa', creatorImg:IMG.nina }),
    ],
  },

  'Homeschooling NL': {
    description:'Thuisonderwijs-gezinnen verenigd. Lesmodules, dagritme, sociale activiteiten en juridisch advies — zodat kinderen kunnen leren op hun eigen tempo.',
    founded:'feb 2023',
    contact:[[Ico.Globe,'homeschoolingnl.org'],[Ico.Mail,'info@homeschoolingnl.org'],[Ico.Link,'@HomeschoolNL']],
    feed:[
      { id:1, avatar:IMG.nina, name:'Melissa',   time:'3u', type:'text',   text:'Mijn zoon leest nu zelf een hoofdstuk per dag — voor het eerst zonder dat ik hoef te vragen. Kleine overwinning!', counts:[24,3,6] },
      { id:2, avatar:IMG.eva,  name:'Eva Smit',        time:'8u', type:'images', text:'Vandaag de natuur-les buiten gedaan. Bladeren sorteren, stokken tellen, wolken kijken. Beste "klas" ooit.', images:[IMG.cHomeschool, IMG.park], counts:[38,7,11] },
      { id:3, avatar:IMG.lisa, name:'Kees Jan',   time:'1d', type:'quote',  text:'Herinnering voor mezelf op zware dagen:', quote:'Kinderen leren niet minder als wij minder doen — ze leren anders.', by:'John Holt', counts:[19,4,2] },
    ],
    forum:[
      { cat:'Vraag',        title:'Welke wiskunde-methode kiezen jullie voor groep 5?', excerpt:'Zoek iets wat niet saai is maar ook niet te veel glitter. Ervaringen welkom.', a:'Melissa', src:IMG.nina, t:'2u', replies:27, score:58 },
      { cat:'Resource',     title:'Dagritme-template voor 2 kinderen (6 & 9 jaar)', excerpt:'Werkt bij ons al een jaar. Pas gerust aan naar eigen gezin.', a:'Eva', src:IMG.eva, t:'1d', replies:14, score:104, flair:'Pinned' },
      { cat:'Aankondiging', title:'📢 Meet-up in De Wilde Tuin, Utrecht — zo 11 mei', excerpt:'Ouders en kinderen welkom. Picknick, vrij spel, rondetafel-gesprek.', a:'Kees Jan', src:IMG.lisa, t:'2d', replies:32, score:87 },
      { cat:'Discussie',    title:'Juridisch — inspectie gehad, hoe was jullie ervaring?', excerpt:'Onze inspectie staat gepland. Wat kunnen we verwachten?', a:'Jelle', src:IMG.mark, t:'3d', replies:19, score:41 },
    ],
    practicals:[
      makePractical(1,{ title:'Dagritme bouwen',       manifest:'Gedragen structuur, ruimte voor eigen tempo.',                 count:4, creator:'Eva',  creatorImg:IMG.eva,  status:'done' }),
      makePractical(2,{ title:'Les Module 1 samenstellen', manifest:'Eigen werkboek — per kind op maat.',                       count:8, type:'Building', creator:'Melissa', creatorImg:IMG.nina }),
      makePractical(3,{ title:'Leren buiten',          manifest:'Natuur als klaslokaal — biologie, wiskunde, beweging.',         count:5, creator:'Kees Jan', creatorImg:IMG.lisa }),
      makePractical(4,{ title:'Portfolio bijhouden',   manifest:'Voor onszelf én voor de inspecteur — visueel en compleet.',     count:6, creator:'Jelle', creatorImg:IMG.mark }),
    ],
  },

  '4x4 Off-road NL': {
    description:'Voor 4x4-enthousiastelingen die routes, techniek en trips willen delen. Van Ardennen-weekenders tot Marokko-expedities — we helpen elkaar voorbereid op pad.',
    founded:'apr 2023',
    contact:[[Ico.Globe,'4x4offroadnl.nl'],[Ico.Mail,'info@4x4offroadnl.nl'],[Ico.Link,'@4x4OffroadNL']],
    feed:[
      { id:1, avatar:IMG.mark, name:'Jelle', time:'2u', type:'images', text:'Trip Ardennen was zwaar maar geweldig — 8 voertuigen, 48 uur, 6 routes. Mijn Defender draait nog precies zoals hij moet.', images:[IMG.cOffroad, IMG.nature], counts:[45,12,8] },
      { id:2, avatar:IMG.tom,  name:'Joep',  time:'8u', type:'text',   text:'Wie heeft ervaring met de nieuwe Maxxis Trepador? Overweeg upgrade voor komende zomer.', counts:[12,6,3] },
      { id:3, avatar:IMG.eva,  name:'Eva Smit',    time:'1d', type:'quote',  text:'Wat mijn vader altijd zei voor een trip:', quote:'De beste voorbereiding is niet angst, maar kennis van je machine.', by:'Volkswijsheid', counts:[18,3,2] },
    ],
    forum:[
      { cat:'Aankondiging', title:'🚗 Trip Eifel — 14–16 juni, nog 4 plekken', excerpt:'Twee dagen trails, één verhardings-dag voor conditie-check. Info en aanmelden in de pinned topic.', a:'Jelle', src:IMG.mark, t:'3u', replies:36, score:128, flair:'Pinned', thumb:IMG.cOffroad },
      { cat:'Vraag',        title:'Kraanstop vervangen op oudere Land Rover — tips?', excerpt:'Eerste keer zelf doen. Iemand die een stap-voor-stap heeft?', a:'Joep', src:IMG.tom, t:'6u', replies:19, score:42 },
      { cat:'Resource',     title:'Checklist voor solo-trips in Midden-Europa', excerpt:'Uitrusting, papieren, communicatie. Bewezen na 5 trips.', a:'Eva', src:IMG.eva, t:'2d', replies:11, score:78 },
      { cat:'Discussie',    title:'Wetgeving NL — waar mogen we nog wél off-road?', excerpt:'Voelt alsof het elk jaar strenger wordt. Wie heeft hier overzicht van?', a:'Melissa', src:IMG.nina, t:'3d', replies:54, score:29 },
    ],
    practicals:[
      makePractical(1,{ title:'Pre-trip voertuig-check',  manifest:'Niets aan het toeval overlaten — 30 min voor vertrek.',      count:7, type:'Building', creator:'Jelle', creatorImg:IMG.mark }),
      makePractical(2,{ title:'Recovery basics',          manifest:'Vast in modder of zand — zelf eruit of samen.',               count:5, creator:'Joep',  creatorImg:IMG.tom,  status:'done' }),
      makePractical(3,{ title:'Navigatie zonder signaal', manifest:'Offline kaarten, kompas en overleg-protocol.',                count:4, creator:'Eva',  creatorImg:IMG.eva }),
      makePractical(4,{ title:'Trip-planning template',   manifest:'Route, check-points, contingency — op één A4.',               count:6, creator:'Melissa', creatorImg:IMG.nina }),
    ],
  },

  'Eigen Gym Bouwen': {
    description:'Voor mensen die thuis of in het bos hun eigen gym bouwen. Calisthenics, functional, outdoor — we delen bouwplannen, materialen en oefeningen.',
    founded:'jul 2023',
    contact:[[Ico.Globe,'eigengym.nl'],[Ico.Mail,'hallo@eigengym.nl'],[Ico.Link,'@EigenGymBouwen']],
    feed:[
      { id:1, avatar:IMG.lisa, name:'Kees Jan', time:'1u', type:'images', text:'Pull-up bar tussen twee bomen — 250 kg belasting getest. Kost 40 euro en een middag werk.', images:[IMG.cGym, IMG.sports], counts:[32,8,5] },
      { id:2, avatar:IMG.mark, name:'Jelle',   time:'5u', type:'text',   text:'Na 3 maanden alleen buiten trainen voel ik me sterker dan 10 jaar sportschool. Serieus aanbevolen.', counts:[41,6,4] },
      { id:3, avatar:IMG.tom,  name:'Joep',    time:'2d', type:'quote',  text:'Motto van onze groep:', quote:'Je lichaam is al het materiaal dat je nodig hebt. Alles erbuiten is extra.', by:'Ido Portal', counts:[17,3,2] },
    ],
    forum:[
      { cat:'Aankondiging', title:'💪 Bouwdag Leusderhei — vr 9 mei', excerpt:'Samen een bosgym bouwen met ropes, rings en balken. Materialen geregeld, ervaring niet nodig.', a:'Kees Jan', src:IMG.lisa, t:'4u', replies:28, score:98, flair:'Pinned', thumb:IMG.cGym },
      { cat:'Vraag',        title:'Welke touw voor climb-setup? 32mm of dikker?', excerpt:'Wil climb+dip-station bouwen maar ben bang voor slijtage.', a:'Joep', src:IMG.tom, t:'1d', replies:14, score:35 },
      { cat:'Resource',     title:'Goedkoopste leveranciers voor staal en hout', excerpt:'Na 3 gyms gebouwd heb ik een lijstje. Deel ik graag.', a:'Jelle', src:IMG.mark, t:'2d', replies:9, score:62 },
      { cat:'Idee',         title:'Voorstel: gedeelde buurt-gym in park', excerpt:'Met vergunning natuurlijk. Wie heeft ervaring met zoiets regelen?', a:'Melissa', src:IMG.nina, t:'3d', replies:22, score:41 },
    ],
    practicals:[
      makePractical(1,{ title:'Pull-up bar monteren', manifest:'Veilig, stevig, verweerbestendig.',                       count:6, type:'Building', creator:'Kees Jan', creatorImg:IMG.lisa }),
      makePractical(2,{ title:'Bosgym opstelling',    manifest:'Outdoor bewegen, natuurlijke materialen, elk seizoen.',    count:8, type:'Building', creator:'Joep',  creatorImg:IMG.tom }),
      makePractical(3,{ title:'Basis-workout routine',manifest:'3x per week, 30 min, alleen lichaamsgewicht.',             count:5, creator:'Jelle', creatorImg:IMG.mark, status:'done' }),
      makePractical(4,{ title:'Ringen workout',       manifest:'Progressie van beginner tot intermediate.',                count:7, creator:'Melissa', creatorImg:IMG.nina }),
    ],
  },

  'Tinyhouse Nederland': {
    description:'Voor iedereen die klein, bewust en zelfvoorzienend wil wonen. Van eerste schetsen tot bewoning — we delen plattegronden, vergunning-ervaringen en leveranciers.',
    founded:'sep 2022',
    contact:[[Ico.Globe,'tinyhousenl.org'],[Ico.Mail,'info@tinyhousenl.org'],[Ico.Link,'@TinyhouseNL']],
    feed:[
      { id:1, avatar:IMG.sara, name:'Sara Ahmed',    time:'2u', type:'images', text:'Plattegrond v2 — keuken herontworpen na 6 maanden bewoning. Minder is echt meer als je het goed plant.', images:[IMG.cTinyhouse, IMG.garden], counts:[27,5,9] },
      { id:2, avatar:IMG.eva,  name:'Eva Smit',      time:'7u', type:'text',   text:'Onze vergunning is binnen! Na 14 maanden. Blij en moe. Morgen beginnen we met fundering.', counts:[54,12,8] },
      { id:3, avatar:IMG.tom,  name:'Joep',    time:'2d', type:'quote',  text:'Herinnering tijdens een moeilijke bouwdag:', quote:'Een klein huis is geen opoffering, het is een bevrijding.', by:'Dee Williams', counts:[23,4,3] },
    ],
    forum:[
      { cat:'Vraag',        title:'Vergunning-traject in provincie Noord-Brabant?', excerpt:'Wie heeft hier recent succes gehad? Welke gemeente is meest open?', a:'Sara', src:IMG.sara, t:'5u', replies:34, score:71 },
      { cat:'Resource',     title:'Complete materialenlijst voor 24m² off-grid', excerpt:'Inclusief budget en leveranciers. Onderhouden sinds begin project.', a:'Eva', src:IMG.eva, t:'1d', replies:18, score:126, flair:'Pinned' },
      { cat:'Aankondiging', title:'🏡 Open dag bij ons tinyhouse — 18 mei', excerpt:'Kom kijken, vragen stellen, fotos maken. Koffie staat klaar.', a:'Joep', src:IMG.tom, t:'2d', replies:26, score:58 },
      { cat:'Idee',         title:'Voorstel: coöperatie voor gezamenlijke grondaankoop', excerpt:'8 tinyhouses op 1 perceel = schaal en draagvlak. Wie denkt mee?', a:'Jelle', src:IMG.mark, t:'4d', replies:41, score:89 },
    ],
    practicals:[
      makePractical(1,{ title:'Plattegrond ontwerpen', manifest:'Elk vierkante meter telt — begin bij je dagritme.',         count:6, type:'Building', creator:'Sara', creatorImg:IMG.sara }),
      makePractical(2,{ title:'Off-grid water-setup',  manifest:'Regen, filter, opslag — betrouwbaar en compact.',            count:7, type:'Building', creator:'Eva',  creatorImg:IMG.eva,  status:'warn' }),
      makePractical(3,{ title:'Vergunning-traject',    manifest:'Gemeente benaderen, kansen verhogen, geduld bewaren.',        count:5, creator:'Joep',  creatorImg:IMG.tom }),
      makePractical(4,{ title:'Kleine keuken indeling',manifest:'Koken zonder compromis op smaak — compacte opstelling.',     count:4, creator:'Kees Jan', creatorImg:IMG.lisa, status:'done' }),
    ],
  },

  'Meditatie Thuis': {
    description:'Voor wie thuis een vaste meditatie-praktijk wil opbouwen. Korte sessies, eerlijke reflecties, geen gedoe — gewoon beginnen en volhouden.',
    founded:'mei 2023',
    contact:[[Ico.Globe,'meditatiethuis.nl'],[Ico.Mail,'hoi@meditatiethuis.nl'],[Ico.Link,'@MeditatieThuis']],
    feed:[
      { id:1, avatar:IMG.nina, name:'Melissa',  time:'3u', type:'text',   text:'21 dagen op rij 10 min mediteren. Niet veel, wel consistent. Merk verschil in mijn reactie op stress.', counts:[36,7,4] },
      { id:2, avatar:IMG.anna, name:'Anna de Groot',  time:'9u', type:'images', text:'Mijn meditatie-hoekje — eenvoud werkt. Plant, kussen, kaars.', images:[IMG.cMeditatie, IMG.park], counts:[42,8,6] },
      { id:3, avatar:IMG.sara, name:'Sara Ahmed',     time:'2d', type:'quote',  text:'Deze week bleef dit hangen:', quote:'Mediteren is niet stoppen met denken. Het is stoppen met geloven dat je je gedachten bent.', by:'Mooji', counts:[28,5,3] },
    ],
    forum:[
      { cat:'Vraag',        title:'Hoe blijven jullie gemotiveerd na 30 dagen?', excerpt:'Begin altijd enthousiast, raak na maand 1 vaak de draad kwijt. Tips?', a:'Melissa', src:IMG.nina, t:'4u', replies:24, score:52 },
      { cat:'Resource',     title:'10 ademhalings-technieken gerangschikt op moeilijkheid', excerpt:'Van box-breathing tot Tummo — praktisch, zonder mystiek.', a:'Anna', src:IMG.anna, t:'1d', replies:11, score:97, flair:'Pinned' },
      { cat:'Discussie',    title:'Begeleide audio vs. stilte — wat werkt voor jullie?', excerpt:'Ik wissel af, sommigen doen alleen stilte, anderen altijd apps. Benieuwd.', a:'Sara', src:IMG.sara, t:'2d', replies:38, score:46 },
      { cat:'Idee',         title:'Voorstel: gedeelde 30-dagen challenge in juni', excerpt:'Elke dag check-in, korte reflectie. Zachte verantwoording.', a:'Kees Jan', src:IMG.lisa, t:'3d', replies:19, score:63 },
    ],
    practicals:[
      makePractical(1,{ title:'Meditatie-hoekje inrichten', manifest:'Plek herkenbaar — brein weet: nu is het tijd.',           count:4, creator:'Anna', creatorImg:IMG.anna, status:'done' }),
      makePractical(2,{ title:'Ochtend-routine 10 min',     manifest:'Voor werk, zonder uitstel — 7 dagen per week.',            count:5, creator:'Melissa', creatorImg:IMG.nina }),
      makePractical(3,{ title:'Body scan beginners',        manifest:'Van kruin tot tenen — ontspannen en aanwezig.',            count:6, creator:'Sara', creatorImg:IMG.sara }),
      makePractical(4,{ title:'Ademwerk routine',           manifest:'Drie technieken, één vaste volgorde.',                     count:4, creator:'Joep',  creatorImg:IMG.tom }),
    ],
  },

  'Wildkampeer NL': {
    description:'Voor natuurliefhebbers die liefst zonder camping wildkamperen. Routes, wetgeving, lichtgewicht uitrusting en magische plekken — zonder spoor.',
    founded:'jun 2023',
    contact:[[Ico.Globe,'wildkampeernl.nl'],[Ico.Mail,'info@wildkampeernl.nl'],[Ico.Link,'@WildkampeerNL']],
    feed:[
      { id:1, avatar:IMG.mark, name:'Jelle',  time:'4u', type:'images', text:'Zweden Q2 trip — 120 km te voet, 9 dagen onder tarp. Mist in de ochtend was onbeschrijfelijk.', images:[IMG.cWildkampeer, IMG.nature], counts:[54,11,7] },
      { id:2, avatar:IMG.tom,  name:'Joep',   time:'1d', type:'text',   text:'Nieuw tarp-pitch geleerd (de "plow point") — sneller, steviger, minder gewicht. Elke setup is simpeler als je eenmaal ziet hoe.', counts:[21,4,3] },
      { id:3, avatar:IMG.eva,  name:'Eva Smit',     time:'3d', type:'quote',  text:'Uit mijn reisdagboek:', quote:'Stilte buiten leert je luisteren naar stilte binnen.', by:'Anonymous', counts:[29,6,2] },
    ],
    forum:[
      { cat:'Resource',     title:'Wildkamp-wetgeving per Europees land (2026)', excerpt:'Actuele tabel van wat mag en niet mag. Werk bijgewerkt houden.', a:'Jelle', src:IMG.mark, t:'6u', replies:16, score:134, flair:'Pinned' },
      { cat:'Vraag',        title:'Welke tarp-maat voor solo langere trips?', excerpt:'3x3 voelt krap bij regen, 4x4 zwaar. Gulden middenweg?', a:'Joep', src:IMG.tom, t:'1d', replies:22, score:48 },
      { cat:'Aankondiging', title:'🌲 Weekend Veluwe — nog 3 plekken (zacht)', excerpt:'Vr-zo, 30 km, kleine groep. Eigen uitrusting meenemen.', a:'Eva', src:IMG.eva, t:'2d', replies:27, score:72 },
      { cat:'Discussie',    title:'Alleen of samen — voor- en nadelen?', excerpt:'Begonnen solo, nu meer met groep. Missen allebei iets eigens.', a:'Melissa', src:IMG.nina, t:'3d', replies:33, score:41 },
    ],
    practicals:[
      makePractical(1,{ title:'Tarp opzetten basics',  manifest:'5 pitches voor elke weersituatie.',                           count:6, type:'Building', creator:'Jelle', creatorImg:IMG.mark }),
      makePractical(2,{ title:'Leave no trace',        manifest:'Zo achterlaten dat niemand kan zien dat je er was.',           count:5, creator:'Eva',  creatorImg:IMG.eva,  status:'done' }),
      makePractical(3,{ title:'Kook-setup 350 gram',   manifest:'Compleet, compact, betrouwbaar.',                             count:4, creator:'Joep',  creatorImg:IMG.tom }),
      makePractical(4,{ title:'Solo-trip voorbereiden',manifest:'Route, noodcommunicatie, mentale check-in.',                   count:7, creator:'Melissa', creatorImg:IMG.nina }),
    ],
  },

  'Homeschool Creatief': {
    description:'Thuisonderwijs met nadruk op kunst, muziek, verhalen en handwerk. Voor gezinnen die creatief leren écht centraal willen stellen.',
    founded:'okt 2023',
    contact:[[Ico.Globe,'homeschoolcreatief.nl'],[Ico.Mail,'info@homeschoolcreatief.nl'],[Ico.Link,'@HSCreatief']],
    feed:[
      { id:1, avatar:IMG.eva,  name:'Eva Smit',      time:'2u', type:'images', text:'Onze dochter (7) maakte haar eigen recept-boek. Geschreven, geïllustreerd, gebonden. Trotser kan niet.', images:[IMG.cCreatief, IMG.books], counts:[41,9,6] },
      { id:2, avatar:IMG.sara, name:'Sara Ahmed',    time:'8u', type:'text',   text:'Muziek-dag vandaag. Drie uur ongestructureerd klanken onderzoeken. Kids waren verzaligd.', counts:[28,5,4] },
      { id:3, avatar:IMG.anna, name:'Anna de Groot', time:'2d', type:'quote',  text:'Hangt nu boven onze werktafel:', quote:'Elk kind is een kunstenaar. Het probleem is kunstenaar blijven als je opgroeit.', by:'Pablo Picasso', counts:[34,6,2] },
    ],
    forum:[
      { cat:'Resource',     title:'Aquarel-basics voor kinderen van 6-10', excerpt:'Lesjes in 20 min per dag — stap voor stap.', a:'Eva', src:IMG.eva, t:'5u', replies:14, score:86, flair:'Pinned' },
      { cat:'Idee',         title:'Weekdoel: 1 verhaal schrijven per week per kind', excerpt:'Wie doet mee? Delen in een aparte thread.', a:'Sara', src:IMG.sara, t:'1d', replies:22, score:54 },
      { cat:'Vraag',        title:'Welke materialen voor beginnend mandenvlechten?', excerpt:'Met 8-jarige beginnen. Tips op kwaliteit en betaalbaar.', a:'Anna', src:IMG.anna, t:'2d', replies:11, score:32 },
      { cat:'Aankondiging', title:'🎨 Creatief-weekend Gelderse bos — 24 mei', excerpt:'Schildersworkshop, natuurlijke verf maken, theater-spel. Gezinnen welkom.', a:'Kees Jan', src:IMG.lisa, t:'3d', replies:19, score:68 },
    ],
    practicals:[
      makePractical(1,{ title:'Creatieve dag-structuur', manifest:'Ochtend focus, middag vrij — beste leer-ritme voor creatief werk.', count:5, creator:'Eva',  creatorImg:IMG.eva }),
      makePractical(2,{ title:'Eigen boek maken',        manifest:'Verhaal, tekst, illustratie — alles zelf.',                  count:6, type:'Building', creator:'Sara', creatorImg:IMG.sara, status:'done' }),
      makePractical(3,{ title:'Muziek ontdek-sessie',    manifest:'Ongestructureerd klanken onderzoeken — instrumenten en stemmen.', count:4, creator:'Anna', creatorImg:IMG.anna }),
      makePractical(4,{ title:'Natuur-tekenen',          manifest:'Observeren, traag tekenen, details leren zien.',             count:5, creator:'Kees Jan', creatorImg:IMG.lisa }),
    ],
  },

  'Bushcraft Collectief': {
    description:'Voor mensen die ambachtelijke buitenskills willen leren. Vuur maken, kampen bouwen, eetbare planten — verbonden met land, niet toerist.',
    founded:'aug 2023',
    contact:[[Ico.Globe,'bushcraftcollectief.nl'],[Ico.Mail,'info@bushcraftcollectief.nl'],[Ico.Link,'@BushcraftCol']],
    feed:[
      { id:1, avatar:IMG.mark, name:'Jelle', time:'3u', type:'images', text:'Eerste vuurboog-vuur deze week. Na 4 pogingen. Trotser dan toen ik mijn eerste fiets kon.', images:[IMG.cBushcraft, IMG.nature], counts:[58,14,7] },
      { id:2, avatar:IMG.tom,  name:'Joep',  time:'1d', type:'text',   text:'Shelter-weekend was intens. 36u in de regen, lekker droog onder eigen constructie. Ken je grenzen.', counts:[32,6,5] },
      { id:3, avatar:IMG.eva,  name:'Eva Smit',    time:'3d', type:'quote',  text:'Wijsheid van onze gids vorige maand:', quote:'Skills vergroten je grenzen. Kennis verleg ze.', by:'Mors Kochanski', counts:[24,4,2] },
    ],
    forum:[
      { cat:'Aankondiging', title:'🔥 Vuur-weekend Hoge Veluwe — za-zo 17-18 mei', excerpt:'4 technieken leren: vuurboog, ferrocerium, flint, solar. Alle niveaus.', a:'Jelle', src:IMG.mark, t:'4u', replies:31, score:116, flair:'Pinned', thumb:IMG.cBushcraft },
      { cat:'Vraag',        title:'Eerste mes — Mora Companion of iets anders?', excerpt:'Budget is niet mega maar wil geen miskoop. Ervaringen?', a:'Joep', src:IMG.tom, t:'1d', replies:26, score:54 },
      { cat:'Resource',     title:'Eetbare planten NL — seizoens-kalender', excerpt:'Wat pluk je wanneer, met foto en check-lijst.', a:'Eva', src:IMG.eva, t:'2d', replies:13, score:89 },
      { cat:'Discussie',    title:'Moderne vs. traditionele bushcraft — waar sta jij?', excerpt:'Ferrocerium of vuurboog? Dyneema of natuurtouw?', a:'Melissa', src:IMG.nina, t:'3d', replies:42, score:37 },
    ],
    practicals:[
      makePractical(1,{ title:'Vuur maken met vuurboog',  manifest:'Het oer-ritueel — geduld, techniek, beloning.',              count:7, type:'Building', creator:'Jelle', creatorImg:IMG.mark }),
      makePractical(2,{ title:'Shelter in 2 uur',         manifest:'Droog en warm, alleen met wat het bos geeft.',                count:6, type:'Building', creator:'Joep',  creatorImg:IMG.tom }),
      makePractical(3,{ title:'Eetbaar in het bos',       manifest:'10 planten die je veilig kunt herkennen en eten.',            count:5, creator:'Eva',  creatorImg:IMG.eva,  status:'done' }),
      makePractical(4,{ title:'Mes onderhoud',            manifest:'Scherp, schoon, klaar voor elke situatie.',                   count:4, creator:'Melissa', creatorImg:IMG.nina }),
    ],
  },
};

// Fallback content (shouldn't happen but safe)
const FALLBACK_CONTENT = {
  description:'Deze community wordt nog uitgewerkt — kom snel terug.',
  founded:'2023',
  contact:[[Ico.Globe,'community.nl'],[Ico.Mail,'info@community.nl'],[Ico.Link,'@community']],
  feed:[], forum:[], practicals:[],
};

const getCommunityContent = (community) => {
  if (!community) return FALLBACK_CONTENT;
  return COMMUNITY_CONTENT[community.name] || FALLBACK_CONTENT;
};

// ─── Community detail sub-tabs ─────────────────────────────────────────────
const CDFeed = ({ community }) => {
  const [sheet, setSheet] = React.useState(null);
  const content = getCommunityContent(community);
  const posts = content.feed.map(p => ({ ...p, tag: community?.name || '' }));
  return (
    <div style={{ paddingTop:16, background:'#fff', margin:'0 -16px', padding:'16px 20px 0' }}>
      {sheet && <BottomSheet type={sheet} onClose={()=>setSheet(null)} />}
      {posts.length === 0 ? (
        <div style={{ padding:'40px 20px', textAlign:'center', color:'#8E8E93', fontFamily:'Inter,system-ui,sans-serif', fontSize:13 }}>Nog geen posts in deze community.</div>
      ) : posts.map((p,i)=>(
        <PostItem key={p.id} {...p} last={i===posts.length-1}
          onDoeMee={()=>setSheet('doeMee')} onBijdragen={()=>setSheet('bijdragen')} onReflecteer={()=>setSheet('reflecteer')} />
      ))}
    </div>
  );
};

// ─── Forum row (Reddit-like with vote rail) ───────────────────────────────
const ForumRow = ({ post }) => {
  const [vote, setVote] = React.useState(post.userVote || 0);
  const delta = vote - (post.userVote || 0);
  const score = post.score + delta;
  const catCol = {
    'Vraag':'#007AFF','Idee':'#34C759','Aankondiging':'#FF4D1A',
    'Discussie':'#AF52DE','Poll':'#FF9500','Project':'#020100','Resource':'#8E8E93',
  }[post.cat] || '#8E8E93';

  const Arrow = ({ up, filled, onClick }) => (
    <button onClick={(e)=>{ e.stopPropagation(); onClick(); }} style={{
      border:'none', background:'transparent', cursor:'pointer', padding:2,
      color: filled ? (up?'#FF4D1A':'#007AFF') : 'rgba(2,1,0,0.25)',
      display:'flex', alignItems:'center', justifyContent:'center',
    }}>
      <svg width="14" height="14" viewBox="0 0 24 24" fill={filled?'currentColor':'none'} stroke="currentColor" strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round">
        {up ? <polyline points="18 15 12 9 6 15"/> : <polyline points="6 9 12 15 18 9"/>}
      </svg>
    </button>
  );

  return (
    <div style={{
      background:'#fff', borderRadius:14, padding:'10px 12px',
      boxShadow:'0 1px 3px rgba(0,0,0,0.05)',
      display:'flex', gap:10, cursor:'pointer',
    }}>
      {/* Vote rail */}
      <div style={{
        display:'flex', flexDirection:'column', alignItems:'center',
        gap:0, flexShrink:0, paddingTop:2, minWidth:28,
      }}>
        <Arrow up filled={vote===1}  onClick={()=>setVote(v=>v===1?0:1)} />
        <span style={{
          fontSize:12, fontWeight:700,
          color: vote===1?'#FF4D1A':vote===-1?'#007AFF':'#020100',
          fontFamily:'Inter,system-ui,sans-serif', lineHeight:1,
        }}>{score >= 1000 ? `${(score/1000).toFixed(1)}k` : score}</span>
        <Arrow up={false} filled={vote===-1} onClick={()=>setVote(v=>v===-1?0:-1)} />
      </div>

      {/* Body */}
      <div style={{ flex:1, minWidth:0 }}>
        {/* Top meta */}
        <div style={{ display:'flex', alignItems:'center', gap:6, marginBottom:5, flexWrap:'wrap' }}>
          <span style={{ fontSize:10, padding:'2px 8px', borderRadius:999, background:`${catCol}18`, color:catCol, fontFamily:'Inter,system-ui,sans-serif', fontWeight:700, letterSpacing:'0.02em', textTransform:'uppercase' }}>{post.cat}</span>
          {post.flair && <span style={{ fontSize:10, padding:'2px 8px', borderRadius:999, background:'rgba(116,116,128,0.12)', color:'#6B6B70', fontFamily:'Inter,system-ui,sans-serif', fontWeight:600 }}>{post.flair}</span>}
          <span style={{ fontSize:10.5, color:'#8E8E93', fontFamily:'Inter,system-ui,sans-serif' }}>
            u/<b style={{ color:'#020100', fontWeight:600 }}>{post.a}</b> · {post.t}
          </span>
        </div>

        {/* Title */}
        <div style={{ fontSize:14, fontWeight:700, color:'#020100', fontFamily:'Inter,system-ui,sans-serif', marginBottom:4, letterSpacing:'-0.2px', lineHeight:1.25 }}>{post.title}</div>

        {/* Excerpt */}
        {post.excerpt && (
          <div style={{ fontSize:12.5, color:'rgba(2,1,0,0.68)', fontFamily:'Inter,system-ui,sans-serif', lineHeight:1.45, marginBottom:post.thumb || post.poll ? 8 : 10 }}>{post.excerpt}</div>
        )}

        {/* Optional thumbnail */}
        {post.thumb && (
          <img src={post.thumb} alt="" style={{ width:'100%', maxHeight:120, objectFit:'cover', borderRadius:10, marginBottom:10 }} />
        )}

        {/* Poll */}
        {post.poll && (
          <div style={{ display:'flex', flexDirection:'column', gap:5, marginBottom:10 }}>
            {post.poll.options.map((o,j)=>{
              const pct = Math.round((o.votes/post.poll.total)*100);
              return (
                <div key={j} style={{ position:'relative', background:'rgba(116,116,128,0.1)', borderRadius:8, padding:'7px 10px', overflow:'hidden' }}>
                  <div style={{ position:'absolute', inset:0, width:`${pct}%`, background:'rgba(0,122,255,0.12)' }} />
                  <div style={{ position:'relative', display:'flex', alignItems:'center', justifyContent:'space-between', fontSize:12, fontFamily:'Inter,system-ui,sans-serif' }}>
                    <span style={{ fontWeight:600, color:'#020100' }}>{o.label}</span>
                    <span style={{ color:'#8E8E93', fontWeight:600 }}>{pct}%</span>
                  </div>
                </div>
              );
            })}
            <span style={{ fontSize:10.5, color:'#8E8E93', fontFamily:'Inter,system-ui,sans-serif', marginTop:2 }}>{post.poll.total} stemmen</span>
          </div>
        )}

        {/* Footer actions */}
        <div style={{ display:'flex', alignItems:'center', gap:14 }}>
          <span style={{ display:'inline-flex', alignItems:'center', gap:5, fontSize:11.5, color:'#6B6B70', fontFamily:'Inter,system-ui,sans-serif', fontWeight:600 }}>
            <Ico.Chat size={12} color="#8E8E93" />
            {post.replies} reacties
          </span>
          <span style={{ display:'inline-flex', alignItems:'center', gap:5, fontSize:11.5, color:'#8E8E93', fontFamily:'Inter,system-ui,sans-serif' }}>
            <Ico.Link size={11} color="#8E8E93" /> Delen
          </span>
          <span style={{ display:'inline-flex', alignItems:'center', gap:5, fontSize:11.5, color:'#8E8E93', fontFamily:'Inter,system-ui,sans-serif' }}>
            <Ico.Pin size={11} color="#8E8E93" /> Opslaan
          </span>
        </div>
      </div>
    </div>
  );
};

const CDForum = ({ community }) => {
  const [cat,  setCat]  = React.useState('Alle');
  const [sort, setSort] = React.useState('Hot');
  const content = getCommunityContent(community);
  const posts = content.forum;

  const filtered = cat==='Alle' ? posts : posts.filter(p=>p.cat===cat);

  return (
    <div style={{ paddingTop:14 }}>
      {/* New post CTA */}
      <div style={{
        display:'flex', alignItems:'center', gap:10, marginBottom:12,
        background:'#fff', borderRadius:14, padding:'10px 12px',
        boxShadow:'0 1px 3px rgba(0,0,0,0.05)',
      }}>
        <img src={IMG.joep} alt="" style={{ width:32, height:32, borderRadius:'50%', objectFit:'cover' }} />
        <span style={{ flex:1, fontSize:13, color:'#8E8E93', fontFamily:'Inter,system-ui,sans-serif' }}>Deel iets met de community…</span>
        <button style={{ padding:'6px 10px', borderRadius:999, border:'none', background:'rgba(116,116,128,0.12)', cursor:'pointer', display:'flex', alignItems:'center', justifyContent:'center' }}>
          <Ico.Img size={14} color="#8E8E93" />
        </button>
        <button style={{ padding:'6px 10px', borderRadius:999, border:'none', background:'#020100', cursor:'pointer', display:'flex', alignItems:'center', justifyContent:'center', gap:4 }}>
          <Ico.Plus size={12} color="#fff" />
          <span style={{ fontSize:11, fontWeight:700, color:'#fff', fontFamily:'Inter,system-ui,sans-serif' }}>Post</span>
        </button>
      </div>

      {/* Sort tabs — Reddit style */}
      <div style={{
        display:'flex', gap:4, marginBottom:10,
        background:'rgba(116,116,128,0.08)', borderRadius:10, padding:3,
      }}>
        {[
          ['Hot',    '🔥'],
          ['Nieuw',  '🆕'],
          ['Top',    '⭐'],
          ['Open',   '❓'],
        ].map(([s,em])=>(
          <button key={s} onClick={()=>setSort(s)} style={{
            flex:1, padding:'6px 0', borderRadius:8, border:'none',
            background: sort===s ? '#fff' : 'transparent',
            color: sort===s ? '#020100' : '#8E8E93',
            fontSize:11.5, fontWeight: sort===s ? 700 : 500,
            cursor:'pointer', fontFamily:'Inter,system-ui,sans-serif',
            boxShadow: sort===s ? '0 1px 3px rgba(0,0,0,0.1)' : 'none',
            display:'flex', alignItems:'center', justifyContent:'center', gap:4,
          }}>
            <span style={{ fontSize:11 }}>{em}</span>{s}
          </button>
        ))}
      </div>

      {/* Category pills */}
      <div style={{ display:'flex', gap:6, overflowX:'auto', scrollbarWidth:'none', marginBottom:12, paddingBottom:2 }}>
        {['Alle','Vraag','Idee','Aankondiging','Discussie','Poll','Project','Resource'].map(c=>(
          <Pill key={c} active={cat===c} onClick={()=>setCat(c)} style={{ padding:'5px 11px', fontSize:11.5 }}>{c}</Pill>
        ))}
      </div>

      {/* Posts */}
      <div style={{ display:'flex', flexDirection:'column', gap:8 }}>
        {filtered.length === 0 ? (
          <div style={{ padding:'30px 20px', textAlign:'center', color:'#8E8E93', fontFamily:'Inter,system-ui,sans-serif', fontSize:13 }}>Nog geen topics in deze categorie.</div>
        ) : filtered.map((p,i)=><ForumRow key={i} post={p} />)}
      </div>
    </div>
  );
};

const CDLeden = () => {
  const members = [
    { name:'Kees Jan',    role:'Facilitator',   src:IMG.lisa, online:true,  joined:'mrt 2023', sort:0,  connected:true  },
    { name:'Joep',       role:'Content Lead',  src:IMG.tom,  online:true,  joined:'mrt 2023', sort:1,  connected:true  },
    { name:'Sara Ahmed',       role:'Ontwerper',     src:IMG.sara, online:false, joined:'apr 2023', sort:2,  connected:true  },
    { name:'Jelle',      role:'Developer',     src:IMG.mark, online:true,  joined:'mei 2023', sort:3,  connected:false },
    { name:'Melissa',    role:'Lid',           src:IMG.nina, online:false, joined:'jun 2023', sort:4,  connected:true  },
    { name:'Eva Smit',         role:'Lid',           src:IMG.eva,  online:true,  joined:'aug 2023', sort:5,  connected:false },
    { name:'Anna de Groot',    role:'Onderzoeker',   src:IMG.anna, online:false, joined:'okt 2023', sort:6,  connected:true  },
    { name:'Jeroen Smit',      role:'Lid',           src:IMG.joep, online:false, joined:'nov 2023', sort:7,  connected:false },
    { name:'Karin Peters',     role:'Lid',           src:IMG.sara, online:true,  joined:'jan 2024', sort:8,  connected:false },
    { name:'Peter Vermeer',    role:'Moderator',     src:IMG.tom,  online:true,  joined:'feb 2024', sort:9,  connected:true  },
    { name:'Yara van Leeuwen', role:'Lid',           src:IMG.nina, online:false, joined:'okt 2025', sort:10, connected:false },
    { name:'Daan Hofman',      role:'Lid',           src:IMG.mark, online:false, joined:'nov 2025', sort:11, connected:true  },
    { name:'Robin Bakker',     role:'Lid',           src:IMG.eva,  online:true,  joined:'feb 2026', sort:12, connected:false },
    { name:'Sem de Jong',      role:'Lid',           src:IMG.anna, online:true,  joined:'mrt 2026', sort:13, connected:false },
    { name:'Mila Vos',         role:'Lid',           src:IMG.lisa, online:false, joined:'apr 2026', sort:14, connected:false },
  ];

  const [filter, setFilter] = React.useState('Alle');
  const [query,  setQuery]  = React.useState('');

  const q = query.trim().toLowerCase();
  let list = members.filter(m => !q || m.name.toLowerCase().includes(q) || m.role.toLowerCase().includes(q));
  if (filter==='Oudste')      list = [...list].sort((a,b)=>a.sort-b.sort);
  if (filter==='Nieuwste')    list = [...list].sort((a,b)=>b.sort-a.sort);
  if (filter==='Connecties')  list = list.filter(m=>m.connected);

  return (
    <div style={{ paddingTop:14 }}>
      {/* Search */}
      <div style={{ display:'flex', alignItems:'center', gap:10, background:'rgba(116,116,128,0.12)', borderRadius:14, padding:'10px 14px', marginBottom:10 }}>
        <Ico.Search size={15} color="#8E8E93" />
        <input
          value={query}
          onChange={e=>setQuery(e.target.value)}
          placeholder="Zoek leden op naam of rol…"
          style={{ flex:1, border:'none', background:'transparent', outline:'none', fontSize:13, color:'#020100', fontFamily:'Inter,system-ui,sans-serif' }}
        />
        {query && (
          <button onClick={()=>setQuery('')} style={{ border:'none', background:'rgba(116,116,128,0.2)', width:18, height:18, borderRadius:'50%', display:'flex', alignItems:'center', justifyContent:'center', cursor:'pointer', padding:0 }}>
            <Ico.X size={9} />
          </button>
        )}
      </div>

      {/* Filter pills */}
      <div style={{ display:'flex', gap:6, overflowX:'auto', scrollbarWidth:'none', marginBottom:10, paddingBottom:2 }}>
        {[
          { id:'Alle',       label:`Alle (${members.length})` },
          { id:'Oudste',     label:'Oudste eerst' },
          { id:'Nieuwste',   label:'Laatst toegevoegd' },
          { id:'Connecties', label:`Jouw connecties (${members.filter(m=>m.connected).length})` },
        ].map(f=>(
          <Pill key={f.id} active={filter===f.id} onClick={()=>setFilter(f.id)} style={{ padding:'5px 11px', fontSize:11.5 }}>{f.label}</Pill>
        ))}
      </div>

      {/* Count */}
      <div style={{ fontSize:11, color:'#8E8E93', fontFamily:'Inter,system-ui,sans-serif', padding:'2px 2px 8px', letterSpacing:'0.02em' }}>
        {list.length} {list.length===1?'lid':'leden'}
        {filter==='Oudste' && ' · op volgorde van aansluiting'}
        {filter==='Nieuwste' && ' · nieuwste bovenaan'}
      </div>

      {/* Compact list */}
      <div style={{ background:'#fff', borderRadius:14, overflow:'hidden', boxShadow:'0 1px 3px rgba(0,0,0,0.05)' }}>
        {list.map((m,i)=>(
          <div key={m.name+i} style={{
            display:'flex', alignItems:'center', gap:11,
            padding:'10px 12px', cursor:'pointer',
            borderTop: i===0 ? 'none' : '1px solid rgba(0,0,0,0.05)',
          }}
            onMouseEnter={e=>e.currentTarget.style.background='#FAFAFA'}
            onMouseLeave={e=>e.currentTarget.style.background='transparent'}>
            {/* Avatar */}
            <div style={{ position:'relative', flexShrink:0 }}>
              <img src={m.src} alt="" style={{ width:36, height:36, borderRadius:'50%', objectFit:'cover' }} />
              {m.online && <span style={{ position:'absolute', bottom:0, right:0, width:9, height:9, borderRadius:'50%', background:'#34C759', border:'2px solid #fff' }} />}
            </div>
            {/* Name + role */}
            <div style={{ flex:1, minWidth:0 }}>
              <div style={{ display:'flex', alignItems:'center', gap:6, marginBottom:1 }}>
                <span style={{ fontSize:13.5, fontWeight:700, color:'#020100', fontFamily:'Inter,system-ui,sans-serif', letterSpacing:'-0.1px', overflow:'hidden', textOverflow:'ellipsis', whiteSpace:'nowrap' }}>{m.name}</span>
                {m.connected && (
                  <span style={{ fontSize:9, padding:'1px 6px', borderRadius:999, background:'rgba(0,122,255,0.12)', color:'#007AFF', fontFamily:'Inter,system-ui,sans-serif', fontWeight:700, letterSpacing:'0.02em' }}>Connectie</span>
                )}
              </div>
              <div style={{ display:'flex', alignItems:'center', gap:6, fontSize:11, color:'#8E8E93', fontFamily:'Inter,system-ui,sans-serif' }}>
                <span>{m.role}</span>
                <span style={{ color:'#D0D0D5' }}>·</span>
                <span>Lid sinds {m.joined}</span>
              </div>
            </div>
            {/* Actions */}
            <button onClick={(e)=>e.stopPropagation()} style={{
              width:30, height:30, borderRadius:'50%', border:'none',
              background:'rgba(116,116,128,0.1)', cursor:'pointer',
              display:'flex', alignItems:'center', justifyContent:'center', flexShrink:0,
            }}>
              <Ico.Msg size={13} color="#8E8E93" />
            </button>
            <Ico.ChevR size={13} color="#C7C7CC" />
          </div>
        ))}
        {list.length === 0 && (
          <div style={{ padding:'24px 16px', textAlign:'center', fontSize:13, color:'#8E8E93', fontFamily:'Inter,system-ui,sans-serif' }}>Geen leden gevonden</div>
        )}
      </div>
    </div>
  );
};

const CDInfo = ({ community }) => {
  const content = getCommunityContent(community);
  const stats = community ? [
    `${community.members}${community.maxMembers?`/${community.maxMembers}`:''} leden`,
    `Opgericht ${content.founded}`,
    community.scope,
    community.cost ? `€${community.cost}/mnd` : 'Gratis',
  ] : [];
  return (
    <div style={{ paddingTop:16, display:'flex', flexDirection:'column', gap:12 }}>
      <Card>
        <MetaLabel style={{ textTransform:'uppercase', letterSpacing:'0.06em', display:'block', marginBottom:10 }}>Over deze community</MetaLabel>
        <p style={{ fontSize:14, color:'rgba(2,1,0,0.75)', lineHeight:1.6, margin:'0 0 12px', fontFamily:'Inter,system-ui,sans-serif' }}>{content.description}</p>
        <div style={{ display:'flex', gap:8, flexWrap:'wrap' }}>
          {stats.map(t=>(
            <span key={t} style={{ fontSize:12, padding:'4px 12px', borderRadius:999, background:'rgba(116,116,128,0.1)', color:'#8E8E93', fontFamily:'Inter,system-ui,sans-serif' }}>{t}</span>
          ))}
        </div>
      </Card>
      <Card>
        <MetaLabel style={{ textTransform:'uppercase', letterSpacing:'0.06em', display:'block', marginBottom:12 }}>Contact</MetaLabel>
        {content.contact.map(([Icon,text])=>(
          <div key={text} style={{ display:'flex', alignItems:'center', gap:10, marginBottom:10 }}>
            <div style={{ width:30,height:30,borderRadius:9,background:'rgba(116,116,128,0.1)',display:'flex',alignItems:'center',justifyContent:'center' }}>
              <Icon size={14} color="#8E8E93" />
            </div>
            <span style={{ fontSize:13, color:'#007AFF', fontFamily:'Inter,system-ui,sans-serif', textDecoration:'underline', cursor:'pointer' }}>{text}</span>
          </div>
        ))}
      </Card>
    </div>
  );
};

const CDPracticals = ({ community }) => {
  const [typeF, setTypeF] = React.useState('Alle');
  const content = getCommunityContent(community);
  const items = content.practicals;
  const filtered = typeF==='Alle' ? items : items.filter(i=>i.type===typeF);

  return (
    <div style={{ display:'flex', flexDirection:'column', gap:20, paddingTop:14 }}>
      <div style={{ display:'flex', gap:8 }}>
        {['Alle','Knowledge','Building'].map(t=><Pill key={t} active={typeF===t} onClick={()=>setTypeF(t)}>{t}</Pill>)}
      </div>

      {filtered.length === 0 ? (
        <div style={{ padding:'30px 20px', textAlign:'center', color:'#8E8E93', fontFamily:'Inter,system-ui,sans-serif', fontSize:13 }}>Nog geen practicals in deze community.</div>
      ) : (
        <div style={{ display:'grid', gridTemplateColumns:'1fr 1fr', gap:22, rowGap:36 }}>
          {filtered.map(p => <PracticalFolder key={p.id} {...p} />)}
        </div>
      )}
    </div>
  );
};

// ─── Community detail page ─────────────────────────────────────────────────
const CommunityDetailPage = ({ community, onBack }) => {
  const [tab, setTab] = React.useState('Feed');
  const c = community || { name:'Community', img:IMG.cOBE, members:0, maxMembers:null, scope:'—', cost:null };
  const stats = [
    `${c.members}${c.maxMembers?`/${c.maxMembers}`:''} leden`,
    c.scope,
    c.cost ? `€${c.cost}/mnd` : 'Gratis',
  ];
  return (
    <div style={{ display:'flex', flexDirection:'column', height:'100%' }}>
      {/* Hero */}
      <div style={{ position:'relative', height:210, flexShrink:0 }}>
        <img src={c.img} alt="" style={{ width:'100%', height:'100%', objectFit:'cover' }} />
        <div style={{ position:'absolute', inset:0, background:'linear-gradient(to top, rgba(2,1,0,0.85) 0%, rgba(2,1,0,0.2) 55%, transparent 100%)' }} />
        <button onClick={onBack} style={{ position:'absolute', top:16, left:16, width:34, height:34, borderRadius:'50%', border:'none', background:'rgba(0,0,0,0.35)', backdropFilter:'blur(8px)', display:'flex', alignItems:'center', justifyContent:'center', cursor:'pointer' }}>
          <Ico.ArrowL size={17} color="#fff" />
        </button>
        <div style={{ position:'absolute', bottom:18, left:18, right:18 }}>
          <MetaLabel style={{ color:'rgba(255,255,255,0.5)', textTransform:'uppercase', letterSpacing:'0.08em', display:'block', marginBottom:4 }}>Community</MetaLabel>
          <h1 style={{ fontFamily:'"Instrument Serif",Georgia,serif', fontWeight:400, fontSize:34, letterSpacing:'-0.8px', color:'#fff', margin:'0 0 6px', lineHeight:1 }}>{c.name}</h1>
          <div style={{ display:'flex', gap:6, flexWrap:'wrap' }}>
            {stats.map(t=>(
              <span key={t} style={{ fontSize:11, padding:'3px 9px', borderRadius:999, background:'rgba(255,255,255,0.14)', color:'rgba(255,255,255,0.8)', fontFamily:'Inter,system-ui,sans-serif', backdropFilter:'blur(4px)' }}>{t}</span>
            ))}
          </div>
        </div>
      </div>

      {/* Tabs */}
      <div style={{ padding:'12px 16px 0', background:'#F2F2F7', flexShrink:0 }}>
        <TabSlider tabs={[
          { id:'Feed',       label:'Feed',       Icon: Ico.List  },
          { id:'Forum',      label:'Forum',      Icon: Ico.Chat  },
          { id:'Practicals', label:'Practicals', Icon: Ico.Bulb  },
          { id:'Leden',      label:'Leden',      Icon: Ico.Users },
          { id:'Info',       label:'Info',       Icon: Ico.Info  },
        ]} active={tab} onChange={setTab} />
      </div>

      {/* Content */}
      <div style={{ flex:1, overflowY:'auto', scrollbarWidth:'none', padding:'0 16px 120px' }}>
        {tab==='Feed'       && <CDFeed community={community} />}
        {tab==='Forum'      && <CDForum community={community} />}
        {tab==='Practicals' && <CDPracticals community={community} />}
        {tab==='Leden'      && <CDLeden />}
        {tab==='Info'       && <CDInfo community={community} />}
      </div>
    </div>
  );
};

Object.assign(window, { CommunityPage, CommunityDetailPage, CommunityTile, GlassCommunityCard: CommunityTile });
