@gamention/pulse-elements 0.1.9 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1363,7 +1363,7 @@
1363
1363
  </div>
1364
1364
  `;const o=t.querySelector("input"),r=t.querySelector(".reply-send"),l=t.querySelector(".reply-attachments-preview");this.upload||(this.upload=new Q(this.client));const a=[],c=d=>{const u=document.createElement("span");Object.assign(u.style,{display:"inline-block",padding:"2px 8px",borderRadius:"4px",background:"#f1f5f9",fontSize:"10px",color:"#64748b"}),u.textContent=d,l.appendChild(u)};t.querySelector(".reply-attach-img").addEventListener("click",async()=>{const d=await this.upload.pickFile("image/*");d&&(a.push(d.id),c("📎 Image"))}),t.querySelector(".reply-attach-mic").addEventListener("click",async()=>{this.audioRecorder||(this.audioRecorder=new _e);const d=await this.audioRecorder.startRecording(t);if(d){const u=await this.upload.uploadBlob(d,"audio.webm");u&&(a.push(u.id),c("🎤 Audio"))}}),t.querySelector(".reply-attach-video").addEventListener("click",async()=>{this.videoRecorder||(this.videoRecorder=new Te);const d=await this.videoRecorder.startRecording(t);if(d){const u=await this.upload.uploadBlob(d.blob,"video.webm");u&&(a.push(u.id),c("đŸŽĨ Video"))}});const p=()=>{const d=o.value.trim();if(!d&&a.length===0)return;const u=[...(d||"").matchAll(/@(\w+)/g)].map(f=>f[1]);this.client.reply(e.id,d||"(attachment)",u,a.length>0?[...a]:void 0),o.value="",a.length=0,l.innerHTML=""};r.addEventListener("click",p),o.addEventListener("input",()=>{const d=Date.now(),u=this.lastTypingSendPins.get(e.id)??0;d-u>=2e3&&(this.client.sendTyping(e.id),this.lastTypingSendPins.set(e.id,d))}),o.addEventListener("keydown",d=>{d.key==="Enter"&&(d.preventDefault(),p()),d.key==="Escape"&&this.closePopover(),d.stopPropagation()}),this.popover.appendChild(t)}removePickerEl(){var e;(e=this.pickerEl)==null||e.remove(),this.pickerEl=null}showPickerForButton(e,t){this.removePickerEl();const i=e.getBoundingClientRect();this.pickerEl=document.createElement("div"),Object.assign(this.pickerEl.style,{position:"fixed",left:`${i.left}px`,top:`${i.top-4}px`,transform:"translateY(-100%)",display:"flex",gap:"2px",padding:"4px 6px",background:"#fff",border:"1px solid #e2e8f0",borderRadius:"8px",boxShadow:"0 4px 24px rgba(0,0,0,0.12)",zIndex:"10002",fontFamily:de});for(const s of Bi){const o=document.createElement("button");Object.assign(o.style,{border:"none",background:"none",cursor:"pointer",fontSize:"16px",padding:"4px",borderRadius:"4px",lineHeight:"1"}),o.textContent=s,o.addEventListener("click",r=>{r.stopPropagation();const a=this.client.state.getReactions(t).find(c=>{var p;return c.emoji===s&&c.userId===((p=this.client.state.user)==null?void 0:p.id)});a?this.client.removeReaction(a.id):this.client.addReaction(t,"comment",s),this.popoverPickerOpen=null,this.removePickerEl()}),this.pickerEl.appendChild(o)}document.body.appendChild(this.pickerEl)}buildReactionPillsHtml(e){var a;const t=this.client.state.getReactions(e),i=(a=this.client.state.user)==null?void 0:a.id,s=new Map;for(const c of t){const p=s.get(c.emoji)??{count:0,ownId:null};p.count++,c.userId===i&&(p.ownId=c.id),s.set(c.emoji,p)}const o="display:inline-flex;align-items:center;gap:3px;padding:2px 8px;border-radius:12px;border:1px solid #e2e8f0;background:#fff;font-size:12px;cursor:pointer;transition:all 0.15s;line-height:1.4;",r=o+"background:#eef2ff;border-color:#6366f1;";let l='<div style="margin-left:29px;display:flex;gap:4px;flex-wrap:wrap;margin-top:4px;">';for(const[c,{count:p,ownId:d}]of s){const u=d?r:o;l+=`<button data-reaction-emoji="${c}" data-reaction-target="${e}" ${d?`data-reaction-id="${d}"`:""} style="${u}">
