feedback-collector 0.2.0 → 0.3.1

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.
package/README.md CHANGED
@@ -74,10 +74,12 @@ Para React, a receita validada usa `@react-dev-inspector/babel-plugin`. Instruç
74
74
  1. Segure ALT para ativar o picker.
75
75
  2. Passe o mouse para ver highlight e source no tooltip.
76
76
  3. Use ALT + clique para capturar sem disparar a ação real do elemento.
77
- 4. Escreva a instrução no painel.
77
+ 4. Escreva a instrução no painel. Use Enter para concluir e tirar o foco do campo, ou Shift+Enter para inserir uma nova linha.
78
78
  5. Clique em “Copiar backlog” e cole o markdown no agente de código.
79
79
 
80
- A fila sobrevive a reloads e navegação SPA. `localStorage` é por origem, portanto portas diferentes têm filas independentes.
80
+ Enquanto ALT está pressionado, o painel fica invisível e deixa o mouse atravessá-lo, permitindo capturar elementos que estavam por baixo. Arraste o cabeçalho para mover o painel; ao soltar, ele se encaixa no canto mais próximo.
81
+
82
+ A fila e o canto escolhido sobrevivem a reloads e navegação SPA. `localStorage` é por origem, portanto portas diferentes têm filas e preferências independentes.
81
83
 
82
84
  ## Persistência e migração segura
83
85
 
package/dist/api.js CHANGED
@@ -1,24 +1,24 @@
1
- var W=["display","position","width","height","margin","padding","color","background-color","font-size","font-weight","line-height","border","border-radius","gap","flex-direction","justify-content","align-items","grid-template-columns","overflow","z-index","opacity","box-shadow","text-align"],J=new Set(["none","normal","auto","rgba(0, 0, 0, 0)","0px","visible","static","start"]);function R(t){let n=t;for(let e in n)if(e.startsWith("__reactFiber$")||e.startsWith("__reactInternalInstance$"))return n[e];return null}function U(t){let n=t;for(;n;){let e=n.type;if(typeof n.type=="function")return e?.displayName||e?.name||"";if(e&&typeof e=="object"&&e.displayName)return e.displayName;n=n._debugOwner||n.return;}return ""}function X(t){return t.match(/(?:^|\/)((?:src|app|pages|components|lib|features)\/.*)$/)?.[1]||t}function Z(t){let n=t.match(/^(.*):(\d+):(\d+)$/);if(n)return {file:n[1]||t,line:n[2]||"",column:n[3]||""};let e=t.match(/^(.*):(\d+)$/);return {file:e?.[1]||t,line:e?.[2]||"",column:""}}function S(t){let n=t,e=0;for(;n&&n!==document.body;){let i=n.getAttribute("data-inspector-relative-path"),s=n.getAttribute("data-source");if(i||s){let u=s?Z(s):null;return {file:i||u?.file||"",line:n.getAttribute("data-inspector-line")||u?.line||"",column:n.getAttribute("data-inspector-column")||u?.column||"",via:"data-attr",ownerHops:e}}n=n.parentElement,e+=1;}let o=R(t),a=0;for(;o&&a<20;){let i=o._debugSource;if(i?.fileName)return {file:X(i.fileName),line:i.lineNumber||"",column:i.columnNumber||"",via:"fiber",componentName:U(o)};o=o._debugOwner||o.return||null,a+=1;}return null}function Q(t){let n=R(t),e=[],o=0;for(;n&&e.length<3&&o<30;){let a=n.type,i=typeof n.type=="function"?a?.displayName||a?.name:a?.displayName;i&&!e.includes(i)&&e.push(i),n=n._debugOwner||n.return||null,o+=1;}return e}function F(t){return typeof CSS<"u"&&CSS.escape?CSS.escape(t):t.replace(/[^a-zA-Z0-9_-]/g,"\\$&")}function ee(t){return t.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function te(t){if(t.id)return `#${F(t.id)}`;let n=[],e=t;for(;e&&e!==document.body&&n.length<5;){let o=e.tagName.toLowerCase(),a=false;for(let i of ["data-testid","data-test","aria-label","name"]){let s=e.getAttribute(i);if(s){o+=`[${i}="${ee(s)}"]`,a=true;break}}if(!a&&e.classList.length){let i=Array.from(e.classList).filter(s=>!/^[a-z]*[_-][a-zA-Z0-9]{5,}$/.test(s)&&!/^\d/.test(s)&&s.length<30).slice(0,2);i.length&&(o+=`.${i.map(F).join(".")}`,a=true);}if(!a){let i=1,s=e.previousElementSibling;for(;s;)s.tagName===e.tagName&&(i+=1),s=s.previousElementSibling;i>1&&(o+=`:nth-of-type(${i})`);}n.unshift(o);try{if(document.querySelectorAll(n.join(" > ")).length===1)break}catch{}e=e.parentElement;}return n.join(" > ")}function ne(t){let n=getComputedStyle(t),e={};for(let o of W){let a=n.getPropertyValue(o);a&&!J.has(a)&&(e[o]=a);}return e}function oe(t,n){let e=t.outerHTML||"";return e.length<=n?e:`${e.slice(0,n)}\u2026 [truncado]`}function N(t){let n=t.getBoundingClientRect();return {id:`${Date.now()}_${Math.random().toString(36).slice(2,7)}`,url:location.pathname+location.search+location.hash,tag:t.tagName.toLowerCase(),selector:te(t),source:S(t),components:Q(t),text:(t.textContent||"").trim().slice(0,120),html:oe(t,600),styles:ne(t),rect:{x:Math.round(n.x),y:Math.round(n.y),w:Math.round(n.width),h:Math.round(n.height)},viewport:`${window.innerWidth}x${window.innerHeight}`,instruction:"",ts:new Date().toISOString()}}function m(t){return String(t).replace(/`/g,"\\`")}function k(t,n=new Date){let e=["# Backlog de feedback visual","",`Gerado em ${n.toLocaleString()} \u2014 ${t.length} itens.`,"Cada item indica o arquivo:linha quando dispon\xEDvel. Execute na ordem, agrupando edits do mesmo arquivo.",""];return t.forEach((o,a)=>{if(e.push(`## ${a+1}. ${o.instruction?o.instruction.split(`
2
- `)[0]:"(sem instru\xE7\xE3o)"}`),e.push(""),o.instruction.includes(`
3
- `)&&e.push(o.instruction,""),e.push(`- **Rota:** \`${m(o.url)}\``),o.source){let s=`${o.source.file}${o.source.line?`:${o.source.line}`:""}`,u=o.source.componentName?` (componente \`${m(o.source.componentName)}\`)`:"";e.push(`- **Source:** \`${m(s)}\`${u}`);}else o.components.length&&e.push(`- **Componentes (do mais interno):** ${o.components.map(s=>`\`${m(s)}\``).join(" \u2192 ")}`);e.push(`- **Elemento:** \`<${m(o.tag)}>\` \u2014 seletor: \`${m(o.selector)}\``),o.text&&e.push(`- **Texto vis\xEDvel:** "${o.text}"`),e.push(`- **Posi\xE7\xE3o:** ${o.rect.w}x${o.rect.h} @ (${o.rect.x},${o.rect.y}), viewport ${o.viewport}`);let i=Object.entries(o.styles);i.length&&e.push(`- **Styles atuais:** ${i.map(([s,u])=>`\`${m(s)}: ${m(u)}\``).join(", ")}`),e.push("","```html",o.html,"```","");}),e.join(`
4
- `)}var z="__fbc_state_v2",re="__fbc_items_v1";var P=()=>({version:2,items:[]});function M(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}function ie(t){return !!t&&typeof t=="object"&&Array.isArray(t.items)}function se(t,n){let e=M(t);if(ie(e)&&e.version===2)return {state:{version:2,items:e.items},migrated:false};let o=M(n);return Array.isArray(o)?{state:{version:2,items:o},migrated:true}:{state:P(),migrated:false}}function $(t,n){try{return t.setItem(z,JSON.stringify(n)),!0}catch{return false}}function D(t){let n=null,e=null;try{n=t.getItem(z),e=t.getItem(re);}catch{return P()}let o=se(n,e);return o.migrated&&$(t,o.state),o.state}var ae="position:fixed;pointer-events:none;z-index:2147483645;border:2px solid #2563eb;background:rgba(37,99,235,.08);border-radius:2px;display:none;transition:all .05s linear;",le="position:absolute;top:-22px;left:0;background:#2563eb;color:#fff;font:11px/1.4 ui-monospace,monospace;padding:1px 6px;border-radius:2px;white-space:nowrap;",ce="position:fixed;bottom:16px;right:16px;width:340px;max-height:70vh;z-index:2147483646;background:#1c1c1e;color:#e5e5e7;border-radius:10px;box-shadow:0 8px 30px rgba(0,0,0,.4);font:13px/1.45 system-ui,sans-serif;display:flex;flex-direction:column;overflow:hidden;",ue="position:fixed;bottom:16px;left:50%;transform:translateX(-50%);z-index:2147483647;background:#15803d;color:#fff;padding:8px 16px;border-radius:8px;font:13px system-ui,sans-serif;display:none;box-shadow:0 4px 14px rgba(0,0,0,.3);";function h(t){return String(t).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/"/g,"&quot;")}function de(t,n){let e=t.source?`${t.source.file.split("/").slice(-2).join("/")}${t.source.line?`:${t.source.line}`:""}`:t.components[0]?`<${t.components[0]}>`:t.selector.slice(0,40);return `<div style="background:#2c2c2e;border-radius:8px;padding:8px;">
1
+ var pe=["display","position","width","height","margin","padding","color","background-color","font-size","font-weight","line-height","border","border-radius","gap","flex-direction","justify-content","align-items","grid-template-columns","overflow","z-index","opacity","box-shadow","text-align"],fe=new Set(["none","normal","auto","rgba(0, 0, 0, 0)","0px","visible","static","start"]);function U(t){let o=t;for(let e in o)if(e.startsWith("__reactFiber$")||e.startsWith("__reactInternalInstance$"))return o[e];return null}function me(t){let o=t;for(;o;){let e=o.type;if(typeof o.type=="function")return e?.displayName||e?.name||"";if(e&&typeof e=="object"&&e.displayName)return e.displayName;o=o._debugOwner||o.return;}return ""}function ge(t){return t.match(/(?:^|\/)((?:src|app|pages|components|lib|features)\/.*)$/)?.[1]||t}function be(t){let o=t.match(/^(.*):(\d+):(\d+)$/);if(o)return {file:o[1]||t,line:o[2]||"",column:o[3]||""};let e=t.match(/^(.*):(\d+)$/);return {file:e?.[1]||t,line:e?.[2]||"",column:""}}function A(t){let o=t,e=0;for(;o&&o!==document.body;){let a=o.getAttribute("data-inspector-relative-path"),l=o.getAttribute("data-source");if(a||l){let c=l?be(l):null;return {file:a||c?.file||"",line:o.getAttribute("data-inspector-line")||c?.line||"",column:o.getAttribute("data-inspector-column")||c?.column||"",via:"data-attr",ownerHops:e}}o=o.parentElement,e+=1;}let r=U(t),u=0;for(;r&&u<20;){let a=r._debugSource;if(a?.fileName)return {file:ge(a.fileName),line:a.lineNumber||"",column:a.columnNumber||"",via:"fiber",componentName:me(r)};r=r._debugOwner||r.return||null,u+=1;}return null}function ye(t){let o=U(t),e=[],r=0;for(;o&&e.length<3&&r<30;){let u=o.type,a=typeof o.type=="function"?u?.displayName||u?.name:u?.displayName;a&&!e.includes(a)&&e.push(a),o=o._debugOwner||o.return||null,r+=1;}return e}function J(t){return typeof CSS<"u"&&CSS.escape?CSS.escape(t):t.replace(/[^a-zA-Z0-9_-]/g,"\\$&")}function he(t){return t.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function ve(t){if(t.id)return `#${J(t.id)}`;let o=[],e=t;for(;e&&e!==document.body&&o.length<5;){let r=e.tagName.toLowerCase(),u=false;for(let a of ["data-testid","data-test","aria-label","name"]){let l=e.getAttribute(a);if(l){r+=`[${a}="${he(l)}"]`,u=true;break}}if(!u&&e.classList.length){let a=Array.from(e.classList).filter(l=>!/^[a-z]*[_-][a-zA-Z0-9]{5,}$/.test(l)&&!/^\d/.test(l)&&l.length<30).slice(0,2);a.length&&(r+=`.${a.map(J).join(".")}`,u=true);}if(!u){let a=1,l=e.previousElementSibling;for(;l;)l.tagName===e.tagName&&(a+=1),l=l.previousElementSibling;a>1&&(r+=`:nth-of-type(${a})`);}o.unshift(r);try{if(document.querySelectorAll(o.join(" > ")).length===1)break}catch{}e=e.parentElement;}return o.join(" > ")}function we(t){let o=getComputedStyle(t),e={};for(let r of pe){let u=o.getPropertyValue(r);u&&!fe.has(u)&&(e[r]=u);}return e}function xe(t,o){let e=t.outerHTML||"";return e.length<=o?e:`${e.slice(0,o)}\u2026 [truncado]`}function Z(t){let o=t.getBoundingClientRect();return {id:`${Date.now()}_${Math.random().toString(36).slice(2,7)}`,url:location.pathname+location.search+location.hash,tag:t.tagName.toLowerCase(),selector:ve(t),source:A(t),components:ye(t),text:(t.textContent||"").trim().slice(0,120),html:xe(t,600),styles:we(t),rect:{x:Math.round(o.x),y:Math.round(o.y),w:Math.round(o.width),h:Math.round(o.height)},viewport:`${window.innerWidth}x${window.innerHeight}`,instruction:"",ts:new Date().toISOString()}}function g(t){return String(t).replace(/`/g,"\\`")}function O(t,o=new Date){let e=["# Backlog de feedback visual","",`Gerado em ${o.toLocaleString()} \u2014 ${t.length} itens.`,"Cada item indica o arquivo:linha quando dispon\xEDvel. Execute na ordem, agrupando edits do mesmo arquivo.",""];return t.forEach((r,u)=>{if(e.push(`## ${u+1}. ${r.instruction?r.instruction.split(`
2
+ `)[0]:"(sem instru\xE7\xE3o)"}`),e.push(""),r.instruction.includes(`
3
+ `)&&e.push(r.instruction,""),e.push(`- **Rota:** \`${g(r.url)}\``),r.source){let l=`${r.source.file}${r.source.line?`:${r.source.line}`:""}`,c=r.source.componentName?` (componente \`${g(r.source.componentName)}\`)`:"";e.push(`- **Source:** \`${g(l)}\`${c}`);}else r.components.length&&e.push(`- **Componentes (do mais interno):** ${r.components.map(l=>`\`${g(l)}\``).join(" \u2192 ")}`);e.push(`- **Elemento:** \`<${g(r.tag)}>\` \u2014 seletor: \`${g(r.selector)}\``),r.text&&e.push(`- **Texto vis\xEDvel:** "${r.text}"`),e.push(`- **Posi\xE7\xE3o:** ${r.rect.w}x${r.rect.h} @ (${r.rect.x},${r.rect.y}), viewport ${r.viewport}`);let a=Object.entries(r.styles);a.length&&e.push(`- **Styles atuais:** ${a.map(([l,c])=>`\`${g(l)}: ${g(c)}\``).join(", ")}`),e.push("","```html",r.html,"```","");}),e.join(`
4
+ `)}var ee="__fbc_state_v2",Ee="__fbc_items_v1";var te=()=>({version:2,items:[]});function Q(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}function Se(t){return !!t&&typeof t=="object"&&Array.isArray(t.items)}function ke(t,o){let e=Q(t);if(Se(e)&&e.version===2)return {state:{version:2,items:e.items},migrated:false};let r=Q(o);return Array.isArray(r)?{state:{version:2,items:r},migrated:true}:{state:te(),migrated:false}}function R(t,o){try{return t.setItem(ee,JSON.stringify(o)),!0}catch{return false}}function ne(t){let o=null,e=null;try{o=t.getItem(ee),e=t.getItem(Ee);}catch{return te()}let r=ke(o,e);return r.migrated&&R(t,r.state),r.state}var Ce="position:fixed;pointer-events:none;z-index:2147483645;border:2px solid #2563eb;background:rgba(37,99,235,.08);border-radius:2px;display:none;transition:all .05s linear;",Le="position:absolute;top:-22px;left:0;background:#2563eb;color:#fff;font:11px/1.4 ui-monospace,monospace;padding:1px 6px;border-radius:2px;white-space:nowrap;",$e="position:fixed;bottom:16px;right:16px;width:340px;max-width:calc(100vw - 32px);max-height:70vh;z-index:2147483646;background:#1c1c1e;color:#e5e5e7;border-radius:10px;box-shadow:0 8px 30px rgba(0,0,0,.4);font:13px/1.45 system-ui,sans-serif;display:flex;flex-direction:column;overflow:hidden;transition:opacity .08s ease;",oe="__fbc_panel_corner_v1",m=16,_e=4;function Te(t){return t==="top-left"||t==="top-right"||t==="bottom-left"||t==="bottom-right"}function x(t){return String(t).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/"/g,"&quot;")}function Ie(t,o){let e=t.source?`${t.source.file.split("/").slice(-2).join("/")}${t.source.line?`:${t.source.line}`:""}`:t.components[0]?`<${t.components[0]}>`:t.selector.slice(0,40);return `<div style="background:#2c2c2e;border-radius:8px;padding:8px;">
5
5
  <div style="display:flex;align-items:baseline;gap:6px;margin-bottom:6px;">
