[object Object]

← back to Rentv

social: collapsible left Growth·LinkedIn target rail — CRE conference-attendee roles + registry pull + per-name letter generator

835146a0b4525c3b5066ea01b4443a1cd4a40119 · 2026-07-30 20:18:27 -0700 · Steve

Files touched

Diff

commit 835146a0b4525c3b5066ea01b4443a1cd4a40119
Author: Steve <steve@designerwallcoverings.com>
Date:   Thu Jul 30 20:18:27 2026 -0700

    social: collapsible left Growth·LinkedIn target rail — CRE conference-attendee roles + registry pull + per-name letter generator
---
 public/social.html | 47 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 47 insertions(+)

diff --git a/public/social.html b/public/social.html
index 6346d4b3..e3f9657d 100644
--- a/public/social.html
+++ b/public/social.html
@@ -310,9 +310,56 @@
   document.getElementById('grailNewBtn').onclick=gAddCustom;
   document.getElementById('grailNew').addEventListener('keydown',function(e){ if(e.key==='Enter') gAddCustom(); });
   document.getElementById('grailList').addEventListener('click',function(e){
+    var lt=e.target.closest('[data-letter]'); if(lt){ genLetter(lt.getAttribute('data-letter')); return; }
     var st=e.target.closest('[data-st]'); if(st){ var id=st.getAttribute('data-st'); var l=gload(); l.forEach(function(x){ if(x.id===id) x.status=((x.status||0)+1)%GSTL.length; }); gsave(l); grender(); return; }
     var del=e.target.closest('[data-del]'); if(del){ var did=del.getAttribute('data-del'); gsave(gload().filter(function(x){return x.id!==did;})); grender(); }
   });
+
+  // ── Pick a name (left) → generate a personalized outreach letter (fills compose, right) ──
+  var GSEL=null;
+  var GOPENERS=[
+    'I’ve been following {a} and wanted to connect.',
+    'Your work around {a} caught my eye — I wanted to reach out directly.',
+    'I’m reaching out because of {a}, and thought it was worth connecting.'
+  ];
+  var GROLE={
+    'Owners / Investors':{a:['your portfolio activity across the Western U.S.','how owners are positioning for the next cycle'],cta:'a complimentary seat at our next State of the Market conference'},
+    'Developers':{a:['your current development pipeline','how developers are navigating capital and entitlements right now'],cta:'a panel seat and complimentary registration at the next RENTV summit'},
+    'Brokers':{a:['the deals moving in your market','getting your listings and closings in front of our CRE audience'],cta:'a delegate invitation to the next State of the Market conference'},
+    'Lenders & Capital Sources':{a:['where capital is flowing in Western CRE','the debt-and-equity picture heading into next quarter'],cta:'a capital-markets panel seat or a sponsorship at our next summit'},
+    'Vendors / Service Providers':{a:['reaching CRE owners, developers and brokers directly','putting your firm in front of the decision-makers who attend'],cta:'an exhibitor or sponsor package at our next conference'},
+    'Legal':{a:['the legal questions shaping CRE deals right now','sharing your expertise with our audience'],cta:'a thought-leadership panel seat at the next RENTV summit'},
+    'Construction / GCs':{a:['the projects breaking ground across the West','showcasing your build pipeline to owners and developers'],cta:'a complimentary seat at our next State of the Market conference'},
+    'Title & Escrow':{a:['keeping deals closing cleanly in this market','partnering on our deal coverage'],cta:'a partner or sponsor conversation ahead of the next summit'},
+    'Other':{a:['your work in commercial real estate','connecting around Western-U.S. CRE'],cta:'an invitation to our next State of the Market conference'}
+  };
+  function firstName(n){ return String(n||'').trim().split(/\s+/)[0]; }
+  function looksFirm(n){ return /\b(inc|llc|corp|co|company|group|realty|properties|partners|capital|associates|holdings|ventures|bank|trust|advisors|management)\b/i.test(n); }
+  function letterFor(x,v){
+    var R=GROLE[x.cat]||GROLE['Other'], i=Math.max(0,(v||1)-1);
+    var a=R.a[i%R.a.length], opener=GOPENERS[i%GOPENERS.length].replace('{a}',a);
+    var isCat=x.kind==='category';
+    var greet=isCat?'there':(looksFirm(x.name)?(cap(x.name)+' team'):cap(firstName(x.name)));
+    var text='Hi '+greet+',\n\n'
+      +'I’m Steve with RENTV — since 1998 we’ve covered the deals that move Western U.S. commercial real estate: home of CRE Talk with Steve & Arnie, the State of the Market conferences, and The REview.\n\n'
+      +opener+'\n\n'
+      +'I’d love to offer you '+R.cta+', and to connect here on LinkedIn as we cover more of the Western-U.S. market.\n\n'
+      +'Best,\nSteve\nRENTV.com';
+    return { topic:'Outreach — '+(isCat?x.cat:x.name), text:text };
+  }
+  function genLetter(id){
+    var l=gload(), it=null; l.forEach(function(x){ if(x.id===id) it=x; });
+    if(!it)return;
+    it.lv=(it.lv||0)+1; gsave(l);              // bump variant → regenerates a different angle each click
+    var out=letterFor(it,it.lv);
+    document.getElementById('pf').value='LinkedIn';
+    document.getElementById('topic').value=out.topic;
+    document.getElementById('text').value=out.text;
+    GSEL=id; grender();
+    var t=document.getElementById('text'); t.scrollIntoView({behavior:'smooth',block:'center'});
+    document.getElementById('msg').textContent='Letter ready for '+it.name+' — edit & Save draft →';
+  }
+
   gsetOpen(localStorage.getItem(GOPEN)==='1'); // collapsed by default
   grender();
 </script>

← 47c8ac14 pr-intelligence: cycle-4 extractor upgrades — single-line Na  ·  back to Rentv  ·  role icons: 13-icon SVG vocabulary for all CRE user/role typ eaccaf1f →