1365
1365
  <span>${c}</span><span style="font-size:11px;font-weight:600;color:#64748b;">${p}</span>
1366
- </button>`}return l+=`<button class="popover-reaction-add" data-comment-id="${e}" style="display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:50%;border:1px dashed #e2e8f0;background:none;cursor:pointer;color:#94a3b8;font-size:14px;">+</button>`,l+="</div>",l}updatePopoverTyping(e){if(!this.popover)return;let t=this.popover.querySelector(".popover-typing");if(!t){t=document.createElement("div"),t.className="popover-typing",Object.assign(t.style,{padding:"0 14px 4px",fontSize:"11px",color:"#94a3b8",fontStyle:"italic",minHeight:"16px"});const s=this.popover.lastElementChild;s&&this.popover.insertBefore(t,s)}const i=this.client.state.getTypingUsers(e).filter(s=>{var o;return s!==((o=this.client.state.user)==null?void 0:o.id)}).map(s=>{const o=this.client.state.presence.find(r=>r.user.id===s);return(o==null?void 0:o.user.name)??"Someone"});i.length===0?t.textContent="":i.length===1?t.textContent=`${i[0]} is typing...`:t.textContent=`${i.join(", ")} are typing...`}formatTime(e){const t=new Date(e),s=new Date().getTime()-t.getTime(),o=Math.floor(s/6e4);if(o<1)return"now";if(o<60)return`${o}m`;const r=Math.floor(o/60);return r<24?`${r}h`:t.toLocaleDateString()}resolvePosition(e){if(e.selector&&e.elementOffsetX!=null&&e.elementOffsetY!=null)try{const t=document.querySelector(e.selector);if(t){const i=t.getBoundingClientRect();return{x:i.left+e.elementOffsetX*i.width,y:i.top+e.elementOffsetY*i.height}}}catch{}return{x:e.x*window.innerWidth,y:e.y*window.innerHeight}}renderPins(){if(!this.container)return;const e=this.threads.filter(i=>i.position&&!i.resolved),t=new Set(e.map(i=>i.id));for(const[i,s]of this.pinEls)t.has(i)||(s.remove(),this.pinEls.delete(i));e.forEach((i,s)=>{const o=i.position;let r=this.pinEls.get(i.id);r||(r=document.createElement("div"),Object.assign(r.style,{position:"fixed",width:"24px",height:"24px",borderRadius:"50%",background:"#6366f1",color:"#fff",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"11px",fontWeight:"700",fontFamily:de,cursor:"pointer",pointerEvents:"auto",boxShadow:"0 2px 8px rgba(99,102,241,0.4)",border:"2px solid #fff",transition:"left 0.15s ease, top 0.15s ease, transform 0.15s ease",zIndex:"9997",transform:"translate(-50%, -50%)"}),r.addEventListener("mouseenter",()=>{r.style.transform="translate(-50%, -50%) scale(1.15)"}),r.addEventListener("mouseleave",()=>{r.style.transform="translate(-50%, -50%)"}),r.addEventListener("click",()=>{if(this.popover&&this.popover.dataset.threadId===i.id){this.closePopover();return}const a=this.threads.find(c=>c.id===i.id);a&&this.showThreadPopover(a,r)}),this.container.appendChild(r),this.pinEls.set(i.id,r)),r.textContent=`${s+1}`;const l=this.resolvePosition(o);r.style.left=`${l.x}px`,r.style.top=`${l.y}px`})}}var Vi=Object.defineProperty,Xi=Object.getOwnPropertyDescriptor,L=(n,e,t,i)=>{for(var s=i>1?void 0:i?Xi(e,t):e,o=n.length-1,r;o>=0;o--)(r=n[o])&&(s=(i?r(e,t,s):r(s))||s);return i&&s&&Vi(e,t,s),s};const Yi=["👍","👎","â¤ī¸","🎉","👀","🚀"];let M=class extends _{constructor(){super(...arguments),this.highlightThreadId=null,this.threads=[],this.replyingTo=null,this.editingCommentId=null,this.editBody="",this.pickerOpenForComment=null,this.typingByThread=new Map,this.reactionsVersion=0,this.typingTimers=new Map,this.lastTypingSend=new Map,this.replyAttachmentIds=[]}connectedCallback(){super.connectedCallback(),this.ensureListener()}disconnectedCallback(){super.disconnectedCallback(),this.teardownListeners()}willUpdate(n){this.client&&!this.unsub&&this.ensureListener()}updated(n){var e,t;(e=this.shadowRoot)==null||e.querySelectorAll(".audio-player-host").forEach(i=>{if(i.children.length>0)return;const s=i.dataset.url;if(s){const o=i.dataset.duration?parseInt(i.dataset.duration):void 0;i.appendChild(Pe.render(s,o))}}),(t=this.shadowRoot)==null||t.querySelectorAll(".video-player-host").forEach(i=>{if(i.children.length>0)return;const s=i.dataset.url;s&&i.appendChild(yt.render(s,i.dataset.poster||void 0))})}teardownListeners(){var n,e,t;(n=this.unsub)==null||n.call(this),this.unsub=void 0,(e=this.reactionUnsub)==null||e.call(this),this.reactionUnsub=void 0,(t=this.typingUnsub)==null||t.call(this),this.typingUnsub=void 0;for(const i of this.typingTimers.values())clearTimeout(i);this.typingTimers.clear()}ensureListener(){this.client&&(this.teardownListeners(),this.threads=[...this.client.state.threads],this.setupListener())}setupListener(){this.client&&(this.threads=this.client.state.threads,this.unsub=this.client.state.on("threads",n=>{this.threads=[...n]}),this.reactionUnsub=this.client.state.on("reactions",()=>{this.reactionsVersion++}),this.typingUnsub=this.client.state.on("typing",({threadId:n})=>{this.refreshTyping(n)}))}refreshTyping(n){const t=this.client.state.getTypingUsers(n).filter(s=>{var o;return s!==((o=this.client.state.user)==null?void 0:o.id)}).map(s=>{const o=this.client.state.presence.find(r=>r.user.id===s);return(o==null?void 0:o.user.name)??"Someone"}),i=new Map(this.typingByThread);i.set(n,t),this.typingByThread=i,this.typingTimers.has(n)&&clearTimeout(this.typingTimers.get(n)),this.typingTimers.set(n,setTimeout(()=>{this.refreshTyping(n)},3500))}handleTypingInput(n){const e=Date.now(),t=this.lastTypingSend.get(n)??0;e-t>=2e3&&(this.client.sendTyping(n),this.lastTypingSend.set(n,e))}toggleReaction(n,e){var o;const t=this.client.state.getReactions(n),i=(o=this.client.state.user)==null?void 0:o.id,s=t.find(r=>r.emoji===e&&r.userId===i);s?this.client.removeReaction(s.id):this.client.addReaction(n,"comment",e),this.pickerOpenForComment=null}fireClose(){this.dispatchEvent(new CustomEvent("panel-close",{bubbles:!0,composed:!0}))}scrollToThread(n){this.updateComplete.then(()=>{var t;const e=(t=this.shadowRoot)==null?void 0:t.querySelector(`[data-thread-id="${n}"]`);e==null||e.scrollIntoView({behavior:"smooth",block:"center"})})}parseMentions(n){return n.split(/(@\w+)/g).map(t=>t.startsWith("@")?h`<span class="mention">${t}</span>`:t)}getInitials(n){return n.split(" ").map(e=>e[0]).join("").toUpperCase().slice(0,2)}getUserForComment(n){return this.client.state.getUser(n)}formatTime(n){const e=new Date(n),i=new Date().getTime()-e.getTime(),s=Math.floor(i/6e4);if(s<1)return"now";if(s<60)return`${s}m`;const o=Math.floor(s/60);return o<24?`${o}h`:e.toLocaleDateString()}async handleAttachImage(){this.upload||(this.upload=new Q(this.client));const n=await this.upload.pickFile("image/*");n&&(this.replyAttachmentIds.push(n.id),this.requestUpdate())}async handleRecordAudio(n){var i;this.upload||(this.upload=new Q(this.client)),this.audioRecorder||(this.audioRecorder=new _e);const e=(i=this.shadowRoot)==null?void 0:i.querySelector(`[data-thread-id="${n}"]`),t=await this.audioRecorder.startRecording(e??document.body);if(t){const s=await this.upload.uploadBlob(t,"audio.webm");s&&(this.replyAttachmentIds.push(s.id),this.requestUpdate())}}async handleRecordVideo(n){var i;this.upload||(this.upload=new Q(this.client)),this.videoRecorder||(this.videoRecorder=new Te);const e=(i=this.shadowRoot)==null?void 0:i.querySelector(`[data-thread-id="${n}"]`),t=await this.videoRecorder.startRecording(e??document.body);if(t){const s=await this.upload.uploadBlob(t.blob,"video.webm");s&&(this.replyAttachmentIds.push(s.id),this.requestUpdate())}}handleReply(n,e){e.preventDefault();const i=e.target.querySelector("input"),s=i.value.trim();if(!s&&this.replyAttachmentIds.length===0)return;const o=[...(s||"").matchAll(/@(\w+)/g)].map(r=>r[1]);this.client.reply(n,s||"(attachment)",o,this.replyAttachmentIds.length>0?[...this.replyAttachmentIds]:void 0),i.value="",this.replyAttachmentIds=[],this.replyingTo=null}isOwnComment(n){var e,t;return((t=(e=this.client)==null?void 0:e.state.user)==null?void 0:t.id)===n.userId}startEdit(n){this.editingCommentId=n.id,this.editBody=n.body}cancelEdit(){this.editingCommentId=null,this.editBody=""}saveEdit(n){const e=this.editBody.trim();if(!e)return;const t=[...e.matchAll(/@(\w+)/g)].map(i=>i[1]);this.client.editComment(n,e,t),this.editingCommentId=null,this.editBody=""}deleteComment(n){this.client.deleteComment(n)}renderEditForm(n){return h`
1366
+ </button>`}return l+=`<button class="popover-reaction-add" data-comment-id="${e}" style="display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:50%;border:1px dashed #e2e8f0;background:none;cursor:pointer;color:#94a3b8;font-size:14px;">+</button>`,l+="</div>",l}updatePopoverTyping(e){if(!this.popover)return;let t=this.popover.querySelector(".popover-typing");if(!t){t=document.createElement("div"),t.className="popover-typing",Object.assign(t.style,{padding:"0 14px 4px",fontSize:"11px",color:"#94a3b8",fontStyle:"italic",minHeight:"16px"});const s=this.popover.lastElementChild;s&&this.popover.insertBefore(t,s)}const i=this.client.state.getTypingUsers(e).filter(s=>{var o;return s!==((o=this.client.state.user)==null?void 0:o.id)}).map(s=>{const o=this.client.state.presence.find(r=>r.user.id===s);return(o==null?void 0:o.user.name)??"Someone"});i.length===0?t.textContent="":i.length===1?t.textContent=`${i[0]} is typing...`:t.textContent=`${i.join(", ")} are typing...`}formatTime(e){const t=new Date(e),s=new Date().getTime()-t.getTime(),o=Math.floor(s/6e4);if(o<1)return"now";if(o<60)return`${o}m`;const r=Math.floor(o/60);return r<24?`${r}h`:t.toLocaleDateString()}resolvePosition(e){if(e.selector&&e.elementOffsetX!=null&&e.elementOffsetY!=null)try{const t=document.querySelector(e.selector);if(t){const i=t.getBoundingClientRect();return{x:i.left+e.elementOffsetX*i.width,y:i.top+e.elementOffsetY*i.height}}}catch{}return{x:e.x*window.innerWidth,y:e.y*window.innerHeight}}renderPins(){if(!this.container)return;const e=this.threads.filter(i=>i.position&&!i.resolved),t=new Set(e.map(i=>i.id));for(const[i,s]of this.pinEls)t.has(i)||(s.remove(),this.pinEls.delete(i));e.forEach((i,s)=>{const o=i.position;let r=this.pinEls.get(i.id);r||(r=document.createElement("div"),Object.assign(r.style,{position:"fixed",width:"24px",height:"24px",borderRadius:"50%",background:"#6366f1",color:"#fff",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"11px",fontWeight:"700",fontFamily:de,cursor:"pointer",pointerEvents:"auto",boxShadow:"0 2px 8px rgba(99,102,241,0.4)",border:"2px solid #fff",transition:"left 0.15s ease, top 0.15s ease, transform 0.15s ease",zIndex:"9997",transform:"translate(-50%, -50%)"}),r.addEventListener("mouseenter",()=>{r.style.transform="translate(-50%, -50%) scale(1.15)"}),r.addEventListener("mouseleave",()=>{r.style.transform="translate(-50%, -50%)"}),r.addEventListener("click",()=>{if(this.popover&&this.popover.dataset.threadId===i.id){this.closePopover();return}const a=this.threads.find(c=>c.id===i.id);a&&this.showThreadPopover(a,r)}),this.container.appendChild(r),this.pinEls.set(i.id,r)),r.textContent=`${s+1}`;const l=this.resolvePosition(o);r.style.left=`${l.x}px`,r.style.top=`${l.y}px`})}}var Vi=Object.defineProperty,Xi=Object.getOwnPropertyDescriptor,L=(n,e,t,i)=>{for(var s=i>1?void 0:i?Xi(e,t):e,o=n.length-1,r;o>=0;o--)(r=n[o])&&(s=(i?r(e,t,s):r(s))||s);return i&&s&&Vi(e,t,s),s};const Yi=["👍","👎","â¤ī¸","🎉","👀","🚀"];let M=class extends _{constructor(){super(...arguments),this.highlightThreadId=null,this.threadsVersion=0,this.replyingTo=null,this.editingCommentId=null,this.editBody="",this.pickerOpenForComment=null,this.typingByThread=new Map,this.reactionsVersion=0,this.typingTimers=new Map,this.lastTypingSend=new Map,this.replyAttachmentIds=[]}get threads(){return this.threadsVersion,this.client?[...this.client.state.threads]:[]}connectedCallback(){super.connectedCallback(),this.ensureListener()}disconnectedCallback(){super.disconnectedCallback(),this.teardownListeners()}willUpdate(n){this.client&&!this.unsub&&this.ensureListener()}updated(n){var e,t;(e=this.shadowRoot)==null||e.querySelectorAll(".audio-player-host").forEach(i=>{if(i.children.length>0)return;const s=i.dataset.url;if(s){const o=i.dataset.duration?parseInt(i.dataset.duration):void 0;i.appendChild(Pe.render(s,o))}}),(t=this.shadowRoot)==null||t.querySelectorAll(".video-player-host").forEach(i=>{if(i.children.length>0)return;const s=i.dataset.url;s&&i.appendChild(yt.render(s,i.dataset.poster||void 0))})}teardownListeners(){var n,e,t;(n=this.unsub)==null||n.call(this),this.unsub=void 0,(e=this.reactionUnsub)==null||e.call(this),this.reactionUnsub=void 0,(t=this.typingUnsub)==null||t.call(this),this.typingUnsub=void 0;for(const i of this.typingTimers.values())clearTimeout(i);this.typingTimers.clear()}ensureListener(){this.client&&(this.teardownListeners(),this.threadsVersion++,this.setupListener())}setupListener(){this.client&&(this.unsub=this.client.state.on("threads",()=>{this.threadsVersion++}),this.reactionUnsub=this.client.state.on("reactions",()=>{this.reactionsVersion++}),this.typingUnsub=this.client.state.on("typing",({threadId:n})=>{this.refreshTyping(n)}))}refreshTyping(n){const t=this.client.state.getTypingUsers(n).filter(s=>{var o;return s!==((o=this.client.state.user)==null?void 0:o.id)}).map(s=>{const o=this.client.state.presence.find(r=>r.user.id===s);return(o==null?void 0:o.user.name)??"Someone"}),i=new Map(this.typingByThread);i.set(n,t),this.typingByThread=i,this.typingTimers.has(n)&&clearTimeout(this.typingTimers.get(n)),this.typingTimers.set(n,setTimeout(()=>{this.refreshTyping(n)},3500))}handleTypingInput(n){const e=Date.now(),t=this.lastTypingSend.get(n)??0;e-t>=2e3&&(this.client.sendTyping(n),this.lastTypingSend.set(n,e))}toggleReaction(n,e){var o;const t=this.client.state.getReactions(n),i=(o=this.client.state.user)==null?void 0:o.id,s=t.find(r=>r.emoji===e&&r.userId===i);s?this.client.removeReaction(s.id):this.client.addReaction(n,"comment",e),this.pickerOpenForComment=null}fireClose(){this.dispatchEvent(new CustomEvent("panel-close",{bubbles:!0,composed:!0}))}scrollToThread(n){this.updateComplete.then(()=>{var t;const e=(t=this.shadowRoot)==null?void 0:t.querySelector(`[data-thread-id="${n}"]`);e==null||e.scrollIntoView({behavior:"smooth",block:"center"})})}parseMentions(n){return n.split(/(@\w+)/g).map(t=>t.startsWith("@")?h`<span class="mention">${t}</span>`:t)}getInitials(n){return n.split(" ").map(e=>e[0]).join("").toUpperCase().slice(0,2)}getUserForComment(n){return this.client.state.getUser(n)}formatTime(n){const e=new Date(n),i=new Date().getTime()-e.getTime(),s=Math.floor(i/6e4);if(s<1)return"now";if(s<60)return`${s}m`;const o=Math.floor(s/60);return o<24?`${o}h`:e.toLocaleDateString()}async handleAttachImage(){this.upload||(this.upload=new Q(this.client));const n=await this.upload.pickFile("image/*");n&&(this.replyAttachmentIds.push(n.id),this.requestUpdate())}async handleRecordAudio(n){var i;this.upload||(this.upload=new Q(this.client)),this.audioRecorder||(this.audioRecorder=new _e);const e=(i=this.shadowRoot)==null?void 0:i.querySelector(`[data-thread-id="${n}"]`),t=await this.audioRecorder.startRecording(e??document.body);if(t){const s=await this.upload.uploadBlob(t,"audio.webm");s&&(this.replyAttachmentIds.push(s.id),this.requestUpdate())}}async handleRecordVideo(n){var i;this.upload||(this.upload=new Q(this.client)),this.videoRecorder||(this.videoRecorder=new Te);const e=(i=this.shadowRoot)==null?void 0:i.querySelector(`[data-thread-id="${n}"]`),t=await this.videoRecorder.startRecording(e??document.body);if(t){const s=await this.upload.uploadBlob(t.blob,"video.webm");s&&(this.replyAttachmentIds.push(s.id),this.requestUpdate())}}handleReply(n,e){e.preventDefault();const i=e.target.querySelector("input"),s=i.value.trim();if(!s&&this.replyAttachmentIds.length===0)return;const o=[...(s||"").matchAll(/@(\w+)/g)].map(r=>r[1]);this.client.reply(n,s||"(attachment)",o,this.replyAttachmentIds.length>0?[...this.replyAttachmentIds]:void 0),i.value="",this.replyAttachmentIds=[],this.replyingTo=null}isOwnComment(n){var e,t;return((t=(e=this.client)==null?void 0:e.state.user)==null?void 0:t.id)===n.userId}startEdit(n){this.editingCommentId=n.id,this.editBody=n.body}cancelEdit(){this.editingCommentId=null,this.editBody=""}saveEdit(n){const e=this.editBody.trim();if(!e)return;const t=[...e.matchAll(/@(\w+)/g)].map(i=>i[1]);this.client.editComment(n,e,t),this.editingCommentId=null,this.editBody=""}deleteComment(n){this.client.deleteComment(n)}renderEditForm(n){return h`
1367
1367
  <div class="edit-form">
