@rendra-ui/web 2.6.0 → 2.7.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.
Files changed (55) hide show
  1. package/README.md +2 -1
  2. package/dist/base.css +1 -1
  3. package/dist/{empty-state-DrQjqxvp.js → brand-feedback-icon-BYNcqBel.js} +4 -64
  4. package/dist/brand-feedback-icon-BYNcqBel.js.map +1 -0
  5. package/dist/{button-B6-644xP.js → button-DlzWwpZk.js} +6 -6
  6. package/dist/{button-B6-644xP.js.map → button-DlzWwpZk.js.map} +1 -1
  7. package/dist/chart.js +7 -7
  8. package/dist/cli/auditar.js +1 -1
  9. package/dist/cli/codigos.js +2 -2
  10. package/dist/cli/executar-auditar.js +1 -1
  11. package/dist/cli/help.js +1 -1
  12. package/dist/cli/trocar.js +2 -2
  13. package/dist/cli/typescript-loader.js +1 -1
  14. package/dist/{cn-TBlI6-gS.js → cn-B0N3Pek0.js} +2 -2
  15. package/dist/{cn-TBlI6-gS.js.map → cn-B0N3Pek0.js.map} +1 -1
  16. package/dist/{components-Btk1cUg2.js → components-CpQPMGfT.js} +18 -2
  17. package/dist/{components-Btk1cUg2.js.map → components-CpQPMGfT.js.map} +1 -1
  18. package/dist/components.css +90 -1
  19. package/dist/document-viewer.js +4 -4
  20. package/dist/{tooltip-kgsorOg6.js → dropdown-menu-M8vs0byD.js} +9 -75
  21. package/dist/dropdown-menu-M8vs0byD.js.map +1 -0
  22. package/dist/empty-state-a47Kd_Ci.js +67 -0
  23. package/dist/empty-state-a47Kd_Ci.js.map +1 -0
  24. package/dist/{features-max-CC6CorTg.js → features-max-ScxV8gb3.js} +1 -1
  25. package/dist/flow.js +1485 -0
  26. package/dist/flow.js.map +1 -0
  27. package/dist/index.js +72 -1854
  28. package/dist/index.js.map +1 -1
  29. package/dist/{motion-context-BL545cb6.js → motion-context-BUMPf0e9.js} +4 -4
  30. package/dist/{motion-context-BL545cb6.js.map → motion-context-BUMPf0e9.js.map} +1 -1
  31. package/dist/{motion-on-DMoTsWrG.js → motion-on-CNN6y8g-.js} +2 -2
  32. package/dist/{motion-on-DMoTsWrG.js.map → motion-on-CNN6y8g-.js.map} +1 -1
  33. package/dist/motion.js +2 -2
  34. package/dist/{rendra-provider-CeCkPafT.js → rendra-provider-DEURIIL3.js} +3 -3
  35. package/dist/{rendra-provider-CeCkPafT.js.map → rendra-provider-DEURIIL3.js.map} +1 -1
  36. package/dist/rich-text-editor.js +4 -3
  37. package/dist/rich-text-editor.js.map +1 -1
  38. package/dist/router-bridge.js +2 -2
  39. package/dist/timeline-BOh7gUdA.js +1803 -0
  40. package/dist/timeline-BOh7gUdA.js.map +1 -0
  41. package/dist/tokens.css +1 -1
  42. package/dist/tooltip-Ym9S4h9_.js +76 -0
  43. package/dist/tooltip-Ym9S4h9_.js.map +1 -0
  44. package/dist/types/components/ui/flow-editor.d.ts +11 -0
  45. package/dist/types/components/ui/flow-viewer.d.ts +58 -0
  46. package/dist/types/flow.d.ts +3 -0
  47. package/dist/types/lib/flow.d.ts +121 -0
  48. package/dist/{use-breakpoint-CNxDwEpc.js → use-breakpoint-En17oXKY.js} +2 -2
  49. package/dist/{use-breakpoint-CNxDwEpc.js.map → use-breakpoint-En17oXKY.js.map} +1 -1
  50. package/dist/{use-motion-presets-DCJPBfNJ.js → use-motion-presets-D3ww1oJX.js} +3 -3
  51. package/dist/{use-motion-presets-DCJPBfNJ.js.map → use-motion-presets-D3ww1oJX.js.map} +1 -1
  52. package/dist/widget-grid.js +2 -2
  53. package/package.json +7 -1
  54. package/dist/empty-state-DrQjqxvp.js.map +0 -1
  55. package/dist/tooltip-kgsorOg6.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow.js","names":[],"sources":["../src/lib/flow.ts","../src/components/ui/flow-viewer.tsx","../src/components/ui/flow-editor.tsx"],"sourcesContent":["/*\n * Fluxos de automação: contrato do JSON, validação, edição, serialização e simulação.\n * Funções puras e imutáveis, com tipos próprios do Rendra: nada daqui importa o React Flow,\n * então o item `core` do registry não depende dele. A conversão para os nós da biblioteca\n * mora só dentro de FlowEditor e FlowViewer.\n */\n\nexport type FlowNodeType = 'gatilho' | 'acao' | 'condicao' | 'espera' | 'fim'\nexport type FlowBranch = 'sim' | 'nao'\nexport type FlowWaitUnit = 'segundos' | 'minutos' | 'horas' | 'dias'\n\nexport interface FlowNode {\n id: string\n type: FlowNodeType\n position: { x: number; y: number }\n data: { label: string; config?: Record<string, unknown> }\n}\n\nexport interface FlowEdge {\n id: string\n source: string\n target: string\n /** Só a saída de uma condição usa o ramo. */\n branch?: FlowBranch\n}\n\nexport interface Flow {\n nodes: FlowNode[]\n edges: FlowEdge[]\n}\n\nexport interface FlowIssue {\n code: string\n message: string\n nodeId?: string\n edgeId?: string\n}\n\nexport interface SimulationStep {\n nodeId: string\n type: FlowNodeType\n label: string\n status: 'succeeded' | 'failed' | 'skipped'\n detail?: string\n}\n\nexport interface SimulationState {\n status: 'idle' | 'running' | 'waiting-choice' | 'finished' | 'error'\n steps: SimulationStep[]\n /** Bloco que o próximo avanço executa (o bloco ativo); `null` fora da simulação. */\n currentId: string | null\n issues: FlowIssue[]\n}\n\nexport const FLOW_NODE_TYPES: readonly FlowNodeType[] = [\n 'gatilho',\n 'acao',\n 'condicao',\n 'espera',\n 'fim',\n]\n\nexport const FLOW_WAIT_UNITS: readonly FlowWaitUnit[] = ['segundos', 'minutos', 'horas', 'dias']\n\n/** Nome do tipo de bloco, como aparece na interface. */\nexport const FLOW_TYPE_NAME: Record<FlowNodeType, string> = {\n gatilho: 'Gatilho',\n acao: 'Ação',\n condicao: 'Condição',\n espera: 'Espera',\n fim: 'Fim',\n}\n\nconst BRANCH_NAME: Record<FlowBranch, string> = { sim: 'Sim', nao: 'Não' }\n\nconst WAIT_SINGULAR: Record<FlowWaitUnit, string> = {\n segundos: 'segundo',\n minutos: 'minuto',\n horas: 'hora',\n dias: 'dia',\n}\n\nconst DEFAULT_WAIT: { duration: number; unit: FlowWaitUnit } = { duration: 5, unit: 'minutos' }\n\nconst isUnit = (v: unknown): v is FlowWaitUnit =>\n typeof v === 'string' && (FLOW_WAIT_UNITS as readonly string[]).includes(v)\n\n/** A duração do bloco de espera (\"5 minutos\"), ou `null` se o config não a define. */\nexport function formatWait(config: Record<string, unknown> | undefined): string | null {\n const duration = config?.duration\n const unit = config?.unit\n if (typeof duration !== 'number' || !Number.isFinite(duration) || !isUnit(unit)) return null\n return `${duration} ${duration === 1 ? WAIT_SINGULAR[unit] : unit}`\n}\n\n/** Texto da espera simulada: nunca espera de verdade. */\nexport function describeWait(config: Record<string, unknown> | undefined): string {\n const wait = formatWait(config)\n return wait ? `Aguardaria ${wait}` : 'Aguardaria o tempo definido no bloco'\n}\n\n/** Nome do bloco para mensagens e rótulos: o rótulo, ou o tipo quando ele está vazio. */\nexport const nodeName = (n: Pick<FlowNode, 'type' | 'data'>) =>\n n.data.label.trim() || FLOW_TYPE_NAME[n.type]\n\n/** Ligações que saem de cada bloco, na ordem do fluxo. */\nfunction outgoing(flow: Flow) {\n const map = new Map<string, FlowEdge[]>()\n for (const e of flow.edges) map.set(e.source, [...(map.get(e.source) ?? []), e])\n return map\n}\n\n/** Problemas do fluxo, em ordem estável: a mesma entrada dá sempre a mesma lista. */\nexport function validateFlow(flow: Flow): FlowIssue[] {\n const issues: FlowIssue[] = []\n const byId = new Map(flow.nodes.map((n) => [n.id, n]))\n const out = outgoing(flow)\n\n const triggers = flow.nodes.filter((n) => n.type === 'gatilho')\n if (triggers.length === 0)\n issues.push({\n code: 'sem-gatilho',\n message: 'O fluxo precisa de um bloco Gatilho para começar.',\n })\n else if (triggers.length > 1)\n issues.push({\n code: 'varios-gatilhos',\n message: `O fluxo tem ${triggers.length} gatilhos, mas deve ter só um.`,\n })\n\n // Integridade: ligações apontando para o que não existe, ou com o ramo errado.\n const sound: FlowEdge[] = []\n for (const e of flow.edges) {\n const from = byId.get(e.source)\n const to = byId.get(e.target)\n if (!from || !to) {\n issues.push({\n code: 'ligacao-invalida',\n message: 'Há uma ligação que aponta para um bloco que não existe.',\n edgeId: e.id,\n })\n continue\n }\n if (from.type === 'condicao' ? !e.branch : e.branch) {\n issues.push({\n code: 'ramo-invalido',\n message:\n from.type === 'condicao'\n ? `Uma saída da condição \"${nodeName(from)}\" não diz se é \"Sim\" ou \"Não\".`\n : `A ligação que sai de \"${nodeName(from)}\" não pode ter \"Sim\" ou \"Não\": isso só vale para condição.`,\n nodeId: from.id,\n edgeId: e.id,\n })\n continue\n }\n sound.push(e)\n }\n\n for (const n of flow.nodes) {\n const edges = out.get(n.id) ?? []\n const name = nodeName(n)\n if (n.type === 'fim') {\n if (edges.length > 0)\n issues.push({\n code: 'fim-com-saida',\n message: `O bloco Fim \"${name}\" não pode ter saída.`,\n nodeId: n.id,\n })\n } else if (n.type === 'condicao') {\n const sim = edges.filter((e) => e.branch === 'sim').length\n const nao = edges.filter((e) => e.branch === 'nao').length\n if (sim === 0)\n issues.push({\n code: 'condicao-sem-sim',\n message: `A condição \"${name}\" precisa de uma saída \"Sim\".`,\n nodeId: n.id,\n })\n if (nao === 0)\n issues.push({\n code: 'condicao-sem-nao',\n message: `A condição \"${name}\" precisa de uma saída \"Não\".`,\n nodeId: n.id,\n })\n if (sim > 1 || nao > 1)\n issues.push({\n code: 'condicao-saida-repetida',\n message: `A condição \"${name}\" tem mais de uma saída para o mesmo ramo.`,\n nodeId: n.id,\n })\n } else if (edges.length === 0) {\n issues.push({\n code: 'sem-saida',\n message: `O bloco \"${name}\" não leva a nenhum próximo bloco.`,\n nodeId: n.id,\n })\n } else if (edges.length > 1) {\n issues.push({\n code: 'varias-saidas',\n message: `O bloco \"${name}\" tem mais de uma saída; só a condição pode ter.`,\n nodeId: n.id,\n })\n }\n }\n\n const next = new Map<string, string[]>()\n for (const e of sound) next.set(e.source, [...(next.get(e.source) ?? []), e.target])\n\n // Alcançáveis a partir do gatilho (sem gatilho, nada é acusado: o problema já é outro).\n if (triggers.length > 0) {\n const seen = new Set<string>()\n const stack = triggers.map((t) => t.id)\n while (stack.length) {\n const id = stack.pop()!\n if (seen.has(id)) continue\n seen.add(id)\n stack.push(...(next.get(id) ?? []))\n }\n for (const n of flow.nodes)\n if (!seen.has(n.id))\n issues.push({\n code: 'inalcancavel',\n message: `O bloco \"${nodeName(n)}\" não é alcançado a partir do gatilho.`,\n nodeId: n.id,\n })\n }\n\n // Ciclos: busca em profundidade, uma queixa por laço encontrado.\n const state = new Map<string, 1 | 2>()\n const path: string[] = []\n const visit = (id: string) => {\n state.set(id, 1)\n path.push(id)\n for (const t of next.get(id) ?? []) {\n if (state.get(t) === 1) {\n const loop = [...path.slice(path.indexOf(t)), t].map((x) => `\"${nodeName(byId.get(x)!)}\"`)\n issues.push({\n code: 'ciclo',\n message: `O fluxo volta para um bloco por onde já passou: ${loop.join(' → ')}.`,\n nodeId: t,\n })\n } else if (!state.has(t)) visit(t)\n }\n path.pop()\n state.set(id, 2)\n }\n for (const n of flow.nodes) if (!state.has(n.id)) visit(n.id)\n\n return issues\n}\n\n/* ---------------------------------------------------------------- serialização */\n\nconst sortKeys = (v: unknown): unknown => {\n if (Array.isArray(v)) return v.map(sortKeys)\n if (v && typeof v === 'object')\n return Object.fromEntries(\n Object.keys(v)\n .sort()\n .map((k) => [k, sortKeys((v as Record<string, unknown>)[k])]),\n )\n return v\n}\n\n/** JSON do fluxo, com a ordem das chaves fixa: o mesmo fluxo dá sempre o mesmo texto. */\nexport function serializeFlow(flow: Flow): string {\n const nodes = flow.nodes.map((n) => ({\n id: n.id,\n type: n.type,\n position: { x: n.position.x, y: n.position.y },\n data: n.data.config\n ? { label: n.data.label, config: sortKeys(n.data.config) }\n : { label: n.data.label },\n }))\n const edges = flow.edges.map((e) =>\n e.branch\n ? { id: e.id, source: e.source, target: e.target, branch: e.branch }\n : { id: e.id, source: e.source, target: e.target },\n )\n return JSON.stringify({ nodes, edges }, null, 2)\n}\n\nexport type ParseResult = { ok: true; flow: Flow } | { ok: false; errors: string[] }\n\nconst isObject = (v: unknown): v is Record<string, unknown> =>\n typeof v === 'object' && v !== null && !Array.isArray(v)\n\n/** Lê o JSON de um fluxo. Nunca lança; campos que o contrato não conhece são ignorados. */\nexport function parseFlow(text: string): ParseResult {\n let raw: unknown\n try {\n raw = JSON.parse(text)\n } catch {\n return { ok: false, errors: ['O texto não é um JSON válido.'] }\n }\n if (!isObject(raw)) return { ok: false, errors: ['O JSON do fluxo precisa ser um objeto.'] }\n if (!Array.isArray(raw.nodes) || !Array.isArray(raw.edges)) {\n const falta = !Array.isArray(raw.nodes) ? 'nodes' : 'edges'\n return { ok: false, errors: [`O campo \"${falta}\" precisa ser uma lista.`] }\n }\n\n const errors: string[] = []\n const nodes: FlowNode[] = []\n const ids = new Set<string>()\n raw.nodes.forEach((item, i) => {\n const at = `Bloco ${i + 1}`\n if (!isObject(item)) return void errors.push(`${at}: precisa ser um objeto.`)\n const { id, type, position, data } = item\n let ok = true\n if (typeof id !== 'string' || id === '') {\n errors.push(`${at}: falta o \"id\".`)\n ok = false\n } else if (ids.has(id)) {\n errors.push(`${at}: o id \"${id}\" está repetido.`)\n ok = false\n } else ids.add(id)\n if (!(FLOW_NODE_TYPES as readonly unknown[]).includes(type)) {\n errors.push(`${at}: tipo desconhecido (${String(type)}).`)\n ok = false\n }\n const pos = isObject(position) ? position : null\n if (\n !pos ||\n typeof pos.x !== 'number' ||\n typeof pos.y !== 'number' ||\n !Number.isFinite(pos.x) ||\n !Number.isFinite(pos.y)\n ) {\n errors.push(`${at}: \"position\" precisa ter \"x\" e \"y\" numéricos.`)\n ok = false\n }\n if (!isObject(data) || typeof data.label !== 'string') {\n errors.push(`${at}: \"data.label\" precisa ser um texto.`)\n ok = false\n } else if (data.config !== undefined && !isObject(data.config)) {\n errors.push(`${at}: \"data.config\" precisa ser um objeto.`)\n ok = false\n }\n if (ok) {\n const d = data as { label: string; config?: Record<string, unknown> }\n nodes.push({\n id: id as string,\n type: type as FlowNodeType,\n position: { x: (pos as { x: number }).x, y: (pos as { y: number }).y },\n data: d.config ? { label: d.label, config: d.config } : { label: d.label },\n })\n }\n })\n\n const edges: FlowEdge[] = []\n const edgeIds = new Set<string>()\n raw.edges.forEach((item, i) => {\n const at = `Ligação ${i + 1}`\n if (!isObject(item)) return void errors.push(`${at}: precisa ser um objeto.`)\n const { id, source, target, branch } = item\n let ok = true\n for (const [campo, v] of [\n ['id', id],\n ['source', source],\n ['target', target],\n ] as const)\n if (typeof v !== 'string' || v === '') {\n errors.push(`${at}: falta o campo \"${campo}\".`)\n ok = false\n }\n if (ok && edgeIds.has(id as string)) {\n errors.push(`${at}: o id \"${id as string}\" está repetido.`)\n ok = false\n }\n if (branch !== undefined && branch !== 'sim' && branch !== 'nao') {\n errors.push(`${at}: \"branch\" só pode ser \"sim\" ou \"nao\".`)\n ok = false\n }\n if (ok) {\n edgeIds.add(id as string)\n edges.push(\n branch\n ? {\n id: id as string,\n source: source as string,\n target: target as string,\n branch: branch as FlowBranch,\n }\n : { id: id as string, source: source as string, target: target as string },\n )\n }\n })\n\n return errors.length > 0 ? { ok: false, errors } : { ok: true, flow: { nodes, edges } }\n}\n\n/* ---------------------------------------------------------------------- edição */\n\nexport interface AddNodeOptions {\n label?: string\n /** Ids que já existiram neste fluxo (mesmo apagados): não voltam a ser usados. */\n reservedIds?: Iterable<string>\n}\n\n/** Acrescenta um bloco com id único e determinístico (`tipo-N`). */\nexport function addNode(\n flow: Flow,\n type: FlowNodeType,\n position: { x: number; y: number },\n options: AddNodeOptions = {},\n): { flow: Flow; id: string } {\n const taken = new Set([...flow.nodes.map((n) => n.id), ...(options.reservedIds ?? [])])\n let n = 1\n while (taken.has(`${type}-${n}`)) n++\n const id = `${type}-${n}`\n const node: FlowNode = {\n id,\n type,\n position: { x: position.x, y: position.y },\n data:\n type === 'espera'\n ? { label: options.label ?? FLOW_TYPE_NAME[type], config: { ...DEFAULT_WAIT } }\n : { label: options.label ?? FLOW_TYPE_NAME[type] },\n }\n return { flow: { ...flow, nodes: [...flow.nodes, node] }, id }\n}\n\n/** Apaga o bloco e as ligações que chegam ou saem dele. */\nexport function removeNode(flow: Flow, id: string): Flow {\n if (!flow.nodes.some((n) => n.id === id)) return flow\n return {\n nodes: flow.nodes.filter((n) => n.id !== id),\n edges: flow.edges.filter((e) => e.source !== id && e.target !== id),\n }\n}\n\nexport function removeEdge(flow: Flow, id: string): Flow {\n return { ...flow, edges: flow.edges.filter((e) => e.id !== id) }\n}\n\nexport function moveNode(flow: Flow, id: string, position: { x: number; y: number }): Flow {\n return {\n ...flow,\n nodes: flow.nodes.map((n) =>\n n.id === id ? { ...n, position: { x: position.x, y: position.y } } : n,\n ),\n }\n}\n\n/** Troca o rótulo e/ou o config do bloco (o config informado substitui o anterior). */\nexport function updateNodeData(\n flow: Flow,\n id: string,\n patch: { label?: string; config?: Record<string, unknown> },\n): Flow {\n return {\n ...flow,\n nodes: flow.nodes.map((n) => {\n if (n.id !== id) return n\n const label = patch.label ?? n.data.label\n const config = patch.config ?? n.data.config\n return { ...n, data: config ? { label, config } : { label } }\n }),\n }\n}\n\nexport type ConnectResult = { ok: true; flow: Flow } | { ok: false; reason: string }\n\nconst edgeId = (source: string, target: string, branch?: FlowBranch) =>\n branch ? `${source}:${branch}->${target}` : `${source}->${target}`\n\n/**\n * Liga dois blocos. A segunda saída de um bloco comum (ou do mesmo ramo da condição) substitui\n * a primeira. Recusa, com o motivo, o que o fluxo nunca aceita.\n */\nexport function connectNodes(\n flow: Flow,\n source: string,\n target: string,\n branch?: FlowBranch,\n): ConnectResult {\n const from = flow.nodes.find((n) => n.id === source)\n const to = flow.nodes.find((n) => n.id === target)\n if (!from || !to) return { ok: false, reason: 'Esse bloco não existe mais.' }\n if (source === target) return { ok: false, reason: 'Um bloco não pode ligar a ele mesmo.' }\n if (from.type === 'fim')\n return { ok: false, reason: 'O bloco Fim termina o fluxo e não tem saída.' }\n if (to.type === 'gatilho')\n return { ok: false, reason: 'O gatilho começa o fluxo e não recebe ligação.' }\n if (from.type === 'condicao' && !branch)\n return { ok: false, reason: 'Escolha a saída \"Sim\" ou \"Não\" da condição.' }\n if (from.type !== 'condicao' && branch)\n return { ok: false, reason: '\"Sim\" e \"Não\" só existem na condição.' }\n const id = edgeId(source, target, branch)\n if (flow.edges.some((e) => e.id === id)) return { ok: false, reason: 'Essa ligação já existe.' }\n const kept = flow.edges.filter(\n (e) => !(e.source === source && (from.type === 'condicao' ? e.branch === branch : true)),\n )\n const edge: FlowEdge = branch ? { id, source, target, branch } : { id, source, target }\n return { ok: true, flow: { ...flow, edges: [...kept, edge] } }\n}\n\n/**\n * Define (ou, com `target` nulo, tira) o próximo bloco de `id`; na condição, o do ramo dado.\n * Uma ligação recusada devolve o próprio fluxo, sem mudança.\n */\nexport function setNext(flow: Flow, id: string, target: string | null, branch?: FlowBranch): Flow {\n if (target === null)\n return {\n ...flow,\n edges: flow.edges.filter((e) => !(e.source === id && (branch ? e.branch === branch : true))),\n }\n const r = connectNodes(flow, id, target, branch)\n return r.ok ? r.flow : flow\n}\n\n/** Blocos que `id` pode ter como próximo: nunca ele mesmo nem o gatilho. */\nexport function nextCandidates(flow: Flow, id: string): FlowNode[] {\n const from = flow.nodes.find((n) => n.id === id)\n if (!from || from.type === 'fim') return []\n return flow.nodes.filter((n) => n.id !== id && n.type !== 'gatilho')\n}\n\n/* -------------------------------------------------------------------- simulação */\n\nexport function resetSimulation(): SimulationState {\n return { status: 'idle', steps: [], currentId: null, issues: [] }\n}\n\n/** Começa no gatilho. Fluxo inválido não inicia: devolve `error` com os problemas. */\nexport function startSimulation(flow: Flow): SimulationState {\n const issues = validateFlow(flow)\n if (issues.length > 0) return { status: 'error', steps: [], currentId: null, issues }\n const trigger = flow.nodes.find((n) => n.type === 'gatilho')!\n return { status: 'running', steps: [], currentId: trigger.id, issues: [] }\n}\n\n/**\n * Executa o bloco ativo (um passo) e passa ao próximo. Na condição é preciso escolher o ramo:\n * sem escolha válida nada anda. A espera é instantânea; só o texto diz quanto aguardaria.\n */\nexport function advanceSimulation(\n flow: Flow,\n state: SimulationState,\n choice?: FlowBranch,\n): SimulationState {\n if ((state.status !== 'running' && state.status !== 'waiting-choice') || !state.currentId)\n return state\n const node = flow.nodes.find((n) => n.id === state.currentId)\n const edges = node ? flow.edges.filter((e) => e.source === node.id) : []\n const fail = (): SimulationState => ({\n ...state,\n status: 'error',\n currentId: null,\n issues: [\n {\n code: 'fluxo-mudou',\n message: 'O fluxo mudou durante o teste. Reinicie para testar de novo.',\n },\n ],\n })\n if (!node) return fail()\n\n let detail: string | undefined\n let target: string | undefined\n if (node.type === 'condicao') {\n if (choice !== 'sim' && choice !== 'nao') return state\n target = edges.find((e) => e.branch === choice)?.target\n detail = `Escolha: ${BRANCH_NAME[choice]}`\n if (!target) return fail()\n } else if (node.type !== 'fim') {\n target = edges[0]?.target\n if (node.type === 'espera') detail = describeWait(node.data.config)\n if (!target) return fail()\n }\n\n const step: SimulationStep = {\n nodeId: node.id,\n type: node.type,\n label: nodeName(node),\n status: 'succeeded',\n ...(detail ? { detail } : {}),\n }\n const steps = [...state.steps, step]\n if (!target) return { status: 'finished', steps, currentId: null, issues: [] }\n const next = flow.nodes.find((n) => n.id === target)\n if (!next) return fail()\n return {\n status: next.type === 'condicao' ? 'waiting-choice' : 'running',\n steps,\n currentId: target,\n issues: [],\n }\n}\n","import {\n ConnectionLineType,\n Handle,\n MarkerType,\n Position,\n ReactFlow,\n useReactFlow,\n useStore,\n type AriaLabelConfig,\n type Edge,\n type FitViewOptions,\n type Node,\n type NodeProps,\n type ReactFlowProps,\n} from '@xyflow/react'\nimport '@xyflow/react/dist/base.css'\nimport {\n Clock,\n Flag,\n GitBranch,\n Maximize2,\n Play,\n SquarePen,\n TriangleAlert,\n Zap,\n ZoomIn,\n ZoomOut,\n} from 'lucide-react'\nimport {\n useEffect,\n useId,\n useMemo,\n useRef,\n type ComponentType,\n type CSSProperties,\n type ReactNode,\n} from 'react'\nimport { Button } from '@/components/ui/button'\nimport { useFillHeight } from '@/hooks/use-fill-height'\nimport { cn } from '@/lib/cn'\nimport {\n FLOW_TYPE_NAME,\n formatWait,\n nodeName,\n type Flow,\n type FlowIssue,\n type FlowNodeType,\n} from '@/lib/flow'\nimport { useMotionLib, useMotionPresets } from '@/lib/motion'\n\n/*\n * Canvas de fluxos de automação (React Flow, MIT). Este arquivo tem o que o FlowViewer e o\n * FlowEditor dividem: o desenho dos cinco tipos de bloco, a conversão do `Flow` do Rendra para\n * os nós e ligações da biblioteca, o tema (as variáveis --xy-* apontam para os tokens do Rendra),\n * o zoom próprio de 44 px e os textos de acessibilidade em português.\n *\n * FlowViewer é só leitura: ver, aproximar, afastar e mover o canvas. O que muda o fluxo é do\n * FlowEditor. Fica fora da entrada principal (@rendra-ui/web/flow), porque depende de @xyflow/react.\n */\n\nexport interface FlowBlockData extends Record<string, unknown> {\n label: string\n kind: FlowNodeType\n config?: Record<string, unknown>\n /** Mensagens de validação deste bloco; vazio quando está tudo certo. */\n issues: string[]\n /** Bloco que a simulação executa agora. */\n active: boolean\n /** Alças grandes (montar com mouse ou toque) ou discretas (só ver). */\n handles: 'lg' | 'sm'\n /** Mostra o botão \"Editar bloco\" dentro do bloco. */\n edit: boolean\n}\n\nexport type FlowRfNode = Node<FlowBlockData, 'bloco'>\n\nexport const FLOW_ICON: Record<FlowNodeType, ComponentType<{ className?: string }>> = {\n gatilho: Zap,\n acao: Play,\n condicao: GitBranch,\n espera: Clock,\n fim: Flag,\n}\n\nconst TONE: Record<FlowNodeType, string> = {\n gatilho: 'bg-primary-soft text-primary-soft-foreground',\n acao: 'bg-info-soft text-info-soft-foreground',\n condicao: 'bg-warning-soft text-warning-soft-foreground',\n espera: 'bg-muted text-muted-foreground',\n fim: 'bg-success-soft text-success-soft-foreground',\n}\n\nconst DIRECTION: Record<string, string> = {\n up: 'para cima',\n down: 'para baixo',\n left: 'para a esquerda',\n right: 'para a direita',\n}\n\n/** Os textos que a biblioteca escreve no DOM (leitor de tela), em português. */\nexport const FLOW_ARIA: Partial<AriaLabelConfig> = {\n 'node.a11yDescription.default':\n 'Pressione Enter para abrir o bloco, Espaço para selecioná-lo e Delete para apagá-lo. Esc cancela.',\n 'node.a11yDescription.keyboardDisabled':\n 'Pressione Enter para abrir o bloco, Espaço para selecioná-lo e Delete para apagá-lo. Esc cancela.',\n 'node.a11yDescription.ariaLiveMessage': ({ direction, x, y }) =>\n `Bloco movido ${DIRECTION[direction] ?? direction}. Nova posição, x: ${x}, y: ${y}`,\n 'edge.a11yDescription.default':\n 'Pressione Espaço para selecionar a ligação e Delete para apagá-la. Esc cancela.',\n}\n\ninterface RfNodeOptions {\n activeId?: string | null\n issues?: FlowIssue[]\n handles: 'lg' | 'sm'\n edit: boolean\n}\n\n/** Os blocos do Rendra como nós do React Flow (a biblioteca só vê isto). */\nexport function toRfNodes(flow: Flow, opts: RfNodeOptions): FlowRfNode[] {\n const byNode = new Map<string, string[]>()\n for (const issue of opts.issues ?? [])\n if (issue.nodeId) byNode.set(issue.nodeId, [...(byNode.get(issue.nodeId) ?? []), issue.message])\n return flow.nodes.map((n) => ({\n id: n.id,\n type: 'bloco',\n position: n.position,\n ariaLabel: n.data.label,\n domAttributes: { 'aria-roledescription': 'bloco' },\n data: {\n label: n.data.label,\n kind: n.type,\n ...(n.data.config ? { config: n.data.config } : {}),\n issues: byNode.get(n.id) ?? [],\n active: opts.activeId === n.id,\n handles: opts.handles,\n edit: opts.edit,\n },\n }))\n}\n\n/** As ligações do Rendra como arestas do React Flow, com a descrição em português. */\nexport function toRfEdges(flow: Flow): Edge[] {\n const labelOf = new Map(flow.nodes.map((n) => [n.id, nodeName(n)]))\n return flow.edges.map((e) => ({\n id: e.id,\n source: e.source,\n target: e.target,\n ...(e.branch ? { sourceHandle: e.branch } : {}),\n ariaLabel: `De \"${labelOf.get(e.source) ?? e.source}\" para \"${labelOf.get(e.target) ?? e.target}\"${\n e.branch ? `, se ${e.branch === 'sim' ? 'sim' : 'não'}` : ''\n }`,\n domAttributes: { 'aria-roledescription': 'ligação' },\n }))\n}\n\nfunction FlowBlock({ id, data, selected, isConnectable }: NodeProps<FlowRfNode>) {\n const lib = useMotionLib()\n const presets = useMotionPresets()\n const uid = useId()\n const Icon = FLOW_ICON[data.kind]\n const wait = data.kind === 'espera' ? formatWait(data.config) : null\n const invalid = data.issues.length > 0\n const issueId = `${uid}-problema`\n const handle = cn(\n 'rounded-full border-2 border-card',\n data.handles === 'lg' ? 'size-6' : 'size-2',\n )\n const ring = 'pointer-events-none absolute -inset-1 rounded-block border-2 border-primary'\n return (\n <div\n data-flow-node\n data-kind={data.kind}\n data-block-id={id}\n data-active={data.active ? 'true' : undefined}\n data-invalid={invalid ? 'true' : undefined}\n data-selected={selected ? 'true' : undefined}\n aria-describedby={invalid ? issueId : undefined}\n className={cn(\n 'relative w-flow-node rounded-block border bg-card p-3 text-card-foreground shadow-sm',\n data.kind === 'condicao' && 'pr-12 pb-8',\n invalid && 'border-destructive',\n data.active && 'border-primary',\n selected && 'ring-2 ring-primary',\n )}\n >\n {data.active &&\n (lib ? (\n <lib.m.span\n aria-hidden\n data-flow-pulse\n className={ring}\n animate={presets.reduced ? { opacity: 1 } : { opacity: [1, 0.3, 1] }}\n transition={\n presets.reduced\n ? presets.fade.transition\n : {\n duration: presets.tokens.duration.pulse,\n ease: presets.tokens.ease.inOut,\n repeat: Infinity,\n }\n }\n />\n ) : (\n <span aria-hidden className={ring} />\n ))}\n {data.kind !== 'gatilho' && (\n <Handle\n type=\"target\"\n position={Position.Top}\n className={handle}\n isConnectable={isConnectable}\n />\n )}\n <div className=\"flex items-start gap-3\">\n <span\n className={cn(\n 'flex size-8 shrink-0 items-center justify-center rounded-block',\n TONE[data.kind],\n )}\n >\n <Icon className=\"size-icon-md\" aria-hidden />\n </span>\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"text-xs text-muted-foreground\">{FLOW_TYPE_NAME[data.kind]}</span>\n <span className=\"text-sm font-medium break-words\">{data.label}</span>\n {wait && <span className=\"text-xs text-muted-foreground\">{wait}</span>}\n {data.active && <span className=\"text-xs font-medium text-primary-text\">Ativo</span>}\n </div>\n {data.edit && (\n <Button\n data-flow-edit\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={`Editar bloco ${nodeName({ type: data.kind, data })}`}\n className=\"nodrag nopan -mt-1 -mr-1 min-h-touch min-w-touch shrink-0\"\n icon={<SquarePen />}\n />\n )}\n </div>\n {invalid && (\n <p\n id={issueId}\n className=\"mt-2 flex flex-wrap gap-x-1 rounded-block bg-destructive-soft p-2 text-xs text-destructive-soft-foreground\"\n >\n <TriangleAlert className=\"size-icon-sm shrink-0\" aria-hidden />\n <strong>Problema</strong> {data.issues.join(' ')}\n </p>\n )}\n {data.kind === 'condicao' && (\n <>\n <span className=\"absolute inset-y-0 right-4 flex items-center text-xs font-medium\">\n Sim\n </span>\n <span className=\"absolute inset-x-0 bottom-3 text-center text-xs font-medium\">Não</span>\n <Handle\n id=\"sim\"\n type=\"source\"\n position={Position.Right}\n className={handle}\n isConnectable={isConnectable}\n />\n <Handle\n id=\"nao\"\n type=\"source\"\n position={Position.Bottom}\n className={handle}\n isConnectable={isConnectable}\n />\n </>\n )}\n {data.kind !== 'condicao' && data.kind !== 'fim' && (\n <Handle\n type=\"source\"\n position={Position.Bottom}\n className={handle}\n isConnectable={isConnectable}\n />\n )}\n </div>\n )\n}\n\nconst nodeTypes = { bloco: FlowBlock }\n\nconst defaultEdgeOptions = { type: 'smoothstep', markerEnd: { type: MarkerType.ArrowClosed } }\n// Folga em cima e embaixo: o zoom fica no topo e a atribuição no canto de baixo, sem cobrir blocos.\nconst fitViewOptions: FitViewOptions = {\n padding: { top: '64px', right: '16px', bottom: '64px', left: '16px' },\n maxZoom: 1,\n}\n\n/** Aproximar, afastar e enquadrar, com 44 px de toque (os botões da biblioteca têm 26 px). */\nexport function FlowZoomControls() {\n const { zoomIn, zoomOut, fitView } = useReactFlow()\n const cls = 'min-h-touch min-w-touch'\n return (\n <div className=\"absolute top-2 left-2 z-10 flex gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n iconOnly\n aria-label=\"Aproximar\"\n className={cls}\n icon={<ZoomIn />}\n onClick={() => void zoomIn()}\n />\n <Button\n variant=\"outline\"\n size=\"sm\"\n iconOnly\n aria-label=\"Afastar\"\n className={cls}\n icon={<ZoomOut />}\n onClick={() => void zoomOut()}\n />\n <Button\n variant=\"outline\"\n size=\"sm\"\n iconOnly\n aria-label=\"Enquadrar\"\n className={cls}\n icon={<Maximize2 />}\n onClick={() => void fitView(fitViewOptions)}\n />\n </div>\n )\n}\n\n/** Enquadra de novo quando a largura do canvas muda (painel do teste abrindo, janela redimensionada). */\nfunction FlowAutoFit() {\n const { fitView } = useReactFlow()\n const width = useStore((st) => st.width)\n const before = useRef(0)\n useEffect(() => {\n if (before.current > 0 && width > 0 && width !== before.current) void fitView(fitViewOptions)\n if (width > 0) before.current = width\n }, [width, fitView])\n return null\n}\n\nexport interface FlowSurfaceProps extends ReactFlowProps<FlowRfNode, Edge> {\n children?: ReactNode\n}\n\n/**\n * O canvas: contêiner com a altura que sobra na tela (`h-board`), tema pelos tokens e a\n * biblioteca por dentro. A rolagem horizontal é do canvas (`data-allow-overflow`), nunca da página.\n */\nexport function FlowSurface({ className, children, ...props }: FlowSurfaceProps) {\n const ref = useFillHeight<HTMLDivElement>()\n return (\n <div\n ref={ref}\n data-allow-overflow\n className={cn(\n 'flow-surface relative h-board min-h-viewer w-full min-w-0 overflow-hidden rounded-surface border',\n className,\n )}\n style={\n {\n '--xy-edge-stroke': 'var(--rendra-muted-foreground)',\n '--xy-edge-stroke-selected': 'var(--rendra-primary)',\n '--xy-edge-stroke-width': '2',\n '--xy-connectionline-stroke': 'var(--rendra-primary)',\n '--xy-connectionline-stroke-width': '2',\n '--xy-handle-background-color': 'var(--rendra-primary)',\n '--xy-attribution-background-color': 'var(--rendra-card)',\n '--xy-background-color': 'var(--rendra-muted)',\n } as CSSProperties\n }\n >\n <ReactFlow\n className=\"flow-canvas\"\n nodeTypes={nodeTypes}\n defaultEdgeOptions={defaultEdgeOptions}\n defaultMarkerColor=\"var(--rendra-muted-foreground)\"\n connectionLineType={ConnectionLineType.SmoothStep}\n ariaLabelConfig={FLOW_ARIA}\n fitView\n fitViewOptions={fitViewOptions}\n minZoom={0.25}\n maxZoom={2}\n zoomOnDoubleClick={false}\n zoomOnScroll={false}\n preventScrolling={false}\n {...props}\n >\n <FlowZoomControls />\n <FlowAutoFit />\n {children}\n </ReactFlow>\n </div>\n )\n}\n\nexport interface FlowViewerProps {\n /** O fluxo a mostrar (o mesmo JSON do FlowEditor). */\n value: Flow\n /** Bloco destacado (por exemplo, o passo que a simulação está executando). */\n activeId?: string | null\n /** Problemas de validação (`validateFlow`): os blocos citados ganham marca e texto. */\n issues?: FlowIssue[]\n className?: string\n}\n\n/**\n * Fluxo de automação só para ler: aproximar, afastar e mover o canvas. Não arrasta, não liga,\n * não apaga. Para montar e editar, use o FlowEditor.\n */\nexport function FlowViewer({ value, activeId = null, issues, className }: FlowViewerProps) {\n const nodes = useMemo(\n () => toRfNodes(value, { activeId, issues, handles: 'sm', edit: false }),\n [value, activeId, issues],\n )\n const edges = useMemo(() => toRfEdges(value), [value])\n return (\n <div data-rendra=\"FLX-002\" className={cn('flow-viewer min-w-0', className)}>\n <FlowSurface\n nodes={nodes}\n edges={edges}\n nodesDraggable={false}\n nodesConnectable={false}\n elementsSelectable={false}\n edgesFocusable={false}\n deleteKeyCode={null}\n />\n </div>\n )\n}\n","import {\n ReactFlowProvider,\n applyEdgeChanges,\n applyNodeChanges,\n useReactFlow,\n type Connection,\n type Edge,\n type EdgeChange,\n type NodeChange,\n} from '@xyflow/react'\nimport { CheckCircle2, FlaskConical, ListChecks, Trash2, X } from 'lucide-react'\nimport {\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type PointerEvent as ReactPointerEvent,\n} from 'react'\nimport { ActionBar } from '@/components/ui/action-bar'\nimport { Alert } from '@/components/ui/alert'\nimport { Button } from '@/components/ui/button'\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'\nimport { Drawer } from '@/components/ui/drawer'\nimport { Field } from '@/components/ui/field'\nimport {\n FLOW_ICON,\n FlowSurface,\n toRfEdges,\n toRfNodes,\n type FlowRfNode,\n} from '@/components/ui/flow-viewer'\nimport { Input } from '@/components/ui/input'\nimport { Modal } from '@/components/ui/modal'\nimport { Select } from '@/components/ui/select'\nimport { Timeline, type TimelineEvent } from '@/components/ui/timeline'\nimport { useBreakpoint } from '@/hooks/use-breakpoint'\nimport { cn } from '@/lib/cn'\nimport {\n FLOW_NODE_TYPES,\n FLOW_TYPE_NAME,\n nodeName,\n FLOW_WAIT_UNITS,\n addNode,\n advanceSimulation,\n connectNodes,\n moveNode,\n nextCandidates,\n removeEdge,\n removeNode,\n resetSimulation,\n setNext,\n startSimulation,\n updateNodeData,\n validateFlow,\n type Flow,\n type FlowBranch,\n type FlowNode,\n type FlowNodeType,\n type FlowWaitUnit,\n type SimulationState,\n} from '@/lib/flow'\n\n/*\n * Editor de fluxos de automação (React Flow, MIT): monta blocos (gatilho, ação, condição, espera\n * e fim), liga um ao próximo, apaga, valida e testa o caminho. O fluxo é CONTROLADO: `value`\n * entra, `onChange` devolve um fluxo novo (nunca muda o recebido). O JSON é o de `lib/flow.ts`.\n *\n * Largura: a partir do tablet (768 px) monta por mouse ou toque (paleta, arraste, alças). No\n * celular só se vê e se navega; tocar no bloco abre a gaveta, que é onde se edita, se liga ao\n * próximo bloco e se exclui. A gaveta também é o caminho por teclado. Arrastar nunca é o único\n * caminho. Fica fora da entrada principal (@rendra-ui/web/flow), porque depende de @xyflow/react.\n */\n\nexport interface FlowEditorProps {\n /** O fluxo (controlado). */\n value: Flow\n /** Recebe o fluxo novo a cada mudança. */\n onChange: (flow: Flow) => void\n /** Só ver, navegar e testar: nada se monta, liga ou apaga. */\n readOnly?: boolean\n className?: string\n}\n\nconst NODE_W = 256\nconst NODE_H = 72\nconst DRAG_START = 4\nconst NONE = '__nenhum'\n\n/** Reaproveita os objetos de nó que não mudaram (a biblioteca guarda medida e seleção neles). */\nfunction mergeNodes(prev: FlowRfNode[], next: FlowRfNode[]): FlowRfNode[] {\n const old = new Map(prev.map((n) => [n.id, n]))\n return next.map((n) => {\n const o = old.get(n.id)\n if (!o) return n\n const a = o.data\n const b = n.data\n const same =\n !o.dragging &&\n o.position.x === n.position.x &&\n o.position.y === n.position.y &&\n o.ariaLabel === n.ariaLabel &&\n a.label === b.label &&\n a.kind === b.kind &&\n a.config === b.config &&\n a.active === b.active &&\n a.handles === b.handles &&\n a.edit === b.edit &&\n a.issues.length === b.issues.length &&\n a.issues.every((m, i) => m === b.issues[i])\n if (same) return o\n return { ...o, position: o.dragging ? o.position : n.position, ariaLabel: n.ariaLabel, data: b }\n })\n}\n\nfunction mergeEdges(prev: Edge[], next: Edge[]): Edge[] {\n const old = new Map(prev.map((e) => [e.id, e]))\n return next.map((e) => {\n const o = old.get(e.id)\n if (!o) return e\n const same =\n o.source === e.source &&\n o.target === e.target &&\n o.sourceHandle === e.sourceHandle &&\n o.ariaLabel === e.ariaLabel\n return same ? o : { ...o, ...e }\n })\n}\n\n/* --------------------------------------------------------------------------- gaveta */\n\ninterface Draft {\n label: string\n duration: string\n unit: FlowWaitUnit\n next: string\n sim: string\n nao: string\n}\n\nfunction draftOf(node: FlowNode, flow: Flow): Draft {\n const target = (branch?: FlowBranch) =>\n flow.edges.find((e) => e.source === node.id && (branch ? e.branch === branch : true))?.target ??\n NONE\n const cfg = node.data.config\n const unit = FLOW_WAIT_UNITS.find((u) => u === cfg?.unit) ?? 'minutos'\n return {\n label: node.data.label,\n duration: typeof cfg?.duration === 'number' ? String(cfg.duration) : '',\n unit,\n next: node.type === 'condicao' ? NONE : target(),\n sim: node.type === 'condicao' ? target('sim') : NONE,\n nao: node.type === 'condicao' ? target('nao') : NONE,\n }\n}\n\nconst sameDraft = (a: Draft, b: Draft) =>\n a.label === b.label &&\n a.duration === b.duration &&\n a.unit === b.unit &&\n a.next === b.next &&\n a.sim === b.sim &&\n a.nao === b.nao\n\ninterface BlockDrawerProps {\n flow: Flow\n nodeId: string\n open: boolean\n onOpenChange: (open: boolean) => void\n onApply: (flow: Flow) => void\n onDelete: (nodeId: string) => void\n}\n\nfunction BlockDrawer({ flow, nodeId, open, onOpenChange, onApply, onDelete }: BlockDrawerProps) {\n const node = flow.nodes.find((n) => n.id === nodeId)\n const initial = useMemo(() => (node ? draftOf(node, flow) : null), [node, flow])\n const [draft, setDraft] = useState<Draft | null>(initial)\n const [discarding, setDiscarding] = useState(false)\n // O rascunho nasce quando a gaveta abre (key do pai) e não segue o fluxo depois disso.\n if (!node || !initial || !draft) return null\n\n const dirty = !sameDraft(draft, initial)\n const duration = Number(draft.duration)\n const durationError =\n node.type === 'espera' && (draft.duration.trim() === '' || !(duration > 0))\n ? 'Informe um número maior que zero.'\n : undefined\n const set = (patch: Partial<Draft>) => setDraft({ ...draft, ...patch })\n const options = [\n { value: NONE, label: 'Nenhum' },\n ...nextCandidates(flow, node.id).map((n) => ({\n value: n.id,\n label: `${FLOW_TYPE_NAME[n.type]}: ${nodeName(n)}`,\n })),\n ]\n const target = (value: string | null) => (value && value !== NONE ? value : null)\n\n const apply = () => {\n let next = updateNodeData(flow, node.id, {\n label: draft.label,\n ...(node.type === 'espera' ? { config: { duration, unit: draft.unit } } : {}),\n })\n if (node.type === 'condicao') {\n next = setNext(next, node.id, target(draft.sim), 'sim')\n next = setNext(next, node.id, target(draft.nao), 'nao')\n } else if (node.type !== 'fim') {\n next = setNext(next, node.id, target(draft.next))\n }\n onApply(next)\n }\n\n const nextField = (name: string, key: 'next' | 'sim' | 'nao') => (\n <Field label={name} span=\"full\">\n <Select\n label={name}\n options={options}\n value={draft[key]}\n onChange={(v) => set({ [key]: v ?? NONE })}\n />\n </Field>\n )\n\n return (\n <>\n <Drawer\n open={open}\n onOpenChange={onOpenChange}\n title={`Bloco: ${nodeName(node)}`}\n description={FLOW_TYPE_NAME[node.type]}\n dirty={dirty}\n footer={\n <ActionBar\n primary={{\n label: 'Aplicar',\n onClick: apply,\n disabled: draft.label.trim() === '' || Boolean(durationError),\n }}\n cancel={{\n label: 'Cancelar',\n onClick: () => (dirty ? setDiscarding(true) : onOpenChange(false)),\n }}\n secondary={[\n {\n label: 'Excluir bloco',\n icon: <Trash2 />,\n destructive: true,\n onClick: () => onDelete(node.id),\n },\n ]}\n />\n }\n >\n <div className=\"flex flex-col gap-4\">\n <Field\n label=\"Rótulo\"\n span=\"full\"\n error={draft.label.trim() === '' ? 'Informe um rótulo.' : undefined}\n >\n <Input value={draft.label} onChange={(v) => set({ label: v })} />\n </Field>\n {node.type === 'espera' && (\n <>\n <Field label=\"Duração\" span=\"full\" error={durationError}>\n <Input\n value={draft.duration}\n inputMode=\"numeric\"\n onChange={(v) => set({ duration: v })}\n />\n </Field>\n <Field label=\"Unidade\" span=\"full\">\n <Select\n label=\"Unidade\"\n options={FLOW_WAIT_UNITS.map((u) => ({ value: u, label: u }))}\n value={draft.unit}\n onChange={(v) => set({ unit: (v as FlowWaitUnit | null) ?? 'minutos' })}\n />\n </Field>\n </>\n )}\n {node.type === 'condicao' && (\n <>\n {nextField('Se sim', 'sim')}\n {nextField('Se não', 'nao')}\n </>\n )}\n {node.type !== 'condicao' && node.type !== 'fim' && nextField('Próximo bloco', 'next')}\n </div>\n </Drawer>\n <Modal\n open={discarding}\n onOpenChange={setDiscarding}\n type=\"destructive\"\n title=\"Descartar alterações?\"\n description=\"As informações preenchidas neste painel serão perdidas.\"\n confirmLabel=\"Descartar\"\n cancelLabel=\"Continuar editando\"\n onConfirm={() => onOpenChange(false)}\n />\n </>\n )\n}\n\n/* ---------------------------------------------------------------------- simulação */\n\nfunction SimulationPanel({\n flow,\n sim,\n onSim,\n onClose,\n}: {\n flow: Flow\n sim: SimulationState\n onSim: (sim: SimulationState) => void\n onClose: () => void\n}) {\n const waiting = sim.status === 'waiting-choice'\n const current = flow.nodes.find((n) => n.id === sim.currentId)\n const events: TimelineEvent[] = sim.steps.map((s, i) => ({\n id: `${i}-${s.nodeId}`,\n title: s.label,\n description: s.detail,\n date: `Passo ${i + 1}`,\n status: s.status,\n }))\n const choose = (choice: FlowBranch) => onSim(advanceSimulation(flow, sim, choice))\n return (\n <Card role=\"region\" aria-label=\"Teste do fluxo\" className=\"min-w-0 shrink-0 lg:w-popover\">\n <CardHeader\n actions={\n <Button\n size=\"sm\"\n variant=\"ghost\"\n iconOnly\n aria-label=\"Fechar teste\"\n icon={<X />}\n onClick={onClose}\n />\n }\n >\n <CardTitle>Teste do fluxo</CardTitle>\n <CardDescription>Um passo por vez, sem executar nada de verdade.</CardDescription>\n </CardHeader>\n <CardContent className=\"flex flex-col gap-4\">\n <ActionBar\n primary={{\n label: 'Avançar',\n disabled: sim.status !== 'running',\n onClick: () => onSim(advanceSimulation(flow, sim)),\n }}\n cancel={{ label: 'Reiniciar', onClick: () => onSim(startSimulation(flow)) }}\n />\n {sim.status === 'error' && (\n <div className=\"flex flex-col gap-3\">\n <Alert type=\"error\" title=\"O fluxo precisa de ajustes antes do teste\" />\n <ul className=\"flex list-disc flex-col gap-1 pl-4 text-sm\">\n {sim.issues.map((i, k) => (\n <li key={`${i.code}-${k}`}>{i.message}</li>\n ))}\n </ul>\n </div>\n )}\n {waiting && current && (\n <div\n role=\"group\"\n aria-label=\"Escolha o caminho da condição\"\n className=\"flex flex-col gap-3\"\n >\n <p className=\"text-sm font-medium\">{nodeName(current)}</p>\n <div className=\"grid grid-actions-2 gap-3\">\n <Button variant=\"outline\" onClick={() => choose('sim')}>\n Sim\n </Button>\n <Button variant=\"outline\" onClick={() => choose('nao')}>\n Não\n </Button>\n </div>\n </div>\n )}\n {sim.status === 'finished' && (\n <p\n role=\"status\"\n className=\"flex items-center gap-2 text-sm font-medium text-success-soft-foreground\"\n >\n <CheckCircle2 className=\"size-icon-md\" aria-hidden />\n Fluxo concluído\n </p>\n )}\n {events.length > 0 && <Timeline events={events} />}\n {events.length === 0 && sim.status !== 'error' && (\n <p className=\"text-sm text-muted-foreground\">Nenhum passo executado ainda.</p>\n )}\n </CardContent>\n </Card>\n )\n}\n\n/* ------------------------------------------------------------------------ editor */\n\nfunction FlowEditorInner({ value, onChange, readOnly = false, className }: FlowEditorProps) {\n const { isMobile } = useBreakpoint()\n const canEdit = !readOnly\n const canBuild = canEdit && !isMobile\n const { screenToFlowPosition, fitView } = useReactFlow()\n const canvasRef = useRef<HTMLDivElement>(null)\n const noticeId = useId()\n\n const valueRef = useRef(value)\n valueRef.current = value\n const everUsed = useRef(new Set<string>())\n value.nodes.forEach((n) => everUsed.current.add(n.id))\n\n const [validated, setValidated] = useState(false)\n const [sim, setSim] = useState<SimulationState>(resetSimulation)\n const [notice, setNotice] = useState<string | null>(null)\n const [drawer, setDrawer] = useState<{ id: string; session: number } | null>(null)\n const [drawerOpen, setDrawerOpen] = useState(false)\n const drawerOpenRef = useRef(false)\n drawerOpenRef.current = drawerOpen\n const [deleting, setDeleting] = useState<string | null>(null)\n const [drag, setDrag] = useState<{\n type: FlowNodeType\n x: number\n y: number\n over: boolean\n } | null>(null)\n const suppressClick = useRef(false)\n\n const issues = useMemo(() => validateFlow(value), [value])\n const shownIssues = validated ? issues : undefined\n const activeId =\n sim.status === 'running' || sim.status === 'waiting-choice' ? sim.currentId : null\n\n // Estado de interface da biblioteca (medida, seleção, arraste) guardado por bloco; o fluxo em\n // si nunca é copiado: sempre vem de `value`.\n const nextNodes = useMemo(\n () =>\n toRfNodes(value, {\n activeId,\n issues: shownIssues,\n handles: canBuild ? 'lg' : 'sm',\n edit: canBuild,\n }),\n [value, activeId, shownIssues, canBuild],\n )\n const nextEdges = useMemo(() => toRfEdges(value), [value])\n const [rfNodes, setRfNodes] = useState<FlowRfNode[]>(nextNodes)\n const [rfEdges, setRfEdges] = useState<Edge[]>(nextEdges)\n useEffect(() => setRfNodes((prev) => mergeNodes(prev, nextNodes)), [nextNodes])\n useEffect(() => setRfEdges((prev) => mergeEdges(prev, nextEdges)), [nextEdges])\n\n const emit = useCallback(\n (flow: Flow) => {\n setNotice(null)\n onChange(flow)\n },\n [onChange],\n )\n\n const commitMoves = useCallback(\n (moves: { id: string; position: { x: number; y: number } }[]) => {\n let flow = valueRef.current\n for (const m of moves) {\n const cur = flow.nodes.find((n) => n.id === m.id)\n if (cur && (cur.position.x !== m.position.x || cur.position.y !== m.position.y))\n flow = moveNode(flow, m.id, m.position)\n }\n if (flow !== valueRef.current) emit(flow)\n },\n [emit],\n )\n\n const onNodesChange = useCallback(\n (changes: NodeChange<FlowRfNode>[]) => {\n setRfNodes((nds) =>\n applyNodeChanges(\n changes.filter((c) => c.type !== 'remove'),\n nds,\n ),\n )\n const moves = changes.flatMap((c) =>\n c.type === 'position' && c.dragging === false && c.position\n ? [{ id: c.id, position: c.position }]\n : [],\n )\n if (moves.length > 0 && canBuild) commitMoves(moves)\n },\n [canBuild, commitMoves],\n )\n const onEdgesChange = useCallback(\n (changes: EdgeChange[]) =>\n setRfEdges((eds) =>\n applyEdgeChanges(\n changes.filter((c) => c.type !== 'remove'),\n eds,\n ),\n ),\n [],\n )\n\n const onConnect = useCallback(\n (c: Connection) => {\n if (!c.source || !c.target) return\n const branch =\n c.sourceHandle === 'sim' || c.sourceHandle === 'nao' ? c.sourceHandle : undefined\n const r = connectNodes(valueRef.current, c.source, c.target, branch)\n if (r.ok) emit(r.flow)\n else setNotice(r.reason)\n },\n [emit],\n )\n\n const addBlock = useCallback(\n (type: FlowNodeType, at?: { x: number; y: number }) => {\n const flow = valueRef.current\n if (type === 'gatilho' && flow.nodes.some((n) => n.type === 'gatilho')) {\n setNotice('Já existe um gatilho neste fluxo.')\n return\n }\n let pos = at\n if (!pos) {\n const rect = canvasRef.current?.getBoundingClientRect()\n const center = screenToFlowPosition({\n x: (rect?.left ?? 0) + (rect?.width ?? 0) / 2,\n y: (rect?.top ?? 0) + (rect?.height ?? 0) / 2,\n })\n pos = { x: center.x - NODE_W / 2, y: center.y - NODE_H / 2 }\n // Não empilha o bloco novo sobre outro que já esteja ali.\n while (\n flow.nodes.some(\n (n) => Math.abs(n.position.x - pos!.x) < 24 && Math.abs(n.position.y - pos!.y) < 24,\n )\n )\n pos = { x: pos.x + 24, y: pos.y + 24 }\n }\n emit(addNode(flow, type, pos, { reservedIds: everUsed.current }).flow)\n },\n [emit, screenToFlowPosition],\n )\n\n /** Arrastar um item da paleta até o canvas, por pointer events (funciona com mouse e toque). */\n const startPaletteDrag = (e: ReactPointerEvent<HTMLButtonElement>, type: FlowNodeType) => {\n if (e.pointerType === 'mouse' && e.button !== 0) return\n const origin = { x: e.clientX, y: e.clientY }\n let moved = false\n const inside = (x: number, y: number) => {\n const r = canvasRef.current?.getBoundingClientRect()\n return !!r && x >= r.left && x <= r.right && y >= r.top && y <= r.bottom\n }\n const stop = () => {\n window.removeEventListener('pointermove', move)\n window.removeEventListener('pointerup', up)\n window.removeEventListener('pointercancel', cancel)\n window.removeEventListener('keydown', key)\n setDrag(null)\n }\n const move = (ev: PointerEvent) => {\n if (!moved && Math.hypot(ev.clientX - origin.x, ev.clientY - origin.y) < DRAG_START) return\n moved = true\n setDrag({ type, x: ev.clientX, y: ev.clientY, over: inside(ev.clientX, ev.clientY) })\n }\n const up = (ev: PointerEvent) => {\n stop()\n if (!moved) return\n suppressClick.current = true\n setTimeout(() => (suppressClick.current = false), 0)\n if (inside(ev.clientX, ev.clientY)) {\n const p = screenToFlowPosition({ x: ev.clientX, y: ev.clientY })\n addBlock(type, { x: p.x - NODE_W / 2, y: p.y - NODE_H / 2 })\n }\n }\n const cancel = () => {\n stop()\n if (moved) {\n suppressClick.current = true\n setTimeout(() => (suppressClick.current = false), 0)\n }\n }\n const key = (ev: KeyboardEvent) => {\n if (ev.key === 'Escape') cancel()\n }\n window.addEventListener('pointermove', move)\n window.addEventListener('pointerup', up)\n window.addEventListener('pointercancel', cancel)\n window.addEventListener('keydown', key)\n }\n\n const openDrawer = (id: string) => {\n if (!canEdit) return\n setDrawer((d) => ({ id, session: (d?.session ?? 0) + 1 }))\n setDrawerOpen(true)\n }\n\n const viewBlock = (id: string) => {\n setRfNodes((nds) =>\n nds.map((n) => (n.selected === (n.id === id) ? n : { ...n, selected: n.id === id })),\n )\n void fitView({ nodes: [{ id }], padding: 0.5, maxZoom: 1 })\n }\n\n const startTest = () => setSim(startSimulation(value))\n const closeTest = () => setSim(resetSimulation())\n\n const deleteNode = deleting ? value.nodes.find((n) => n.id === deleting) : undefined\n\n return (\n <div data-rendra=\"FLX-001\" className={cn('flow-editor flex min-w-0 flex-col gap-4', className)}>\n <div className=\"flex min-w-0 flex-col gap-4 lg:flex-row lg:items-start\">\n <Card className=\"min-w-0 flex-1\">\n <CardHeader\n actions={\n <>\n <Button\n variant=\"outline\"\n iconOnly={isMobile}\n aria-label=\"Validar\"\n icon={<ListChecks />}\n onClick={() => setValidated(true)}\n >\n {isMobile ? null : 'Validar'}\n </Button>\n <Button\n iconOnly={isMobile}\n aria-label=\"Testar fluxo\"\n icon={<FlaskConical />}\n onClick={startTest}\n >\n {isMobile ? null : 'Testar fluxo'}\n </Button>\n </>\n }\n >\n <CardTitle>Fluxo de automação</CardTitle>\n <CardDescription>Blocos, ligações e teste do caminho.</CardDescription>\n </CardHeader>\n <CardContent className=\"flex flex-col gap-4\">\n {canBuild && (\n <div role=\"group\" aria-label=\"Blocos\" className=\"flex flex-wrap items-center gap-2\">\n {FLOW_NODE_TYPES.map((type) => {\n const Icon = FLOW_ICON[type]\n return (\n <Button\n key={type}\n variant=\"outline\"\n size=\"sm\"\n icon={<Icon />}\n className=\"cursor-grab touch-none\"\n onPointerDown={(e) => startPaletteDrag(e, type)}\n onClick={() => {\n if (suppressClick.current) return\n addBlock(type)\n }}\n >\n {FLOW_TYPE_NAME[type]}\n </Button>\n )\n })}\n </div>\n )}\n <div ref={canvasRef} className=\"min-w-0\">\n <FlowSurface\n className={cn(drag?.over && 'ring-2 ring-primary')}\n nodes={rfNodes}\n edges={rfEdges}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onConnect={onConnect}\n nodesDraggable={canBuild}\n nodesConnectable={canBuild}\n elementsSelectable={canEdit}\n deleteKeyCode={canEdit ? ['Delete', 'Backspace'] : null}\n onBeforeDelete={async () => canEdit && !drawerOpenRef.current}\n onDelete={({ nodes, edges }) => {\n let flow = valueRef.current\n for (const e of edges) flow = removeEdge(flow, e.id)\n for (const n of nodes) flow = removeNode(flow, n.id)\n if (flow !== valueRef.current) emit(flow)\n }}\n onNodeDragStop={(_, __, nodes) =>\n commitMoves(nodes.map((n) => ({ id: n.id, position: n.position })))\n }\n onNodeClick={(e, node) => {\n const fromEditButton = (e.target as HTMLElement).closest('[data-flow-edit]')\n if (isMobile || fromEditButton) openDrawer(node.id)\n }}\n onNodeDoubleClick={(_, node) => openDrawer(node.id)}\n onKeyDown={(e) => {\n const el = e.target as HTMLElement\n if (\n e.key === 'Enter' &&\n el.classList?.contains('react-flow__node') &&\n el.dataset.id\n ) {\n // O foco vai para a gaveta: sem isto o Enter ainda ativaria o primeiro botão dela.\n e.preventDefault()\n openDrawer(el.dataset.id)\n }\n }}\n />\n </div>\n <div\n role=\"status\"\n aria-live=\"polite\"\n id={noticeId}\n className={cn(!notice && 'sr-only')}\n >\n {notice && <Alert type=\"warning\" title={notice} onDismiss={() => setNotice(null)} />}\n </div>\n {validated && (\n <section\n aria-label=\"Validação do fluxo\"\n aria-live=\"polite\"\n className=\"flex flex-col gap-3\"\n >\n {issues.length === 0 ? (\n <Alert type=\"success\" title=\"Fluxo válido\" />\n ) : (\n <>\n <Alert\n type=\"error\"\n title={\n issues.length === 1\n ? '1 problema encontrado'\n : `${issues.length} problemas encontrados`\n }\n />\n <ul className=\"flex flex-col gap-2\">\n {issues.map((i, k) => (\n <li\n key={`${i.code}-${i.nodeId ?? i.edgeId ?? k}`}\n className=\"flex flex-wrap items-center justify-between gap-2 rounded-control border bg-card px-3 py-2 text-sm\"\n >\n <span>{i.message}</span>\n {i.nodeId && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n aria-label={`Ver bloco ${nodeName(\n value.nodes.find((n) => n.id === i.nodeId) ?? {\n type: 'acao',\n data: { label: i.nodeId },\n },\n )}`}\n onClick={() => viewBlock(i.nodeId!)}\n >\n Ver bloco\n </Button>\n )}\n </li>\n ))}\n </ul>\n </>\n )}\n </section>\n )}\n </CardContent>\n </Card>\n {sim.status !== 'idle' && (\n <SimulationPanel flow={value} sim={sim} onSim={setSim} onClose={closeTest} />\n )}\n </div>\n {drag && (\n <div\n aria-hidden\n data-flow-drag\n className=\"pointer-events-none fixed top-0 left-0 z-50 translate-x-(--flow-x) translate-y-(--flow-y) rounded-control border bg-card px-3 py-2 text-sm shadow-md\"\n style={{ '--flow-x': `${drag.x}px`, '--flow-y': `${drag.y}px` } as CSSProperties}\n >\n {FLOW_TYPE_NAME[drag.type]}\n </div>\n )}\n {canEdit && drawer && (\n <BlockDrawer\n key={drawer.session}\n flow={value}\n nodeId={drawer.id}\n open={drawerOpen}\n onOpenChange={setDrawerOpen}\n onApply={(flow) => {\n setDrawerOpen(false)\n emit(flow)\n }}\n onDelete={setDeleting}\n />\n )}\n <Modal\n open={Boolean(deleting)}\n onOpenChange={(o) => !o && setDeleting(null)}\n type=\"destructive\"\n title=\"Excluir este bloco?\"\n description={\n deleteNode\n ? `O bloco \"${nodeName(deleteNode)}\" e as ligações dele serão apagados.`\n : undefined\n }\n confirmLabel=\"Excluir\"\n onConfirm={() => {\n if (!deleting) return\n emit(removeNode(valueRef.current, deleting))\n setDeleting(null)\n setDrawerOpen(false)\n }}\n />\n </div>\n )\n}\n\nexport function FlowEditor(props: FlowEditorProps) {\n return (\n <ReactFlowProvider>\n <FlowEditorInner {...props} />\n </ReactFlowProvider>\n )\n}\n"],"mappings":"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"}