6
- <span style="color:#a8a8ae;font-size:11px;">#${n+1}</span>
7
- <span style="font-family:ui-monospace,monospace;font-size:11px;color:#64d2ff;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;" title="${h(t.selector)}">${h(e)}</span>
8
- <span data-fbc-del="${h(t.id)}" style="cursor:pointer;color:#a8a8ae;padding:0 4px;" title="Remover">\u2715</span>
6
+ <span style="color:#a8a8ae;font-size:11px;">#${o+1}</span>
7
+ <span style="font-family:ui-monospace,monospace;font-size:11px;color:#64d2ff;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;" title="${x(t.selector)}">${x(e)}</span>
8
+ <span data-fbc-del="${x(t.id)}" style="cursor:pointer;color:#a8a8ae;padding:0 4px;" title="Remover">\u2715</span>
9
9
  </div>
10
- <textarea data-fbc-ta="${h(t.id)}" placeholder="O que mudar aqui?" style="width:100%;box-sizing:border-box;background:#1c1c1e;color:#e5e5e7;border:1px solid #3a3a3c;border-radius:6px;padding:6px;font:13px system-ui;resize:vertical;min-height:40px;">${h(t.instruction)}</textarea>
11
- </div>`}function j(t={}){if(!document.body)throw new Error("feedback-collector: mount() requer document.body dispon\xEDvel.");let n=t.storage||window.localStorage,e=D(n),o=false,a=null,i=false,s=true,u,x=new Set,H=document.body.style.cursor,c=document.createElement("div");c.dataset.fbcRoot="highlight",c.style.cssText=ae;let E=document.createElement("div");E.style.cssText=le,c.append(E);let p=document.createElement("div");p.dataset.fbcRoot="panel",p.style.cssText=ce;let b=document.createElement("div");b.dataset.fbcRoot="toast",b.style.cssText=ue;function v(){$(n,e);}function q(r){b.textContent=r,b.style.display="block",u&&clearTimeout(u),u=setTimeout(()=>{b.style.display="none";},2500);}function y(){let r=e.items.filter(l=>l.source).length;p.innerHTML=`<div data-fbc="header" style="display:flex;align-items:center;gap:8px;padding:10px 12px;background:#2c2c2e;cursor:pointer;user-select:none;">
10
+ <textarea data-fbc-ta="${x(t.id)}" placeholder="O que mudar aqui?" style="width:100%;box-sizing:border-box;background:#1c1c1e;color:#e5e5e7;border:1px solid #3a3a3c;border-radius:6px;padding:6px;font:13px system-ui;resize:vertical;min-height:40px;">${x(t.instruction)}</textarea>
11
+ </div>`}function re(t={}){if(!document.body)throw new Error("feedback-collector: mount() requer document.body dispon\xEDvel.");let o=t.storage||window.localStorage,e=ne(o),r=false,u=null,a=false,l="bottom-right",c=null,E=false,y=false,_=true,h,v,S=new Set,ie=document.body.style.cursor,p=document.createElement("div");p.dataset.fbcRoot="highlight",p.style.cssText=Ce;let T=document.createElement("div");T.style.cssText=Le,p.append(T);let s=document.createElement("div");s.dataset.fbcRoot="panel",s.style.cssText=$e;try{let n=o.getItem(oe);Te(n)&&(l=n);}catch{}function M(n,i){let d=Math.max(m,window.innerWidth-s.offsetWidth-m),f=Math.max(m,window.innerHeight-s.offsetHeight-m);s.style.left=`${Math.min(Math.max(m,n),d)}px`,s.style.top=`${Math.min(Math.max(m,i),f)}px`,s.style.right="auto",s.style.bottom="auto";}function k(){let n=l.endsWith("right")?window.innerWidth-s.offsetWidth-m:m,i=l.startsWith("bottom")?window.innerHeight-s.offsetHeight-m:m;M(n,i);}function ae(){try{o.setItem(oe,l);}catch{}}function F(n){s.style.opacity=n?"0":"1",s.style.pointerEvents=n?"none":"auto";}function C(){R(o,e);}function I(){let n=s.querySelector('[data-fbc="copy"]');if(!n)return;let i=e.items.length>0;n.textContent=y?"\u2713 Copiado":"Copiar backlog",n.disabled=!i||y,n.style.background=y?"#15803d":i?"#2563eb":"#3a3a3c",n.style.color=i?"#fff":"#a8a8ae",n.style.cursor=i&&!y?"pointer":"default";}function L(){h&&clearTimeout(h),h=void 0,y=false;}function se(){L(),y=true,I(),h=setTimeout(()=>{h=void 0,y=false,I();},1800);}function w(){let n=e.items.filter(i=>i.source).length;s.innerHTML=`<div data-fbc="header" title="Arraste para mover \xB7 clique para recolher" style="display:flex;align-items:center;gap:8px;padding:10px 12px;background:#2c2c2e;cursor:grab;user-select:none;touch-action:none;">
12
12
  <span style="font-weight:600;">Feedback</span>
13
13
  <span style="background:#2563eb;border-radius:10px;padding:0 8px;font-size:11px;">${e.items.length}</span>
14
- ${e.items.length?`<span style="font-size:11px;color:#a8a8ae;">${r} com source</span>`:""}
14
+ ${e.items.length?`<span style="font-size:11px;color:#a8a8ae;">${n} com source</span>`:""}
15
15
  <span style="margin-left:auto;color:#a8a8ae;font-size:11px;">segure ALT + clique</span>
16
- <span data-fbc="toggle" style="color:#a8a8ae;">${i?"\u25B8":"\u25BE"}</span>
17
- </div>${i?"":`<div style="overflow-y:auto;flex:1;padding:8px 12px;display:flex;flex-direction:column;gap:8px;">
18
- ${e.items.length?e.items.map(de).join(""):'<div style="color:#a8a8ae;padding:12px 0;text-align:center;">Nenhum item. Segure ALT e clique num elemento da p\xE1gina.</div>'}
16
+ <span data-fbc="toggle" style="color:#a8a8ae;">${a?"\u25B8":"\u25BE"}</span>
17
+ </div>${a?"":`<div style="overflow-y:auto;flex:1;padding:8px 12px;display:flex;flex-direction:column;gap:8px;">
18
+ ${e.items.length?e.items.map(Ie).join(""):'<div style="color:#a8a8ae;padding:12px 0;text-align:center;">Nenhum item. Segure ALT e clique num elemento da p\xE1gina.</div>'}
19
19
  </div>
20
20
  <div style="display:flex;gap:8px;padding:10px 12px;background:#2c2c2e;">
21
- <button data-fbc="copy" ${e.items.length?"":"disabled"} style="flex:1;background:${e.items.length?"#2563eb":"#3a3a3c"};color:${e.items.length?"#fff":"#a8a8ae"};border:0;border-radius:6px;padding:8px;font:600 13px system-ui;cursor:${e.items.length?"pointer":"default"};">Copiar backlog</button>
21
+ <button data-fbc="copy" ${e.items.length?"":"disabled"} style="flex:1;background:${e.items.length?"#2563eb":"#3a3a3c"};color:${e.items.length?"#fff":"#a8a8ae"};border:0;border-radius:6px;padding:8px;font:600 13px system-ui;cursor:${e.items.length?"pointer":"default"};transition:background .15s ease,color .15s ease;">Copiar backlog</button>
22
22
  <button data-fbc="clear" style="background:#3a3a3c;color:#e5e5e7;border:0;border-radius:6px;padding:8px 12px;font:13px system-ui;cursor:pointer;">Limpar</button>
23
- </div>`}`;}function w(){o=false,a=null,c.style.display="none",document.body.style.cursor=H;}function B(r){let l=r.style.outline;r.style.outline="3px solid #16a34a";let d=setTimeout(()=>{r.style.outline=l,x.delete(d);},400);x.add(d);}function G(r){let l=N(r);e.items.push(l),v(),y(),setTimeout(()=>p.querySelector(`[data-fbc-ta="${CSS.escape(l.id)}"]`)?.focus(),50),r instanceof HTMLElement&&B(r);}async function K(){let r=k(e.items);try{await navigator.clipboard.writeText(r),q(`Backlog copiado (${e.items.length} itens). Cola no seu agente de c\xF3digo.`);}catch{window.prompt("Copie manualmente:",r);}}function C(r){r.key==="Alt"&&!o&&(o=true,document.body.style.cursor="crosshair");}function L(r){r.key==="Alt"&&w();}function T(r){if(!o)return;let l=document.elementFromPoint(r.clientX,r.clientY);if(!l||p.contains(l)||c.contains(l)||l===c){c.style.display="none",a=null;return}a=l;let d=l.getBoundingClientRect();c.style.display="block",c.style.left=`${d.left}px`,c.style.top=`${d.top}px`,c.style.width=`${d.width}px`,c.style.height=`${d.height}px`;let f=S(l);E.textContent=`<${l.tagName.toLowerCase()}>${f?` ${f.file.split("/").pop()}${f.line?`:${f.line}`:""}`:""}`;}function A(r){!o||!a||!(r.target instanceof Node)||p.contains(r.target)||(r.preventDefault(),r.stopPropagation(),G(a));}function O(r){if(!(r.target instanceof Element))return;let l=r.target,d=l.getAttribute("data-fbc");if(d==="copy"){K();return}if(d==="clear"){e.items.length&&window.confirm(`Limpar todos os ${e.items.length} itens?`)&&(e.items=[],v(),y());return}let f=l.getAttribute("data-fbc-del");if(f){e.items=e.items.filter(V=>V.id!==f),v(),y();return}l.closest('[data-fbc="header"]')&&(i=!i,y());}function I(r){if(!(r.target instanceof HTMLTextAreaElement))return;let l=r.target.getAttribute("data-fbc-ta"),d=e.items.find(f=>f.id===l);d&&(d.instruction=r.target.value,v());}document.addEventListener("keydown",C,true),document.addEventListener("keyup",L,true),window.addEventListener("blur",w),document.addEventListener("mousemove",T,true),document.addEventListener("click",A,true),p.addEventListener("click",O),p.addEventListener("input",I),document.body.append(c,p,b),y();let Y={get mounted(){return s},get items(){return e.items},exportMarkdown(){return k(e.items)},destroy(){if(s){s=false,w(),document.removeEventListener("keydown",C,true),document.removeEventListener("keyup",L,true),window.removeEventListener("blur",w),document.removeEventListener("mousemove",T,true),document.removeEventListener("click",A,true),p.removeEventListener("click",O),p.removeEventListener("input",I),u&&clearTimeout(u);for(let r of x)clearTimeout(r);x.clear(),c.remove(),p.remove(),b.remove();}}};return console.log(`[feedback-collector] ativo. Segure ALT + clique pra capturar. ${e.items.length} item(ns) restaurado(s) do localStorage.`),Y}var g=null;function pe(t={}){if(typeof window>"u"||typeof document>"u")throw new Error("feedback-collector: mount() s\xF3 pode ser chamado no navegador.");if(g?.mounted)return g;let n=window.__FEEDBACK_COLLECTOR__;if(n&&typeof n=="object"&&n.mounted)return g=n,n;if(n===true)throw new Error("feedback-collector: uma vers\xE3o anterior j\xE1 est\xE1 montada nesta p\xE1gina.");return g=j(t),window.__FEEDBACK_COLLECTOR__=g,g}function fe(){g?.destroy(),g=null,typeof window<"u"&&delete window.__FEEDBACK_COLLECTOR__;}export{fe as destroy,pe as mount};//# sourceMappingURL=api.js.map
23
+ </div>`}`,I(),c||k();}function $(){r=false,u=null,p.style.display="none",F(false),document.body.style.cursor=ie;}function le(n){let i=n.style.outline;n.style.outline="3px solid #16a34a";let d=setTimeout(()=>{n.style.outline=i,S.delete(d);},400);S.add(d);}function ce(n){L();let i=Z(n);e.items.push(i),C(),w(),setTimeout(()=>s.querySelector(`[data-fbc-ta="${CSS.escape(i.id)}"]`)?.focus(),50),n instanceof HTMLElement&&le(n);}async function de(){let n=O(e.items);try{await navigator.clipboard.writeText(n),se();}catch{window.prompt("Copie manualmente:",n);}}function N(n){n.key==="Alt"&&!r&&(r=true,F(true),document.body.style.cursor="crosshair");}function D(n){n.key==="Alt"&&$();}function H(n){if(!r)return;let i=document.elementFromPoint(n.clientX,n.clientY);if(!i||s.contains(i)||p.contains(i)||i===p){p.style.display="none",u=null;return}u=i;let d=i.getBoundingClientRect();p.style.display="block",p.style.left=`${d.left}px`,p.style.top=`${d.top}px`,p.style.width=`${d.width}px`,p.style.height=`${d.height}px`;let f=A(i);T.textContent=`<${i.tagName.toLowerCase()}>${f?` ${f.file.split("/").pop()}${f.line?`:${f.line}`:""}`:""}`;}function Y(n){!r||!u||!(n.target instanceof Node)||s.contains(n.target)||(n.preventDefault(),n.stopPropagation(),ce(u));}function z(n){if(!(n.target instanceof Element))return;let i=n.target,d=i.getAttribute("data-fbc");if(d==="copy"){de();return}if(d==="clear"){e.items.length&&(L(),e.items=[],C(),w());return}let f=i.getAttribute("data-fbc-del");if(f){L(),e.items=e.items.filter(V=>V.id!==f),C(),w();return}if(i.closest('[data-fbc="header"]')){if(E){E=false;return}a=!a,w();}}function B(n){if(n.button!==0||!(n.target instanceof Element))return;let i=n.target.closest('[data-fbc="header"]');if(!i)return;let d=s.getBoundingClientRect();c={pointerId:n.pointerId,startX:n.clientX,startY:n.clientY,panelX:d.left,panelY:d.top,moved:false,header:i},i.style.cursor="grabbing";}function K(n){if(!c||n.pointerId!==c.pointerId)return;let i=n.clientX-c.startX,d=n.clientY-c.startY;!c.moved&&Math.hypot(i,d)<_e||(c.moved=true,n.preventDefault(),M(c.panelX+i,c.panelY+d));}function j(n){if(!c||n.pointerId!==c.pointerId)return;let i=c;if(c=null,i.header.style.cursor="grab",!i.moved)return;let d=s.getBoundingClientRect(),f=d.left+d.width/2<window.innerWidth/2?"left":"right";l=`${d.top+d.height/2<window.innerHeight/2?"top":"bottom"}-${f}`,E=true,v&&clearTimeout(v),v=setTimeout(()=>{E=false,v=void 0;},0),k(),ae();}function q(n){!c||n.pointerId!==c.pointerId||(c.header.style.cursor="grab",c=null,k());}function G(){c||k();}function W(n){if(!(n.target instanceof HTMLTextAreaElement))return;let i=n.target.getAttribute("data-fbc-ta"),d=e.items.find(f=>f.id===i);d&&(d.instruction=n.target.value,C());}function X(n){n.target instanceof HTMLTextAreaElement&&n.key==="Enter"&&!n.shiftKey&&!n.isComposing&&(n.preventDefault(),n.target.blur());}document.addEventListener("keydown",N,true),document.addEventListener("keyup",D,true),window.addEventListener("blur",$),document.addEventListener("mousemove",H,true),document.addEventListener("click",Y,true),s.addEventListener("click",z),s.addEventListener("input",W),s.addEventListener("keydown",X),s.addEventListener("pointerdown",B),window.addEventListener("pointermove",K,{passive:false}),window.addEventListener("pointerup",j),window.addEventListener("pointercancel",q),window.addEventListener("resize",G),document.body.append(p,s),w();let ue={get mounted(){return _},get items(){return e.items},exportMarkdown(){return O(e.items)},destroy(){if(_){_=false,$(),document.removeEventListener("keydown",N,true),document.removeEventListener("keyup",D,true),window.removeEventListener("blur",$),document.removeEventListener("mousemove",H,true),document.removeEventListener("click",Y,true),s.removeEventListener("click",z),s.removeEventListener("input",W),s.removeEventListener("keydown",X),s.removeEventListener("pointerdown",B),window.removeEventListener("pointermove",K),window.removeEventListener("pointerup",j),window.removeEventListener("pointercancel",q),window.removeEventListener("resize",G),h&&clearTimeout(h),v&&clearTimeout(v);for(let n of S)clearTimeout(n);S.clear(),p.remove(),s.remove();}}};return console.log(`[feedback-collector] ativo. Segure ALT + clique pra capturar. ${e.items.length} item(ns) restaurado(s) do localStorage.`),ue}var b=null;function Ae(t={}){if(typeof window>"u"||typeof document>"u")throw new Error("feedback-collector: mount() s\xF3 pode ser chamado no navegador.");if(b?.mounted)return b;let o=window.__FEEDBACK_COLLECTOR__;if(o&&typeof o=="object"&&o.mounted)return b=o,o;if(o===true)throw new Error("feedback-collector: uma vers\xE3o anterior j\xE1 est\xE1 montada nesta p\xE1gina.");return b=re(t),window.__FEEDBACK_COLLECTOR__=b,b}function Oe(){b?.destroy(),b=null,typeof window<"u"&&delete window.__FEEDBACK_COLLECTOR__;}export{Oe as destroy,Ae as mount};//# sourceMappingURL=api.js.map
24
24
  //# sourceMappingURL=api.js.map