1368
1368
  <textarea
1369
1369
  .value=${this.editBody}
@@ -2048,7 +2048,7 @@
2048
2048
  background: var(--pw-surface-hover);
2049
2049
  color: var(--pw-text);
2050
2050
  }
2051
- `];L([g({attribute:!1})],M.prototype,"client",2);L([g()],M.prototype,"highlightThreadId",2);L([v()],M.prototype,"threads",2);L([v()],M.prototype,"replyingTo",2);L([v()],M.prototype,"editingCommentId",2);L([v()],M.prototype,"editBody",2);L([v()],M.prototype,"pickerOpenForComment",2);L([v()],M.prototype,"typingByThread",2);L([v()],M.prototype,"reactionsVersion",2);M=L([O("pulse-widget-comments-panel")],M);var Ki=Object.defineProperty,Gi=Object.getOwnPropertyDescriptor,ze=(n,e,t,i)=>{for(var s=i>1?void 0:i?Gi(e,t):e,o=n.length-1,r;o>=0;o--)(r=n[o])&&(s=(i?r(e,t,s):r(s))||s);return i&&s&&Ki(e,t,s),s};const Zi={"comment:created":"left a comment","comment:mention":"mentioned you","comment:reply":"replied to your comment","thread:resolved":"resolved a thread","reaction:added":"reacted to your comment"},Ji={"comment:created":"đŸ’Ŧ","comment:mention":"đŸ“Ŗ","comment:reply":"â†Šī¸","thread:resolved":"✅","reaction:added":"🎉"};let se=class extends _{constructor(){super(...arguments),this.notifications=[]}connectedCallback(){super.connectedCallback(),this.setupListener()}disconnectedCallback(){var n;super.disconnectedCallback(),(n=this.unsub)==null||n.call(this)}updated(n){var e;n.has("client")&&this.client&&((e=this.unsub)==null||e.call(this),this.setupListener())}setupListener(){this.client&&(this.notifications=this.client.state.notifications,this.unsub=this.client.state.on("notifications",n=>{this.notifications=[...n]}))}fireClose(){this.dispatchEvent(new CustomEvent("panel-close",{bubbles:!0,composed:!0}))}handleClick(n){n.read||this.client.markRead(n.id)}getActorName(n){var e;return((e=this.client.state.getUser(n))==null?void 0:e.name)??"Someone"}formatTime(n){const e=new Date(n),i=new Date().getTime()-e.getTime(),s=Math.floor(i/6e4);if(s<1)return"now";if(s<60)return`${s}m`;const o=Math.floor(s/60);return o<24?`${o}h`:e.toLocaleDateString()}render(){const n=this.notifications.filter(e=>!e.read).length;return h`
2051
+ `];L([g({attribute:!1})],M.prototype,"client",2);L([g()],M.prototype,"highlightThreadId",2);L([v()],M.prototype,"threadsVersion",2);L([v()],M.prototype,"replyingTo",2);L([v()],M.prototype,"editingCommentId",2);L([v()],M.prototype,"editBody",2);L([v()],M.prototype,"pickerOpenForComment",2);L([v()],M.prototype,"typingByThread",2);L([v()],M.prototype,"reactionsVersion",2);M=L([O("pulse-widget-comments-panel")],M);var Ki=Object.defineProperty,Gi=Object.getOwnPropertyDescriptor,ze=(n,e,t,i)=>{for(var s=i>1?void 0:i?Gi(e,t):e,o=n.length-1,r;o>=0;o--)(r=n[o])&&(s=(i?r(e,t,s):r(s))||s);return i&&s&&Ki(e,t,s),s};const Zi={"comment:created":"left a comment","comment:mention":"mentioned you","comment:reply":"replied to your comment","thread:resolved":"resolved a thread","reaction:added":"reacted to your comment"},Ji={"comment:created":"đŸ’Ŧ","comment:mention":"đŸ“Ŗ","comment:reply":"â†Šī¸","thread:resolved":"✅","reaction:added":"🎉"};let se=class extends _{constructor(){super(...arguments),this.notifications=[]}connectedCallback(){super.connectedCallback(),this.setupListener()}disconnectedCallback(){var n;super.disconnectedCallback(),(n=this.unsub)==null||n.call(this)}updated(n){var e;n.has("client")&&this.client&&((e=this.unsub)==null||e.call(this),this.setupListener())}setupListener(){this.client&&(this.notifications=this.client.state.notifications,this.unsub=this.client.state.on("notifications",n=>{this.notifications=[...n]}))}fireClose(){this.dispatchEvent(new CustomEvent("panel-close",{bubbles:!0,composed:!0}))}handleClick(n){n.read||this.client.markRead(n.id)}getActorName(n){var e;return((e=this.client.state.getUser(n))==null?void 0:e.name)??"Someone"}formatTime(n){const e=new Date(n),i=new Date().getTime()-e.getTime(),s=Math.floor(i/6e4);if(s<1)return"now";if(s<60)return`${s}m`;const o=Math.floor(s/60);return o<24?`${o}h`:e.toLocaleDateString()}render(){const n=this.notifications.filter(e=>!e.read).length;return h`
2052
2052
  <div class="panel">
