feedback-collector 0.1.1 → 0.2.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/extract.ts","../src/markdown.ts","../src/storage.ts","../src/collector.ts","../src/lifecycle.ts","../src/script.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","pendingAutoMount","mount","existing","destroy","autoMount"],"mappings":"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","file":"feedback-collector.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","import { autoMount } from \"./lifecycle\";\n\nexport { destroy, mount } from \"./lifecycle\";\n\n// Entry clássico/IIFE usado por feedback-collector/script e pelo caminho legado.\nautoMount();\n"]}
@@ -0,0 +1 @@
1
+ export { FeedbackCollectorController, FeedbackItem, MountOptions, SourceInfo, destroy, mount } from './api.js';
package/dist/index.js ADDED
@@ -0,0 +1,24 @@
1
+ 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 N(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=N(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=N(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 R(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 `#${R(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(R).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;">
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>
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;">
12
+ <span style="font-weight:600;">Feedback</span>
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>`:""}
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>'}
19
+ </div>
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>
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 F(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",F),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",F),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();export{me as destroy,C as mount};//# sourceMappingURL=index.js.map
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/extract.ts","../src/markdown.ts","../src/storage.ts","../src/collector.ts","../src/lifecycle.ts","../src/index.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","pendingAutoMount","mount","existing","destroy","autoMount"],"mappings":"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","file":"index.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","import { autoMount } from \"./lifecycle\";\n\nexport { destroy, mount } from \"./lifecycle\";\nexport type { FeedbackCollectorController, FeedbackItem, MountOptions, SourceInfo } from \"./types\";\n\n// Compatibilidade v0.1: import(\"feedback-collector\") continua injetando o picker.\nautoMount();\n"]}
@@ -0,0 +1,87 @@
1
+ # Registro de decisões
2
+
3
+ ## 2026-07-08 — Primeira instalação real + empacotamento npm
4
+
5
+ Contexto: POC instalada num projeto de produção real (Bananas CMD — Next.js 15,
6
+ React 19, webpack, Tailwind, Supabase auth). A instalação validou o pipeline de
7
+ captura + source mapping; os critérios de sucesso da POC (precisão do agente,
8
+ coerência em lote, velocidade vs fluxo serial) **ainda não foram medidos** em
9
+ sessão cronometrada.
10
+
11
+ ### Descobertas técnicas
12
+
13
+ 1. **React 19 removeu `_debugSource` do fiber.** O fallback (b) do
14
+ `getSourceInfo` é código morto em React 19 — source mapping passa a depender
15
+ 100% do plugin de build (`@react-dev-inspector/babel-plugin`). O README
16
+ original assumia o fallback como rede de segurança; não é mais.
17
+ 2. **Next.js: babel via `.babelrc` desliga o SWC do projeto inteiro** (inclusive
18
+ build de prod). A receita segura é um `babel-loader` como `enforce: "pre"`
19
+ dentro do hook `webpack()` do `next.config.ts` — o SWC continua sendo o
20
+ compilador; o Babel só injeta os atributos antes.
21
+ 3. **Babel 8 removeu `isTSX`/`allExtensions`** do `@babel/preset-typescript`.
22
+ JSX precisa do `@babel/plugin-syntax-jsx` explícito (só parse; sem transform).
23
+ 4. **O pre-pass deve rodar em server E client** — só no client gera hydration
24
+ mismatch (SSR sem os atributos, client com).
25
+ 5. **TypeScript exige que o script seja módulo** pra `import()` funcionar
26
+ (`TS2306: not a module`). Resolvido com entry ESM separado (`src/index.js`
27
+ com `import "./feedback-collector.js"; export {}`), mantendo o IIFE cru
28
+ utilizável via `<script src>`.
29
+
30
+ ### Decisões de produto
31
+
32
+ 6. **Uso em produção é caso real, não edge case.** Dev local nem sempre está
33
+ disponível/populado; o valor do picker aparece contra dados e auth reais. O
34
+ gate correto não é `NODE_ENV`, é **quem vê**: render condicional server-side
35
+ por papel (ex.: `role === "owner"`). O script é leitura-somente do DOM do
36
+ próprio usuário — não é vetor de vazamento.
37
+ 7. **Source mapping em prod é trade-off explícito do usuário:** paths de `src/`
38
+ ficam nos chunks públicos + build sem SWC (mais lento). Aceito no primeiro
39
+ projeto; documentado em comentário no config e na skill.
40
+ 8. **Alternativa SWC descartada por ora:** `experimental.swcPlugins` +
41
+ `swc-plugin-react-source-string` manteria o build rápido, mas está
42
+ experimental desde o Next 12.2 (2022; verificado em 07/2026 que segue
43
+ experimental) e plugins Wasm quebram entre versões do `swc_core`. Revisitar
44
+ só se build lento virar dor.
45
+
46
+ ### Decisões de empacotamento
47
+
48
+ 9. **Publicado como `feedback-collector` no npm** (nome estava livre), v0.1.0,
49
+ licença **MIT**, sem build step (JS vanilla). `sideEffects: true` no
50
+ package.json é obrigatório — o package É um side effect; sem isso bundlers
51
+ podem tree-shakear o import.
52
+ 10. **Skill de agente incluída no repo** (`skills/feedback-collector-setup/`):
53
+ receitas de instalação/remoção por stack, com os caveats acima, pra
54
+ qualquer agente de código instalar o package sem redescobrir as armadilhas.
55
+
56
+ ## 2026-08-13 — v0.2: base TypeScript, lifecycle e compatibilidade
57
+
58
+ Contexto: a POC empacotada precisava evoluir sem trocar sua hipótese por uma
59
+ plataforma maior. A v0.2 mantém runtime vanilla, local e sem backend, mas cria
60
+ uma base testável e publicável com contratos explícitos.
61
+
62
+ ### Decisões técnicas
63
+
64
+ 11. **Autoria em TypeScript modular; distribuição compilada.** Extração,
65
+ markdown, storage, UI e lifecycle ficam separados em `src/*.ts`. O package
66
+ entrega ESM minificado, IIFE/script e declarações TypeScript via tsup.
67
+ 12. **Compatibilidade por dois caminhos.** O import raiz continua auto-montando
68
+ por side effect. `feedback-collector/api` oferece `mount()`/`destroy()` sem
69
+ auto-mount. O IIFE expõe a mesma API em `window.FeedbackCollector`.
70
+ 13. **Path legado temporário.** O build também grava
71
+ `src/feedback-collector.js`, permitindo que consumidores v0.1 que acessavam
72
+ esse arquivo diretamente continuem funcionando. Novos consumidores devem
73
+ usar os exports do package.
74
+ 14. **Storage versionado e rollback seguro.** A chave nova
75
+ `__fbc_state_v2` guarda `{ version: 2, items }`. Se necessário, o runtime
76
+ migra `__fbc_items_v1` preservando cada objeto e mantém a chave antiga
77
+ intacta. Não há migração destrutiva.
78
+ 15. **Teste proporcional ao risco.** Funções puras têm testes Vitest. Um teste
79
+ Playwright em Chromium real cobre montagem, ALT+clique, `data-inspector-*`,
80
+ edição, storage, clipboard, destroy e remontagem.
81
+ 16. **Orçamento de bundle automatizado.** ESM e IIFE falham acima de 30 KB raw
82
+ ou 8 KiB gzip. Na implementação inicial da v0.2 ambos ficam em ~5,2 KB
83
+ gzip, abaixo dos ~6,3 KB gzip do arquivo v0.1 sem minificação.
84
+ 17. **Compiler próprio continua adiado.** O contrato e os critérios de uma
85
+ futura integração Next/Vite estão em `docs/integracao-compiler-futura.md`.
86
+ Primeiro é preciso validar a base em projetos reais; nenhum plugin novo foi
87
+ adicionado nesta versão.
@@ -0,0 +1,56 @@
1
+ # Integração própria de compiler/bundler — proposta futura
2
+
3
+ Status: desenho, não implementado na v0.2.
4
+
5
+ ## Por que adiar
6
+
7
+ O diferencial que ainda precisa ser validado é o fluxo de coleta e export em projetos reais. Um plugin próprio adiciona uma matriz de versões, compiladores e frameworks antes de sabermos se source mapping + backlog em lote resolve o problema com frequência suficiente. A v0.2 estabiliza runtime, storage, API e testes primeiro.
8
+
9
+ ## Contrato a preservar
10
+
11
+ Uma integração futura deve apenas enriquecer o DOM; não pode acoplar o runtime a React nem exigir backend. O contrato mínimo continua sendo:
12
+
13
+ ```html
14
+ <div
15
+ data-inspector-relative-path="src/components/Card.tsx"
16
+ data-inspector-line="12"
17
+ data-inspector-column="5"
18
+ ></div>
19
+ ```
20
+
21
+ Também deve continuar aceito `data-source="src/components/Card.tsx:12:5"`. Projetos que já usam `@react-dev-inspector/babel-plugin` não podem ser obrigados a migrar.
22
+
23
+ ## Forma provável
24
+
25
+ Começar com uma única transformação interna compartilhada e wrappers finos, sem criar um ecossistema de packages:
26
+
27
+ 1. transformação de JSX/TSX que injeta os atributos no nó host;
28
+ 2. wrapper Vite executado antes do plugin React;
29
+ 3. wrapper Next escolhido conforme o compiler realmente suportado (webpack/Babel primeiro; SWC apenas se sua API estiver estável);
30
+ 4. opção explícita para dev versus produção, com warning sobre exposição de paths;
31
+ 5. exclusão de `node_modules`, código gerado e elementos sem localização útil.
32
+
33
+ O protótipo pode viver no mesmo repositório. Separar packages só se houver necessidades reais de versionamento ou instalação independente.
34
+
35
+ ## Critérios antes de implementar
36
+
37
+ - validar o collector em pelo menos dois projetos e sessões reais;
38
+ - medir a proporção de capturas sem source e confirmar que setup é a principal causa;
39
+ - registrar versões-alvo de Next, Vite, React e TypeScript;
40
+ - definir comportamento SSR/client que não produza hydration mismatch;
41
+ - manter build e runtime sem dependências de produção adicionais;
42
+ - provar que o plugin não altera semântica, source maps do app ou Fast Refresh;
43
+ - ter fixtures de build e teste de navegador para cada wrapper suportado.
44
+
45
+ ## Sequência de validação sugerida
46
+
47
+ 1. Criar fixtures mínimas de Vite e Next dentro de testes, sem publicar nada.
48
+ 2. Implementar a transformação mais simples que preserve paths relativos.
49
+ 3. Comparar HTML server/client e testar hydration.
50
+ 4. Medir custo de build, HMR e tamanho dos chunks.
51
+ 5. Testar modo dev e produção com gate explícito.
52
+ 6. Fazer dogfood em um projeto real antes de expor API pública.
53
+
54
+ ## Não fazer junto
55
+
56
+ Esse trabalho não deve puxar backend, screenshots, dashboard, MCP, múltiplos adapters ou suporte amplo a frameworks. Cada expansão precisa de evidência própria depois que a base estiver validada.
package/package.json CHANGED
@@ -1,24 +1,42 @@
1
1
  {
2
2
  "name": "feedback-collector",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "Coletor de feedback visual para desenvolvimento assistido por IA: ALT+clique nos elementos, anote instruções e exporte um backlog em markdown com source mapping (arquivo:linha) pronto para colar no Claude Code ou outro agente.",
5
5
  "type": "module",
6
- "main": "./src/index.js",
7
- "types": "./src/index.d.ts",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
8
9
  "exports": {
9
10
  ".": {
10
- "types": "./src/index.d.ts",
11
- "default": "./src/index.js"
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "default": "./dist/index.js"
12
14
  },
13
- "./script": "./src/feedback-collector.js"
15
+ "./api": {
16
+ "types": "./dist/api.d.ts",
17
+ "import": "./dist/api.js",
18
+ "default": "./dist/api.js"
19
+ },
20
+ "./script": "./dist/feedback-collector.js"
14
21
  },
15
22
  "sideEffects": true,
16
23
  "files": [
17
- "src",
24
+ "dist",
25
+ "src/feedback-collector.js",
18
26
  "skills",
27
+ "docs",
19
28
  "README.md",
20
29
  "LICENSE"
21
30
  ],
31
+ "scripts": {
32
+ "build": "tsup",
33
+ "prepack": "npm run build",
34
+ "typecheck": "tsc --noEmit",
35
+ "test": "vitest run",
36
+ "test:browser": "playwright test",
37
+ "size": "node scripts/check-bundle-size.mjs",
38
+ "check": "npm run build && npm run typecheck && npm test && npm run test:browser && npm run size && npm pack --dry-run"
39
+ },
22
40
  "keywords": [
23
41
  "feedback",
24
42
  "visual-feedback",
@@ -40,5 +58,15 @@
40
58
  "url": "https://github.com/bananas-global/feedback-collector/issues"
41
59
  },
42
60
  "author": "Bruno Santos (https://github.com/brucesantos)",
43
- "license": "MIT"
61
+ "license": "MIT",
62
+ "overrides": {
63
+ "esbuild": "^0.28.2"
64
+ },
65
+ "devDependencies": {
66
+ "@types/node": "^24.2.1",
67
+ "@playwright/test": "^1.55.0",
68
+ "tsup": "^8.5.0",
69
+ "typescript": "^5.9.2",
70
+ "vitest": "^3.2.4"
71
+ }
44
72
  }