package/dist/api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/extract.ts","../src/markdown.ts","../src/storage.ts","../src/collector.ts","../src/lifecycle.ts"],"names":["STYLE_PROPERTIES","NOISY_STYLE_VALUES","getFiber","element","record","key","fiberName","fiber","current","type","relativize","fileName","parseDataSource","value","withColumn","withLine","getSourceInfo","node","ownerHops","inspectorPath","dataSource","alternative","hops","source","componentChain","names","name","escapeIdentifier","escapeAttribute","cssSelector","parts","part","gotStablePart","attribute","classes","index","sibling","curatedStyles","computed","styles","property","truncatedHtml","max","html","captureElement","rect","inline","toMarkdown","items","generatedAt","lines","item","location","component","STORAGE_KEY","LEGACY_STORAGE_KEY","emptyState","parseJson","raw","hasItems","decodeStoredState","currentRaw","legacyRaw","legacy","persistState","storage","state","loadState","decoded","HIGHLIGHT_STYLE","LABEL_STYLE","PANEL_STYLE","TOAST_STYLE","escapeHtml","renderItem","createCollector","options","pickerActive","hoverElement","collapsed","mounted","toastTimer","flashTimers","previousCursor","highlight","highlightLabel","panel","toastElement","save","toast","message","renderPanel","sourceCount","deactivatePicker","flashElement","previousOutline","timer","capture","copyBacklog","markdown","onKeyDown","event","onKeyUp","onMouseMove","onClick","onPanelClick","target","action","deleteId","onPanelInput","id","candidate","controller","activeController","mount","existing","destroy"],"mappings":"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","file":"api.js","sourcesContent":["import type { FeedbackItem, SourceInfo } from \"./types\";\n\ntype Fiber = {\n type?: unknown;\n return?: Fiber | null;\n _debugOwner?: Fiber | null;\n _debugSource?: { fileName?: string; lineNumber?: number; columnNumber?: number };\n};\n\nconst STYLE_PROPERTIES = [\n \"display\", \"position\", \"width\", \"height\", \"margin\", \"padding\", \"color\",\n \"background-color\", \"font-size\", \"font-weight\", \"line-height\", \"border\",\n \"border-radius\", \"gap\", \"flex-direction\", \"justify-content\", \"align-items\",\n \"grid-template-columns\", \"overflow\", \"z-index\", \"opacity\", \"box-shadow\", \"text-align\",\n];\n\nconst NOISY_STYLE_VALUES = new Set([\n \"none\", \"normal\", \"auto\", \"rgba(0, 0, 0, 0)\", \"0px\", \"visible\", \"static\", \"start\",\n]);\n\nfunction getFiber(element: Element): Fiber | null {\n const record = element as unknown as Record<string, unknown>;\n for (const key in record) {\n if (key.startsWith(\"__reactFiber$\") || key.startsWith(\"__reactInternalInstance$\")) {\n return record[key] as Fiber;\n }\n }\n return null;\n}\n\nfunction fiberName(fiber: Fiber): string {\n let current: Fiber | null | undefined = fiber;\n while (current) {\n const type = current.type as { displayName?: string; name?: string } | undefined;\n if (typeof current.type === \"function\") return type?.displayName || type?.name || \"\";\n if (type && typeof type === \"object\" && type.displayName) return type.displayName;\n current = current._debugOwner || current.return;\n }\n return \"\";\n}\n\nexport function relativize(fileName: string): string {\n const match = fileName.match(/(?:^|\\/)((?:src|app|pages|components|lib|features)\\/.*)$/);\n return match?.[1] || fileName;\n}\n\nfunction parseDataSource(value: string): { file: string; line: string; column: string } {\n const withColumn = value.match(/^(.*):(\\d+):(\\d+)$/);\n if (withColumn) {\n return { file: withColumn[1] || value, line: withColumn[2] || \"\", column: withColumn[3] || \"\" };\n }\n const withLine = value.match(/^(.*):(\\d+)$/);\n return {\n file: withLine?.[1] || value,\n line: withLine?.[2] || \"\",\n column: \"\",\n };\n}\n\nexport function getSourceInfo(element: Element): SourceInfo | null {\n let node: Element | null = element;\n let ownerHops = 0;\n while (node && node !== document.body) {\n const inspectorPath = node.getAttribute(\"data-inspector-relative-path\");\n const dataSource = node.getAttribute(\"data-source\");\n if (inspectorPath || dataSource) {\n const alternative = dataSource ? parseDataSource(dataSource) : null;\n return {\n file: inspectorPath || alternative?.file || \"\",\n line: node.getAttribute(\"data-inspector-line\") || alternative?.line || \"\",\n column: node.getAttribute(\"data-inspector-column\") || alternative?.column || \"\",\n via: \"data-attr\",\n ownerHops,\n };\n }\n node = node.parentElement;\n ownerHops += 1;\n }\n\n let fiber = getFiber(element);\n let hops = 0;\n while (fiber && hops < 20) {\n const source = fiber._debugSource;\n if (source?.fileName) {\n return {\n file: relativize(source.fileName),\n line: source.lineNumber || \"\",\n column: source.columnNumber || \"\",\n via: \"fiber\",\n componentName: fiberName(fiber),\n };\n }\n fiber = fiber._debugOwner || fiber.return || null;\n hops += 1;\n }\n return null;\n}\n\nexport function componentChain(element: Element): string[] {\n let fiber = getFiber(element);\n const names: string[] = [];\n let hops = 0;\n while (fiber && names.length < 3 && hops < 30) {\n const type = fiber.type as { displayName?: string; name?: string } | undefined;\n const name = typeof fiber.type === \"function\" ? type?.displayName || type?.name : type?.displayName;\n if (name && !names.includes(name)) names.push(name);\n fiber = fiber._debugOwner || fiber.return || null;\n hops += 1;\n }\n return names;\n}\n\nfunction escapeIdentifier(value: string): string {\n return typeof CSS !== \"undefined\" && CSS.escape ? CSS.escape(value) : value.replace(/[^a-zA-Z0-9_-]/g, \"\\\\$&\");\n}\n\nfunction escapeAttribute(value: string): string {\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n}\n\nexport function cssSelector(element: Element): string {\n if (element.id) return `#${escapeIdentifier(element.id)}`;\n const parts: string[] = [];\n let node: Element | null = element;\n while (node && node !== document.body && parts.length < 5) {\n let part = node.tagName.toLowerCase();\n let gotStablePart = false;\n for (const attribute of [\"data-testid\", \"data-test\", \"aria-label\", \"name\"]) {\n const value = node.getAttribute(attribute);\n if (value) {\n part += `[${attribute}=\"${escapeAttribute(value)}\"]`;\n gotStablePart = true;\n break;\n }\n }\n\n if (!gotStablePart && node.classList.length) {\n const classes = Array.from(node.classList)\n .filter((value) => !/^[a-z]*[_-][a-zA-Z0-9]{5,}$/.test(value) && !/^\\d/.test(value) && value.length < 30)\n .slice(0, 2);\n if (classes.length) {\n part += `.${classes.map(escapeIdentifier).join(\".\")}`;\n gotStablePart = true;\n }\n }\n\n if (!gotStablePart) {\n let index = 1;\n let sibling = node.previousElementSibling;\n while (sibling) {\n if (sibling.tagName === node.tagName) index += 1;\n sibling = sibling.previousElementSibling;\n }\n if (index > 1) part += `:nth-of-type(${index})`;\n }\n\n parts.unshift(part);\n try {\n if (document.querySelectorAll(parts.join(\" > \")).length === 1) break;\n } catch {\n // Continue até montar um seletor válido/mais específico.\n }\n node = node.parentElement;\n }\n return parts.join(\" > \");\n}\n\nfunction curatedStyles(element: Element): Record<string, string> {\n const computed = getComputedStyle(element);\n const styles: Record<string, string> = {};\n for (const property of STYLE_PROPERTIES) {\n const value = computed.getPropertyValue(property);\n if (value && !NOISY_STYLE_VALUES.has(value)) styles[property] = value;\n }\n return styles;\n}\n\nfunction truncatedHtml(element: Element, max: number): string {\n const html = element.outerHTML || \"\";\n return html.length <= max ? html : `${html.slice(0, max)}… [truncado]`;\n}\n\nexport function captureElement(element: Element): FeedbackItem {\n const rect = element.getBoundingClientRect();\n return {\n id: `${Date.now()}_${Math.random().toString(36).slice(2, 7)}`,\n url: location.pathname + location.search + location.hash,\n tag: element.tagName.toLowerCase(),\n selector: cssSelector(element),\n source: getSourceInfo(element),\n components: componentChain(element),\n text: (element.textContent || \"\").trim().slice(0, 120),\n html: truncatedHtml(element, 600),\n styles: curatedStyles(element),\n rect: {\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n w: Math.round(rect.width),\n h: Math.round(rect.height),\n },\n viewport: `${window.innerWidth}x${window.innerHeight}`,\n instruction: \"\",\n ts: new Date().toISOString(),\n };\n}\n","import type { FeedbackItem } from \"./types\";\n\nfunction inline(value: unknown): string {\n return String(value).replace(/`/g, \"\\\\`\");\n}\n\nexport function toMarkdown(items: readonly FeedbackItem[], generatedAt = new Date()): string {\n const lines = [\n \"# Backlog de feedback visual\",\n \"\",\n `Gerado em ${generatedAt.toLocaleString()} — ${items.length} itens.`,\n \"Cada item indica o arquivo:linha quando disponível. Execute na ordem, agrupando edits do mesmo arquivo.\",\n \"\",\n ];\n\n items.forEach((item, index) => {\n lines.push(`## ${index + 1}. ${item.instruction ? item.instruction.split(\"\\n\")[0] : \"(sem instrução)\"}`);\n lines.push(\"\");\n if (item.instruction.includes(\"\\n\")) lines.push(item.instruction, \"\");\n lines.push(`- **Rota:** \\`${inline(item.url)}\\``);\n if (item.source) {\n const location = `${item.source.file}${item.source.line ? `:${item.source.line}` : \"\"}`;\n const component = item.source.componentName ? ` (componente \\`${inline(item.source.componentName)}\\`)` : \"\";\n lines.push(`- **Source:** \\`${inline(location)}\\`${component}`);\n } else if (item.components.length) {\n lines.push(`- **Componentes (do mais interno):** ${item.components.map((name) => `\\`${inline(name)}\\``).join(\" → \")}`);\n }\n lines.push(`- **Elemento:** \\`<${inline(item.tag)}>\\` — seletor: \\`${inline(item.selector)}\\``);\n if (item.text) lines.push(`- **Texto visível:** \"${item.text}\"`);\n lines.push(`- **Posição:** ${item.rect.w}x${item.rect.h} @ (${item.rect.x},${item.rect.y}), viewport ${item.viewport}`);\n\n const styles = Object.entries(item.styles);\n if (styles.length) {\n lines.push(`- **Styles atuais:** ${styles.map(([key, value]) => `\\`${inline(key)}: ${inline(value)}\\``).join(\", \")}`);\n }\n lines.push(\"\", \"```html\", item.html, \"```\", \"\");\n });\n\n return lines.join(\"\\n\");\n}\n","import type { FeedbackItem } from \"./types\";\n\nexport const STORAGE_KEY = \"__fbc_state_v2\";\nexport const LEGACY_STORAGE_KEY = \"__fbc_items_v1\";\nexport const STORAGE_VERSION = 2 as const;\n\nexport interface StoredState {\n version: typeof STORAGE_VERSION;\n items: FeedbackItem[];\n}\n\nexport interface DecodedState {\n state: StoredState;\n migrated: boolean;\n}\n\nconst emptyState = (): StoredState => ({ version: STORAGE_VERSION, items: [] });\n\nfunction parseJson(raw: string | null): unknown {\n if (!raw) return null;\n try {\n return JSON.parse(raw) as unknown;\n } catch {\n return null;\n }\n}\n\nfunction hasItems(value: unknown): value is { items: FeedbackItem[] } {\n return Boolean(value) && typeof value === \"object\" && Array.isArray((value as { items?: unknown }).items);\n}\n\n/** Pure migration used by the runtime and unit tests. */\nexport function decodeStoredState(currentRaw: string | null, legacyRaw: string | null): DecodedState {\n const current = parseJson(currentRaw);\n if (hasItems(current) && (current as { version?: unknown }).version === STORAGE_VERSION) {\n return {\n state: { version: STORAGE_VERSION, items: current.items },\n migrated: false,\n };\n }\n\n const legacy = parseJson(legacyRaw);\n if (Array.isArray(legacy)) {\n return {\n state: { version: STORAGE_VERSION, items: legacy as FeedbackItem[] },\n migrated: true,\n };\n }\n\n return { state: emptyState(), migrated: false };\n}\n\nexport function persistState(storage: Pick<Storage, \"setItem\">, state: StoredState): boolean {\n try {\n storage.setItem(STORAGE_KEY, JSON.stringify(state));\n return true;\n } catch {\n return false;\n }\n}\n\nexport function loadState(storage: Pick<Storage, \"getItem\" | \"setItem\">): StoredState {\n let currentRaw: string | null = null;\n let legacyRaw: string | null = null;\n try {\n currentRaw = storage.getItem(STORAGE_KEY);\n legacyRaw = storage.getItem(LEGACY_STORAGE_KEY);\n } catch {\n return emptyState();\n }\n\n const decoded = decodeStoredState(currentRaw, legacyRaw);\n if (decoded.migrated) {\n // A chave v1 fica intacta para permitir rollback sem perda de dados.\n persistState(storage, decoded.state);\n }\n return decoded.state;\n}\n","import { captureElement, getSourceInfo } from \"./extract\";\nimport { toMarkdown } from \"./markdown\";\nimport { loadState, persistState, type StoredState } from \"./storage\";\nimport type { FeedbackCollectorController, FeedbackItem, MountOptions } from \"./types\";\n\nconst HIGHLIGHT_STYLE = \"position:fixed;pointer-events:none;z-index:2147483645;border:2px solid #2563eb;background:rgba(37,99,235,.08);border-radius:2px;display:none;transition:all .05s linear;\";\nconst LABEL_STYLE = \"position:absolute;top:-22px;left:0;background:#2563eb;color:#fff;font:11px/1.4 ui-monospace,monospace;padding:1px 6px;border-radius:2px;white-space:nowrap;\";\nconst PANEL_STYLE = \"position:fixed;bottom:16px;right:16px;width:340px;max-height:70vh;z-index:2147483646;background:#1c1c1e;color:#e5e5e7;border-radius:10px;box-shadow:0 8px 30px rgba(0,0,0,.4);font:13px/1.45 system-ui,sans-serif;display:flex;flex-direction:column;overflow:hidden;\";\nconst TOAST_STYLE = \"position:fixed;bottom:16px;left:50%;transform:translateX(-50%);z-index:2147483647;background:#15803d;color:#fff;padding:8px 16px;border-radius:8px;font:13px system-ui,sans-serif;display:none;box-shadow:0 4px 14px rgba(0,0,0,.3);\";\n\nfunction escapeHtml(value: unknown): string {\n return String(value).replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/\"/g, \"&quot;\");\n}\n\nfunction renderItem(item: FeedbackItem, index: number): string {\n const location = item.source\n ? `${item.source.file.split(\"/\").slice(-2).join(\"/\")}${item.source.line ? `:${item.source.line}` : \"\"}`\n : item.components[0]\n ? `<${item.components[0]}>`\n : item.selector.slice(0, 40);\n\n return `<div style=\"background:#2c2c2e;border-radius:8px;padding:8px;\">\n <div style=\"display:flex;align-items:baseline;gap:6px;margin-bottom:6px;\">\n <span style=\"color:#a8a8ae;font-size:11px;\">#${index + 1}</span>\n <span style=\"font-family:ui-monospace,monospace;font-size:11px;color:#64d2ff;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;\" title=\"${escapeHtml(item.selector)}\">${escapeHtml(location)}</span>\n <span data-fbc-del=\"${escapeHtml(item.id)}\" style=\"cursor:pointer;color:#a8a8ae;padding:0 4px;\" title=\"Remover\">✕</span>\n </div>\n <textarea data-fbc-ta=\"${escapeHtml(item.id)}\" placeholder=\"O que mudar aqui?\" style=\"width:100%;box-sizing:border-box;background:#1c1c1e;color:#e5e5e7;border:1px solid #3a3a3c;border-radius:6px;padding:6px;font:13px system-ui;resize:vertical;min-height:40px;\">${escapeHtml(item.instruction)}</textarea>\n </div>`;\n}\n\nexport function createCollector(options: MountOptions = {}): FeedbackCollectorController {\n if (!document.body) throw new Error(\"feedback-collector: mount() requer document.body disponível.\");\n\n const storage = options.storage || window.localStorage;\n let state: StoredState = loadState(storage);\n let pickerActive = false;\n let hoverElement: Element | null = null;\n let collapsed = false;\n let mounted = true;\n let toastTimer: ReturnType<typeof setTimeout> | undefined;\n const flashTimers = new Set<ReturnType<typeof setTimeout>>();\n const previousCursor = document.body.style.cursor;\n\n const highlight = document.createElement(\"div\");\n highlight.dataset.fbcRoot = \"highlight\";\n highlight.style.cssText = HIGHLIGHT_STYLE;\n const highlightLabel = document.createElement(\"div\");\n highlightLabel.style.cssText = LABEL_STYLE;\n highlight.append(highlightLabel);\n\n const panel = document.createElement(\"div\");\n panel.dataset.fbcRoot = \"panel\";\n panel.style.cssText = PANEL_STYLE;\n\n const toastElement = document.createElement(\"div\");\n toastElement.dataset.fbcRoot = \"toast\";\n toastElement.style.cssText = TOAST_STYLE;\n\n function save(): void {\n persistState(storage, state);\n }\n\n function toast(message: string): void {\n toastElement.textContent = message;\n toastElement.style.display = \"block\";\n if (toastTimer) clearTimeout(toastTimer);\n toastTimer = setTimeout(() => {\n toastElement.style.display = \"none\";\n }, 2500);\n }\n\n function renderPanel(): void {\n const sourceCount = state.items.filter((item) => item.source).length;\n panel.innerHTML = `<div data-fbc=\"header\" style=\"display:flex;align-items:center;gap:8px;padding:10px 12px;background:#2c2c2e;cursor:pointer;user-select:none;\">\n <span style=\"font-weight:600;\">Feedback</span>\n <span style=\"background:#2563eb;border-radius:10px;padding:0 8px;font-size:11px;\">${state.items.length}</span>\n ${state.items.length ? `<span style=\"font-size:11px;color:#a8a8ae;\">${sourceCount} com source</span>` : \"\"}\n <span style=\"margin-left:auto;color:#a8a8ae;font-size:11px;\">segure ALT + clique</span>\n <span data-fbc=\"toggle\" style=\"color:#a8a8ae;\">${collapsed ? \"▸\" : \"▾\"}</span>\n </div>${collapsed ? \"\" : `<div style=\"overflow-y:auto;flex:1;padding:8px 12px;display:flex;flex-direction:column;gap:8px;\">\n ${state.items.length ? state.items.map(renderItem).join(\"\") : '<div style=\"color:#a8a8ae;padding:12px 0;text-align:center;\">Nenhum item. Segure ALT e clique num elemento da página.</div>'}\n </div>\n <div style=\"display:flex;gap:8px;padding:10px 12px;background:#2c2c2e;\">\n <button data-fbc=\"copy\" ${state.items.length ? \"\" : \"disabled\"} style=\"flex:1;background:${state.items.length ? \"#2563eb\" : \"#3a3a3c\"};color:${state.items.length ? \"#fff\" : \"#a8a8ae\"};border:0;border-radius:6px;padding:8px;font:600 13px system-ui;cursor:${state.items.length ? \"pointer\" : \"default\"};\">Copiar backlog</button>\n <button data-fbc=\"clear\" style=\"background:#3a3a3c;color:#e5e5e7;border:0;border-radius:6px;padding:8px 12px;font:13px system-ui;cursor:pointer;\">Limpar</button>\n </div>`}`;\n }\n\n function deactivatePicker(): void {\n pickerActive = false;\n hoverElement = null;\n highlight.style.display = \"none\";\n document.body.style.cursor = previousCursor;\n }\n\n function flashElement(element: HTMLElement): void {\n const previousOutline = element.style.outline;\n element.style.outline = \"3px solid #16a34a\";\n const timer = setTimeout(() => {\n element.style.outline = previousOutline;\n flashTimers.delete(timer);\n }, 400);\n flashTimers.add(timer);\n }\n\n function capture(element: Element): void {\n const item = captureElement(element);\n state.items.push(item);\n save();\n renderPanel();\n setTimeout(() => panel.querySelector<HTMLTextAreaElement>(`[data-fbc-ta=\"${CSS.escape(item.id)}\"]`)?.focus(), 50);\n if (element instanceof HTMLElement) flashElement(element);\n }\n\n async function copyBacklog(): Promise<void> {\n const markdown = toMarkdown(state.items);\n try {\n await navigator.clipboard.writeText(markdown);\n toast(`Backlog copiado (${state.items.length} itens). Cola no seu agente de código.`);\n } catch {\n window.prompt(\"Copie manualmente:\", markdown);\n }\n }\n\n function onKeyDown(event: KeyboardEvent): void {\n if (event.key === \"Alt\" && !pickerActive) {\n pickerActive = true;\n document.body.style.cursor = \"crosshair\";\n }\n }\n\n function onKeyUp(event: KeyboardEvent): void {\n if (event.key === \"Alt\") deactivatePicker();\n }\n\n function onMouseMove(event: MouseEvent): void {\n if (!pickerActive) return;\n const element = document.elementFromPoint(event.clientX, event.clientY);\n if (!element || panel.contains(element) || highlight.contains(element) || element === highlight) {\n highlight.style.display = \"none\";\n hoverElement = null;\n return;\n }\n hoverElement = element;\n const rect = element.getBoundingClientRect();\n highlight.style.display = \"block\";\n highlight.style.left = `${rect.left}px`;\n highlight.style.top = `${rect.top}px`;\n highlight.style.width = `${rect.width}px`;\n highlight.style.height = `${rect.height}px`;\n const source = getSourceInfo(element);\n highlightLabel.textContent = `<${element.tagName.toLowerCase()}>${source ? ` ${source.file.split(\"/\").pop()}${source.line ? `:${source.line}` : \"\"}` : \"\"}`;\n }\n\n function onClick(event: MouseEvent): void {\n if (!pickerActive || !hoverElement || !(event.target instanceof Node) || panel.contains(event.target)) return;\n event.preventDefault();\n event.stopPropagation();\n capture(hoverElement);\n }\n\n function onPanelClick(event: MouseEvent): void {\n if (!(event.target instanceof Element)) return;\n const target = event.target;\n const action = target.getAttribute(\"data-fbc\");\n if (action === \"copy\") {\n void copyBacklog();\n return;\n }\n if (action === \"clear\") {\n if (state.items.length && window.confirm(`Limpar todos os ${state.items.length} itens?`)) {\n state.items = [];\n save();\n renderPanel();\n }\n return;\n }\n const deleteId = target.getAttribute(\"data-fbc-del\");\n if (deleteId) {\n state.items = state.items.filter((item) => item.id !== deleteId);\n save();\n renderPanel();\n return;\n }\n if (target.closest('[data-fbc=\"header\"]')) {\n collapsed = !collapsed;\n renderPanel();\n }\n }\n\n function onPanelInput(event: Event): void {\n if (!(event.target instanceof HTMLTextAreaElement)) return;\n const id = event.target.getAttribute(\"data-fbc-ta\");\n const item = state.items.find((candidate) => candidate.id === id);\n if (item) {\n item.instruction = event.target.value;\n save();\n }\n }\n\n document.addEventListener(\"keydown\", onKeyDown, true);\n document.addEventListener(\"keyup\", onKeyUp, true);\n window.addEventListener(\"blur\", deactivatePicker);\n document.addEventListener(\"mousemove\", onMouseMove, true);\n document.addEventListener(\"click\", onClick, true);\n panel.addEventListener(\"click\", onPanelClick);\n panel.addEventListener(\"input\", onPanelInput);\n document.body.append(highlight, panel, toastElement);\n renderPanel();\n\n const controller: FeedbackCollectorController = {\n get mounted() {\n return mounted;\n },\n get items() {\n return state.items;\n },\n exportMarkdown() {\n return toMarkdown(state.items);\n },\n destroy() {\n if (!mounted) return;\n mounted = false;\n deactivatePicker();\n document.removeEventListener(\"keydown\", onKeyDown, true);\n document.removeEventListener(\"keyup\", onKeyUp, true);\n window.removeEventListener(\"blur\", deactivatePicker);\n document.removeEventListener(\"mousemove\", onMouseMove, true);\n document.removeEventListener(\"click\", onClick, true);\n panel.removeEventListener(\"click\", onPanelClick);\n panel.removeEventListener(\"input\", onPanelInput);\n if (toastTimer) clearTimeout(toastTimer);\n for (const timer of flashTimers) clearTimeout(timer);\n flashTimers.clear();\n highlight.remove();\n panel.remove();\n toastElement.remove();\n },\n };\n\n console.log(`[feedback-collector] ativo. Segure ALT + clique pra capturar. ${state.items.length} item(ns) restaurado(s) do localStorage.`);\n return controller;\n}\n","import { createCollector } from \"./collector\";\nimport type { FeedbackCollectorController, MountOptions } from \"./types\";\n\ndeclare global {\n interface Window {\n __FEEDBACK_COLLECTOR__?: boolean | FeedbackCollectorController;\n }\n}\n\nlet activeController: FeedbackCollectorController | null = null;\nlet pendingAutoMount: (() => void) | null = null;\n\nexport function mount(options: MountOptions = {}): FeedbackCollectorController {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n throw new Error(\"feedback-collector: mount() só pode ser chamado no navegador.\");\n }\n if (activeController?.mounted) return activeController;\n\n const existing = window.__FEEDBACK_COLLECTOR__;\n if (existing && typeof existing === \"object\" && existing.mounted) {\n activeController = existing;\n return existing;\n }\n if (existing === true) {\n throw new Error(\"feedback-collector: uma versão anterior já está montada nesta página.\");\n }\n\n activeController = createCollector(options);\n window.__FEEDBACK_COLLECTOR__ = activeController;\n return activeController;\n}\n\nexport function destroy(): void {\n if (pendingAutoMount) {\n document.removeEventListener(\"DOMContentLoaded\", pendingAutoMount);\n pendingAutoMount = null;\n }\n activeController?.destroy();\n activeController = null;\n if (typeof window !== \"undefined\") delete window.__FEEDBACK_COLLECTOR__;\n}\n\nexport function autoMount(): void {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") return;\n // Uma v0.1 já injetada usa o booleano; auto-init duplicado continua sendo no-op.\n if (window.__FEEDBACK_COLLECTOR__ === true) return;\n if (document.readyState === \"loading\") {\n pendingAutoMount = () => {\n pendingAutoMount = null;\n mount();\n };\n document.addEventListener(\"DOMContentLoaded\", pendingAutoMount, { once: true });\n return;\n }\n mount();\n}\n"]}
1
+ {"version":3,"sources":["../src/extract.ts","../src/markdown.ts","../src/storage.ts","../src/collector.ts","../src/lifecycle.ts"],"names":["STYLE_PROPERTIES","NOISY_STYLE_VALUES","getFiber","element","record","key","fiberName","fiber","current","type","relativize","fileName","parseDataSource","value","withColumn","withLine","getSourceInfo","node","ownerHops","inspectorPath","dataSource","alternative","hops","source","componentChain","names","name","escapeIdentifier","escapeAttribute","cssSelector","parts","part","gotStablePart","attribute","classes","index","sibling","curatedStyles","computed","styles","property","truncatedHtml","max","html","captureElement","rect","inline","toMarkdown","items","generatedAt","lines","item","location","component","STORAGE_KEY","LEGACY_STORAGE_KEY","emptyState","parseJson","raw","hasItems","decodeStoredState","currentRaw","legacyRaw","legacy","persistState","storage","state","loadState","decoded","HIGHLIGHT_STYLE","LABEL_STYLE","PANEL_STYLE","PANEL_CORNER_KEY","PANEL_MARGIN","DRAG_THRESHOLD","isPanelCorner","escapeHtml","renderItem","createCollector","options","pickerActive","hoverElement","collapsed","panelCorner","panelDrag","suppressHeaderClick","copyFeedbackActive","mounted","copyFeedbackTimer","dragClickTimer","flashTimers","previousCursor","highlight","highlightLabel","panel","storedCorner","setPanelPosition","x","y","maxX","maxY","applyPanelCorner","persistPanelCorner","setPanelHiddenForPicker","hidden","save","updateCopyButton","button","canCopy","resetCopyFeedback","showCopyFeedback","renderPanel","sourceCount","deactivatePicker","flashElement","previousOutline","timer","capture","copyBacklog","markdown","onKeyDown","event","onKeyUp","onMouseMove","onClick","onPanelClick","target","action","deleteId","onPanelPointerDown","header","onPanelPointerMove","deltaX","deltaY","finishPanelDrag","drag","horizontal","cancelPanelDrag","onViewportResize","onPanelInput","id","candidate","onPanelKeyDown","controller","activeController","mount","existing","destroy"],"mappings":"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","file":"api.js","sourcesContent":["import type { FeedbackItem, SourceInfo } from \"./types\";\n\ntype Fiber = {\n type?: unknown;\n return?: Fiber | null;\n _debugOwner?: Fiber | null;\n _debugSource?: { fileName?: string; lineNumber?: number; columnNumber?: number };\n};\n\nconst STYLE_PROPERTIES = [\n \"display\", \"position\", \"width\", \"height\", \"margin\", \"padding\", \"color\",\n \"background-color\", \"font-size\", \"font-weight\", \"line-height\", \"border\",\n \"border-radius\", \"gap\", \"flex-direction\", \"justify-content\", \"align-items\",\n \"grid-template-columns\", \"overflow\", \"z-index\", \"opacity\", \"box-shadow\", \"text-align\",\n];\n\nconst NOISY_STYLE_VALUES = new Set([\n \"none\", \"normal\", \"auto\", \"rgba(0, 0, 0, 0)\", \"0px\", \"visible\", \"static\", \"start\",\n]);\n\nfunction getFiber(element: Element): Fiber | null {\n const record = element as unknown as Record<string, unknown>;\n for (const key in record) {\n if (key.startsWith(\"__reactFiber$\") || key.startsWith(\"__reactInternalInstance$\")) {\n return record[key] as Fiber;\n }\n }\n return null;\n}\n\nfunction fiberName(fiber: Fiber): string {\n let current: Fiber | null | undefined = fiber;\n while (current) {\n const type = current.type as { displayName?: string; name?: string } | undefined;\n if (typeof current.type === \"function\") return type?.displayName || type?.name || \"\";\n if (type && typeof type === \"object\" && type.displayName) return type.displayName;\n current = current._debugOwner || current.return;\n }\n return \"\";\n}\n\nexport function relativize(fileName: string): string {\n const match = fileName.match(/(?:^|\\/)((?:src|app|pages|components|lib|features)\\/.*)$/);\n return match?.[1] || fileName;\n}\n\nfunction parseDataSource(value: string): { file: string; line: string; column: string } {\n const withColumn = value.match(/^(.*):(\\d+):(\\d+)$/);\n if (withColumn) {\n return { file: withColumn[1] || value, line: withColumn[2] || \"\", column: withColumn[3] || \"\" };\n }\n const withLine = value.match(/^(.*):(\\d+)$/);\n return {\n file: withLine?.[1] || value,\n line: withLine?.[2] || \"\",\n column: \"\",\n };\n}\n\nexport function getSourceInfo(element: Element): SourceInfo | null {\n let node: Element | null = element;\n let ownerHops = 0;\n while (node && node !== document.body) {\n const inspectorPath = node.getAttribute(\"data-inspector-relative-path\");\n const dataSource = node.getAttribute(\"data-source\");\n if (inspectorPath || dataSource) {\n const alternative = dataSource ? parseDataSource(dataSource) : null;\n return {\n file: inspectorPath || alternative?.file || \"\",\n line: node.getAttribute(\"data-inspector-line\") || alternative?.line || \"\",\n column: node.getAttribute(\"data-inspector-column\") || alternative?.column || \"\",\n via: \"data-attr\",\n ownerHops,\n };\n }\n node = node.parentElement;\n ownerHops += 1;\n }\n\n let fiber = getFiber(element);\n let hops = 0;\n while (fiber && hops < 20) {\n const source = fiber._debugSource;\n if (source?.fileName) {\n return {\n file: relativize(source.fileName),\n line: source.lineNumber || \"\",\n column: source.columnNumber || \"\",\n via: \"fiber\",\n componentName: fiberName(fiber),\n };\n }\n fiber = fiber._debugOwner || fiber.return || null;\n hops += 1;\n }\n return null;\n}\n\nexport function componentChain(element: Element): string[] {\n let fiber = getFiber(element);\n const names: string[] = [];\n let hops = 0;\n while (fiber && names.length < 3 && hops < 30) {\n const type = fiber.type as { displayName?: string; name?: string } | undefined;\n const name = typeof fiber.type === \"function\" ? type?.displayName || type?.name : type?.displayName;\n if (name && !names.includes(name)) names.push(name);\n fiber = fiber._debugOwner || fiber.return || null;\n hops += 1;\n }\n return names;\n}\n\nfunction escapeIdentifier(value: string): string {\n return typeof CSS !== \"undefined\" && CSS.escape ? CSS.escape(value) : value.replace(/[^a-zA-Z0-9_-]/g, \"\\\\$&\");\n}\n\nfunction escapeAttribute(value: string): string {\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n}\n\nexport function cssSelector(element: Element): string {\n if (element.id) return `#${escapeIdentifier(element.id)}`;\n const parts: string[] = [];\n let node: Element | null = element;\n while (node && node !== document.body && parts.length < 5) {\n let part = node.tagName.toLowerCase();\n let gotStablePart = false;\n for (const attribute of [\"data-testid\", \"data-test\", \"aria-label\", \"name\"]) {\n const value = node.getAttribute(attribute);\n if (value) {\n part += `[${attribute}=\"${escapeAttribute(value)}\"]`;\n gotStablePart = true;\n break;\n }\n }\n\n if (!gotStablePart && node.classList.length) {\n const classes = Array.from(node.classList)\n .filter((value) => !/^[a-z]*[_-][a-zA-Z0-9]{5,}$/.test(value) && !/^\\d/.test(value) && value.length < 30)\n .slice(0, 2);\n if (classes.length) {\n part += `.${classes.map(escapeIdentifier).join(\".\")}`;\n gotStablePart = true;\n }\n }\n\n if (!gotStablePart) {\n let index = 1;\n let sibling = node.previousElementSibling;\n while (sibling) {\n if (sibling.tagName === node.tagName) index += 1;\n sibling = sibling.previousElementSibling;\n }\n if (index > 1) part += `:nth-of-type(${index})`;\n }\n\n parts.unshift(part);\n try {\n if (document.querySelectorAll(parts.join(\" > \")).length === 1) break;\n } catch {\n // Continue até montar um seletor válido/mais específico.\n }\n node = node.parentElement;\n }\n return parts.join(\" > \");\n}\n\nfunction curatedStyles(element: Element): Record<string, string> {\n const computed = getComputedStyle(element);\n const styles: Record<string, string> = {};\n for (const property of STYLE_PROPERTIES) {\n const value = computed.getPropertyValue(property);\n if (value && !NOISY_STYLE_VALUES.has(value)) styles[property] = value;\n }\n return styles;\n}\n\nfunction truncatedHtml(element: Element, max: number): string {\n const html = element.outerHTML || \"\";\n return html.length <= max ? html : `${html.slice(0, max)}… [truncado]`;\n}\n\nexport function captureElement(element: Element): FeedbackItem {\n const rect = element.getBoundingClientRect();\n return {\n id: `${Date.now()}_${Math.random().toString(36).slice(2, 7)}`,\n url: location.pathname + location.search + location.hash,\n tag: element.tagName.toLowerCase(),\n selector: cssSelector(element),\n source: getSourceInfo(element),\n components: componentChain(element),\n text: (element.textContent || \"\").trim().slice(0, 120),\n html: truncatedHtml(element, 600),\n styles: curatedStyles(element),\n rect: {\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n w: Math.round(rect.width),\n h: Math.round(rect.height),\n },\n viewport: `${window.innerWidth}x${window.innerHeight}`,\n instruction: \"\",\n ts: new Date().toISOString(),\n };\n}\n","import type { FeedbackItem } from \"./types\";\n\nfunction inline(value: unknown): string {\n return String(value).replace(/`/g, \"\\\\`\");\n}\n\nexport function toMarkdown(items: readonly FeedbackItem[], generatedAt = new Date()): string {\n const lines = [\n \"# Backlog de feedback visual\",\n \"\",\n `Gerado em ${generatedAt.toLocaleString()} — ${items.length} itens.`,\n \"Cada item indica o arquivo:linha quando disponível. Execute na ordem, agrupando edits do mesmo arquivo.\",\n \"\",\n ];\n\n items.forEach((item, index) => {\n lines.push(`## ${index + 1}. ${item.instruction ? item.instruction.split(\"\\n\")[0] : \"(sem instrução)\"}`);\n lines.push(\"\");\n if (item.instruction.includes(\"\\n\")) lines.push(item.instruction, \"\");\n lines.push(`- **Rota:** \\`${inline(item.url)}\\``);\n if (item.source) {\n const location = `${item.source.file}${item.source.line ? `:${item.source.line}` : \"\"}`;\n const component = item.source.componentName ? ` (componente \\`${inline(item.source.componentName)}\\`)` : \"\";\n lines.push(`- **Source:** \\`${inline(location)}\\`${component}`);\n } else if (item.components.length) {\n lines.push(`- **Componentes (do mais interno):** ${item.components.map((name) => `\\`${inline(name)}\\``).join(\" → \")}`);\n }\n lines.push(`- **Elemento:** \\`<${inline(item.tag)}>\\` — seletor: \\`${inline(item.selector)}\\``);\n if (item.text) lines.push(`- **Texto visível:** \"${item.text}\"`);\n lines.push(`- **Posição:** ${item.rect.w}x${item.rect.h} @ (${item.rect.x},${item.rect.y}), viewport ${item.viewport}`);\n\n const styles = Object.entries(item.styles);\n if (styles.length) {\n lines.push(`- **Styles atuais:** ${styles.map(([key, value]) => `\\`${inline(key)}: ${inline(value)}\\``).join(\", \")}`);\n }\n lines.push(\"\", \"```html\", item.html, \"```\", \"\");\n });\n\n return lines.join(\"\\n\");\n}\n","import type { FeedbackItem } from \"./types\";\n\nexport const STORAGE_KEY = \"__fbc_state_v2\";\nexport const LEGACY_STORAGE_KEY = \"__fbc_items_v1\";\nexport const STORAGE_VERSION = 2 as const;\n\nexport interface StoredState {\n version: typeof STORAGE_VERSION;\n items: FeedbackItem[];\n}\n\nexport interface DecodedState {\n state: StoredState;\n migrated: boolean;\n}\n\nconst emptyState = (): StoredState => ({ version: STORAGE_VERSION, items: [] });\n\nfunction parseJson(raw: string | null): unknown {\n if (!raw) return null;\n try {\n return JSON.parse(raw) as unknown;\n } catch {\n return null;\n }\n}\n\nfunction hasItems(value: unknown): value is { items: FeedbackItem[] } {\n return Boolean(value) && typeof value === \"object\" && Array.isArray((value as { items?: unknown }).items);\n}\n\n/** Pure migration used by the runtime and unit tests. */\nexport function decodeStoredState(currentRaw: string | null, legacyRaw: string | null): DecodedState {\n const current = parseJson(currentRaw);\n if (hasItems(current) && (current as { version?: unknown }).version === STORAGE_VERSION) {\n return {\n state: { version: STORAGE_VERSION, items: current.items },\n migrated: false,\n };\n }\n\n const legacy = parseJson(legacyRaw);\n if (Array.isArray(legacy)) {\n return {\n state: { version: STORAGE_VERSION, items: legacy as FeedbackItem[] },\n migrated: true,\n };\n }\n\n return { state: emptyState(), migrated: false };\n}\n\nexport function persistState(storage: Pick<Storage, \"setItem\">, state: StoredState): boolean {\n try {\n storage.setItem(STORAGE_KEY, JSON.stringify(state));\n return true;\n } catch {\n return false;\n }\n}\n\nexport function loadState(storage: Pick<Storage, \"getItem\" | \"setItem\">): StoredState {\n let currentRaw: string | null = null;\n let legacyRaw: string | null = null;\n try {\n currentRaw = storage.getItem(STORAGE_KEY);\n legacyRaw = storage.getItem(LEGACY_STORAGE_KEY);\n } catch {\n return emptyState();\n }\n\n const decoded = decodeStoredState(currentRaw, legacyRaw);\n if (decoded.migrated) {\n // A chave v1 fica intacta para permitir rollback sem perda de dados.\n persistState(storage, decoded.state);\n }\n return decoded.state;\n}\n","import { captureElement, getSourceInfo } from \"./extract\";\nimport { toMarkdown } from \"./markdown\";\nimport { loadState, persistState, type StoredState } from \"./storage\";\nimport type { FeedbackCollectorController, FeedbackItem, MountOptions } from \"./types\";\n\nconst HIGHLIGHT_STYLE = \"position:fixed;pointer-events:none;z-index:2147483645;border:2px solid #2563eb;background:rgba(37,99,235,.08);border-radius:2px;display:none;transition:all .05s linear;\";\nconst LABEL_STYLE = \"position:absolute;top:-22px;left:0;background:#2563eb;color:#fff;font:11px/1.4 ui-monospace,monospace;padding:1px 6px;border-radius:2px;white-space:nowrap;\";\nconst PANEL_STYLE = \"position:fixed;bottom:16px;right:16px;width:340px;max-width:calc(100vw - 32px);max-height:70vh;z-index:2147483646;background:#1c1c1e;color:#e5e5e7;border-radius:10px;box-shadow:0 8px 30px rgba(0,0,0,.4);font:13px/1.45 system-ui,sans-serif;display:flex;flex-direction:column;overflow:hidden;transition:opacity .08s ease;\";\nconst PANEL_CORNER_KEY = \"__fbc_panel_corner_v1\";\nconst PANEL_MARGIN = 16;\nconst DRAG_THRESHOLD = 4;\n\ntype PanelCorner = \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n\ninterface PanelDrag {\n pointerId: number;\n startX: number;\n startY: number;\n panelX: number;\n panelY: number;\n moved: boolean;\n header: HTMLElement;\n}\n\nfunction isPanelCorner(value: unknown): value is PanelCorner {\n return value === \"top-left\" || value === \"top-right\" || value === \"bottom-left\" || value === \"bottom-right\";\n}\n\nfunction escapeHtml(value: unknown): string {\n return String(value).replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/\"/g, \"&quot;\");\n}\n\nfunction renderItem(item: FeedbackItem, index: number): string {\n const location = item.source\n ? `${item.source.file.split(\"/\").slice(-2).join(\"/\")}${item.source.line ? `:${item.source.line}` : \"\"}`\n : item.components[0]\n ? `<${item.components[0]}>`\n : item.selector.slice(0, 40);\n\n return `<div style=\"background:#2c2c2e;border-radius:8px;padding:8px;\">\n <div style=\"display:flex;align-items:baseline;gap:6px;margin-bottom:6px;\">\n <span style=\"color:#a8a8ae;font-size:11px;\">#${index + 1}</span>\n <span style=\"font-family:ui-monospace,monospace;font-size:11px;color:#64d2ff;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;\" title=\"${escapeHtml(item.selector)}\">${escapeHtml(location)}</span>\n <span data-fbc-del=\"${escapeHtml(item.id)}\" style=\"cursor:pointer;color:#a8a8ae;padding:0 4px;\" title=\"Remover\">✕</span>\n </div>\n <textarea data-fbc-ta=\"${escapeHtml(item.id)}\" placeholder=\"O que mudar aqui?\" style=\"width:100%;box-sizing:border-box;background:#1c1c1e;color:#e5e5e7;border:1px solid #3a3a3c;border-radius:6px;padding:6px;font:13px system-ui;resize:vertical;min-height:40px;\">${escapeHtml(item.instruction)}</textarea>\n </div>`;\n}\n\nexport function createCollector(options: MountOptions = {}): FeedbackCollectorController {\n if (!document.body) throw new Error(\"feedback-collector: mount() requer document.body disponível.\");\n\n const storage = options.storage || window.localStorage;\n let state: StoredState = loadState(storage);\n let pickerActive = false;\n let hoverElement: Element | null = null;\n let collapsed = false;\n let panelCorner: PanelCorner = \"bottom-right\";\n let panelDrag: PanelDrag | null = null;\n let suppressHeaderClick = false;\n let copyFeedbackActive = false;\n let mounted = true;\n let copyFeedbackTimer: ReturnType<typeof setTimeout> | undefined;\n let dragClickTimer: ReturnType<typeof setTimeout> | undefined;\n const flashTimers = new Set<ReturnType<typeof setTimeout>>();\n const previousCursor = document.body.style.cursor;\n\n const highlight = document.createElement(\"div\");\n highlight.dataset.fbcRoot = \"highlight\";\n highlight.style.cssText = HIGHLIGHT_STYLE;\n const highlightLabel = document.createElement(\"div\");\n highlightLabel.style.cssText = LABEL_STYLE;\n highlight.append(highlightLabel);\n\n const panel = document.createElement(\"div\");\n panel.dataset.fbcRoot = \"panel\";\n panel.style.cssText = PANEL_STYLE;\n\n try {\n const storedCorner = storage.getItem(PANEL_CORNER_KEY);\n if (isPanelCorner(storedCorner)) panelCorner = storedCorner;\n } catch {\n // O painel continua no canto padrão quando o storage não está disponível.\n }\n\n function setPanelPosition(x: number, y: number): void {\n const maxX = Math.max(PANEL_MARGIN, window.innerWidth - panel.offsetWidth - PANEL_MARGIN);\n const maxY = Math.max(PANEL_MARGIN, window.innerHeight - panel.offsetHeight - PANEL_MARGIN);\n panel.style.left = `${Math.min(Math.max(PANEL_MARGIN, x), maxX)}px`;\n panel.style.top = `${Math.min(Math.max(PANEL_MARGIN, y), maxY)}px`;\n panel.style.right = \"auto\";\n panel.style.bottom = \"auto\";\n }\n\n function applyPanelCorner(): void {\n const x = panelCorner.endsWith(\"right\")\n ? window.innerWidth - panel.offsetWidth - PANEL_MARGIN\n : PANEL_MARGIN;\n const y = panelCorner.startsWith(\"bottom\")\n ? window.innerHeight - panel.offsetHeight - PANEL_MARGIN\n : PANEL_MARGIN;\n setPanelPosition(x, y);\n }\n\n function persistPanelCorner(): void {\n try {\n storage.setItem(PANEL_CORNER_KEY, panelCorner);\n } catch {\n // A posição ainda funciona durante a sessão quando o storage falha.\n }\n }\n\n function setPanelHiddenForPicker(hidden: boolean): void {\n panel.style.opacity = hidden ? \"0\" : \"1\";\n panel.style.pointerEvents = hidden ? \"none\" : \"auto\";\n }\n\n function save(): void {\n persistState(storage, state);\n }\n\n function updateCopyButton(): void {\n const button = panel.querySelector<HTMLButtonElement>('[data-fbc=\"copy\"]');\n if (!button) return;\n const canCopy = state.items.length > 0;\n button.textContent = copyFeedbackActive ? \"✓ Copiado\" : \"Copiar backlog\";\n button.disabled = !canCopy || copyFeedbackActive;\n button.style.background = copyFeedbackActive ? \"#15803d\" : canCopy ? \"#2563eb\" : \"#3a3a3c\";\n button.style.color = canCopy ? \"#fff\" : \"#a8a8ae\";\n button.style.cursor = canCopy && !copyFeedbackActive ? \"pointer\" : \"default\";\n }\n\n function resetCopyFeedback(): void {\n if (copyFeedbackTimer) clearTimeout(copyFeedbackTimer);\n copyFeedbackTimer = undefined;\n copyFeedbackActive = false;\n }\n\n function showCopyFeedback(): void {\n resetCopyFeedback();\n copyFeedbackActive = true;\n updateCopyButton();\n copyFeedbackTimer = setTimeout(() => {\n copyFeedbackTimer = undefined;\n copyFeedbackActive = false;\n updateCopyButton();\n }, 1800);\n }\n\n function renderPanel(): void {\n const sourceCount = state.items.filter((item) => item.source).length;\n panel.innerHTML = `<div data-fbc=\"header\" title=\"Arraste para mover · clique para recolher\" style=\"display:flex;align-items:center;gap:8px;padding:10px 12px;background:#2c2c2e;cursor:grab;user-select:none;touch-action:none;\">\n <span style=\"font-weight:600;\">Feedback</span>\n <span style=\"background:#2563eb;border-radius:10px;padding:0 8px;font-size:11px;\">${state.items.length}</span>\n ${state.items.length ? `<span style=\"font-size:11px;color:#a8a8ae;\">${sourceCount} com source</span>` : \"\"}\n <span style=\"margin-left:auto;color:#a8a8ae;font-size:11px;\">segure ALT + clique</span>\n <span data-fbc=\"toggle\" style=\"color:#a8a8ae;\">${collapsed ? \"▸\" : \"▾\"}</span>\n </div>${collapsed ? \"\" : `<div style=\"overflow-y:auto;flex:1;padding:8px 12px;display:flex;flex-direction:column;gap:8px;\">\n ${state.items.length ? state.items.map(renderItem).join(\"\") : '<div style=\"color:#a8a8ae;padding:12px 0;text-align:center;\">Nenhum item. Segure ALT e clique num elemento da página.</div>'}\n </div>\n <div style=\"display:flex;gap:8px;padding:10px 12px;background:#2c2c2e;\">\n <button data-fbc=\"copy\" ${state.items.length ? \"\" : \"disabled\"} style=\"flex:1;background:${state.items.length ? \"#2563eb\" : \"#3a3a3c\"};color:${state.items.length ? \"#fff\" : \"#a8a8ae\"};border:0;border-radius:6px;padding:8px;font:600 13px system-ui;cursor:${state.items.length ? \"pointer\" : \"default\"};transition:background .15s ease,color .15s ease;\">Copiar backlog</button>\n <button data-fbc=\"clear\" style=\"background:#3a3a3c;color:#e5e5e7;border:0;border-radius:6px;padding:8px 12px;font:13px system-ui;cursor:pointer;\">Limpar</button>\n </div>`}`;\n updateCopyButton();\n if (!panelDrag) applyPanelCorner();\n }\n\n function deactivatePicker(): void {\n pickerActive = false;\n hoverElement = null;\n highlight.style.display = \"none\";\n setPanelHiddenForPicker(false);\n document.body.style.cursor = previousCursor;\n }\n\n function flashElement(element: HTMLElement): void {\n const previousOutline = element.style.outline;\n element.style.outline = \"3px solid #16a34a\";\n const timer = setTimeout(() => {\n element.style.outline = previousOutline;\n flashTimers.delete(timer);\n }, 400);\n flashTimers.add(timer);\n }\n\n function capture(element: Element): void {\n resetCopyFeedback();\n const item = captureElement(element);\n state.items.push(item);\n save();\n renderPanel();\n setTimeout(() => panel.querySelector<HTMLTextAreaElement>(`[data-fbc-ta=\"${CSS.escape(item.id)}\"]`)?.focus(), 50);\n if (element instanceof HTMLElement) flashElement(element);\n }\n\n async function copyBacklog(): Promise<void> {\n const markdown = toMarkdown(state.items);\n try {\n await navigator.clipboard.writeText(markdown);\n showCopyFeedback();\n } catch {\n window.prompt(\"Copie manualmente:\", markdown);\n }\n }\n\n function onKeyDown(event: KeyboardEvent): void {\n if (event.key === \"Alt\" && !pickerActive) {\n pickerActive = true;\n setPanelHiddenForPicker(true);\n document.body.style.cursor = \"crosshair\";\n }\n }\n\n function onKeyUp(event: KeyboardEvent): void {\n if (event.key === \"Alt\") deactivatePicker();\n }\n\n function onMouseMove(event: MouseEvent): void {\n if (!pickerActive) return;\n const element = document.elementFromPoint(event.clientX, event.clientY);\n if (!element || panel.contains(element) || highlight.contains(element) || element === highlight) {\n highlight.style.display = \"none\";\n hoverElement = null;\n return;\n }\n hoverElement = element;\n const rect = element.getBoundingClientRect();\n highlight.style.display = \"block\";\n highlight.style.left = `${rect.left}px`;\n highlight.style.top = `${rect.top}px`;\n highlight.style.width = `${rect.width}px`;\n highlight.style.height = `${rect.height}px`;\n const source = getSourceInfo(element);\n highlightLabel.textContent = `<${element.tagName.toLowerCase()}>${source ? ` ${source.file.split(\"/\").pop()}${source.line ? `:${source.line}` : \"\"}` : \"\"}`;\n }\n\n function onClick(event: MouseEvent): void {\n if (!pickerActive || !hoverElement || !(event.target instanceof Node) || panel.contains(event.target)) return;\n event.preventDefault();\n event.stopPropagation();\n capture(hoverElement);\n }\n\n function onPanelClick(event: MouseEvent): void {\n if (!(event.target instanceof Element)) return;\n const target = event.target;\n const action = target.getAttribute(\"data-fbc\");\n if (action === \"copy\") {\n void copyBacklog();\n return;\n }\n if (action === \"clear\") {\n if (state.items.length) {\n resetCopyFeedback();\n state.items = [];\n save();\n renderPanel();\n }\n return;\n }\n const deleteId = target.getAttribute(\"data-fbc-del\");\n if (deleteId) {\n resetCopyFeedback();\n state.items = state.items.filter((item) => item.id !== deleteId);\n save();\n renderPanel();\n return;\n }\n if (target.closest('[data-fbc=\"header\"]')) {\n if (suppressHeaderClick) {\n suppressHeaderClick = false;\n return;\n }\n collapsed = !collapsed;\n renderPanel();\n }\n }\n\n function onPanelPointerDown(event: PointerEvent): void {\n if (event.button !== 0 || !(event.target instanceof Element)) return;\n const header = event.target.closest<HTMLElement>('[data-fbc=\"header\"]');\n if (!header) return;\n const rect = panel.getBoundingClientRect();\n panelDrag = {\n pointerId: event.pointerId,\n startX: event.clientX,\n startY: event.clientY,\n panelX: rect.left,\n panelY: rect.top,\n moved: false,\n header,\n };\n header.style.cursor = \"grabbing\";\n }\n\n function onPanelPointerMove(event: PointerEvent): void {\n if (!panelDrag || event.pointerId !== panelDrag.pointerId) return;\n const deltaX = event.clientX - panelDrag.startX;\n const deltaY = event.clientY - panelDrag.startY;\n if (!panelDrag.moved && Math.hypot(deltaX, deltaY) < DRAG_THRESHOLD) return;\n panelDrag.moved = true;\n event.preventDefault();\n setPanelPosition(panelDrag.panelX + deltaX, panelDrag.panelY + deltaY);\n }\n\n function finishPanelDrag(event: PointerEvent): void {\n if (!panelDrag || event.pointerId !== panelDrag.pointerId) return;\n const drag = panelDrag;\n panelDrag = null;\n drag.header.style.cursor = \"grab\";\n if (!drag.moved) return;\n\n const rect = panel.getBoundingClientRect();\n const horizontal = rect.left + rect.width / 2 < window.innerWidth / 2 ? \"left\" : \"right\";\n const vertical = rect.top + rect.height / 2 < window.innerHeight / 2 ? \"top\" : \"bottom\";\n panelCorner = `${vertical}-${horizontal}` as PanelCorner;\n suppressHeaderClick = true;\n if (dragClickTimer) clearTimeout(dragClickTimer);\n dragClickTimer = setTimeout(() => {\n suppressHeaderClick = false;\n dragClickTimer = undefined;\n }, 0);\n applyPanelCorner();\n persistPanelCorner();\n }\n\n function cancelPanelDrag(event: PointerEvent): void {\n if (!panelDrag || event.pointerId !== panelDrag.pointerId) return;\n panelDrag.header.style.cursor = \"grab\";\n panelDrag = null;\n applyPanelCorner();\n }\n\n function onViewportResize(): void {\n if (!panelDrag) applyPanelCorner();\n }\n\n function onPanelInput(event: Event): void {\n if (!(event.target instanceof HTMLTextAreaElement)) return;\n const id = event.target.getAttribute(\"data-fbc-ta\");\n const item = state.items.find((candidate) => candidate.id === id);\n if (item) {\n item.instruction = event.target.value;\n save();\n }\n }\n\n function onPanelKeyDown(event: KeyboardEvent): void {\n if (!(event.target instanceof HTMLTextAreaElement)) return;\n if (event.key === \"Enter\" && !event.shiftKey && !event.isComposing) {\n event.preventDefault();\n event.target.blur();\n }\n }\n\n document.addEventListener(\"keydown\", onKeyDown, true);\n document.addEventListener(\"keyup\", onKeyUp, true);\n window.addEventListener(\"blur\", deactivatePicker);\n document.addEventListener(\"mousemove\", onMouseMove, true);\n document.addEventListener(\"click\", onClick, true);\n panel.addEventListener(\"click\", onPanelClick);\n panel.addEventListener(\"input\", onPanelInput);\n panel.addEventListener(\"keydown\", onPanelKeyDown);\n panel.addEventListener(\"pointerdown\", onPanelPointerDown);\n window.addEventListener(\"pointermove\", onPanelPointerMove, { passive: false });\n window.addEventListener(\"pointerup\", finishPanelDrag);\n window.addEventListener(\"pointercancel\", cancelPanelDrag);\n window.addEventListener(\"resize\", onViewportResize);\n document.body.append(highlight, panel);\n renderPanel();\n\n const controller: FeedbackCollectorController = {\n get mounted() {\n return mounted;\n },\n get items() {\n return state.items;\n },\n exportMarkdown() {\n return toMarkdown(state.items);\n },\n destroy() {\n if (!mounted) return;\n mounted = false;\n deactivatePicker();\n document.removeEventListener(\"keydown\", onKeyDown, true);\n document.removeEventListener(\"keyup\", onKeyUp, true);\n window.removeEventListener(\"blur\", deactivatePicker);\n document.removeEventListener(\"mousemove\", onMouseMove, true);\n document.removeEventListener(\"click\", onClick, true);\n panel.removeEventListener(\"click\", onPanelClick);\n panel.removeEventListener(\"input\", onPanelInput);\n panel.removeEventListener(\"keydown\", onPanelKeyDown);\n panel.removeEventListener(\"pointerdown\", onPanelPointerDown);\n window.removeEventListener(\"pointermove\", onPanelPointerMove);\n window.removeEventListener(\"pointerup\", finishPanelDrag);\n window.removeEventListener(\"pointercancel\", cancelPanelDrag);\n window.removeEventListener(\"resize\", onViewportResize);\n if (copyFeedbackTimer) clearTimeout(copyFeedbackTimer);\n if (dragClickTimer) clearTimeout(dragClickTimer);\n for (const timer of flashTimers) clearTimeout(timer);\n flashTimers.clear();\n highlight.remove();\n panel.remove();\n },\n };\n\n console.log(`[feedback-collector] ativo. Segure ALT + clique pra capturar. ${state.items.length} item(ns) restaurado(s) do localStorage.`);\n return controller;\n}\n","import { createCollector } from \"./collector\";\nimport type { FeedbackCollectorController, MountOptions } from \"./types\";\n\ndeclare global {\n interface Window {\n __FEEDBACK_COLLECTOR__?: boolean | FeedbackCollectorController;\n }\n}\n\nlet activeController: FeedbackCollectorController | null = null;\nlet pendingAutoMount: (() => void) | null = null;\n\nexport function mount(options: MountOptions = {}): FeedbackCollectorController {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n throw new Error(\"feedback-collector: mount() só pode ser chamado no navegador.\");\n }\n if (activeController?.mounted) return activeController;\n\n const existing = window.__FEEDBACK_COLLECTOR__;\n if (existing && typeof existing === \"object\" && existing.mounted) {\n activeController = existing;\n return existing;\n }\n if (existing === true) {\n throw new Error(\"feedback-collector: uma versão anterior já está montada nesta página.\");\n }\n\n activeController = createCollector(options);\n window.__FEEDBACK_COLLECTOR__ = activeController;\n return activeController;\n}\n\nexport function destroy(): void {\n if (pendingAutoMount) {\n document.removeEventListener(\"DOMContentLoaded\", pendingAutoMount);\n pendingAutoMount = null;\n }\n activeController?.destroy();\n activeController = null;\n if (typeof window !== \"undefined\") delete window.__FEEDBACK_COLLECTOR__;\n}\n\nexport function autoMount(): void {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") return;\n // Uma v0.1 já injetada usa o booleano; auto-init duplicado continua sendo no-op.\n if (window.__FEEDBACK_COLLECTOR__ === true) return;\n if (document.readyState === \"loading\") {\n pendingAutoMount = () => {\n pendingAutoMount = null;\n mount();\n };\n document.addEventListener(\"DOMContentLoaded\", pendingAutoMount, { once: true });\n return;\n }\n mount();\n}\n"]}
@@ -1,24 +1,24 @@
1
- var FeedbackCollector=(function(exports){'use strict';var U=["display","position","width","height","margin","padding","color","background-color","font-size","font-weight","line-height","border","border-radius","gap","flex-direction","justify-content","align-items","grid-template-columns","overflow","z-index","opacity","box-shadow","text-align"],X=new Set(["none","normal","auto","rgba(0, 0, 0, 0)","0px","visible","static","start"]);function F(t){let n=t;for(let e in n)if(e.startsWith("__reactFiber$")||e.startsWith("__reactInternalInstance$"))return n[e];return null}function Z(t){let n=t;for(;n;){let e=n.type;if(typeof n.type=="function")return e?.displayName||e?.name||"";if(e&&typeof e=="object"&&e.displayName)return e.displayName;n=n._debugOwner||n.return;}return ""}function Q(t){return t.match(/(?:^|\/)((?:src|app|pages|components|lib|features)\/.*)$/)?.[1]||t}function ee(t){let n=t.match(/^(.*):(\d+):(\d+)$/);if(n)return {file:n[1]||t,line:n[2]||"",column:n[3]||""};let e=t.match(/^(.*):(\d+)$/);return {file:e?.[1]||t,line:e?.[2]||"",column:""}}function k(t){let n=t,e=0;for(;n&&n!==document.body;){let i=n.getAttribute("data-inspector-relative-path"),a=n.getAttribute("data-source");if(i||a){let u=a?ee(a):null;return {file:i||u?.file||"",line:n.getAttribute("data-inspector-line")||u?.line||"",column:n.getAttribute("data-inspector-column")||u?.column||"",via:"data-attr",ownerHops:e}}n=n.parentElement,e+=1;}let o=F(t),s=0;for(;o&&s<20;){let i=o._debugSource;if(i?.fileName)return {file:Q(i.fileName),line:i.lineNumber||"",column:i.columnNumber||"",via:"fiber",componentName:Z(o)};o=o._debugOwner||o.return||null,s+=1;}return null}function te(t){let n=F(t),e=[],o=0;for(;n&&e.length<3&&o<30;){let s=n.type,i=typeof n.type=="function"?s?.displayName||s?.name:s?.displayName;i&&!e.includes(i)&&e.push(i),n=n._debugOwner||n.return||null,o+=1;}return e}function N(t){return typeof CSS<"u"&&CSS.escape?CSS.escape(t):t.replace(/[^a-zA-Z0-9_-]/g,"\\$&")}function ne(t){return t.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function oe(t){if(t.id)return `#${N(t.id)}`;let n=[],e=t;for(;e&&e!==document.body&&n.length<5;){let o=e.tagName.toLowerCase(),s=false;for(let i of ["data-testid","data-test","aria-label","name"]){let a=e.getAttribute(i);if(a){o+=`[${i}="${ne(a)}"]`,s=true;break}}if(!s&&e.classList.length){let i=Array.from(e.classList).filter(a=>!/^[a-z]*[_-][a-zA-Z0-9]{5,}$/.test(a)&&!/^\d/.test(a)&&a.length<30).slice(0,2);i.length&&(o+=`.${i.map(N).join(".")}`,s=true);}if(!s){let i=1,a=e.previousElementSibling;for(;a;)a.tagName===e.tagName&&(i+=1),a=a.previousElementSibling;i>1&&(o+=`:nth-of-type(${i})`);}n.unshift(o);try{if(document.querySelectorAll(n.join(" > ")).length===1)break}catch{}e=e.parentElement;}return n.join(" > ")}function re(t){let n=getComputedStyle(t),e={};for(let o of U){let s=n.getPropertyValue(o);s&&!X.has(s)&&(e[o]=s);}return e}function ie(t,n){let e=t.outerHTML||"";return e.length<=n?e:`${e.slice(0,n)}\u2026 [truncado]`}function M(t){let n=t.getBoundingClientRect();return {id:`${Date.now()}_${Math.random().toString(36).slice(2,7)}`,url:location.pathname+location.search+location.hash,tag:t.tagName.toLowerCase(),selector:oe(t),source:k(t),components:te(t),text:(t.textContent||"").trim().slice(0,120),html:ie(t,600),styles:re(t),rect:{x:Math.round(n.x),y:Math.round(n.y),w:Math.round(n.width),h:Math.round(n.height)},viewport:`${window.innerWidth}x${window.innerHeight}`,instruction:"",ts:new Date().toISOString()}}function m(t){return String(t).replace(/`/g,"\\`")}function $(t,n=new Date){let e=["# Backlog de feedback visual","",`Gerado em ${n.toLocaleString()} \u2014 ${t.length} itens.`,"Cada item indica o arquivo:linha quando dispon\xEDvel. Execute na ordem, agrupando edits do mesmo arquivo.",""];return t.forEach((o,s)=>{if(e.push(`## ${s+1}. ${o.instruction?o.instruction.split(`
2
- `)[0]:"(sem instru\xE7\xE3o)"}`),e.push(""),o.instruction.includes(`
3
- `)&&e.push(o.instruction,""),e.push(`- **Rota:** \`${m(o.url)}\``),o.source){let a=`${o.source.file}${o.source.line?`:${o.source.line}`:""}`,u=o.source.componentName?` (componente \`${m(o.source.componentName)}\`)`:"";e.push(`- **Source:** \`${m(a)}\`${u}`);}else o.components.length&&e.push(`- **Componentes (do mais interno):** ${o.components.map(a=>`\`${m(a)}\``).join(" \u2192 ")}`);e.push(`- **Elemento:** \`<${m(o.tag)}>\` \u2014 seletor: \`${m(o.selector)}\``),o.text&&e.push(`- **Texto vis\xEDvel:** "${o.text}"`),e.push(`- **Posi\xE7\xE3o:** ${o.rect.w}x${o.rect.h} @ (${o.rect.x},${o.rect.y}), viewport ${o.viewport}`);let i=Object.entries(o.styles);i.length&&e.push(`- **Styles atuais:** ${i.map(([a,u])=>`\`${m(a)}: ${m(u)}\``).join(", ")}`),e.push("","```html",o.html,"```","");}),e.join(`
4
- `)}var P="__fbc_state_v2",ae="__fbc_items_v1";var D=()=>({version:2,items:[]});function z(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}function se(t){return !!t&&typeof t=="object"&&Array.isArray(t.items)}function le(t,n){let e=z(t);if(se(e)&&e.version===2)return {state:{version:2,items:e.items},migrated:false};let o=z(n);return Array.isArray(o)?{state:{version:2,items:o},migrated:true}:{state:D(),migrated:false}}function _(t,n){try{return t.setItem(P,JSON.stringify(n)),!0}catch{return false}}function j(t){let n=null,e=null;try{n=t.getItem(P),e=t.getItem(ae);}catch{return D()}let o=le(n,e);return o.migrated&&_(t,o.state),o.state}var ce="position:fixed;pointer-events:none;z-index:2147483645;border:2px solid #2563eb;background:rgba(37,99,235,.08);border-radius:2px;display:none;transition:all .05s linear;",ue="position:absolute;top:-22px;left:0;background:#2563eb;color:#fff;font:11px/1.4 ui-monospace,monospace;padding:1px 6px;border-radius:2px;white-space:nowrap;",de="position:fixed;bottom:16px;right:16px;width:340px;max-height:70vh;z-index:2147483646;background:#1c1c1e;color:#e5e5e7;border-radius:10px;box-shadow:0 8px 30px rgba(0,0,0,.4);font:13px/1.45 system-ui,sans-serif;display:flex;flex-direction:column;overflow:hidden;",pe="position:fixed;bottom:16px;left:50%;transform:translateX(-50%);z-index:2147483647;background:#15803d;color:#fff;padding:8px 16px;border-radius:8px;font:13px system-ui,sans-serif;display:none;box-shadow:0 4px 14px rgba(0,0,0,.3);";function x(t){return String(t).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/"/g,"&quot;")}function fe(t,n){let e=t.source?`${t.source.file.split("/").slice(-2).join("/")}${t.source.line?`:${t.source.line}`:""}`:t.components[0]?`<${t.components[0]}>`:t.selector.slice(0,40);return `<div style="background:#2c2c2e;border-radius:8px;padding:8px;">
1
+ var FeedbackCollector=(function(exports){'use strict';var me=["display","position","width","height","margin","padding","color","background-color","font-size","font-weight","line-height","border","border-radius","gap","flex-direction","justify-content","align-items","grid-template-columns","overflow","z-index","opacity","box-shadow","text-align"],ge=new Set(["none","normal","auto","rgba(0, 0, 0, 0)","0px","visible","static","start"]);function Z(t){let o=t;for(let e in o)if(e.startsWith("__reactFiber$")||e.startsWith("__reactInternalInstance$"))return o[e];return null}function be(t){let o=t;for(;o;){let e=o.type;if(typeof o.type=="function")return e?.displayName||e?.name||"";if(e&&typeof e=="object"&&e.displayName)return e.displayName;o=o._debugOwner||o.return;}return ""}function ye(t){return t.match(/(?:^|\/)((?:src|app|pages|components|lib|features)\/.*)$/)?.[1]||t}function he(t){let o=t.match(/^(.*):(\d+):(\d+)$/);if(o)return {file:o[1]||t,line:o[2]||"",column:o[3]||""};let e=t.match(/^(.*):(\d+)$/);return {file:e?.[1]||t,line:e?.[2]||"",column:""}}function O(t){let o=t,e=0;for(;o&&o!==document.body;){let a=o.getAttribute("data-inspector-relative-path"),l=o.getAttribute("data-source");if(a||l){let c=l?he(l):null;return {file:a||c?.file||"",line:o.getAttribute("data-inspector-line")||c?.line||"",column:o.getAttribute("data-inspector-column")||c?.column||"",via:"data-attr",ownerHops:e}}o=o.parentElement,e+=1;}let r=Z(t),u=0;for(;r&&u<20;){let a=r._debugSource;if(a?.fileName)return {file:ye(a.fileName),line:a.lineNumber||"",column:a.columnNumber||"",via:"fiber",componentName:be(r)};r=r._debugOwner||r.return||null,u+=1;}return null}function ve(t){let o=Z(t),e=[],r=0;for(;o&&e.length<3&&r<30;){let u=o.type,a=typeof o.type=="function"?u?.displayName||u?.name:u?.displayName;a&&!e.includes(a)&&e.push(a),o=o._debugOwner||o.return||null,r+=1;}return e}function U(t){return typeof CSS<"u"&&CSS.escape?CSS.escape(t):t.replace(/[^a-zA-Z0-9_-]/g,"\\$&")}function we(t){return t.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function xe(t){if(t.id)return `#${U(t.id)}`;let o=[],e=t;for(;e&&e!==document.body&&o.length<5;){let r=e.tagName.toLowerCase(),u=false;for(let a of ["data-testid","data-test","aria-label","name"]){let l=e.getAttribute(a);if(l){r+=`[${a}="${we(l)}"]`,u=true;break}}if(!u&&e.classList.length){let a=Array.from(e.classList).filter(l=>!/^[a-z]*[_-][a-zA-Z0-9]{5,}$/.test(l)&&!/^\d/.test(l)&&l.length<30).slice(0,2);a.length&&(r+=`.${a.map(U).join(".")}`,u=true);}if(!u){let a=1,l=e.previousElementSibling;for(;l;)l.tagName===e.tagName&&(a+=1),l=l.previousElementSibling;a>1&&(r+=`:nth-of-type(${a})`);}o.unshift(r);try{if(document.querySelectorAll(o.join(" > ")).length===1)break}catch{}e=e.parentElement;}return o.join(" > ")}function Ee(t){let o=getComputedStyle(t),e={};for(let r of me){let u=o.getPropertyValue(r);u&&!ge.has(u)&&(e[r]=u);}return e}function Se(t,o){let e=t.outerHTML||"";return e.length<=o?e:`${e.slice(0,o)}\u2026 [truncado]`}function Q(t){let o=t.getBoundingClientRect();return {id:`${Date.now()}_${Math.random().toString(36).slice(2,7)}`,url:location.pathname+location.search+location.hash,tag:t.tagName.toLowerCase(),selector:xe(t),source:O(t),components:ve(t),text:(t.textContent||"").trim().slice(0,120),html:Se(t,600),styles:Ee(t),rect:{x:Math.round(o.x),y:Math.round(o.y),w:Math.round(o.width),h:Math.round(o.height)},viewport:`${window.innerWidth}x${window.innerHeight}`,instruction:"",ts:new Date().toISOString()}}function g(t){return String(t).replace(/`/g,"\\`")}function R(t,o=new Date){let e=["# Backlog de feedback visual","",`Gerado em ${o.toLocaleString()} \u2014 ${t.length} itens.`,"Cada item indica o arquivo:linha quando dispon\xEDvel. Execute na ordem, agrupando edits do mesmo arquivo.",""];return t.forEach((r,u)=>{if(e.push(`## ${u+1}. ${r.instruction?r.instruction.split(`
2
+ `)[0]:"(sem instru\xE7\xE3o)"}`),e.push(""),r.instruction.includes(`
3
+ `)&&e.push(r.instruction,""),e.push(`- **Rota:** \`${g(r.url)}\``),r.source){let l=`${r.source.file}${r.source.line?`:${r.source.line}`:""}`,c=r.source.componentName?` (componente \`${g(r.source.componentName)}\`)`:"";e.push(`- **Source:** \`${g(l)}\`${c}`);}else r.components.length&&e.push(`- **Componentes (do mais interno):** ${r.components.map(l=>`\`${g(l)}\``).join(" \u2192 ")}`);e.push(`- **Elemento:** \`<${g(r.tag)}>\` \u2014 seletor: \`${g(r.selector)}\``),r.text&&e.push(`- **Texto vis\xEDvel:** "${r.text}"`),e.push(`- **Posi\xE7\xE3o:** ${r.rect.w}x${r.rect.h} @ (${r.rect.x},${r.rect.y}), viewport ${r.viewport}`);let a=Object.entries(r.styles);a.length&&e.push(`- **Styles atuais:** ${a.map(([l,c])=>`\`${g(l)}: ${g(c)}\``).join(", ")}`),e.push("","```html",r.html,"```","");}),e.join(`
4
+ `)}var te="__fbc_state_v2",ke="__fbc_items_v1";var ne=()=>({version:2,items:[]});function ee(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}function Ce(t){return !!t&&typeof t=="object"&&Array.isArray(t.items)}function Le(t,o){let e=ee(t);if(Ce(e)&&e.version===2)return {state:{version:2,items:e.items},migrated:false};let r=ee(o);return Array.isArray(r)?{state:{version:2,items:r},migrated:true}:{state:ne(),migrated:false}}function P(t,o){try{return t.setItem(te,JSON.stringify(o)),!0}catch{return false}}function oe(t){let o=null,e=null;try{o=t.getItem(te),e=t.getItem(ke);}catch{return ne()}let r=Le(o,e);return r.migrated&&P(t,r.state),r.state}var $e="position:fixed;pointer-events:none;z-index:2147483645;border:2px solid #2563eb;background:rgba(37,99,235,.08);border-radius:2px;display:none;transition:all .05s linear;",_e="position:absolute;top:-22px;left:0;background:#2563eb;color:#fff;font:11px/1.4 ui-monospace,monospace;padding:1px 6px;border-radius:2px;white-space:nowrap;",Te="position:fixed;bottom:16px;right:16px;width:340px;max-width:calc(100vw - 32px);max-height:70vh;z-index:2147483646;background:#1c1c1e;color:#e5e5e7;border-radius:10px;box-shadow:0 8px 30px rgba(0,0,0,.4);font:13px/1.45 system-ui,sans-serif;display:flex;flex-direction:column;overflow:hidden;transition:opacity .08s ease;",re="__fbc_panel_corner_v1",m=16,Ae=4;function Ie(t){return t==="top-left"||t==="top-right"||t==="bottom-left"||t==="bottom-right"}function E(t){return String(t).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/"/g,"&quot;")}function Oe(t,o){let e=t.source?`${t.source.file.split("/").slice(-2).join("/")}${t.source.line?`:${t.source.line}`:""}`:t.components[0]?`<${t.components[0]}>`:t.selector.slice(0,40);return `<div style="background:#2c2c2e;border-radius:8px;padding:8px;">
5
5
  <div style="display:flex;align-items:baseline;gap:6px;margin-bottom:6px;">
6
- <span style="color:#a8a8ae;font-size:11px;">#${n+1}</span>
7
- <span style="font-family:ui-monospace,monospace;font-size:11px;color:#64d2ff;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;" title="${x(t.selector)}">${x(e)}</span>
8
- <span data-fbc-del="${x(t.id)}" style="cursor:pointer;color:#a8a8ae;padding:0 4px;" title="Remover">\u2715</span>
6
+ <span style="color:#a8a8ae;font-size:11px;">#${o+1}</span>
7
+ <span style="font-family:ui-monospace,monospace;font-size:11px;color:#64d2ff;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;" title="${E(t.selector)}">${E(e)}</span>
8
+ <span data-fbc-del="${E(t.id)}" style="cursor:pointer;color:#a8a8ae;padding:0 4px;" title="Remover">\u2715</span>
9
9
  </div>
10
- <textarea data-fbc-ta="${x(t.id)}" placeholder="O que mudar aqui?" style="width:100%;box-sizing:border-box;background:#1c1c1e;color:#e5e5e7;border:1px solid #3a3a3c;border-radius:6px;padding:6px;font:13px system-ui;resize:vertical;min-height:40px;">${x(t.instruction)}</textarea>
11
- </div>`}function H(t={}){if(!document.body)throw new Error("feedback-collector: mount() requer document.body dispon\xEDvel.");let n=t.storage||window.localStorage,e=j(n),o=false,s=null,i=false,a=true,u,v=new Set,B=document.body.style.cursor,c=document.createElement("div");c.dataset.fbcRoot="highlight",c.style.cssText=ce;let S=document.createElement("div");S.style.cssText=ue,c.append(S);let p=document.createElement("div");p.dataset.fbcRoot="panel",p.style.cssText=de;let b=document.createElement("div");b.dataset.fbcRoot="toast",b.style.cssText=pe;function w(){_(n,e);}function G(r){b.textContent=r,b.style.display="block",u&&clearTimeout(u),u=setTimeout(()=>{b.style.display="none";},2500);}function h(){let r=e.items.filter(l=>l.source).length;p.innerHTML=`<div data-fbc="header" style="display:flex;align-items:center;gap:8px;padding:10px 12px;background:#2c2c2e;cursor:pointer;user-select:none;">
10
+ <textarea data-fbc-ta="${E(t.id)}" placeholder="O que mudar aqui?" style="width:100%;box-sizing:border-box;background:#1c1c1e;color:#e5e5e7;border:1px solid #3a3a3c;border-radius:6px;padding:6px;font:13px system-ui;resize:vertical;min-height:40px;">${E(t.instruction)}</textarea>
11
+ </div>`}function ie(t={}){if(!document.body)throw new Error("feedback-collector: mount() requer document.body dispon\xEDvel.");let o=t.storage||window.localStorage,e=oe(o),r=false,u=null,a=false,l="bottom-right",c=null,S=false,y=false,T=true,h,v,k=new Set,se=document.body.style.cursor,p=document.createElement("div");p.dataset.fbcRoot="highlight",p.style.cssText=$e;let A=document.createElement("div");A.style.cssText=_e,p.append(A);let s=document.createElement("div");s.dataset.fbcRoot="panel",s.style.cssText=Te;try{let n=o.getItem(re);Ie(n)&&(l=n);}catch{}function F(n,i){let d=Math.max(m,window.innerWidth-s.offsetWidth-m),f=Math.max(m,window.innerHeight-s.offsetHeight-m);s.style.left=`${Math.min(Math.max(m,n),d)}px`,s.style.top=`${Math.min(Math.max(m,i),f)}px`,s.style.right="auto",s.style.bottom="auto";}function C(){let n=l.endsWith("right")?window.innerWidth-s.offsetWidth-m:m,i=l.startsWith("bottom")?window.innerHeight-s.offsetHeight-m:m;F(n,i);}function le(){try{o.setItem(re,l);}catch{}}function N(n){s.style.opacity=n?"0":"1",s.style.pointerEvents=n?"none":"auto";}function L(){P(o,e);}function I(){let n=s.querySelector('[data-fbc="copy"]');if(!n)return;let i=e.items.length>0;n.textContent=y?"\u2713 Copiado":"Copiar backlog",n.disabled=!i||y,n.style.background=y?"#15803d":i?"#2563eb":"#3a3a3c",n.style.color=i?"#fff":"#a8a8ae",n.style.cursor=i&&!y?"pointer":"default";}function $(){h&&clearTimeout(h),h=void 0,y=false;}function ce(){$(),y=true,I(),h=setTimeout(()=>{h=void 0,y=false,I();},1800);}function x(){let n=e.items.filter(i=>i.source).length;s.innerHTML=`<div data-fbc="header" title="Arraste para mover \xB7 clique para recolher" style="display:flex;align-items:center;gap:8px;padding:10px 12px;background:#2c2c2e;cursor:grab;user-select:none;touch-action:none;">
12
12
  <span style="font-weight:600;">Feedback</span>
13
13
  <span style="background:#2563eb;border-radius:10px;padding:0 8px;font-size:11px;">${e.items.length}</span>
14
- ${e.items.length?`<span style="font-size:11px;color:#a8a8ae;">${r} com source</span>`:""}
14
+ ${e.items.length?`<span style="font-size:11px;color:#a8a8ae;">${n} com source</span>`:""}
15
15
  <span style="margin-left:auto;color:#a8a8ae;font-size:11px;">segure ALT + clique</span>
16
- <span data-fbc="toggle" style="color:#a8a8ae;">${i?"\u25B8":"\u25BE"}</span>
17
- </div>${i?"":`<div style="overflow-y:auto;flex:1;padding:8px 12px;display:flex;flex-direction:column;gap:8px;">
18
- ${e.items.length?e.items.map(fe).join(""):'<div style="color:#a8a8ae;padding:12px 0;text-align:center;">Nenhum item. Segure ALT e clique num elemento da p\xE1gina.</div>'}
16
+ <span data-fbc="toggle" style="color:#a8a8ae;">${a?"\u25B8":"\u25BE"}</span>
17
+ </div>${a?"":`<div style="overflow-y:auto;flex:1;padding:8px 12px;display:flex;flex-direction:column;gap:8px;">
18
+ ${e.items.length?e.items.map(Oe).join(""):'<div style="color:#a8a8ae;padding:12px 0;text-align:center;">Nenhum item. Segure ALT e clique num elemento da p\xE1gina.</div>'}
19
19
  </div>
20
20
  <div style="display:flex;gap:8px;padding:10px 12px;background:#2c2c2e;">
21
- <button data-fbc="copy" ${e.items.length?"":"disabled"} style="flex:1;background:${e.items.length?"#2563eb":"#3a3a3c"};color:${e.items.length?"#fff":"#a8a8ae"};border:0;border-radius:6px;padding:8px;font:600 13px system-ui;cursor:${e.items.length?"pointer":"default"};">Copiar backlog</button>
21
+ <button data-fbc="copy" ${e.items.length?"":"disabled"} style="flex:1;background:${e.items.length?"#2563eb":"#3a3a3c"};color:${e.items.length?"#fff":"#a8a8ae"};border:0;border-radius:6px;padding:8px;font:600 13px system-ui;cursor:${e.items.length?"pointer":"default"};transition:background .15s ease,color .15s ease;">Copiar backlog</button>
22
22
  <button data-fbc="clear" style="background:#3a3a3c;color:#e5e5e7;border:0;border-radius:6px;padding:8px 12px;font:13px system-ui;cursor:pointer;">Limpar</button>
23
- </div>`}`;}function E(){o=false,s=null,c.style.display="none",document.body.style.cursor=B;}function K(r){let l=r.style.outline;r.style.outline="3px solid #16a34a";let d=setTimeout(()=>{r.style.outline=l,v.delete(d);},400);v.add(d);}function Y(r){let l=M(r);e.items.push(l),w(),h(),setTimeout(()=>p.querySelector(`[data-fbc-ta="${CSS.escape(l.id)}"]`)?.focus(),50),r instanceof HTMLElement&&K(r);}async function V(){let r=$(e.items);try{await navigator.clipboard.writeText(r),G(`Backlog copiado (${e.items.length} itens). Cola no seu agente de c\xF3digo.`);}catch{window.prompt("Copie manualmente:",r);}}function L(r){r.key==="Alt"&&!o&&(o=true,document.body.style.cursor="crosshair");}function T(r){r.key==="Alt"&&E();}function A(r){if(!o)return;let l=document.elementFromPoint(r.clientX,r.clientY);if(!l||p.contains(l)||c.contains(l)||l===c){c.style.display="none",s=null;return}s=l;let d=l.getBoundingClientRect();c.style.display="block",c.style.left=`${d.left}px`,c.style.top=`${d.top}px`,c.style.width=`${d.width}px`,c.style.height=`${d.height}px`;let f=k(l);S.textContent=`<${l.tagName.toLowerCase()}>${f?` ${f.file.split("/").pop()}${f.line?`:${f.line}`:""}`:""}`;}function O(r){!o||!s||!(r.target instanceof Node)||p.contains(r.target)||(r.preventDefault(),r.stopPropagation(),Y(s));}function I(r){if(!(r.target instanceof Element))return;let l=r.target,d=l.getAttribute("data-fbc");if(d==="copy"){V();return}if(d==="clear"){e.items.length&&window.confirm(`Limpar todos os ${e.items.length} itens?`)&&(e.items=[],w(),h());return}let f=l.getAttribute("data-fbc-del");if(f){e.items=e.items.filter(J=>J.id!==f),w(),h();return}l.closest('[data-fbc="header"]')&&(i=!i,h());}function R(r){if(!(r.target instanceof HTMLTextAreaElement))return;let l=r.target.getAttribute("data-fbc-ta"),d=e.items.find(f=>f.id===l);d&&(d.instruction=r.target.value,w());}document.addEventListener("keydown",L,true),document.addEventListener("keyup",T,true),window.addEventListener("blur",E),document.addEventListener("mousemove",A,true),document.addEventListener("click",O,true),p.addEventListener("click",I),p.addEventListener("input",R),document.body.append(c,p,b),h();let W={get mounted(){return a},get items(){return e.items},exportMarkdown(){return $(e.items)},destroy(){if(a){a=false,E(),document.removeEventListener("keydown",L,true),document.removeEventListener("keyup",T,true),window.removeEventListener("blur",E),document.removeEventListener("mousemove",A,true),document.removeEventListener("click",O,true),p.removeEventListener("click",I),p.removeEventListener("input",R),u&&clearTimeout(u);for(let r of v)clearTimeout(r);v.clear(),c.remove(),p.remove(),b.remove();}}};return console.log(`[feedback-collector] ativo. Segure ALT + clique pra capturar. ${e.items.length} item(ns) restaurado(s) do localStorage.`),W}var g=null,y=null;function C(t={}){if(typeof window>"u"||typeof document>"u")throw new Error("feedback-collector: mount() s\xF3 pode ser chamado no navegador.");if(g?.mounted)return g;let n=window.__FEEDBACK_COLLECTOR__;if(n&&typeof n=="object"&&n.mounted)return g=n,n;if(n===true)throw new Error("feedback-collector: uma vers\xE3o anterior j\xE1 est\xE1 montada nesta p\xE1gina.");return g=H(t),window.__FEEDBACK_COLLECTOR__=g,g}function me(){y&&(document.removeEventListener("DOMContentLoaded",y),y=null),g?.destroy(),g=null,typeof window<"u"&&delete window.__FEEDBACK_COLLECTOR__;}function q(){if(!(typeof window>"u"||typeof document>"u")&&window.__FEEDBACK_COLLECTOR__!==true){if(document.readyState==="loading"){y=()=>{y=null,C();},document.addEventListener("DOMContentLoaded",y,{once:true});return}C();}}q();exports.destroy=me;exports.mount=C;return exports;})({});//# sourceMappingURL=feedback-collector.js.map
23
+ </div>`}`,I(),c||C();}function _(){r=false,u=null,p.style.display="none",N(false),document.body.style.cursor=se;}function de(n){let i=n.style.outline;n.style.outline="3px solid #16a34a";let d=setTimeout(()=>{n.style.outline=i,k.delete(d);},400);k.add(d);}function ue(n){$();let i=Q(n);e.items.push(i),L(),x(),setTimeout(()=>s.querySelector(`[data-fbc-ta="${CSS.escape(i.id)}"]`)?.focus(),50),n instanceof HTMLElement&&de(n);}async function pe(){let n=R(e.items);try{await navigator.clipboard.writeText(n),ce();}catch{window.prompt("Copie manualmente:",n);}}function D(n){n.key==="Alt"&&!r&&(r=true,N(true),document.body.style.cursor="crosshair");}function H(n){n.key==="Alt"&&_();}function Y(n){if(!r)return;let i=document.elementFromPoint(n.clientX,n.clientY);if(!i||s.contains(i)||p.contains(i)||i===p){p.style.display="none",u=null;return}u=i;let d=i.getBoundingClientRect();p.style.display="block",p.style.left=`${d.left}px`,p.style.top=`${d.top}px`,p.style.width=`${d.width}px`,p.style.height=`${d.height}px`;let f=O(i);A.textContent=`<${i.tagName.toLowerCase()}>${f?` ${f.file.split("/").pop()}${f.line?`:${f.line}`:""}`:""}`;}function z(n){!r||!u||!(n.target instanceof Node)||s.contains(n.target)||(n.preventDefault(),n.stopPropagation(),ue(u));}function B(n){if(!(n.target instanceof Element))return;let i=n.target,d=i.getAttribute("data-fbc");if(d==="copy"){pe();return}if(d==="clear"){e.items.length&&($(),e.items=[],L(),x());return}let f=i.getAttribute("data-fbc-del");if(f){$(),e.items=e.items.filter(J=>J.id!==f),L(),x();return}if(i.closest('[data-fbc="header"]')){if(S){S=false;return}a=!a,x();}}function K(n){if(n.button!==0||!(n.target instanceof Element))return;let i=n.target.closest('[data-fbc="header"]');if(!i)return;let d=s.getBoundingClientRect();c={pointerId:n.pointerId,startX:n.clientX,startY:n.clientY,panelX:d.left,panelY:d.top,moved:false,header:i},i.style.cursor="grabbing";}function j(n){if(!c||n.pointerId!==c.pointerId)return;let i=n.clientX-c.startX,d=n.clientY-c.startY;!c.moved&&Math.hypot(i,d)<Ae||(c.moved=true,n.preventDefault(),F(c.panelX+i,c.panelY+d));}function q(n){if(!c||n.pointerId!==c.pointerId)return;let i=c;if(c=null,i.header.style.cursor="grab",!i.moved)return;let d=s.getBoundingClientRect(),f=d.left+d.width/2<window.innerWidth/2?"left":"right";l=`${d.top+d.height/2<window.innerHeight/2?"top":"bottom"}-${f}`,S=true,v&&clearTimeout(v),v=setTimeout(()=>{S=false,v=void 0;},0),C(),le();}function G(n){!c||n.pointerId!==c.pointerId||(c.header.style.cursor="grab",c=null,C());}function W(){c||C();}function X(n){if(!(n.target instanceof HTMLTextAreaElement))return;let i=n.target.getAttribute("data-fbc-ta"),d=e.items.find(f=>f.id===i);d&&(d.instruction=n.target.value,L());}function V(n){n.target instanceof HTMLTextAreaElement&&n.key==="Enter"&&!n.shiftKey&&!n.isComposing&&(n.preventDefault(),n.target.blur());}document.addEventListener("keydown",D,true),document.addEventListener("keyup",H,true),window.addEventListener("blur",_),document.addEventListener("mousemove",Y,true),document.addEventListener("click",z,true),s.addEventListener("click",B),s.addEventListener("input",X),s.addEventListener("keydown",V),s.addEventListener("pointerdown",K),window.addEventListener("pointermove",j,{passive:false}),window.addEventListener("pointerup",q),window.addEventListener("pointercancel",G),window.addEventListener("resize",W),document.body.append(p,s),x();let fe={get mounted(){return T},get items(){return e.items},exportMarkdown(){return R(e.items)},destroy(){if(T){T=false,_(),document.removeEventListener("keydown",D,true),document.removeEventListener("keyup",H,true),window.removeEventListener("blur",_),document.removeEventListener("mousemove",Y,true),document.removeEventListener("click",z,true),s.removeEventListener("click",B),s.removeEventListener("input",X),s.removeEventListener("keydown",V),s.removeEventListener("pointerdown",K),window.removeEventListener("pointermove",j),window.removeEventListener("pointerup",q),window.removeEventListener("pointercancel",G),window.removeEventListener("resize",W),h&&clearTimeout(h),v&&clearTimeout(v);for(let n of k)clearTimeout(n);k.clear(),p.remove(),s.remove();}}};return console.log(`[feedback-collector] ativo. Segure ALT + clique pra capturar. ${e.items.length} item(ns) restaurado(s) do localStorage.`),fe}var b=null,w=null;function M(t={}){if(typeof window>"u"||typeof document>"u")throw new Error("feedback-collector: mount() s\xF3 pode ser chamado no navegador.");if(b?.mounted)return b;let o=window.__FEEDBACK_COLLECTOR__;if(o&&typeof o=="object"&&o.mounted)return b=o,o;if(o===true)throw new Error("feedback-collector: uma vers\xE3o anterior j\xE1 est\xE1 montada nesta p\xE1gina.");return b=ie(t),window.__FEEDBACK_COLLECTOR__=b,b}function Re(){w&&(document.removeEventListener("DOMContentLoaded",w),w=null),b?.destroy(),b=null,typeof window<"u"&&delete window.__FEEDBACK_COLLECTOR__;}function ae(){if(!(typeof window>"u"||typeof document>"u")&&window.__FEEDBACK_COLLECTOR__!==true){if(document.readyState==="loading"){w=()=>{w=null,M();},document.addEventListener("DOMContentLoaded",w,{once:true});return}M();}}ae();exports.destroy=Re;exports.mount=M;return exports;})({});//# sourceMappingURL=feedback-collector.js.map
24
24
  //# sourceMappingURL=feedback-collector.js.map