2053
2053
  <div class="panel-header">
2054
2054
  <span class="panel-title">
@@ -4239,7 +4239,11 @@ var Qi = Object.defineProperty, es = Object.getOwnPropertyDescriptor, j = (s, e,
4239
4239
  const ts = ["👍", "👎", "â¤ī¸", "🎉", "👀", "🚀"];
4240
4240
  let O = class extends S {
4241
4241
  constructor() {
4242
- super(...arguments), this.highlightThreadId = null, this.threads = [], this.replyingTo = null, this.editingCommentId = null, this.editBody = "", this.pickerOpenForComment = null, this.typingByThread = /* @__PURE__ */ new Map(), this.reactionsVersion = 0, this.typingTimers = /* @__PURE__ */ new Map(), this.lastTypingSend = /* @__PURE__ */ new Map(), this.replyAttachmentIds = [];
4242
+ super(...arguments), this.highlightThreadId = null, this.threadsVersion = 0, this.replyingTo = null, this.editingCommentId = null, this.editBody = "", this.pickerOpenForComment = null, this.typingByThread = /* @__PURE__ */ new Map(), this.reactionsVersion = 0, this.typingTimers = /* @__PURE__ */ new Map(), this.lastTypingSend = /* @__PURE__ */ new Map(), this.replyAttachmentIds = [];
4243
+ }
4244
+ /** Read threads directly from state — threadsVersion triggers re-renders. */
4245
+ get threads() {
4246
+ return this.threadsVersion, this.client ? [...this.client.state.threads] : [];
4243
4247
  }
4244
4248
  connectedCallback() {
4245
4249
  super.connectedCallback(), this.ensureListener();
@@ -4272,11 +4276,11 @@ let O = class extends S {
4272
4276
  this.typingTimers.clear();
4273
4277
  }
4274
4278
  ensureListener() {
4275
- this.client && (this.teardownListeners(), this.threads = [...this.client.state.threads], this.setupListener());
4279
+ this.client && (this.teardownListeners(), this.threadsVersion++, this.setupListener());
4276
4280
  }
4277
4281
  setupListener() {
4278
- this.client && (this.threads = this.client.state.threads, this.unsub = this.client.state.on("threads", (s) => {
4279
- this.threads = [...s];
4282
+ this.client && (this.unsub = this.client.state.on("threads", () => {
4283
+ this.threadsVersion++;
4280
4284
  }), this.reactionUnsub = this.client.state.on("reactions", () => {
4281
4285
  this.reactionsVersion++;
4282
4286
  }), this.typingUnsub = this.client.state.on(
@@ -5159,7 +5163,7 @@ j([
5159
5163
  ], O.prototype, "highlightThreadId", 2);
5160
5164
  j([
5161
5165
  v()
5162
- ], O.prototype, "threads", 2);
5166
+ ], O.prototype, "threadsVersion", 2);
5163
5167
  j([
5164
5168
  v()
5165
5169
  ], O.prototype, "replyingTo", 2);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gamention/pulse-elements",
3
- "version": "0.1.9",
3
+ "version": "0.1.10",
4
4
  "description": "Drop-in web components for real-time collaboration — comments, cursors, presence, drawing, and more",
5
5
  "type": "module",
6
6
  "main": "./dist/pulse-elements.cjs",
@@ -41,8 +41,8 @@
41
41
  "@lit/context": "^1.1.0",
42
42
  "lit": "^3.2.0",
43
43
  "lucide": "^0.577.0",
44
- "@gamention/pulse-core": "0.1.9",
45
- "@gamention/pulse-shared": "0.1.9"
44
+ "@gamention/pulse-core": "0.1.10",
45
+ "@gamention/pulse-shared": "0.1.10"
46
46
  },
47
47
  "devDependencies": {
48
48
  "typescript": "^5.7.0",