{"context":{"domain":"industrias"},"layers":{"ApplicationLayer":{"reference":"ApplicationLayer","availableInstances":[{"reference":"ComponentsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@DataSet","reference":"SystemsDataSet","params":{"filter":{"domain":"data2"},"pagination":{"size":1},"datasource":{"component":"data2-core-types@ProcessReference","params":{"reference":"SystemsDataSource"}}}},{"reference":"ExternalComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"SystemsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"5e3b796d6228227ca637d0f4","name":"data2","domain":"data2","organization":"62292184611f480b3191c37c","visibility":"public","updatedAt":"2026-07-27T14:19:36.810Z"}]}},{"reference":"OrganizationsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"DataComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@DataSet","reference":"OneFileComponentInstancesDataSet","params":{"pagination":{"size":1},"master":{"dataset":{"component":"data2-core-types@ProcessReference","params":{"reference":"SystemsDataSet"}},"localField":"system","masterField":"_id"},"datasource":{"component":"data2-core-types@ProcessReference","params":{"reference":"FileComponentInstancesDataSource"}}}},{"reference":"ApplicationsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"ComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"ServiceComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@Data2TableDataSource","reference":"FileComponentInstancesDataSource","params":{"table":"fileComponentInstances","schema":[{"component":"data2-core-types@Field","params":{"key":"component","title":"Component","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"system","title":"System","component":"data2-core-primitives@ObjectId"}},{"component":"data2-core-types@Field","params":{"key":"displayName","title":"Display Name","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"params","title":"Params","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"key":"reference","title":"Reference","component":"data2-core-primitives@String"}}]}},{"component":"data2-core@MemoryDataSource","reference":"EmptyDataSource","params":{"initialData":[]}},{"reference":"ComponentsDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"UserComponentsDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"DataComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ServiceComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ExternalComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ApplicationsDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}}],"processesParams":{}},"HostApplicationLayer":{"reference":"HostApplicationLayer","availableInstances":[{"_id":"5f15ff190528b92601890f71","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemsTableDataSource"}},"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"domain"}}},"pk":"_id","fields":[{"component":"data2-core-types@FieldReference","params":{"key":"_id"}},{"component":"data2-core-types@FieldReference","params":{"key":"name"}},{"component":"data2-core-types@FieldReference","params":{"key":"domain"}},{"component":"data2-core-types@FieldReference","params":{"key":"visibility"}},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"customDomains"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization._id"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.name"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.billingStatus"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.publicTrial.active"}}},"break":true}],"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"staticPagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"params":{"actions":[{"params":{"components":[{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"_id"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"},{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"domain"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"},{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"customDomains"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"}]},"component":"data2-core-logical-operators@Or"}]},"component":"data2-core-flow@Series"}}}]},"reference":"SystemsDataSet","updatedAt":"2025-11-05T19:23:47.135Z","createdAt":"2020-07-20T20:31:21.838Z"},{"_id":"5f1601ce0528b92601890f7c","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":1000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentsTableDataSource"}},"sort":{"params.package":1,"params.component":1},"pk":"_id","autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"staticFilter":{"system":{"exists":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}}},"filter":{"system":{"exists":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}}}},"reference":"ComponentsDataSet","updatedAt":"2025-11-05T19:37:01.935Z","createdAt":"2020-07-20T20:42:54.898Z"},{"_id":"5f9041dbc8da12be8b94aea4","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":2000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentsTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"UserComponentsDataSet","updatedAt":"2025-11-06T21:06:58.095Z","createdAt":"2020-07-20T20:44:09.350Z"},{"_id":"65d8c4fabc9dbb8f94de8d53","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ExternalComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ExternalComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:23.742Z","createdAt":"2024-02-23T16:17:01.816Z"},{"reference":"SystemsTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a71fb04034c99fe6b932f42","name":"Industrias","domain":"industrias","visibility":"private","updatedAt":"2026-08-04T14:46:25.033Z","createdAt":"2026-08-04T14:45:24.674Z"}]}},{"reference":"ComponentsTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"5f52a278a575399a45d239b4","component":"data2-core-types@Component","params":{"package":"data2-core-primitives","component":"Router","interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"goBack":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@This","params":{}},"prop":"history.goBack","args":[]}}}},"icon":{"component":"data2-core-primitives@String","params":{"content":"arrow-left"}},"visibility":"public"}},"goTo":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@This","params":{}},"prop":"history.push","args":[{"component":"data2-core-types@Reference","params":{"reference":"url"}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"preserveQuery"}}}}]}},"parameters":[{"component":"data2-core-primitives@String","params":{"content":"url"}},{"component":"data2-core-primitives@String","params":{"content":"preserveQuery"}}]},"break":true},"icon":{"component":"data2-core-primitives@String","params":{"content":"share"}},"visibility":"public","arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Path to route"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Path to redirect user"}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Preserve Query"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Preserve query string parameters  preserve query parameters on navigating."}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}]}},"open":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@This","params":{}},"prop":"history.push","args":[{"pathname":{"component":"data2-core-types@Reference","params":{"reference":"value"}}}]}},"parameters":["value"]}},"icon":{"component":"data2-core-primitives@String","params":{"content":"share"}},"visibility":"public","arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Link to open"}},"description":{"component":"data2-core-primitives@String","params":{"content":""}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Target"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Where to open the link"}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"oneOf":[{"params":{"content":"_blank"},"component":"data2-core-primitives@String"},{"params":{"content":"_self"},"component":"data2-core-primitives@String"},{"params":{"content":"_parent"},"component":"data2-core-primitives@String"},{"params":{"content":"_top"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}]}},"close":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"params":{},"component":"data2-core-web@Window"},"prop":"close"}},"parameters":["value"]}},"icon":{"component":"data2-core-primitives@String","params":{"content":"times"}},"visibility":"public","arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Link to open"}},"description":{"component":"data2-core-primitives@String","params":{"content":""}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Target"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Where to open the link"}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"oneOf":[{"params":{"content":"_blank"},"component":"data2-core-primitives@String"},{"params":{"content":"_self"},"component":"data2-core-primitives@String"},{"params":{"content":"_parent"},"component":"data2-core-primitives@String"},{"params":{"content":"_top"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}],"description":{"component":"data2-core-primitives@String","params":{"content":"Closes a window that was opened via router.open."}}}}}}}}},{"_id":"620d28658271aa4129919d89","component":"data2-core-types@Component","params":{"package":"data2-interface-services","component":"DeviceController","interactions":{"params":{"fields":{"postMessage":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"data"}}}}]},"component":"data2-core-types@ComponentParameter"},"print":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"zoom":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"zoom"}},"visibility":"public"}}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"}],"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"share":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}}},"component":"data2-core-types@ComponentParameter"},"clipboard.copy":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}}]},"component":"data2-core-types@ComponentParameter"},"clipboard.paste":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}}]},"component":"data2-core-types@ComponentParameter"},"download":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Content"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"parameters":{"params":{"fields":{"type":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Mimetype"}}}}}},"component":"data2-core-types@FieldSet"}}}]},"component":"data2-core-types@ComponentParameter"},"downloadUrl":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Url"}}}}]},"component":"data2-core-types@ComponentParameter"},"promptFiles":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"params":{"fields":{"multiple":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Multiple"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Whether or not to allow selecting multiple files"}},"component":"data2-core-primitives@Boolean"}},"acceptedFormats":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Accepted Formats"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Accepted file formats"}},"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},"timeout":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Timeout"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Max milliseconds to wait for file upload"}},"component":"data2-core-primitives@Number"}}}},"component":"data2-core-types@FieldSet"}}}],"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"meetingRecord":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","definition":{"params":{"actions":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"meeting"}},"script":{"component":"data2-core-primitives@String","params":{"content":"(function() {\n  let mediaRecorder;\n  let audioChunks = [];\n  let combinedStream;\n  let audioContext;\n  \n  window.meetingCapture = async function() {\n    try {\n      // Solicitar acesso ao áudio da guia (e vídeo, que será ignorado depois)\n      const tabStream = await navigator.mediaDevices.getDisplayMedia({ \n        video: true, // Necessário para alguns navegadores\n        audio: true\n      });\n      \n      // Remover a trilha de vídeo\n      const tabAudioTrack = tabStream.getAudioTracks()[0];\n      \n      // Solicitar acesso ao microfone\n      const micStream = await navigator.mediaDevices.getUserMedia({ audio: true });\n      const micAudioTrack = micStream.getAudioTracks()[0];\n      \n      // Criar um novo MediaStream com ambas as trilhas de áudio\n      combinedStream = new MediaStream([tabAudioTrack, micAudioTrack]);\n      \n      // Criar um contexto de áudio para misturar os streams\n      audioContext = new AudioContext();\n      const destination = audioContext.createMediaStreamDestination();\n      \n      // Conectar a trilha de áudio da guia\n      const tabSource = audioContext.createMediaStreamSource(new MediaStream([tabAudioTrack]));\n      tabSource.connect(destination);\n      \n      // Conectar a trilha de áudio do microfone\n      const micSource = audioContext.createMediaStreamSource(new MediaStream([micAudioTrack]));\n      micSource.connect(destination);\n      \n      // Iniciar gravação com o stream misturado\n      mediaRecorder = new MediaRecorder(destination.stream);\n      audioChunks = [];\n      mediaRecorder.ondataavailable = (e) => audioChunks.push(e.data);\n      mediaRecorder.start();\n      \n      console.log('Gravação iniciada. Chame meetingCaptureStop() para finalizar.');\n    } catch (error) {\n      console.error('Erro ao iniciar a captura:', error);\n    }\n  };\n  \n  window.meetingCaptureStop = function() {\n    return new Promise((resolve, reject) => {\n      if (!mediaRecorder) {\n        reject('Nenhuma gravação em andamento.');\n        return;\n      }\n      \n      mediaRecorder.onstop = () => {\n        const audioBlob = new Blob(audioChunks, { type: 'audio/webm' });\n        combinedStream.getTracks().forEach(track => track.stop());\n        audioContext.close();\n        \n        resolve(audioBlob);\n        console.log('Gravação finalizada. O arquivo de áudio está pronto para upload.');\n      };\n      \n      mediaRecorder.stop();\n    });\n  };\n})();"}}},"component":"data2-core-web@Script"},{"component":"data2-core-types@Getter","params":{"module":{"params":{},"component":"data2-core-web@Window"},"prop":{"component":"data2-core-primitives@String","params":{"content":"meetingCapture"}}}}]},"component":"data2-core-flow@Series"}},"component":"data2-core-types@ComponentParameter"},"meetingRecordStop":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Content"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"parameters":{"params":{"fields":{"type":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Mimetype"}}}}}},"component":"data2-core-types@FieldSet"}}}],"definition":{"params":{"actions":[{"component":"data2-core-types@Getter","params":{"module":{"params":{},"component":"data2-core-web@Window"},"prop":{"component":"data2-core-primitives@String","params":{"content":"meetingCaptureStop"}}}}]},"component":"data2-core-flow@Series"}},"component":"data2-core-types@ComponentParameter"},"notify":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"private","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","parameters":{"title":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":0}},"title":{"component":"data2-core-primitives@String","params":{"content":"title"}}},"component":"data2-core-types@ComponentParameter"},"sound":{"params":{"component":"data2-core-types@FileComponentUrlReference","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"title":{"component":"data2-core-primitives@String","params":{"content":"sound"}}},"component":"data2-core-types@ComponentParameter"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}]},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}}},{"_id":"6a72094f3f478ccd119d656f","component":"data2-core-types@Component","system":"6a71fb04034c99fe6b932f42","params":{"extends":"data2-core-primitives@Block","component":"dud-dashboard-ui","package":"industrias","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"function daysBackList(n){\n  const out = []\n  const d = new Date()\n  for(let i=n-1;i>=0;i--){\n    const dt = new Date(d)\n    dt.setDate(d.getDate()-i)\n    out.push(dt.toISOString().slice(0,10))\n  }\n  return out\n}\nexport default {\n  css: `\n    .root{height:100%;box-sizing:border-box;overflow:auto;background:#f3efe6;font-family:-apple-system,BlinkMacSystemFont,'Helvetica Neue',Arial,sans-serif;color:#1a2744}\n    .dudlogo3{height:17px;width:auto;display:block}\n    header{background:#1a2744;color:#f3efe6;padding:20px 32px;display:flex;align-items:baseline;gap:16px}\n    .word{font-size:12px;letter-spacing:.3em;text-transform:uppercase;color:#c9a97a}\n    .htitle{font-size:16px;font-weight:600}\n    .loading{padding:40px;color:#6b6f7c;font-size:13px}\n    .kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;padding:24px 32px 0}\n    .kpi{background:#fff;border-radius:6px;padding:18px 20px}\n    .kl{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:#6b6f7c;margin-bottom:8px}\n    .kv{font-size:28px;font-weight:700;color:#1a2744}\n    .kv.small{font-size:15px;font-weight:600;line-height:1.3}\n    .charts{display:grid;grid-template-columns:1.2fr 1fr;gap:16px;padding:20px 32px 32px}\n    .panel{background:#fff;border-radius:6px;padding:20px}\n    .panel h3{font-size:12px;text-transform:uppercase;letter-spacing:.06em;color:#6b6f7c;margin:0 0 16px}\n    .bars{display:flex;align-items:flex-end;gap:10px;height:160px}\n    .bar-col{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;height:100%}\n    .bar{width:100%;max-width:36px;background:#7a4a2b;border-radius:3px 3px 0 0;min-height:2px}\n    .bl{font-size:10px;color:#9a9583;margin-top:6px}\n    .glist{display:flex;flex-direction:column;gap:10px}\n    .grow{display:grid;grid-template-columns:1fr 2fr auto;gap:10px;align-items:center;font-size:12px}\n    .gname{color:#1a2744;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n    .gtrack{background:#eee7d8;border-radius:3px;height:10px;overflow:hidden}\n    .gfill{background:#6b2e2e;height:100%;border-radius:3px}\n    .gcount{color:#6b6f7c;font-weight:700}\n    .muted{color:#9a9583;font-size:12px}\n  `,\n  render(d2){\n    if(!d2.state.leadsLoaded || !d2.state.usageLoaded){\n      return `<div class=\"root\"><header><svg class=\"dudlogo3\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1305.71 179.8\"><path d=\"M66.52,55.29c1.99,6.71,10.01,32.4,11.94,38.64.87,3.03,4.33,4.07,7.31,4.07.03,0,.06,0,.09,0s.06,0,.08,0c2.97,0,6.44-1.04,7.31-4.07,1.93-6.24,9.95-31.93,11.94-38.64.79-2.66,1.61-7.33,1.98-9.58.13-.81.25-1.62.32-2.44.27-3.17.23-6-.11-8.64-.88-6.8-3.73-12.04-8.35-18.79l-8.63-13.12c-1.72-2.35-3.35-2.71-4.54-2.71-1.55,0-3.22.94-4.54,2.71l-8.63,13.12c-4.62,6.75-7.47,11.99-8.35,18.79-.34,2.64-.38,5.47-.11,8.64.07.82.18,1.63.32,2.44.37,2.25,1.19,6.92,1.98,9.58\" fill=\"white\"/><path d=\"M96.66,106.86h-21.61c-.23,0-.47.01-.69.04-3.35.36-5.87,3.16-5.87,6.53s2.52,6.17,5.86,6.52c.23.03.46.04.7.04h21.61c.23,0,.47-.01.7-.04,3.34-.35,5.86-3.16,5.86-6.52s-2.52-6.17-5.87-6.53c-.23-.02-.46-.04-.69-.04\" fill=\"white\"/><path d=\"M90.67,140.96c-.11-1.15-.22-2.25-.35-3.27-.29-2.31-2.23-4.03-4.46-4.07-2.23.04-4.17,1.76-4.46,4.07-.13,1.02-.24,2.12-.35,3.27-.6,6.1-1.34,13.69-6.25,19.01-1.66,1.47-2.47,2.89-2.43,4.22.02.62.26,1.53,1.21,2.27.27.23,6.67,5.62,10.06,8.01l.24.16c.24.16.51.34.79.49.74.39,1.64.39,2.38,0,.29-.15.56-.33.8-.49l.24-.16c3.38-2.4,9.79-7.78,10.06-8.01.96-.74,1.19-1.64,1.21-2.27.05-1.32-.77-2.74-2.43-4.22-4.91-5.33-5.65-12.92-6.25-19.01\" fill=\"white\"/><path d=\"M57.63,99.53c1.58,1.17,3.27,1.61,4.75,1.24,1.15-.29,2.11-1.07,2.61-2.15.51-1.09.52-2.36.02-3.57-.26-.64-.66-1.23-1.17-1.76-1.06-1.15-2.13-2.31-3.2-3.48-8.2-8.93-16.68-18.16-25.57-23.17-11.91-5.6-23.31-3-30.48,6.95C.05,80.15-1.19,88.28,1.18,95.89c2.72,8.74,10.2,13.2,16.41,13.74.43.04.84.06,1.25.06,3.4,0,6.06-1.29,7.23-3.56,1.12-2.17,1.34-6.07-3.93-12.24-1.82-2.32-1.86-6.17-.08-8.95,1.16-1.83,4.08-4.65,10.48-3.18,9.07,3.49,16.75,10.34,24.18,16.96l.92.81Z\" fill=\"white\"/><path d=\"M75.03,133.01c.65-1.53.67-3.02.04-4.11-.44-.76-1.17-1.25-2.01-1.35-1.66-.18-3.22,1.13-4.17,3.48-.89,2.09-2.56,4.91-5.49,6.46-1.05.56-2.12.91-3.06,1.03-3.45.09-4.34-1.04-5.36-2.34-.68-.86-1.45-1.84-2.87-2.41-1.52-.79-4.04-.3-5.78,1.13-1.93,1.59-2.55,4.02-1.71,6.62,1.29,4.72,6.3,8.49,10.94,8.29.57.07,1.13.1,1.69.1,2.53,0,4.98-.7,7.28-2.09,3.87-2.33,7.14-6.51,9.47-12.09.37-.88.71-1.8,1.03-2.74\" fill=\"white\"/><path d=\"M167.11,73.6c-7.18-9.95-18.57-12.54-30.48-6.95-8.89,5-17.37,14.24-25.57,23.17-1.07,1.16-2.14,2.33-3.2,3.47-.5.53-.9,1.12-1.17,1.76-.5,1.21-.49,2.48.02,3.57.5,1.07,1.45,1.85,2.61,2.15,1.48.38,3.17-.07,4.75-1.24l.92-.81c7.43-6.62,15.11-13.47,24.18-16.96,6.4-1.47,9.31,1.36,10.48,3.18,1.77,2.78,1.74,6.63-.08,8.95-5.27,6.17-5.04,10.07-3.92,12.24,1.17,2.27,3.83,3.56,7.23,3.56.41,0,.83-.02,1.25-.06,6.21-.54,13.69-5,16.41-13.74,2.37-7.62,1.13-15.74-3.42-22.3\" fill=\"white\"/><path d=\"M125.37,134.91c-1.74-1.43-4.26-1.91-5.78-1.13-1.42.57-2.19,1.54-2.86,2.41-1.03,1.3-1.91,2.43-5.36,2.34-.94-.13-2.01-.48-3.06-1.03-2.93-1.55-4.6-4.37-5.49-6.46-.95-2.36-2.51-3.67-4.17-3.48-.83.09-1.56.58-2,1.35-.63,1.09-.61,2.58.04,4.11.32.94.66,1.86,1.02,2.74,2.32,5.58,5.59,9.76,9.47,12.09,2.3,1.39,4.74,2.09,7.28,2.09.56,0,1.12-.03,1.69-.1,4.64.2,9.64-3.57,10.94-8.29.84-2.6.23-5.03-1.7-6.62\" fill=\"white\"/><path d=\"M367.09,169.8c32.88,0,51.54-26.21,51.54-76.65s-18.44-75.31-51.1-75.31c-4.44,0-13.11.44-17.77.89v150.18c4.66.45,12.89.89,17.33.89M314.88,151.14V36.51c0-14.66-4.89-21.99-20-22.22v-2.67h7.11c9.55,0,18.88.22,30.44.22,15.55,0,28.21-.44,41.1-.44,50.21,0,81.53,30.66,81.53,80.2s-32.88,84.64-84.2,84.64c-12.89,0-23.99-.44-38.43-.44-11.55,0-20.22.22-30.44.22h-7.11v-2.67c15.11-.22,20-7.55,20-22.22\" fill=\"white\"/><path d=\"M610.88,173.36v2.67h-45.77l-2.44-22.22c-7.33,13.33-21.55,25.99-42.21,25.99s-38.43-13.11-38.43-40.88v-55.1c0-21.55-1.78-26.22-17.11-26.22v-2.67c26.66,0,40.88-.89,51.32-4.22l1.33,1.56c-2.44,6-3.11,14-3.11,31.55v53.76c0,17.99,10,25.77,23.1,25.77,9.78,0,18.66-4.66,23.99-14v-65.54c0-21.55-2-26.22-17.11-26.22v-2.67c26.66,0,40.88-.89,51.32-4.22l1.33,1.56c-2.45,6-3.11,14-3.11,31.55v70.65c0,14.22,2.44,18.88,16.89,18.88\" fill=\"white\"/><path d=\"M679.57,166.47c9.33,0,16.88-4.66,22.22-10.22v-86.2c-4.44-3.33-11.33-7.33-20.22-7.33-20.44,0-32.88,18.66-32.88,51.76s11.55,51.99,30.88,51.99M702.24,160.47c-8,10.22-20.44,18.88-37.77,18.88-27.99,0-49.32-23.1-49.32-62.21s21.99-65.54,52.43-65.54c14.44,0,25.55,5.55,34.21,13.11v-26.58c0-21.55-2-26.22-17.11-26.22v-2.67c24.22-.22,38.21-2.67,51.1-6.89l1.56,1.33c-2.89,11.11-3.11,20.44-3.11,34.44v118.11c0,12.22,4.67,17.11,17.11,17.11v2.67c-11.55,0-33.77,0-45.54.22l-3.55-15.77Z\" fill=\"white\"/><path d=\"M806.19,167.58c8.66,0,15.55-4.22,20.44-9.78v-48.21c-25.11-4-41.99,4.22-41.99,29.33,0,19.11,8.44,28.66,21.55,28.66M797.97,67.39c-13.55,0-25.55,6.44-32.44,21.55l-2.44-.89c5.33-21.11,22.66-37.77,50.43-37.77s45.77,16.22,45.77,42.43v63.54c0,12.22,4.67,17.11,17.11,17.11v2.67c-11.78,0-33.77,0-45.54.22l-3.33-14c-7.11,9.33-19.33,17.11-35.1,17.11-19.99,0-38.88-13.11-38.88-36.88,0-32.21,33.33-45.77,73.09-37.55v-9.33c0-18.88-12.22-28.22-28.66-28.22\" fill=\"white\"/><path d=\"M883.6,11.93v-2.67c24.44-.22,38.43-2.67,51.32-6.89l1.33,1.33c-2.89,11.11-3.11,20.44-3.11,34.44v118.11c0,12.22,4.44,17.11,17.11,17.11v2.67h-5.33c-9.55,0-17.33-.22-27.99-.22s-18.44.22-27.77.22h-5.55v-2.67c12.88,0,17.11-4.89,17.11-17.11V38.14c0-21.55-1.78-26.22-17.11-26.22\" fill=\"white\"/><path d=\"M991.2,6.11c10.44,0,18.66,7.55,18.66,17.33s-8.22,17.33-18.66,17.33-18.44-7.55-18.44-17.33,8.22-17.33,18.44-17.33M975.87,156.25v-72.43c0-21.55-2-26.21-17.11-26.21v-2.67c26.66,0,40.88-.89,51.32-4.22l1.33,1.56c-2.44,6-3.11,14-3.11,31.55v72.43c0,12.22,4.22,17.11,17.11,17.11v2.67h-5.33c-9.55,0-17.55-.22-27.99-.22s-18.44.22-27.99.22h-5.33v-2.67c12.89,0,17.11-4.89,17.11-17.11\" fill=\"white\"/><path d=\"M1033.47,57.61v-2.67c26.21,0,39.32-.89,50.21-4.22l1.33,1.78c-2.44,5.11-3.11,12-3.11,24.44,7.33-12.89,21.55-25.77,42.21-25.77s38.43,13.11,38.43,41.1v63.98c0,12.22,4.22,17.11,16.89,17.11v2.67h-5.11c-9.55,0-17.55-.22-27.99-.22s-18.66.22-27.99.22h-5.55v-2.67c12.89,0,17.11-4.89,17.11-17.11v-62.65c0-18.22-10-25.77-23.1-25.77-9.55,0-18.44,4.44-23.77,13.33v75.09c0,12.22,4.22,17.11,17.11,17.11v2.67h-5.33c-9.55,0-17.55-.22-27.99-.22s-18.44.22-27.99.22h-5.33v-2.67c12.88,0,17.11-4.89,17.11-17.11v-72.42c0-21.55-2-26.22-17.11-26.22\" fill=\"white\"/><path d=\"M1235.5,167.58c8.66,0,15.55-4.22,20.44-9.78v-48.21c-25.1-4-41.99,4.22-41.99,29.33,0,19.11,8.44,28.66,21.55,28.66M1227.28,67.39c-13.55,0-25.55,6.44-32.44,21.55l-2.44-.89c5.33-21.11,22.66-37.77,50.43-37.77s45.77,16.22,45.77,42.43v63.54c0,12.22,4.67,17.11,17.11,17.11v2.67c-11.78,0-33.77,0-45.54.22l-3.33-14c-7.11,9.33-19.33,17.11-35.1,17.11-19.99,0-38.88-13.11-38.88-36.88,0-32.21,33.33-45.77,73.09-37.55v-9.33c0-18.88-12.22-28.22-28.66-28.22\" fill=\"white\"/></svg><div class=\"htitle\">Dashboard de Uso</div></header><p class=\"loading\">Carregando metricas...</p></div>`\n    }\n    const leads = d2.state.leads || []\n    const usage = d2.state.usage || []\n    const totalLeads = leads.length\n    const totalAttempts = usage.length\n    const uniqueTryers = new Set(usage.map(u=>u.email).filter(Boolean)).size\n    const conversion = totalLeads ? Math.round((uniqueTryers/totalLeads)*1000)/10 : 0\n    const days = daysBackList(7)\n    const perDay = days.map(day => ({ day: day, count: usage.filter(u=>u.day===day).length }))\n    const maxDay = Math.max(1, ...perDay.map(x=>x.count))\n    const byProduct = {}\n    usage.forEach(u=>{ const k=u.product||'-'; byProduct[k]=(byProduct[k]||0)+1 })\n    const topGarments = Object.entries(byProduct).sort((a,b)=>b[1]-a[1]).slice(0,5)\n    const maxG = Math.max(1, ...topGarments.map(([,c])=>c))\n    const kpis = `\n      <div class=\"kpis\">\n        <div class=\"kpi\"><div class=\"kl\">Leads capturados</div><div class=\"kv\">${d2.fmt.number(totalLeads)}</div></div>\n        <div class=\"kpi\"><div class=\"kl\">Try-ons realizados</div><div class=\"kv\">${d2.fmt.number(totalAttempts)}</div></div>\n        <div class=\"kpi\"><div class=\"kl\">Conversao lead / try-on</div><div class=\"kv\">${conversion}%</div></div>\n        <div class=\"kpi\"><div class=\"kl\">Camisa mais experimentada</div><div class=\"kv small\">${topGarments[0]?topGarments[0][0]:'-'}</div></div>\n      </div>`\n    const bars = perDay.map(x=>{\n      const h = Math.round((x.count/maxDay)*100)\n      const label = x.day.slice(5)\n      return `<div class=\"bar-col\"><div class=\"bar\" style=\"height:${h}%\" title=\"${x.day}: ${x.count}\"></div><div class=\"bl\">${label}</div></div>`\n    }).join('')\n    const gRows = topGarments.length ? topGarments.map(([name,count])=>{\n      const w = Math.round((count/maxG)*100)\n      return `<div class=\"grow\"><div class=\"gname\">${name}</div><div class=\"gtrack\"><div class=\"gfill\" style=\"width:${w}%\"></div></div><div class=\"gcount\">${count}</div></div>`\n    }).join('') : `<p class=\"muted\">Ainda sem execucoes.</p>`\n    return `<div class=\"root\">\n      <header><svg class=\"dudlogo3\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1305.71 179.8\"><path d=\"M66.52,55.29c1.99,6.71,10.01,32.4,11.94,38.64.87,3.03,4.33,4.07,7.31,4.07.03,0,.06,0,.09,0s.06,0,.08,0c2.97,0,6.44-1.04,7.31-4.07,1.93-6.24,9.95-31.93,11.94-38.64.79-2.66,1.61-7.33,1.98-9.58.13-.81.25-1.62.32-2.44.27-3.17.23-6-.11-8.64-.88-6.8-3.73-12.04-8.35-18.79l-8.63-13.12c-1.72-2.35-3.35-2.71-4.54-2.71-1.55,0-3.22.94-4.54,2.71l-8.63,13.12c-4.62,6.75-7.47,11.99-8.35,18.79-.34,2.64-.38,5.47-.11,8.64.07.82.18,1.63.32,2.44.37,2.25,1.19,6.92,1.98,9.58\" fill=\"white\"/><path d=\"M96.66,106.86h-21.61c-.23,0-.47.01-.69.04-3.35.36-5.87,3.16-5.87,6.53s2.52,6.17,5.86,6.52c.23.03.46.04.7.04h21.61c.23,0,.47-.01.7-.04,3.34-.35,5.86-3.16,5.86-6.52s-2.52-6.17-5.87-6.53c-.23-.02-.46-.04-.69-.04\" fill=\"white\"/><path d=\"M90.67,140.96c-.11-1.15-.22-2.25-.35-3.27-.29-2.31-2.23-4.03-4.46-4.07-2.23.04-4.17,1.76-4.46,4.07-.13,1.02-.24,2.12-.35,3.27-.6,6.1-1.34,13.69-6.25,19.01-1.66,1.47-2.47,2.89-2.43,4.22.02.62.26,1.53,1.21,2.27.27.23,6.67,5.62,10.06,8.01l.24.16c.24.16.51.34.79.49.74.39,1.64.39,2.38,0,.29-.15.56-.33.8-.49l.24-.16c3.38-2.4,9.79-7.78,10.06-8.01.96-.74,1.19-1.64,1.21-2.27.05-1.32-.77-2.74-2.43-4.22-4.91-5.33-5.65-12.92-6.25-19.01\" fill=\"white\"/><path d=\"M57.63,99.53c1.58,1.17,3.27,1.61,4.75,1.24,1.15-.29,2.11-1.07,2.61-2.15.51-1.09.52-2.36.02-3.57-.26-.64-.66-1.23-1.17-1.76-1.06-1.15-2.13-2.31-3.2-3.48-8.2-8.93-16.68-18.16-25.57-23.17-11.91-5.6-23.31-3-30.48,6.95C.05,80.15-1.19,88.28,1.18,95.89c2.72,8.74,10.2,13.2,16.41,13.74.43.04.84.06,1.25.06,3.4,0,6.06-1.29,7.23-3.56,1.12-2.17,1.34-6.07-3.93-12.24-1.82-2.32-1.86-6.17-.08-8.95,1.16-1.83,4.08-4.65,10.48-3.18,9.07,3.49,16.75,10.34,24.18,16.96l.92.81Z\" fill=\"white\"/><path d=\"M75.03,133.01c.65-1.53.67-3.02.04-4.11-.44-.76-1.17-1.25-2.01-1.35-1.66-.18-3.22,1.13-4.17,3.48-.89,2.09-2.56,4.91-5.49,6.46-1.05.56-2.12.91-3.06,1.03-3.45.09-4.34-1.04-5.36-2.34-.68-.86-1.45-1.84-2.87-2.41-1.52-.79-4.04-.3-5.78,1.13-1.93,1.59-2.55,4.02-1.71,6.62,1.29,4.72,6.3,8.49,10.94,8.29.57.07,1.13.1,1.69.1,2.53,0,4.98-.7,7.28-2.09,3.87-2.33,7.14-6.51,9.47-12.09.37-.88.71-1.8,1.03-2.74\" fill=\"white\"/><path d=\"M167.11,73.6c-7.18-9.95-18.57-12.54-30.48-6.95-8.89,5-17.37,14.24-25.57,23.17-1.07,1.16-2.14,2.33-3.2,3.47-.5.53-.9,1.12-1.17,1.76-.5,1.21-.49,2.48.02,3.57.5,1.07,1.45,1.85,2.61,2.15,1.48.38,3.17-.07,4.75-1.24l.92-.81c7.43-6.62,15.11-13.47,24.18-16.96,6.4-1.47,9.31,1.36,10.48,3.18,1.77,2.78,1.74,6.63-.08,8.95-5.27,6.17-5.04,10.07-3.92,12.24,1.17,2.27,3.83,3.56,7.23,3.56.41,0,.83-.02,1.25-.06,6.21-.54,13.69-5,16.41-13.74,2.37-7.62,1.13-15.74-3.42-22.3\" fill=\"white\"/><path d=\"M125.37,134.91c-1.74-1.43-4.26-1.91-5.78-1.13-1.42.57-2.19,1.54-2.86,2.41-1.03,1.3-1.91,2.43-5.36,2.34-.94-.13-2.01-.48-3.06-1.03-2.93-1.55-4.6-4.37-5.49-6.46-.95-2.36-2.51-3.67-4.17-3.48-.83.09-1.56.58-2,1.35-.63,1.09-.61,2.58.04,4.11.32.94.66,1.86,1.02,2.74,2.32,5.58,5.59,9.76,9.47,12.09,2.3,1.39,4.74,2.09,7.28,2.09.56,0,1.12-.03,1.69-.1,4.64.2,9.64-3.57,10.94-8.29.84-2.6.23-5.03-1.7-6.62\" fill=\"white\"/><path d=\"M367.09,169.8c32.88,0,51.54-26.21,51.54-76.65s-18.44-75.31-51.1-75.31c-4.44,0-13.11.44-17.77.89v150.18c4.66.45,12.89.89,17.33.89M314.88,151.14V36.51c0-14.66-4.89-21.99-20-22.22v-2.67h7.11c9.55,0,18.88.22,30.44.22,15.55,0,28.21-.44,41.1-.44,50.21,0,81.53,30.66,81.53,80.2s-32.88,84.64-84.2,84.64c-12.89,0-23.99-.44-38.43-.44-11.55,0-20.22.22-30.44.22h-7.11v-2.67c15.11-.22,20-7.55,20-22.22\" fill=\"white\"/><path d=\"M610.88,173.36v2.67h-45.77l-2.44-22.22c-7.33,13.33-21.55,25.99-42.21,25.99s-38.43-13.11-38.43-40.88v-55.1c0-21.55-1.78-26.22-17.11-26.22v-2.67c26.66,0,40.88-.89,51.32-4.22l1.33,1.56c-2.44,6-3.11,14-3.11,31.55v53.76c0,17.99,10,25.77,23.1,25.77,9.78,0,18.66-4.66,23.99-14v-65.54c0-21.55-2-26.22-17.11-26.22v-2.67c26.66,0,40.88-.89,51.32-4.22l1.33,1.56c-2.45,6-3.11,14-3.11,31.55v70.65c0,14.22,2.44,18.88,16.89,18.88\" fill=\"white\"/><path d=\"M679.57,166.47c9.33,0,16.88-4.66,22.22-10.22v-86.2c-4.44-3.33-11.33-7.33-20.22-7.33-20.44,0-32.88,18.66-32.88,51.76s11.55,51.99,30.88,51.99M702.24,160.47c-8,10.22-20.44,18.88-37.77,18.88-27.99,0-49.32-23.1-49.32-62.21s21.99-65.54,52.43-65.54c14.44,0,25.55,5.55,34.21,13.11v-26.58c0-21.55-2-26.22-17.11-26.22v-2.67c24.22-.22,38.21-2.67,51.1-6.89l1.56,1.33c-2.89,11.11-3.11,20.44-3.11,34.44v118.11c0,12.22,4.67,17.11,17.11,17.11v2.67c-11.55,0-33.77,0-45.54.22l-3.55-15.77Z\" fill=\"white\"/><path d=\"M806.19,167.58c8.66,0,15.55-4.22,20.44-9.78v-48.21c-25.11-4-41.99,4.22-41.99,29.33,0,19.11,8.44,28.66,21.55,28.66M797.97,67.39c-13.55,0-25.55,6.44-32.44,21.55l-2.44-.89c5.33-21.11,22.66-37.77,50.43-37.77s45.77,16.22,45.77,42.43v63.54c0,12.22,4.67,17.11,17.11,17.11v2.67c-11.78,0-33.77,0-45.54.22l-3.33-14c-7.11,9.33-19.33,17.11-35.1,17.11-19.99,0-38.88-13.11-38.88-36.88,0-32.21,33.33-45.77,73.09-37.55v-9.33c0-18.88-12.22-28.22-28.66-28.22\" fill=\"white\"/><path d=\"M883.6,11.93v-2.67c24.44-.22,38.43-2.67,51.32-6.89l1.33,1.33c-2.89,11.11-3.11,20.44-3.11,34.44v118.11c0,12.22,4.44,17.11,17.11,17.11v2.67h-5.33c-9.55,0-17.33-.22-27.99-.22s-18.44.22-27.77.22h-5.55v-2.67c12.88,0,17.11-4.89,17.11-17.11V38.14c0-21.55-1.78-26.22-17.11-26.22\" fill=\"white\"/><path d=\"M991.2,6.11c10.44,0,18.66,7.55,18.66,17.33s-8.22,17.33-18.66,17.33-18.44-7.55-18.44-17.33,8.22-17.33,18.44-17.33M975.87,156.25v-72.43c0-21.55-2-26.21-17.11-26.21v-2.67c26.66,0,40.88-.89,51.32-4.22l1.33,1.56c-2.44,6-3.11,14-3.11,31.55v72.43c0,12.22,4.22,17.11,17.11,17.11v2.67h-5.33c-9.55,0-17.55-.22-27.99-.22s-18.44.22-27.99.22h-5.33v-2.67c12.89,0,17.11-4.89,17.11-17.11\" fill=\"white\"/><path d=\"M1033.47,57.61v-2.67c26.21,0,39.32-.89,50.21-4.22l1.33,1.78c-2.44,5.11-3.11,12-3.11,24.44,7.33-12.89,21.55-25.77,42.21-25.77s38.43,13.11,38.43,41.1v63.98c0,12.22,4.22,17.11,16.89,17.11v2.67h-5.11c-9.55,0-17.55-.22-27.99-.22s-18.66.22-27.99.22h-5.55v-2.67c12.89,0,17.11-4.89,17.11-17.11v-62.65c0-18.22-10-25.77-23.1-25.77-9.55,0-18.44,4.44-23.77,13.33v75.09c0,12.22,4.22,17.11,17.11,17.11v2.67h-5.33c-9.55,0-17.55-.22-27.99-.22s-18.44.22-27.99.22h-5.33v-2.67c12.88,0,17.11-4.89,17.11-17.11v-72.42c0-21.55-2-26.22-17.11-26.22\" fill=\"white\"/><path d=\"M1235.5,167.58c8.66,0,15.55-4.22,20.44-9.78v-48.21c-25.1-4-41.99,4.22-41.99,29.33,0,19.11,8.44,28.66,21.55,28.66M1227.28,67.39c-13.55,0-25.55,6.44-32.44,21.55l-2.44-.89c5.33-21.11,22.66-37.77,50.43-37.77s45.77,16.22,45.77,42.43v63.54c0,12.22,4.67,17.11,17.11,17.11v2.67c-11.78,0-33.77,0-45.54.22l-3.33-14c-7.11,9.33-19.33,17.11-35.1,17.11-19.99,0-38.88-13.11-38.88-36.88,0-32.21,33.33-45.77,73.09-37.55v-9.33c0-18.88-12.22-28.22-28.66-28.22\" fill=\"white\"/></svg><div class=\"htitle\">Dashboard de Uso - Provador Virtual</div></header>\n      ${kpis}\n      <div class=\"charts\">\n        <div class=\"panel\"><h3>Try-ons por dia (ultimos 7 dias)</h3><div class=\"bars\">${bars}</div></div>\n        <div class=\"panel\"><h3>Camisas mais experimentadas</h3><div class=\"glist\">${gRows}</div></div>\n      </div>\n    </div>`\n  },\n  mounted(d2){\n    (async ()=>{\n      try{ d2.state.leads = await d2.data('leads').loadAll() || [] }catch(e){ d2.state.leads = [] }\n      d2.state.leadsLoaded = true\n      try{ d2.state.usage = await d2.data('usage').loadAll() || [] }catch(e){ d2.state.usage = [] }\n      d2.state.usageLoaded = true\n    })()\n  },\n}"}},"leads":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"leads"}}}},"usage":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"usage"}}}}}}}},"__d2PrevCode":{"code":"function daysBackList(n){\n  const out = []\n  const d = new Date()\n  for(let i=n-1;i>=0;i--){\n    const dt = new Date(d)\n    dt.setDate(d.getDate()-i)\n    out.push(dt.toISOString().slice(0,10))\n  }\n  return out\n}\nexport default {\n  css: `\n    .root{height:100%;box-sizing:border-box;overflow:auto;background:#f3efe6;font-family:-apple-system,BlinkMacSystemFont,'Helvetica Neue',Arial,sans-serif;color:#1a2744}\n    .dudlogo3{height:17px;width:auto;display:block}\n    header{background:#1a2744;color:#f3efe6;padding:20px 32px;display:flex;align-items:baseline;gap:16px}\n    .word{font-size:12px;letter-spacing:.3em;text-transform:uppercase;color:#c9a97a}\n    .htitle{font-size:16px;font-weight:600}\n    .loading{padding:40px;color:#6b6f7c;font-size:13px}\n    .kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;padding:24px 32px 0}\n    .kpi{background:#fff;border-radius:6px;padding:18px 20px}\n    .kl{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:#6b6f7c;margin-bottom:8px}\n    .kv{font-size:28px;font-weight:700;color:#1a2744}\n    .kv.small{font-size:15px;font-weight:600;line-height:1.3}\n    .charts{display:grid;grid-template-columns:1.2fr 1fr;gap:16px;padding:20px 32px 32px}\n    .panel{background:#fff;border-radius:6px;padding:20px}\n    .panel h3{font-size:12px;text-transform:uppercase;letter-spacing:.06em;color:#6b6f7c;margin:0 0 16px}\n    .bars{display:flex;align-items:flex-end;gap:10px;height:160px}\n    .bar-col{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;height:100%}\n    .bar{width:100%;max-width:36px;background:#7a4a2b;border-radius:3px 3px 0 0;min-height:2px}\n    .bl{font-size:10px;color:#9a9583;margin-top:6px}\n    .glist{display:flex;flex-direction:column;gap:10px}\n    .grow{display:grid;grid-template-columns:1fr 2fr auto;gap:10px;align-items:center;font-size:12px}\n    .gname{color:#1a2744;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n    .gtrack{background:#eee7d8;border-radius:3px;height:10px;overflow:hidden}\n    .gfill{background:#6b2e2e;height:100%;border-radius:3px}\n    .gcount{color:#6b6f7c;font-weight:700}\n    .muted{color:#9a9583;font-size:12px}\n  `,\n  render(d2){\n    if(!d2.state.leadsLoaded || !d2.state.usageLoaded){\n      return `<div class=\"root\"><header><div class=\"word\">Dudalina</div><div class=\"htitle\">Dashboard de Uso</div></header><p class=\"loading\">Carregando metricas...</p></div>`\n    }\n    const leads = d2.state.leads || []\n    const usage = d2.state.usage || []\n    const totalLeads = leads.length\n    const totalAttempts = usage.length\n    const uniqueTryers = new Set(usage.map(u=>u.email).filter(Boolean)).size\n    const conversion = totalLeads ? Math.round((uniqueTryers/totalLeads)*1000)/10 : 0\n    const days = daysBackList(7)\n    const perDay = days.map(day => ({ day: day, count: usage.filter(u=>u.day===day).length }))\n    const maxDay = Math.max(1, ...perDay.map(x=>x.count))\n    const byProduct = {}\n    usage.forEach(u=>{ const k=u.product||'-'; byProduct[k]=(byProduct[k]||0)+1 })\n    const topGarments = Object.entries(byProduct).sort((a,b)=>b[1]-a[1]).slice(0,5)\n    const maxG = Math.max(1, ...topGarments.map(([,c])=>c))\n    const kpis = `\n      <div class=\"kpis\">\n        <div class=\"kpi\"><div class=\"kl\">Leads capturados</div><div class=\"kv\">${d2.fmt.number(totalLeads)}</div></div>\n        <div class=\"kpi\"><div class=\"kl\">Try-ons realizados</div><div class=\"kv\">${d2.fmt.number(totalAttempts)}</div></div>\n        <div class=\"kpi\"><div class=\"kl\">Conversao lead / try-on</div><div class=\"kv\">${conversion}%</div></div>\n        <div class=\"kpi\"><div class=\"kl\">Camisa mais experimentada</div><div class=\"kv small\">${topGarments[0]?topGarments[0][0]:'-'}</div></div>\n      </div>`\n    const bars = perDay.map(x=>{\n      const h = Math.round((x.count/maxDay)*100)\n      const label = x.day.slice(5)\n      return `<div class=\"bar-col\"><div class=\"bar\" style=\"height:${h}%\" title=\"${x.day}: ${x.count}\"></div><div class=\"bl\">${label}</div></div>`\n    }).join('')\n    const gRows = topGarments.length ? topGarments.map(([name,count])=>{\n      const w = Math.round((count/maxG)*100)\n      return `<div class=\"grow\"><div class=\"gname\">${name}</div><div class=\"gtrack\"><div class=\"gfill\" style=\"width:${w}%\"></div></div><div class=\"gcount\">${count}</div></div>`\n    }).join('') : `<p class=\"muted\">Ainda sem execucoes.</p>`\n    return `<div class=\"root\">\n      <header><div class=\"word\">Dudalina</div><div class=\"htitle\">Dashboard de Uso - Provador Virtual</div></header>\n      ${kpis}\n      <div class=\"charts\">\n        <div class=\"panel\"><h3>Try-ons por dia (ultimos 7 dias)</h3><div class=\"bars\">${bars}</div></div>\n        <div class=\"panel\"><h3>Camisas mais experimentadas</h3><div class=\"glist\">${gRows}</div></div>\n      </div>\n    </div>`\n  },\n  mounted(d2){\n    (async ()=>{\n      try{ d2.state.leads = await d2.data('leads').loadAll() || [] }catch(e){ d2.state.leads = [] }\n      d2.state.leadsLoaded = true\n      try{ d2.state.usage = await d2.data('usage').loadAll() || [] }catch(e){ d2.state.usage = [] }\n      d2.state.usageLoaded = true\n    })()\n  },\n}","at":"2026-08-04T18:36:50.797Z"}}},{"_id":"6a72094f034c99fe6b937033","component":"data2-core-types@Component","system":"6a71fb04034c99fe6b932f42","params":{"extends":"data2-core-primitives@Block","component":"dud-tryon-ui","package":"industrias","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"const FALLBACK_CATALOG = [\n  { id:'f1', name:'Camisa Slim Fit Maquinetada Dudalina Masculina', color:'Marinho', price:399.90, imageUrl: 'https://vistadudalina.vtexassets.com/arquivos/ids/447557/68063359_48_6-CAMISA-MC-SLIM-MAQUINETADA.jpg' },\n  { id:'f2', name:'Camisa Slim Fit Micro Xadrez Dudalina Masculina', color:'Xadrez', price:459.90, imageUrl: 'https://vistadudalina.vtexassets.com/arquivos/ids/447475/53065639_05_6-CAMISA-ML-SLIM-MICRO-XADREZ.jpg' },\n  { id:'f3', name:'Camisa Linho Slim Fit Lisa Dudalina Masculina', color:'Bege', price:799.90, imageUrl: 'https://vistadudalina.vtexassets.com/arquivos/ids/443198/53740087_01_1-CAMISA-ML-SLIM-LINHO-LISO.jpg' },\n  { id:'f4', name:'Blazer Alfaiataria Slim Fit Duda Dudalina', color:'Grafite', price:1299.90, imageUrl: 'https://vistadudalina.vtexassets.com/arquivos/ids/444892/21110483_54_1-BLAZER-DUDA.jpg' },\n  { id:'f5', name:'Blazer Alfaiataria Slim Fit Natalia Dudalina', color:'Preto', price:1499.90, imageUrl: 'https://vistadudalina.vtexassets.com/arquivos/ids/444859/21010514_25_1-BLAZER-SLIM-NATALIA.jpg' },\n]\nconst AVATARS = [\n  { id:'a1', url: 'https://industrias.data2.media/file/FNt_SC0LLnSUwDgUUycPz', label:'Modelo A' },\n  { id:'a2', url: 'https://industrias.data2.media/file/PAjQHQN7cZH3xL-GbrEIf', label:'Modelo B' },\n  { id:'a3', url: 'https://industrias.data2.media/file/_gq0lZ4nv-fxzzckgL2az', label:'Modelo C' },\n]\nasync function loadCatalog(d2, q){\n  d2.state.catalogSource = 'loading'\n  try{\n    const out = await d2.rush(d2.params.catalogRush).invoke(q ? { q: q } : {})\n    const res = (out && out.data && typeof out.data === 'object' && 'raw' in out.data) ? out.data : out\n    const raw = res && res.raw\n    const payload = (raw && raw.data) || raw || {}\n    const products = payload.products || (payload.data && payload.data.products) || []\n    const parsed = products.slice(0,12).map((p,i)=>{\n      const item = (p.items && p.items[0]) || {}\n      const img = (item.images && item.images[0] && (item.images[0].imageUrl || item.images[0].imageUrl250)) || null\n      const price = (item.sellers && item.sellers[0] && item.sellers[0].commertialOffer && item.sellers[0].commertialOffer.Price) || (p.priceRange && p.priceRange.sellingPrice && p.priceRange.sellingPrice.highPrice) || null\n      return { id: p.productId || ('v'+i), name: p.productName || p.name || 'Camisa Dudalina', color: item.nameComplete || '', price: price, imageUrl: img }\n    }).filter(p=>p.imageUrl)\n    if(parsed.length){ d2.state.catalog = parsed; d2.state.catalogSource = 'live' }\n    else { d2.state.catalog = FALLBACK_CATALOG; d2.state.catalogSource = 'fallback' }\n  }catch(e){\n    d2.state.catalog = FALLBACK_CATALOG\n    d2.state.catalogSource = 'fallback'\n  }\n}\nasync function runGeneration(d2){\n  const p = d2.state.selectedProduct, ph = d2.state.selectedPhoto\n  if(!p || !ph) return\n  d2.state.step = 'generating'\n  d2.state.status = 'running'\n  d2.state.resultUrl = null\n  d2.state.loadingPhase = 0\n  const phaseTimer = setInterval(()=>{ d2.state.loadingPhase = (d2.state.loadingPhase||0) + 1 }, 3200)\n  const store = d2.store(d2.params.session)\n  const email = store.get('email','')\n  try{\n    const raw = await d2.rush(d2.params.tryonRush).invoke({ email: email, product: p.name, photoUrl: ph.url, garmentImageUrl: p.imageUrl })\n    const res = (raw && raw.data && typeof raw.data === 'object' && 'ok' in raw.data) ? raw.data : raw\n    if(res && res.ok && res.resultUrl){\n      d2.state.resultUrl = res.resultUrl\n      d2.state.status = 'done'\n      d2.state.step = 'result'\n    } else {\n      d2.state.status = 'error'\n      d2.state.errorDetail = (res && res.error) || JSON.stringify(raw).slice(0,200)\n      d2.state.step = 'error'\n    }\n  }catch(e){\n    d2.state.status = 'error'\n    d2.state.errorDetail = String(e && e.message || e).slice(0,200)\n    d2.state.step = 'error'\n  } finally {\n    clearInterval(phaseTimer)\n  }\n}\nconst LOADING_MESSAGES = [\n  'Analisando suas proporcoes...',\n  'Aplicando o tecido da peca...',\n  'Ajustando caimento e sombras...',\n  'Finalizando os detalhes...',\n]\nexport default {\n  css: `\n    .root{height:100%;box-sizing:border-box;overflow:auto;background:#f3efe6;font-family:-apple-system,BlinkMacSystemFont,'Helvetica Neue',Arial,sans-serif;color:#1a2744}\n    header{background:#1a2744;color:#f3efe6;padding:18px 32px;display:flex;align-items:center;gap:16px}\n    .dudlogo2{height:20px;width:auto;display:block}\n    .htitle{font-size:15px;font-weight:600;letter-spacing:.02em}\n    .steps{display:flex;justify-content:center;align-items:center;gap:0;background:#fff;border-bottom:1px solid #e6dfcd;padding:14px 20px}\n    .step{display:flex;align-items:center;gap:8px;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:#b7ad98;font-weight:700}\n    .step .dot{width:22px;height:22px;border-radius:50%;border:1.5px solid #d8d3c8;display:flex;align-items:center;justify-content:center;font-size:11px;color:#b7ad98;background:#fff;transition:border-color .3s,background .3s}\n    .step.active{color:#1a2744}\n    .step.active .dot{border-color:#6b2e2e;background:#6b2e2e;color:#fff;animation:dotPop .4s cubic-bezier(.34,1.56,.64,1)}\n    .step.done .dot{border-color:#7a4a2b;background:#7a4a2b;color:#fff;animation:dotPop .4s cubic-bezier(.34,1.56,.64,1)}\n    .step-sep{width:40px;height:1px;background:#e6dfcd;margin:0 10px;position:relative;overflow:hidden}\n    .step-sep.filled::after{content:'';position:absolute;inset:0;background:#7a4a2b;transform-origin:left;animation:fillLine .4s ease both}\n    @keyframes dotPop{0%{transform:scale(.6)}70%{transform:scale(1.2)}100%{transform:scale(1)}}\n    @keyframes fillLine{from{transform:scaleX(0)}to{transform:scaleX(1)}}\n    .stage{max-width:1040px;margin:0 auto;padding:44px 32px 70px;box-sizing:border-box;animation:slideFwd .5s cubic-bezier(.22,1,.36,1) both}\n    .stage.back{animation:slideBack .5s cubic-bezier(.22,1,.36,1) both}\n    @keyframes slideFwd{from{opacity:0;transform:translateX(24px)}to{opacity:1;transform:translateX(0)}}\n    @keyframes slideBack{from{opacity:0;transform:translateX(-24px)}to{opacity:1;transform:translateX(0)}}\n    @keyframes fadeIn{from{opacity:0}to{opacity:1}}\n    @keyframes fadeUp{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}\n    .stage-head{text-align:center;margin-bottom:34px}\n    .eyebrow{font-size:11px;letter-spacing:.18em;text-transform:uppercase;color:#7a4a2b;font-weight:700}\n    .stage h1{font-size:30px;font-weight:600;margin:8px 0 0;letter-spacing:-.01em}\n    .stage .sub{color:#6b6f7c;font-size:14px;margin-top:8px}\n    .back{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:#6b6f7c;cursor:pointer;text-decoration:none;margin-bottom:18px}\n    .back:hover{color:#1a2744}\n    .search{display:flex;gap:8px;margin:0 auto 14px;max-width:520px}\n    .search input{flex:1;font-family:inherit;font-size:14px;padding:13px 16px;border:1px solid #d8d3c8;border-radius:2px;outline:none;background:#fff;color:#1a2744;box-sizing:border-box}\n    .search input:focus{border-color:#7a4a2b}\n    .search button{font-family:inherit;font-size:12px;letter-spacing:.08em;text-transform:uppercase;font-weight:700;background:#1a2744;color:#f3efe6;border:0;padding:0 22px;border-radius:2px;cursor:pointer;transition:transform .12s}\n    .search button:active{transform:scale(.95)}\n    .tag2{display:block;text-align:center;margin:0 0 26px;font-size:10px;letter-spacing:.04em;color:#8b8370}\n    .grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:20px}\n    .card{cursor:pointer;border:2px solid transparent;border-radius:8px;padding:0;background:#fff;transition:transform .18s ease,box-shadow .18s ease,border-color .18s ease;overflow:hidden;box-shadow:0 1px 3px rgba(26,39,68,.08)}\n    .card:hover{transform:translateY(-4px);box-shadow:0 14px 28px rgba(26,39,68,.16)}\n    .card:active{transform:translateY(-1px) scale(.99)}\n    .card.picked{animation:pickPulse .22s ease}\n    .card img{width:100%;height:260px;object-fit:cover;background:#eee;display:block;transition:transform .4s ease}\n    .card:hover img{transform:scale(1.06)}\n    @keyframes pickPulse{0%{transform:scale(1)}45%{transform:scale(.95);border-color:#6b2e2e}100%{transform:scale(1)}}\n    .cbody{padding:14px 16px}\n    .cname{font-size:12.5px;line-height:1.35;margin-bottom:4px}\n    .cprice{font-size:13px;color:#7a4a2b;font-weight:700}\n    .pgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:22px;max-width:900px;margin:0 auto}\n    .ph{cursor:pointer;border:2px solid transparent;border-radius:10px;padding:0;text-align:center;background:#fff;overflow:hidden;transition:transform .18s ease,box-shadow .18s ease,border-color .18s ease;box-shadow:0 1px 3px rgba(26,39,68,.08)}\n    .ph:hover{transform:translateY(-4px);box-shadow:0 14px 28px rgba(26,39,68,.16)}\n    .ph:active{transform:translateY(-1px) scale(.99)}\n    .ph.picked{animation:pickPulse .22s ease}\n    .ph img{width:100%;height:280px;object-fit:cover;display:block;transition:transform .4s ease}\n    .ph:hover img{transform:scale(1.06)}\n    .ph.upload{display:flex;flex-direction:column;align-items:center;justify-content:center;position:relative;height:280px;border:2px dashed #d8d3c8;background:#faf9f6;box-shadow:none}\n    .ph.upload:hover{border-color:#7a4a2b;transform:none;box-shadow:none}\n    .ph.upload input{position:absolute;inset:0;opacity:0;cursor:pointer}\n    .plus{width:56px;height:56px;border-radius:50%;background:#eee7d8;display:flex;align-items:center;justify-content:center;font-size:26px;color:#7a4a2b;margin-bottom:10px}\n    .plabel{font-size:12.5px;padding:12px 10px;color:#1a2744}\n    .confirm-row{display:flex;align-items:center;justify-content:center;gap:28px;margin-bottom:38px;flex-wrap:wrap}\n    .confirm-card{width:220px;text-align:center}\n    .confirm-card img{width:100%;height:260px;object-fit:cover;border-radius:10px;box-shadow:0 8px 24px rgba(26,39,68,.14)}\n    .confirm-card .ccap{font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:#8b8370;margin-top:12px}\n    .confirm-card .cname2{font-size:13.5px;font-weight:600;margin-top:2px}\n    .plusicon{font-size:28px;color:#c9a97a;font-weight:300;display:inline-block;animation:plusPulse 1.8s ease-in-out infinite}\n    @keyframes plusPulse{0%,100%{transform:scale(1);opacity:.85}50%{transform:scale(1.18);opacity:1}}\n    .cta-wrap{text-align:center}\n    .btn-cta{background:#6b2e2e;color:#f3efe6;border:0;padding:18px 48px;font-size:13px;letter-spacing:.14em;text-transform:uppercase;font-weight:700;cursor:pointer;border-radius:2px;transition:background .15s,transform .12s}\n    .btn-cta:hover{background:#7a4a2b}\n    .btn-cta:active{transform:scale(.96)}\n    .loading-stage{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:100px 20px 120px;text-align:center}\n    .glow{position:relative;width:140px;height:140px;border-radius:50%;background:radial-gradient(circle,rgba(107,46,46,.22),rgba(107,46,46,0) 70%);display:flex;align-items:center;justify-content:center;margin-bottom:28px;animation:pulse 2.2s ease-in-out infinite}\n    .glow::before{content:'';position:absolute;inset:6px;border-radius:50%;border:2px solid transparent;border-top-color:#6b2e2e;border-right-color:#6b2e2e;animation:ringspin 1.1s linear infinite}\n    @keyframes pulse{0%,100%{transform:scale(1);opacity:.85}50%{transform:scale(1.12);opacity:1}}\n    @keyframes ringspin{to{transform:rotate(360deg)}}\n    .glow-core{width:64px;height:64px;border-radius:50%;background:#1a2744;display:flex;align-items:center;justify-content:center;color:#c9a97a;font-size:26px}\n    .loading-msg{font-size:15px;color:#1a2744;font-weight:600;min-height:22px;animation:fadeIn .35s ease}\n    .loading-bar{width:220px;height:3px;background:#e6dfcd;border-radius:3px;overflow:hidden;margin-top:22px;position:relative}\n    .loading-bar::after{content:'';position:absolute;top:0;left:-40%;width:40%;height:100%;background:#6b2e2e;animation:slide 1.3s ease-in-out infinite}\n    @keyframes slide{0%{left:-40%}100%{left:100%}}\n    .result-stage{text-align:center}\n    .result-stage .eyebrow{animation:fadeUp .4s ease both}\n    .result-stage h1{animation:fadeUp .45s ease both;animation-delay:.08s}\n    .result-stage img{max-width:100%;max-height:520px;border-radius:10px;box-shadow:0 20px 50px rgba(26,39,68,.22);animation:reveal .6s cubic-bezier(.22,1,.36,1) both;animation-delay:.2s}\n    @keyframes reveal{from{opacity:0;transform:scale(.94)}to{opacity:1;transform:scale(1)}}\n    .result-actions{margin-top:26px;display:flex;gap:14px;justify-content:center;flex-wrap:wrap;animation:fadeUp .4s ease both;animation-delay:.55s}\n    .btn-ghost{background:none;border:1.5px solid #1a2744;color:#1a2744;padding:13px 26px;border-radius:2px;font-size:12px;text-transform:uppercase;letter-spacing:.08em;font-weight:700;cursor:pointer;text-decoration:none;display:inline-block}\n    .btn-ghost:hover{background:#1a2744;color:#fff}\n    .err-box{max-width:420px;margin:0 auto;text-align:center}\n    .err-box p{color:#8b2020;font-size:14px}\n    .err-detail{font-size:10px;color:#b08a8a;margin-top:8px}\n    .locked{height:100%;display:flex;align-items:center;justify-content:center}\n    .lockbox{max-width:420px;text-align:center;background:#fff;padding:44px;border-radius:6px}\n    .lockbox h2{margin:8px 0}\n    .lockbox .link{display:inline-block;margin-top:14px;background:#1a2744;color:#f3efe6;text-decoration:none;padding:12px 20px;border-radius:2px;font-size:12px;text-transform:uppercase;letter-spacing:.08em}\n    @media (max-width:640px){ .stage{padding:30px 18px 50px} .stage h1{font-size:24px} }\n  `,\n  render(d2){\n    const store = d2.store(d2.params.session)\n    const gated = store.get('gateOk', false)\n    if(!gated){\n      return `<div class=\"root locked\"><div class=\"lockbox\">\n        <div class=\"eyebrow\">Provador virtual</div>\n        <h2>Acesso bloqueado</h2>\n        <p>Complete seu cadastro na tela inicial para liberar o provador virtual.</p>\n        <button class=\"link go-gate\">Voltar ao cadastro</button>\n      </div></div>`\n    }\n    const step = d2.state.step || 'shirt'\n    const catalog = d2.state.catalog || []\n    const source = d2.state.catalogSource || 'loading'\n    const sel = d2.state.selectedProduct\n    const photo = d2.state.selectedPhoto\n    const stepIdx = step==='shirt' ? 0 : step==='photo' ? 1 : 2\n    const showStepper = step==='shirt' || step==='photo' || step==='confirm' || step==='error'\n    const dirClass = d2.state.dir==='back' ? ' back' : ''\n\n    const stepper = `<div class=\"steps\">\n      <div class=\"step ${stepIdx===0?'active':stepIdx>0?'done':''}\"><span class=\"dot\">${stepIdx>0?'&#10003;':'1'}</span> Peca</div>\n      <div class=\"step-sep ${stepIdx>0?'filled':''}\"></div>\n      <div class=\"step ${stepIdx===1?'active':stepIdx>1?'done':''}\"><span class=\"dot\">${stepIdx>1?'&#10003;':'2'}</span> Foto</div>\n      <div class=\"step-sep ${stepIdx>1?'filled':''}\"></div>\n      <div class=\"step ${stepIdx===2?'active':''}\"><span class=\"dot\">3</span> Seu look</div>\n    </div>`\n\n    let stage = ''\n    if(step === 'shirt'){\n      const sourceTag = source==='fallback' ? 'Catalogo de referencia' : source==='live' ? 'Catalogo ao vivo dudalina.com.br' : ''\n      const cards = catalog.length ? catalog.map(p=>`\n        <div class=\"card\" data-id=\"${p.id}\">\n          <img src=\"${p.imageUrl}\" alt=\"${p.name}\"/>\n          <div class=\"cbody\"><div class=\"cname\">${p.name}</div><div class=\"cprice\">${p.price ? d2.fmt.currency(p.price,'BRL') : ''}</div></div>\n        </div>`).join('') : `<p style=\"grid-column:1/-1;text-align:center;color:#9a9583\">Carregando catalogo...</p>`\n      stage = `<div class=\"stage${dirClass}\">\n        <div class=\"stage-head\"><div class=\"eyebrow\">Passo 1 de 3</div><h1>Escolha sua peca</h1><p class=\"sub\">Selecione uma camisa ou blazer Dudalina para experimentar</p></div>\n        <div class=\"search\"><input class=\"q\" placeholder=\"Buscar (ex: camisa social, blazer, linho)\" value=\"${d2.state.query||''}\"/><button class=\"qgo\">Buscar</button></div>\n        ${sourceTag ? `<span class=\"tag2\">${sourceTag}</span>` : ''}\n        <div class=\"grid\">${cards}</div>\n      </div>`\n    } else if(step === 'photo'){\n      const avatarCards = AVATARS.map(a=>`\n        <div class=\"ph\" data-photo-id=\"${a.id}\"><img src=\"${a.url}\"/><div class=\"plabel\">${a.label}</div></div>`).join('')\n      stage = `<div class=\"stage${dirClass}\">\n        <a class=\"back go-shirt\">&#8592; Trocar peca</a>\n        <div class=\"stage-head\"><div class=\"eyebrow\">Passo 2 de 3</div><h1>Quem vai experimentar?</h1><p class=\"sub\">Escolha um dos nossos modelos ou envie sua propria foto</p></div>\n        <div class=\"pgrid\">${avatarCards}\n          <label class=\"ph upload\"><input type=\"file\" accept=\"image/*\" class=\"upl\"/><div class=\"plus\">+</div><div class=\"plabel\">Enviar minha foto</div></label>\n        </div>\n      </div>`\n    } else if(step === 'confirm' || step === 'error'){\n      const confirmRow = `<div class=\"confirm-row\">\n        <div class=\"confirm-card\"><img src=\"${photo?photo.url:''}\"/><div class=\"ccap\">Modelo</div><div class=\"cname2\">${photo?photo.label:''}</div></div>\n        <div class=\"plusicon\">+</div>\n        <div class=\"confirm-card\"><img src=\"${sel?sel.imageUrl:''}\"/><div class=\"ccap\">Peca</div><div class=\"cname2\">${sel?sel.name:''}</div></div>\n      </div>`\n      if(step === 'error'){\n        stage = `<div class=\"stage${dirClass}\">\n          <div class=\"stage-head\"><div class=\"eyebrow\">Passo 3 de 3</div><h1>Seu look</h1></div>\n          ${confirmRow}\n          <div class=\"err-box\"><p>Nao foi possivel gerar a imagem agora. Tente novamente em instantes.</p><p class=\"err-detail\">${(d2.state.errorDetail||'').replace(/</g,'&lt;')}</p>\n          <div class=\"result-actions\"><button class=\"btn-cta retry-gen\">Tentar novamente</button><button class=\"btn-ghost go-shirt\">Trocar selecao</button></div></div>\n        </div>`\n      } else {\n        stage = `<div class=\"stage${dirClass}\">\n          <a class=\"back go-photo\">&#8592; Trocar foto</a>\n          <div class=\"stage-head\"><div class=\"eyebrow\">Passo 3 de 3</div><h1>Pronto para ver o resultado?</h1></div>\n          ${confirmRow}\n          <div class=\"cta-wrap\"><button class=\"btn-cta go-generate\">Gerar meu look</button></div>\n        </div>`\n      }\n    } else if(step === 'generating'){\n      const msg = LOADING_MESSAGES[(d2.state.loadingPhase||0) % LOADING_MESSAGES.length]\n      stage = `<div class=\"stage${dirClass}\">\n        <div class=\"loading-stage\">\n          <div class=\"glow\"><div class=\"glow-core\"><svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M12 2l2.2 6.8L21 11l-6.8 2.2L12 20l-2.2-6.8L3 11l6.8-2.2L12 2z\" fill=\"#c9a97a\"/></svg></div></div>\n          <div class=\"loading-msg\">${msg}</div>\n          <div class=\"loading-bar\"></div>\n        </div>\n      </div>`\n    } else if(step === 'result'){\n      stage = `<div class=\"stage${dirClass} result-stage\">\n        <div class=\"eyebrow\">Pronto</div>\n        <h1 style=\"margin-bottom:22px\">Assim ficaria voce com ${sel?sel.name:'a peca'}</h1>\n        <img src=\"${d2.state.resultUrl}\" alt=\"Resultado\"/>\n        <div class=\"result-actions\">\n          <button class=\"btn-cta go-shirt\">Experimentar outra peca</button>\n          <a class=\"btn-ghost\" href=\"${d2.state.resultUrl}\" download target=\"_blank\">Baixar imagem</a>\n        </div>\n      </div>`\n    }\n\n    return `<div class=\"root\">\n      <header><svg class=\"dudlogo2\" xmlns=\"http://www.w3.org/2000/svg\" width=\"175\" height=\"24\" viewBox=\"0 0 1305.71 179.8\"><path d=\"M66.52,55.29c1.99,6.71,10.01,32.4,11.94,38.64.87,3.03,4.33,4.07,7.31,4.07.03,0,.06,0,.09,0s.06,0,.08,0c2.97,0,6.44-1.04,7.31-4.07,1.93-6.24,9.95-31.93,11.94-38.64.79-2.66,1.61-7.33,1.98-9.58.13-.81.25-1.62.32-2.44.27-3.17.23-6-.11-8.64-.88-6.8-3.73-12.04-8.35-18.79l-8.63-13.12c-1.72-2.35-3.35-2.71-4.54-2.71-1.55,0-3.22.94-4.54,2.71l-8.63,13.12c-4.62,6.75-7.47,11.99-8.35,18.79-.34,2.64-.38,5.47-.11,8.64.07.82.18,1.63.32,2.44.37,2.25,1.19,6.92,1.98,9.58\" fill=\"white\"/><path d=\"M96.66,106.86h-21.61c-.23,0-.47.01-.69.04-3.35.36-5.87,3.16-5.87,6.53s2.52,6.17,5.86,6.52c.23.03.46.04.7.04h21.61c.23,0,.47-.01.7-.04,3.34-.35,5.86-3.16,5.86-6.52s-2.52-6.17-5.87-6.53c-.23-.02-.46-.04-.69-.04\" fill=\"white\"/><path d=\"M90.67,140.96c-.11-1.15-.22-2.25-.35-3.27-.29-2.31-2.23-4.03-4.46-4.07-2.23.04-4.17,1.76-4.46,4.07-.13,1.02-.24,2.12-.35,3.27-.6,6.1-1.34,13.69-6.25,19.01-1.66,1.47-2.47,2.89-2.43,4.22.02.62.26,1.53,1.21,2.27.27.23,6.67,5.62,10.06,8.01l.24.16c.24.16.51.34.79.49.74.39,1.64.39,2.38,0,.29-.15.56-.33.8-.49l.24-.16c3.38-2.4,9.79-7.78,10.06-8.01.96-.74,1.19-1.64,1.21-2.27.05-1.32-.77-2.74-2.43-4.22-4.91-5.33-5.65-12.92-6.25-19.01\" fill=\"white\"/><path d=\"M57.63,99.53c1.58,1.17,3.27,1.61,4.75,1.24,1.15-.29,2.11-1.07,2.61-2.15.51-1.09.52-2.36.02-3.57-.26-.64-.66-1.23-1.17-1.76-1.06-1.15-2.13-2.31-3.2-3.48-8.2-8.93-16.68-18.16-25.57-23.17-11.91-5.6-23.31-3-30.48,6.95C.05,80.15-1.19,88.28,1.18,95.89c2.72,8.74,10.2,13.2,16.41,13.74.43.04.84.06,1.25.06,3.4,0,6.06-1.29,7.23-3.56,1.12-2.17,1.34-6.07-3.93-12.24-1.82-2.32-1.86-6.17-.08-8.95,1.16-1.83,4.08-4.65,10.48-3.18,9.07,3.49,16.75,10.34,24.18,16.96l.92.81Z\" fill=\"white\"/><path d=\"M75.03,133.01c.65-1.53.67-3.02.04-4.11-.44-.76-1.17-1.25-2.01-1.35-1.66-.18-3.22,1.13-4.17,3.48-.89,2.09-2.56,4.91-5.49,6.46-1.05.56-2.12.91-3.06,1.03-3.45.09-4.34-1.04-5.36-2.34-.68-.86-1.45-1.84-2.87-2.41-1.52-.79-4.04-.3-5.78,1.13-1.93,1.59-2.55,4.02-1.71,6.62,1.29,4.72,6.3,8.49,10.94,8.29.57.07,1.13.1,1.69.1,2.53,0,4.98-.7,7.28-2.09,3.87-2.33,7.14-6.51,9.47-12.09.37-.88.71-1.8,1.03-2.74\" fill=\"white\"/><path d=\"M167.11,73.6c-7.18-9.95-18.57-12.54-30.48-6.95-8.89,5-17.37,14.24-25.57,23.17-1.07,1.16-2.14,2.33-3.2,3.47-.5.53-.9,1.12-1.17,1.76-.5,1.21-.49,2.48.02,3.57.5,1.07,1.45,1.85,2.61,2.15,1.48.38,3.17-.07,4.75-1.24l.92-.81c7.43-6.62,15.11-13.47,24.18-16.96,6.4-1.47,9.31,1.36,10.48,3.18,1.77,2.78,1.74,6.63-.08,8.95-5.27,6.17-5.04,10.07-3.92,12.24,1.17,2.27,3.83,3.56,7.23,3.56.41,0,.83-.02,1.25-.06,6.21-.54,13.69-5,16.41-13.74,2.37-7.62,1.13-15.74-3.42-22.3\" fill=\"white\"/><path d=\"M125.37,134.91c-1.74-1.43-4.26-1.91-5.78-1.13-1.42.57-2.19,1.54-2.86,2.41-1.03,1.3-1.91,2.43-5.36,2.34-.94-.13-2.01-.48-3.06-1.03-2.93-1.55-4.6-4.37-5.49-6.46-.95-2.36-2.51-3.67-4.17-3.48-.83.09-1.56.58-2,1.35-.63,1.09-.61,2.58.04,4.11.32.94.66,1.86,1.02,2.74,2.32,5.58,5.59,9.76,9.47,12.09,2.3,1.39,4.74,2.09,7.28,2.09.56,0,1.12-.03,1.69-.1,4.64.2,9.64-3.57,10.94-8.29.84-2.6.23-5.03-1.7-6.62\" fill=\"white\"/><path d=\"M367.09,169.8c32.88,0,51.54-26.21,51.54-76.65s-18.44-75.31-51.1-75.31c-4.44,0-13.11.44-17.77.89v150.18c4.66.45,12.89.89,17.33.89M314.88,151.14V36.51c0-14.66-4.89-21.99-20-22.22v-2.67h7.11c9.55,0,18.88.22,30.44.22,15.55,0,28.21-.44,41.1-.44,50.21,0,81.53,30.66,81.53,80.2s-32.88,84.64-84.2,84.64c-12.89,0-23.99-.44-38.43-.44-11.55,0-20.22.22-30.44.22h-7.11v-2.67c15.11-.22,20-7.55,20-22.22\" fill=\"white\"/><path d=\"M610.88,173.36v2.67h-45.77l-2.44-22.22c-7.33,13.33-21.55,25.99-42.21,25.99s-38.43-13.11-38.43-40.88v-55.1c0-21.55-1.78-26.22-17.11-26.22v-2.67c26.66,0,40.88-.89,51.32-4.22l1.33,1.56c-2.44,6-3.11,14-3.11,31.55v53.76c0,17.99,10,25.77,23.1,25.77,9.78,0,18.66-4.66,23.99-14v-65.54c0-21.55-2-26.22-17.11-26.22v-2.67c26.66,0,40.88-.89,51.32-4.22l1.33,1.56c-2.45,6-3.11,14-3.11,31.55v70.65c0,14.22,2.44,18.88,16.89,18.88\" fill=\"white\"/><path d=\"M679.57,166.47c9.33,0,16.88-4.66,22.22-10.22v-86.2c-4.44-3.33-11.33-7.33-20.22-7.33-20.44,0-32.88,18.66-32.88,51.76s11.55,51.99,30.88,51.99M702.24,160.47c-8,10.22-20.44,18.88-37.77,18.88-27.99,0-49.32-23.1-49.32-62.21s21.99-65.54,52.43-65.54c14.44,0,25.55,5.55,34.21,13.11v-26.58c0-21.55-2-26.22-17.11-26.22v-2.67c24.22-.22,38.21-2.67,51.1-6.89l1.56,1.33c-2.89,11.11-3.11,20.44-3.11,34.44v118.11c0,12.22,4.67,17.11,17.11,17.11v2.67c-11.55,0-33.77,0-45.54.22l-3.55-15.77Z\" fill=\"white\"/><path d=\"M806.19,167.58c8.66,0,15.55-4.22,20.44-9.78v-48.21c-25.11-4-41.99,4.22-41.99,29.33,0,19.11,8.44,28.66,21.55,28.66M797.97,67.39c-13.55,0-25.55,6.44-32.44,21.55l-2.44-.89c5.33-21.11,22.66-37.77,50.43-37.77s45.77,16.22,45.77,42.43v63.54c0,12.22,4.67,17.11,17.11,17.11v2.67c-11.78,0-33.77,0-45.54.22l-3.33-14c-7.11,9.33-19.33,17.11-35.1,17.11-19.99,0-38.88-13.11-38.88-36.88,0-32.21,33.33-45.77,73.09-37.55v-9.33c0-18.88-12.22-28.22-28.66-28.22\" fill=\"white\"/><path d=\"M883.6,11.93v-2.67c24.44-.22,38.43-2.67,51.32-6.89l1.33,1.33c-2.89,11.11-3.11,20.44-3.11,34.44v118.11c0,12.22,4.44,17.11,17.11,17.11v2.67h-5.33c-9.55,0-17.33-.22-27.99-.22s-18.44.22-27.77.22h-5.55v-2.67c12.88,0,17.11-4.89,17.11-17.11V38.14c0-21.55-1.78-26.22-17.11-26.22\" fill=\"white\"/><path d=\"M991.2,6.11c10.44,0,18.66,7.55,18.66,17.33s-8.22,17.33-18.66,17.33-18.44-7.55-18.44-17.33,8.22-17.33,18.44-17.33M975.87,156.25v-72.43c0-21.55-2-26.21-17.11-26.21v-2.67c26.66,0,40.88-.89,51.32-4.22l1.33,1.56c-2.44,6-3.11,14-3.11,31.55v72.43c0,12.22,4.22,17.11,17.11,17.11v2.67h-5.33c-9.55,0-17.55-.22-27.99-.22s-18.44.22-27.99.22h-5.33v-2.67c12.89,0,17.11-4.89,17.11-17.11\" fill=\"white\"/><path d=\"M1033.47,57.61v-2.67c26.21,0,39.32-.89,50.21-4.22l1.33,1.78c-2.44,5.11-3.11,12-3.11,24.44,7.33-12.89,21.55-25.77,42.21-25.77s38.43,13.11,38.43,41.1v63.98c0,12.22,4.22,17.11,16.89,17.11v2.67h-5.11c-9.55,0-17.55-.22-27.99-.22s-18.66.22-27.99.22h-5.55v-2.67c12.89,0,17.11-4.89,17.11-17.11v-62.65c0-18.22-10-25.77-23.1-25.77-9.55,0-18.44,4.44-23.77,13.33v75.09c0,12.22,4.22,17.11,17.11,17.11v2.67h-5.33c-9.55,0-17.55-.22-27.99-.22s-18.44.22-27.99.22h-5.33v-2.67c12.88,0,17.11-4.89,17.11-17.11v-72.42c0-21.55-2-26.22-17.11-26.22\" fill=\"white\"/><path d=\"M1235.5,167.58c8.66,0,15.55-4.22,20.44-9.78v-48.21c-25.1-4-41.99,4.22-41.99,29.33,0,19.11,8.44,28.66,21.55,28.66M1227.28,67.39c-13.55,0-25.55,6.44-32.44,21.55l-2.44-.89c5.33-21.11,22.66-37.77,50.43-37.77s45.77,16.22,45.77,42.43v63.54c0,12.22,4.67,17.11,17.11,17.11v2.67c-11.78,0-33.77,0-45.54.22l-3.33-14c-7.11,9.33-19.33,17.11-35.1,17.11-19.99,0-38.88-13.11-38.88-36.88,0-32.21,33.33-45.77,73.09-37.55v-9.33c0-18.88-12.22-28.22-28.66-28.22\" fill=\"white\"/></svg><div class=\"htitle\">Provador Virtual</div></header>\n      ${showStepper ? stepper : ''}\n      ${stage}\n    </div>`\n  },\n  mounted(d2){\n    loadCatalog(d2)\n    d2.on('.qgo','click', ()=>{\n      const el = d2.$('.q')\n      const v = (el && el.value || '').trim()\n      d2.state.query = v\n      loadCatalog(d2, v)\n    })\n    d2.on('.q','keydown',(e)=>{ if(e.key==='Enter'){ const b=d2.$('.qgo'); if(b) b.click() } })\n    d2.on('.card','click',(e,el)=>{\n      const id = el.dataset.id\n      const p = (d2.state.catalog||[]).find(x=>String(x.id)===id)\n      el.classList.add('picked')\n      setTimeout(()=>{\n        d2.state.selectedProduct = p\n        d2.state.dir = 'fwd'\n        d2.state.step = 'photo'\n      }, 200)\n    })\n    d2.on('.ph[data-photo-id]','click',(e,el)=>{\n      const id = el.dataset.photoId\n      const a = AVATARS.find(x=>x.id===id)\n      el.classList.add('picked')\n      setTimeout(()=>{\n        d2.state.selectedPhoto = a\n        d2.state.dir = 'fwd'\n        d2.state.step = 'confirm'\n      }, 200)\n    })\n    d2.on('.upl','change',(e,el)=>{\n      const file = el.files && el.files[0]\n      if(!file) return\n      const reader = new FileReader()\n      reader.onload = ()=>{ d2.state.selectedPhoto = { id:'upload', url: reader.result, label:'Sua foto' }; d2.state.dir = 'fwd'; d2.state.step = 'confirm' }\n      reader.readAsDataURL(file)\n    })\n    d2.on('.go-shirt','click', ()=>{ d2.state.dir='back'; d2.state.step='shirt'; d2.state.status='idle'; d2.state.resultUrl=null; d2.state.selectedProduct=null; d2.state.selectedPhoto=null })\n    d2.on('.go-photo','click', ()=>{ d2.state.dir='back'; d2.state.step='photo' })\n    d2.on('.retry-gen','click', ()=>{ d2.state.dir='fwd'; runGeneration(d2) })\n    d2.on('.go-generate','click', ()=>{ d2.state.dir='fwd'; runGeneration(d2) })\n    // TEMP: d2.router().goTo() e no-op (bug no bridge). Remover quando o fix sair.\n    const nav = (path) => {\n      const R = 'dud-routerInterface'\n      try {\n        const i = d2.process(R) && d2.process(R).instance\n        if (i && typeof i.goTo === 'function') return i.goTo(path)\n        if (i && i.history && typeof i.history.push === 'function') return i.history.push(path)\n      } catch (e) {}\n      try {\n        const L = (window.D2Env && window.D2Env.layers) || {}\n        for (const n of Object.keys(L)) {\n          const i = L[n] && L[n].processes && L[n].processes[R] && L[n].processes[R].instance\n          if (i && typeof i.goTo === 'function') return i.goTo(path)\n        }\n      } catch (e) {}\n      window.location.assign(path)\n    }\n    d2.on('.go-gate','click', ()=> nav('/'))\n  },\n}"}},"session":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"session"}}}},"catalogRush":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"catalogRush"}}}},"tryonRush":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"tryonRush"}}}},"gateUrl":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"gateUrl"}}}}}}}},"__d2PrevCode":{"code":"const FALLBACK_CATALOG = [\n  { id:'f1', name:'Camisa Slim Fit Maquinetada Dudalina Masculina', color:'Marinho', price:399.90, imageUrl: 'https://vistadudalina.vtexassets.com/arquivos/ids/447557/68063359_48_6-CAMISA-MC-SLIM-MAQUINETADA.jpg' },\n  { id:'f2', name:'Camisa Slim Fit Micro Xadrez Dudalina Masculina', color:'Xadrez', price:459.90, imageUrl: 'https://vistadudalina.vtexassets.com/arquivos/ids/447475/53065639_05_6-CAMISA-ML-SLIM-MICRO-XADREZ.jpg' },\n  { id:'f3', name:'Camisa Linho Slim Fit Lisa Dudalina Masculina', color:'Bege', price:799.90, imageUrl: 'https://vistadudalina.vtexassets.com/arquivos/ids/443198/53740087_01_1-CAMISA-ML-SLIM-LINHO-LISO.jpg' },\n  { id:'f4', name:'Blazer Alfaiataria Slim Fit Duda Dudalina', color:'Grafite', price:1299.90, imageUrl: 'https://vistadudalina.vtexassets.com/arquivos/ids/444892/21110483_54_1-BLAZER-DUDA.jpg' },\n  { id:'f5', name:'Blazer Alfaiataria Slim Fit Natalia Dudalina', color:'Preto', price:1499.90, imageUrl: 'https://vistadudalina.vtexassets.com/arquivos/ids/444859/21010514_25_1-BLAZER-SLIM-NATALIA.jpg' },\n]\nconst AVATARS = [\n  { id:'a1', url: 'https://industrias.data2.media/file/FNt_SC0LLnSUwDgUUycPz', label:'Modelo A' },\n  { id:'a2', url: 'https://industrias.data2.media/file/PAjQHQN7cZH3xL-GbrEIf', label:'Modelo B' },\n  { id:'a3', url: 'https://industrias.data2.media/file/_gq0lZ4nv-fxzzckgL2az', label:'Modelo C' },\n]\nasync function loadCatalog(d2, q){\n  d2.state.catalogSource = 'loading'\n  try{\n    const out = await d2.rush(d2.params.catalogRush).invoke(q ? { q: q } : {})\n    const res = (out && out.data && typeof out.data === 'object' && 'raw' in out.data) ? out.data : out\n    const raw = res && res.raw\n    const payload = (raw && raw.data) || raw || {}\n    const products = payload.products || (payload.data && payload.data.products) || []\n    const parsed = products.slice(0,12).map((p,i)=>{\n      const item = (p.items && p.items[0]) || {}\n      const img = (item.images && item.images[0] && (item.images[0].imageUrl || item.images[0].imageUrl250)) || null\n      const price = (item.sellers && item.sellers[0] && item.sellers[0].commertialOffer && item.sellers[0].commertialOffer.Price) || (p.priceRange && p.priceRange.sellingPrice && p.priceRange.sellingPrice.highPrice) || null\n      return { id: p.productId || ('v'+i), name: p.productName || p.name || 'Camisa Dudalina', color: item.nameComplete || '', price: price, imageUrl: img }\n    }).filter(p=>p.imageUrl)\n    if(parsed.length){ d2.state.catalog = parsed; d2.state.catalogSource = 'live' }\n    else { d2.state.catalog = FALLBACK_CATALOG; d2.state.catalogSource = 'fallback' }\n  }catch(e){\n    d2.state.catalog = FALLBACK_CATALOG\n    d2.state.catalogSource = 'fallback'\n  }\n}\nasync function runGeneration(d2){\n  const p = d2.state.selectedProduct, ph = d2.state.selectedPhoto\n  if(!p || !ph) return\n  d2.state.step = 'generating'\n  d2.state.status = 'running'\n  d2.state.resultUrl = null\n  d2.state.loadingPhase = 0\n  const phaseTimer = setInterval(()=>{ d2.state.loadingPhase = (d2.state.loadingPhase||0) + 1 }, 3200)\n  const store = d2.store(d2.params.session)\n  const email = store.get('email','')\n  try{\n    const raw = await d2.rush(d2.params.tryonRush).invoke({ email: email, product: p.name, photoUrl: ph.url, garmentImageUrl: p.imageUrl })\n    const res = (raw && raw.data && typeof raw.data === 'object' && 'ok' in raw.data) ? raw.data : raw\n    if(res && res.ok && res.resultUrl){\n      d2.state.resultUrl = res.resultUrl\n      d2.state.status = 'done'\n      d2.state.step = 'result'\n    } else {\n      d2.state.status = 'error'\n      d2.state.errorDetail = (res && res.error) || JSON.stringify(raw).slice(0,200)\n      d2.state.step = 'error'\n    }\n  }catch(e){\n    d2.state.status = 'error'\n    d2.state.errorDetail = String(e && e.message || e).slice(0,200)\n    d2.state.step = 'error'\n  } finally {\n    clearInterval(phaseTimer)\n  }\n}\nconst LOADING_MESSAGES = [\n  'Analisando suas proporcoes...',\n  'Aplicando o tecido da peca...',\n  'Ajustando caimento e sombras...',\n  'Finalizando os detalhes...',\n]\nexport default {\n  css: `\n    .root{height:100%;box-sizing:border-box;overflow:auto;background:#f3efe6;font-family:-apple-system,BlinkMacSystemFont,'Helvetica Neue',Arial,sans-serif;color:#1a2744}\n    header{background:#1a2744;color:#f3efe6;padding:18px 32px;display:flex;align-items:center;gap:16px}\n    .dudlogo2{height:20px;width:auto;display:block}\n    .htitle{font-size:15px;font-weight:600;letter-spacing:.02em}\n    .steps{display:flex;justify-content:center;align-items:center;gap:0;background:#fff;border-bottom:1px solid #e6dfcd;padding:14px 20px}\n    .step{display:flex;align-items:center;gap:8px;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:#b7ad98;font-weight:700}\n    .step .dot{width:22px;height:22px;border-radius:50%;border:1.5px solid #d8d3c8;display:flex;align-items:center;justify-content:center;font-size:11px;color:#b7ad98;background:#fff}\n    .step.active{color:#1a2744}\n    .step.active .dot{border-color:#6b2e2e;background:#6b2e2e;color:#fff}\n    .step.done .dot{border-color:#7a4a2b;background:#7a4a2b;color:#fff}\n    .step-sep{width:40px;height:1px;background:#e6dfcd;margin:0 10px}\n    .stage{max-width:1040px;margin:0 auto;padding:44px 32px 70px;animation:fadeIn .45s ease both;box-sizing:border-box}\n    @keyframes fadeIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}\n    .stage-head{text-align:center;margin-bottom:34px}\n    .eyebrow{font-size:11px;letter-spacing:.18em;text-transform:uppercase;color:#7a4a2b;font-weight:700}\n    .stage h1{font-size:30px;font-weight:600;margin:8px 0 0;letter-spacing:-.01em}\n    .stage .sub{color:#6b6f7c;font-size:14px;margin-top:8px}\n    .back{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:#6b6f7c;cursor:pointer;text-decoration:none;margin-bottom:18px}\n    .back:hover{color:#1a2744}\n    .search{display:flex;gap:8px;margin:0 auto 14px;max-width:520px}\n    .search input{flex:1;font-family:inherit;font-size:14px;padding:13px 16px;border:1px solid #d8d3c8;border-radius:2px;outline:none;background:#fff;color:#1a2744;box-sizing:border-box}\n    .search input:focus{border-color:#7a4a2b}\n    .search button{font-family:inherit;font-size:12px;letter-spacing:.08em;text-transform:uppercase;font-weight:700;background:#1a2744;color:#f3efe6;border:0;padding:0 22px;border-radius:2px;cursor:pointer}\n    .tag2{display:block;text-align:center;margin:0 0 26px;font-size:10px;letter-spacing:.04em;color:#8b8370}\n    .grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:20px}\n    .card{cursor:pointer;border:2px solid transparent;border-radius:8px;padding:0;background:#fff;transition:transform .18s ease,box-shadow .18s ease,border-color .18s ease;overflow:hidden;box-shadow:0 1px 3px rgba(26,39,68,.08)}\n    .card:hover{transform:translateY(-4px);box-shadow:0 14px 28px rgba(26,39,68,.16)}\n    .card img{width:100%;height:260px;object-fit:cover;background:#eee;display:block}\n    .cbody{padding:14px 16px}\n    .cname{font-size:12.5px;line-height:1.35;margin-bottom:4px}\n    .cprice{font-size:13px;color:#7a4a2b;font-weight:700}\n    .pgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:22px;max-width:900px;margin:0 auto}\n    .ph{cursor:pointer;border:2px solid transparent;border-radius:10px;padding:0;text-align:center;background:#fff;overflow:hidden;transition:transform .18s ease,box-shadow .18s ease,border-color .18s ease;box-shadow:0 1px 3px rgba(26,39,68,.08)}\n    .ph:hover{transform:translateY(-4px);box-shadow:0 14px 28px rgba(26,39,68,.16)}\n    .ph img{width:100%;height:280px;object-fit:cover;display:block}\n    .ph.upload{display:flex;flex-direction:column;align-items:center;justify-content:center;position:relative;height:280px;border:2px dashed #d8d3c8;background:#faf9f6;box-shadow:none}\n    .ph.upload:hover{border-color:#7a4a2b;transform:none;box-shadow:none}\n    .ph.upload input{position:absolute;inset:0;opacity:0;cursor:pointer}\n    .plus{width:56px;height:56px;border-radius:50%;background:#eee7d8;display:flex;align-items:center;justify-content:center;font-size:26px;color:#7a4a2b;margin-bottom:10px}\n    .plabel{font-size:12.5px;padding:12px 10px;color:#1a2744}\n    .confirm-row{display:flex;align-items:center;justify-content:center;gap:28px;margin-bottom:38px;flex-wrap:wrap}\n    .confirm-card{width:220px;text-align:center}\n    .confirm-card img{width:100%;height:260px;object-fit:cover;border-radius:10px;box-shadow:0 8px 24px rgba(26,39,68,.14)}\n    .confirm-card .ccap{font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:#8b8370;margin-top:12px}\n    .confirm-card .cname2{font-size:13.5px;font-weight:600;margin-top:2px}\n    .plusicon{font-size:28px;color:#c9a97a;font-weight:300}\n    .cta-wrap{text-align:center}\n    .btn-cta{background:#6b2e2e;color:#f3efe6;border:0;padding:18px 48px;font-size:13px;letter-spacing:.14em;text-transform:uppercase;font-weight:700;cursor:pointer;border-radius:2px;transition:background .15s}\n    .btn-cta:hover{background:#7a4a2b}\n    .loading-stage{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:100px 20px 120px;text-align:center}\n    .glow{width:140px;height:140px;border-radius:50%;background:radial-gradient(circle,rgba(107,46,46,.22),rgba(107,46,46,0) 70%);display:flex;align-items:center;justify-content:center;margin-bottom:28px;animation:pulse 2.2s ease-in-out infinite}\n    @keyframes pulse{0%,100%{transform:scale(1);opacity:.85}50%{transform:scale(1.12);opacity:1}}\n    .glow-core{width:64px;height:64px;border-radius:50%;background:#1a2744;display:flex;align-items:center;justify-content:center;color:#c9a97a;font-size:26px}\n    .loading-msg{font-size:15px;color:#1a2744;font-weight:600;min-height:22px;animation:fadeIn .35s ease}\n    .loading-bar{width:220px;height:3px;background:#e6dfcd;border-radius:3px;overflow:hidden;margin-top:22px;position:relative}\n    .loading-bar::after{content:'';position:absolute;top:0;left:-40%;width:40%;height:100%;background:#6b2e2e;animation:slide 1.3s ease-in-out infinite}\n    @keyframes slide{0%{left:-40%}100%{left:100%}}\n    .result-stage{text-align:center}\n    .result-stage img{max-width:100%;max-height:520px;border-radius:10px;box-shadow:0 20px 50px rgba(26,39,68,.22);animation:reveal .6s ease both}\n    @keyframes reveal{from{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}\n    .result-actions{margin-top:26px;display:flex;gap:14px;justify-content:center;flex-wrap:wrap}\n    .btn-ghost{background:none;border:1.5px solid #1a2744;color:#1a2744;padding:13px 26px;border-radius:2px;font-size:12px;text-transform:uppercase;letter-spacing:.08em;font-weight:700;cursor:pointer;text-decoration:none;display:inline-block}\n    .btn-ghost:hover{background:#1a2744;color:#fff}\n    .err-box{max-width:420px;margin:0 auto;text-align:center}\n    .err-box p{color:#8b2020;font-size:14px}\n    .err-detail{font-size:10px;color:#b08a8a;margin-top:8px}\n    .locked{height:100%;display:flex;align-items:center;justify-content:center}\n    .lockbox{max-width:420px;text-align:center;background:#fff;padding:44px;border-radius:6px}\n    .lockbox h2{margin:8px 0}\n    .lockbox .link{display:inline-block;margin-top:14px;background:#1a2744;color:#f3efe6;text-decoration:none;padding:12px 20px;border-radius:2px;font-size:12px;text-transform:uppercase;letter-spacing:.08em}\n    @media (max-width:640px){ .stage{padding:30px 18px 50px} .stage h1{font-size:24px} }\n  `,\n  render(d2){\n    const store = d2.store(d2.params.session)\n    const gated = store.get('gateOk', false)\n    if(!gated){\n      return `<div class=\"root locked\"><div class=\"lockbox\">\n        <div class=\"eyebrow\">Provador virtual</div>\n        <h2>Acesso bloqueado</h2>\n        <p>Complete seu cadastro na tela inicial para liberar o provador virtual.</p>\n        <button class=\"link go-gate\">Voltar ao cadastro</button>\n      </div></div>`\n    }\n    const step = d2.state.step || 'shirt'\n    const catalog = d2.state.catalog || []\n    const source = d2.state.catalogSource || 'loading'\n    const sel = d2.state.selectedProduct\n    const photo = d2.state.selectedPhoto\n    const stepIdx = step==='shirt' ? 0 : step==='photo' ? 1 : 2\n    const showStepper = step==='shirt' || step==='photo' || step==='confirm' || step==='error'\n\n    const stepper = `<div class=\"steps\">\n      <div class=\"step ${stepIdx===0?'active':stepIdx>0?'done':''}\"><span class=\"dot\">${stepIdx>0?'&#10003;':'1'}</span> Peca</div>\n      <div class=\"step-sep\"></div>\n      <div class=\"step ${stepIdx===1?'active':stepIdx>1?'done':''}\"><span class=\"dot\">${stepIdx>1?'&#10003;':'2'}</span> Foto</div>\n      <div class=\"step-sep\"></div>\n      <div class=\"step ${stepIdx===2?'active':''}\"><span class=\"dot\">3</span> Seu look</div>\n    </div>`\n\n    let stage = ''\n    if(step === 'shirt'){\n      const sourceTag = source==='fallback' ? 'Catalogo de referencia' : source==='live' ? 'Catalogo ao vivo dudalina.com.br' : ''\n      const cards = catalog.length ? catalog.map(p=>`\n        <div class=\"card\" data-id=\"${p.id}\">\n          <img src=\"${p.imageUrl}\" alt=\"${p.name}\"/>\n          <div class=\"cbody\"><div class=\"cname\">${p.name}</div><div class=\"cprice\">${p.price ? d2.fmt.currency(p.price,'BRL') : ''}</div></div>\n        </div>`).join('') : `<p style=\"grid-column:1/-1;text-align:center;color:#9a9583\">Carregando catalogo...</p>`\n      stage = `<div class=\"stage\">\n        <div class=\"stage-head\"><div class=\"eyebrow\">Passo 1 de 3</div><h1>Escolha sua peca</h1><p class=\"sub\">Selecione uma camisa ou blazer Dudalina para experimentar</p></div>\n        <div class=\"search\"><input class=\"q\" placeholder=\"Buscar (ex: camisa social, blazer, linho)\" value=\"${d2.state.query||''}\"/><button class=\"qgo\">Buscar</button></div>\n        ${sourceTag ? `<span class=\"tag2\">${sourceTag}</span>` : ''}\n        <div class=\"grid\">${cards}</div>\n      </div>`\n    } else if(step === 'photo'){\n      const avatarCards = AVATARS.map(a=>`\n        <div class=\"ph\" data-photo-id=\"${a.id}\"><img src=\"${a.url}\"/><div class=\"plabel\">${a.label}</div></div>`).join('')\n      stage = `<div class=\"stage\">\n        <a class=\"back go-shirt\">&#8592; Trocar peca</a>\n        <div class=\"stage-head\"><div class=\"eyebrow\">Passo 2 de 3</div><h1>Quem vai experimentar?</h1><p class=\"sub\">Escolha um dos nossos modelos ou envie sua propria foto</p></div>\n        <div class=\"pgrid\">${avatarCards}\n          <label class=\"ph upload\"><input type=\"file\" accept=\"image/*\" class=\"upl\"/><div class=\"plus\">+</div><div class=\"plabel\">Enviar minha foto</div></label>\n        </div>\n      </div>`\n    } else if(step === 'confirm' || step === 'error'){\n      const confirmRow = `<div class=\"confirm-row\">\n        <div class=\"confirm-card\"><img src=\"${photo?photo.url:''}\"/><div class=\"ccap\">Modelo</div><div class=\"cname2\">${photo?photo.label:''}</div></div>\n        <div class=\"plusicon\">+</div>\n        <div class=\"confirm-card\"><img src=\"${sel?sel.imageUrl:''}\"/><div class=\"ccap\">Peca</div><div class=\"cname2\">${sel?sel.name:''}</div></div>\n      </div>`\n      if(step === 'error'){\n        stage = `<div class=\"stage\">\n          <div class=\"stage-head\"><div class=\"eyebrow\">Passo 3 de 3</div><h1>Seu look</h1></div>\n          ${confirmRow}\n          <div class=\"err-box\"><p>Nao foi possivel gerar a imagem agora. Tente novamente em instantes.</p><p class=\"err-detail\">${(d2.state.errorDetail||'').replace(/</g,'&lt;')}</p>\n          <div class=\"result-actions\"><button class=\"btn-cta retry-gen\">Tentar novamente</button><button class=\"btn-ghost go-shirt\">Trocar selecao</button></div></div>\n        </div>`\n      } else {\n        stage = `<div class=\"stage\">\n          <a class=\"back go-photo\">&#8592; Trocar foto</a>\n          <div class=\"stage-head\"><div class=\"eyebrow\">Passo 3 de 3</div><h1>Pronto para ver o resultado?</h1></div>\n          ${confirmRow}\n          <div class=\"cta-wrap\"><button class=\"btn-cta go-generate\">Gerar meu look</button></div>\n        </div>`\n      }\n    } else if(step === 'generating'){\n      const msg = LOADING_MESSAGES[(d2.state.loadingPhase||0) % LOADING_MESSAGES.length]\n      stage = `<div class=\"stage\">\n        <div class=\"loading-stage\">\n          <div class=\"glow\"><div class=\"glow-core\"><svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M12 2l2.2 6.8L21 11l-6.8 2.2L12 20l-2.2-6.8L3 11l6.8-2.2L12 2z\" fill=\"#c9a97a\"/></svg></div></div>\n          <div class=\"loading-msg\">${msg}</div>\n          <div class=\"loading-bar\"></div>\n        </div>\n      </div>`\n    } else if(step === 'result'){\n      stage = `<div class=\"stage result-stage\">\n        <div class=\"eyebrow\">Pronto</div>\n        <h1 style=\"margin-bottom:22px\">Assim ficaria voce com ${sel?sel.name:'a peca'}</h1>\n        <img src=\"${d2.state.resultUrl}\" alt=\"Resultado\"/>\n        <div class=\"result-actions\">\n          <button class=\"btn-cta go-shirt\">Experimentar outra peca</button>\n          <a class=\"btn-ghost\" href=\"${d2.state.resultUrl}\" download target=\"_blank\">Baixar imagem</a>\n        </div>\n      </div>`\n    }\n\n    return `<div class=\"root\">\n      <header><svg class=\"dudlogo2\" xmlns=\"http://www.w3.org/2000/svg\" width=\"175\" height=\"24\" viewBox=\"0 0 1305.71 179.8\"><path d=\"M66.52,55.29c1.99,6.71,10.01,32.4,11.94,38.64.87,3.03,4.33,4.07,7.31,4.07.03,0,.06,0,.09,0s.06,0,.08,0c2.97,0,6.44-1.04,7.31-4.07,1.93-6.24,9.95-31.93,11.94-38.64.79-2.66,1.61-7.33,1.98-9.58.13-.81.25-1.62.32-2.44.27-3.17.23-6-.11-8.64-.88-6.8-3.73-12.04-8.35-18.79l-8.63-13.12c-1.72-2.35-3.35-2.71-4.54-2.71-1.55,0-3.22.94-4.54,2.71l-8.63,13.12c-4.62,6.75-7.47,11.99-8.35,18.79-.34,2.64-.38,5.47-.11,8.64.07.82.18,1.63.32,2.44.37,2.25,1.19,6.92,1.98,9.58\" fill=\"white\"/><path d=\"M96.66,106.86h-21.61c-.23,0-.47.01-.69.04-3.35.36-5.87,3.16-5.87,6.53s2.52,6.17,5.86,6.52c.23.03.46.04.7.04h21.61c.23,0,.47-.01.7-.04,3.34-.35,5.86-3.16,5.86-6.52s-2.52-6.17-5.87-6.53c-.23-.02-.46-.04-.69-.04\" fill=\"white\"/><path d=\"M90.67,140.96c-.11-1.15-.22-2.25-.35-3.27-.29-2.31-2.23-4.03-4.46-4.07-2.23.04-4.17,1.76-4.46,4.07-.13,1.02-.24,2.12-.35,3.27-.6,6.1-1.34,13.69-6.25,19.01-1.66,1.47-2.47,2.89-2.43,4.22.02.62.26,1.53,1.21,2.27.27.23,6.67,5.62,10.06,8.01l.24.16c.24.16.51.34.79.49.74.39,1.64.39,2.38,0,.29-.15.56-.33.8-.49l.24-.16c3.38-2.4,9.79-7.78,10.06-8.01.96-.74,1.19-1.64,1.21-2.27.05-1.32-.77-2.74-2.43-4.22-4.91-5.33-5.65-12.92-6.25-19.01\" fill=\"white\"/><path d=\"M57.63,99.53c1.58,1.17,3.27,1.61,4.75,1.24,1.15-.29,2.11-1.07,2.61-2.15.51-1.09.52-2.36.02-3.57-.26-.64-.66-1.23-1.17-1.76-1.06-1.15-2.13-2.31-3.2-3.48-8.2-8.93-16.68-18.16-25.57-23.17-11.91-5.6-23.31-3-30.48,6.95C.05,80.15-1.19,88.28,1.18,95.89c2.72,8.74,10.2,13.2,16.41,13.74.43.04.84.06,1.25.06,3.4,0,6.06-1.29,7.23-3.56,1.12-2.17,1.34-6.07-3.93-12.24-1.82-2.32-1.86-6.17-.08-8.95,1.16-1.83,4.08-4.65,10.48-3.18,9.07,3.49,16.75,10.34,24.18,16.96l.92.81Z\" fill=\"white\"/><path d=\"M75.03,133.01c.65-1.53.67-3.02.04-4.11-.44-.76-1.17-1.25-2.01-1.35-1.66-.18-3.22,1.13-4.17,3.48-.89,2.09-2.56,4.91-5.49,6.46-1.05.56-2.12.91-3.06,1.03-3.45.09-4.34-1.04-5.36-2.34-.68-.86-1.45-1.84-2.87-2.41-1.52-.79-4.04-.3-5.78,1.13-1.93,1.59-2.55,4.02-1.71,6.62,1.29,4.72,6.3,8.49,10.94,8.29.57.07,1.13.1,1.69.1,2.53,0,4.98-.7,7.28-2.09,3.87-2.33,7.14-6.51,9.47-12.09.37-.88.71-1.8,1.03-2.74\" fill=\"white\"/><path d=\"M167.11,73.6c-7.18-9.95-18.57-12.54-30.48-6.95-8.89,5-17.37,14.24-25.57,23.17-1.07,1.16-2.14,2.33-3.2,3.47-.5.53-.9,1.12-1.17,1.76-.5,1.21-.49,2.48.02,3.57.5,1.07,1.45,1.85,2.61,2.15,1.48.38,3.17-.07,4.75-1.24l.92-.81c7.43-6.62,15.11-13.47,24.18-16.96,6.4-1.47,9.31,1.36,10.48,3.18,1.77,2.78,1.74,6.63-.08,8.95-5.27,6.17-5.04,10.07-3.92,12.24,1.17,2.27,3.83,3.56,7.23,3.56.41,0,.83-.02,1.25-.06,6.21-.54,13.69-5,16.41-13.74,2.37-7.62,1.13-15.74-3.42-22.3\" fill=\"white\"/><path d=\"M125.37,134.91c-1.74-1.43-4.26-1.91-5.78-1.13-1.42.57-2.19,1.54-2.86,2.41-1.03,1.3-1.91,2.43-5.36,2.34-.94-.13-2.01-.48-3.06-1.03-2.93-1.55-4.6-4.37-5.49-6.46-.95-2.36-2.51-3.67-4.17-3.48-.83.09-1.56.58-2,1.35-.63,1.09-.61,2.58.04,4.11.32.94.66,1.86,1.02,2.74,2.32,5.58,5.59,9.76,9.47,12.09,2.3,1.39,4.74,2.09,7.28,2.09.56,0,1.12-.03,1.69-.1,4.64.2,9.64-3.57,10.94-8.29.84-2.6.23-5.03-1.7-6.62\" fill=\"white\"/><path d=\"M367.09,169.8c32.88,0,51.54-26.21,51.54-76.65s-18.44-75.31-51.1-75.31c-4.44,0-13.11.44-17.77.89v150.18c4.66.45,12.89.89,17.33.89M314.88,151.14V36.51c0-14.66-4.89-21.99-20-22.22v-2.67h7.11c9.55,0,18.88.22,30.44.22,15.55,0,28.21-.44,41.1-.44,50.21,0,81.53,30.66,81.53,80.2s-32.88,84.64-84.2,84.64c-12.89,0-23.99-.44-38.43-.44-11.55,0-20.22.22-30.44.22h-7.11v-2.67c15.11-.22,20-7.55,20-22.22\" fill=\"white\"/><path d=\"M610.88,173.36v2.67h-45.77l-2.44-22.22c-7.33,13.33-21.55,25.99-42.21,25.99s-38.43-13.11-38.43-40.88v-55.1c0-21.55-1.78-26.22-17.11-26.22v-2.67c26.66,0,40.88-.89,51.32-4.22l1.33,1.56c-2.44,6-3.11,14-3.11,31.55v53.76c0,17.99,10,25.77,23.1,25.77,9.78,0,18.66-4.66,23.99-14v-65.54c0-21.55-2-26.22-17.11-26.22v-2.67c26.66,0,40.88-.89,51.32-4.22l1.33,1.56c-2.45,6-3.11,14-3.11,31.55v70.65c0,14.22,2.44,18.88,16.89,18.88\" fill=\"white\"/><path d=\"M679.57,166.47c9.33,0,16.88-4.66,22.22-10.22v-86.2c-4.44-3.33-11.33-7.33-20.22-7.33-20.44,0-32.88,18.66-32.88,51.76s11.55,51.99,30.88,51.99M702.24,160.47c-8,10.22-20.44,18.88-37.77,18.88-27.99,0-49.32-23.1-49.32-62.21s21.99-65.54,52.43-65.54c14.44,0,25.55,5.55,34.21,13.11v-26.58c0-21.55-2-26.22-17.11-26.22v-2.67c24.22-.22,38.21-2.67,51.1-6.89l1.56,1.33c-2.89,11.11-3.11,20.44-3.11,34.44v118.11c0,12.22,4.67,17.11,17.11,17.11v2.67c-11.55,0-33.77,0-45.54.22l-3.55-15.77Z\" fill=\"white\"/><path d=\"M806.19,167.58c8.66,0,15.55-4.22,20.44-9.78v-48.21c-25.11-4-41.99,4.22-41.99,29.33,0,19.11,8.44,28.66,21.55,28.66M797.97,67.39c-13.55,0-25.55,6.44-32.44,21.55l-2.44-.89c5.33-21.11,22.66-37.77,50.43-37.77s45.77,16.22,45.77,42.43v63.54c0,12.22,4.67,17.11,17.11,17.11v2.67c-11.78,0-33.77,0-45.54.22l-3.33-14c-7.11,9.33-19.33,17.11-35.1,17.11-19.99,0-38.88-13.11-38.88-36.88,0-32.21,33.33-45.77,73.09-37.55v-9.33c0-18.88-12.22-28.22-28.66-28.22\" fill=\"white\"/><path d=\"M883.6,11.93v-2.67c24.44-.22,38.43-2.67,51.32-6.89l1.33,1.33c-2.89,11.11-3.11,20.44-3.11,34.44v118.11c0,12.22,4.44,17.11,17.11,17.11v2.67h-5.33c-9.55,0-17.33-.22-27.99-.22s-18.44.22-27.77.22h-5.55v-2.67c12.88,0,17.11-4.89,17.11-17.11V38.14c0-21.55-1.78-26.22-17.11-26.22\" fill=\"white\"/><path d=\"M991.2,6.11c10.44,0,18.66,7.55,18.66,17.33s-8.22,17.33-18.66,17.33-18.44-7.55-18.44-17.33,8.22-17.33,18.44-17.33M975.87,156.25v-72.43c0-21.55-2-26.21-17.11-26.21v-2.67c26.66,0,40.88-.89,51.32-4.22l1.33,1.56c-2.44,6-3.11,14-3.11,31.55v72.43c0,12.22,4.22,17.11,17.11,17.11v2.67h-5.33c-9.55,0-17.55-.22-27.99-.22s-18.44.22-27.99.22h-5.33v-2.67c12.89,0,17.11-4.89,17.11-17.11\" fill=\"white\"/><path d=\"M1033.47,57.61v-2.67c26.21,0,39.32-.89,50.21-4.22l1.33,1.78c-2.44,5.11-3.11,12-3.11,24.44,7.33-12.89,21.55-25.77,42.21-25.77s38.43,13.11,38.43,41.1v63.98c0,12.22,4.22,17.11,16.89,17.11v2.67h-5.11c-9.55,0-17.55-.22-27.99-.22s-18.66.22-27.99.22h-5.55v-2.67c12.89,0,17.11-4.89,17.11-17.11v-62.65c0-18.22-10-25.77-23.1-25.77-9.55,0-18.44,4.44-23.77,13.33v75.09c0,12.22,4.22,17.11,17.11,17.11v2.67h-5.33c-9.55,0-17.55-.22-27.99-.22s-18.44.22-27.99.22h-5.33v-2.67c12.88,0,17.11-4.89,17.11-17.11v-72.42c0-21.55-2-26.22-17.11-26.22\" fill=\"white\"/><path d=\"M1235.5,167.58c8.66,0,15.55-4.22,20.44-9.78v-48.21c-25.1-4-41.99,4.22-41.99,29.33,0,19.11,8.44,28.66,21.55,28.66M1227.28,67.39c-13.55,0-25.55,6.44-32.44,21.55l-2.44-.89c5.33-21.11,22.66-37.77,50.43-37.77s45.77,16.22,45.77,42.43v63.54c0,12.22,4.67,17.11,17.11,17.11v2.67c-11.78,0-33.77,0-45.54.22l-3.33-14c-7.11,9.33-19.33,17.11-35.1,17.11-19.99,0-38.88-13.11-38.88-36.88,0-32.21,33.33-45.77,73.09-37.55v-9.33c0-18.88-12.22-28.22-28.66-28.22\" fill=\"white\"/></svg><div class=\"htitle\">Provador Virtual</div></header>\n      ${showStepper ? stepper : ''}\n      ${stage}\n    </div>`\n  },\n  mounted(d2){\n    loadCatalog(d2)\n    d2.on('.qgo','click', ()=>{\n      const el = d2.$('.q')\n      const v = (el && el.value || '').trim()\n      d2.state.query = v\n      loadCatalog(d2, v)\n    })\n    d2.on('.q','keydown',(e)=>{ if(e.key==='Enter'){ const b=d2.$('.qgo'); if(b) b.click() } })\n    d2.on('.card','click',(e,el)=>{\n      const id = el.dataset.id\n      const p = (d2.state.catalog||[]).find(x=>String(x.id)===id)\n      d2.state.selectedProduct = p\n      d2.state.step = 'photo'\n    })\n    d2.on('.ph[data-photo-id]','click',(e,el)=>{\n      const id = el.dataset.photoId\n      const a = AVATARS.find(x=>x.id===id)\n      d2.state.selectedPhoto = a\n      d2.state.step = 'confirm'\n    })\n    d2.on('.upl','change',(e,el)=>{\n      const file = el.files && el.files[0]\n      if(!file) return\n      const reader = new FileReader()\n      reader.onload = ()=>{ d2.state.selectedPhoto = { id:'upload', url: reader.result, label:'Sua foto' }; d2.state.step = 'confirm' }\n      reader.readAsDataURL(file)\n    })\n    d2.on('.go-shirt','click', ()=>{ d2.state.step='shirt'; d2.state.status='idle'; d2.state.resultUrl=null; d2.state.selectedProduct=null; d2.state.selectedPhoto=null })\n    d2.on('.go-photo','click', ()=>{ d2.state.step='photo' })\n    d2.on('.retry-gen','click', ()=> runGeneration(d2))\n    d2.on('.go-generate','click', ()=> runGeneration(d2))\n    // TEMP: d2.router().goTo() e no-op (bug no bridge). Remover quando o fix sair.\n    const nav = (path) => {\n      const R = 'dud-routerInterface'\n      try {\n        const i = d2.process(R) && d2.process(R).instance\n        if (i && typeof i.goTo === 'function') return i.goTo(path)\n        if (i && i.history && typeof i.history.push === 'function') return i.history.push(path)\n      } catch (e) {}\n      try {\n        const L = (window.D2Env && window.D2Env.layers) || {}\n        for (const n of Object.keys(L)) {\n          const i = L[n] && L[n].processes && L[n].processes[R] && L[n].processes[R].instance\n          if (i && typeof i.goTo === 'function') return i.goTo(path)\n        }\n      } catch (e) {}\n      window.location.assign(path)\n    }\n    d2.on('.go-gate','click', ()=> nav('/'))\n  },\n}","at":"2026-08-04T21:06:06.953Z"}}},{"_id":"6a72094ec8e65f51f8367b1e","component":"data2-core-types@Component","system":"6a71fb04034c99fe6b932f42","params":{"extends":"data2-core-primitives@Block","component":"dud-gate-ui","package":"industrias","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"export default {\n  css: `\n    .root{height:100%;display:flex;align-items:center;justify-content:center;background:#1a2744;font-family:-apple-system,BlinkMacSystemFont,'Helvetica Neue',Arial,sans-serif;color:#f3efe6;box-sizing:border-box;padding:32px;overflow:auto}\n    .dudlogo{height:26px;width:auto;display:block}\n    .wrap{width:100%;max-width:960px;display:grid;grid-template-columns:1.1fr 1fr;gap:0;background:#f3efe6;border-radius:2px;overflow:hidden;box-shadow:0 30px 80px rgba(0,0,0,.45)}\n    .hero{background:#1a2744;color:#f3efe6;padding:56px 44px;display:flex;flex-direction:column;justify-content:center;gap:18px;min-height:420px;box-sizing:border-box}\n    .word{font-size:13px;letter-spacing:.35em;text-transform:uppercase;color:#c9a97a;font-family:Arial,sans-serif}\n    .head{font-size:32px;line-height:1.2;font-weight:400;margin:0}\n    .sub{font-size:14px;line-height:1.6;color:#cfd3de;font-family:Arial,sans-serif;max-width:360px}\n    .tag{margin-top:auto;font-size:12px;font-style:italic;color:#8b93a8;font-family:Arial,sans-serif}\n    .panel{padding:48px 40px;display:flex;flex-direction:column;gap:14px;background:#fff;box-sizing:border-box}\n    .eyebrow{font-size:11px;letter-spacing:.2em;text-transform:uppercase;color:#7a4a2b;font-family:Arial,sans-serif;font-weight:700}\n    .ptitle{font-size:20px;color:#1a2744;margin:0 0 6px;font-family:Arial,sans-serif;font-weight:600}\n    label{font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:#6b6f7c;font-family:Arial,sans-serif;font-weight:600}\n    input{font-family:Arial,sans-serif;font-size:15px;padding:12px 14px;border:1px solid #d8d3c8;border-radius:2px;outline:none;color:#1a2744;background:#faf9f6;box-sizing:border-box;width:100%}\n    input:focus{border-color:#7a4a2b}\n    .field{display:flex;flex-direction:column;gap:6px}\n    .btn{margin-top:8px;background:#6b2e2e;color:#f3efe6;border:0;padding:14px 20px;font-size:13px;letter-spacing:.12em;text-transform:uppercase;font-family:Arial,sans-serif;font-weight:700;cursor:pointer;border-radius:2px;transition:background .15s}\n    .btn:hover{background:#7a4a2b}\n    .btn[disabled]{opacity:.5;cursor:default}\n    .fine{font-size:11px;color:#9a9583;font-family:Arial,sans-serif;line-height:1.5}\n    .err{font-size:12px;color:#8b2020;font-family:Arial,sans-serif}\n    .success{display:flex;flex-direction:column;gap:16px;align-items:flex-start}\n    .success h3{margin:0;color:#1a2744;font-family:Arial,sans-serif}\n    .link{display:inline-block;background:#1a2744;color:#f3efe6;text-decoration:none;padding:13px 22px;font-size:12px;letter-spacing:.1em;text-transform:uppercase;font-family:Arial,sans-serif;font-weight:700;border-radius:2px;cursor:pointer;border:0;transition:background .15s}\n    .link:hover{background:#2a3a5c}\n    @media (max-width:720px){ .wrap{grid-template-columns:1fr} .hero{padding:36px 28px;min-height:220px} .panel{padding:32px 26px} }\n  `,\n  render(d2){\n    const step = d2.state.step || 'form'\n    const err = d2.state.error || ''\n    const busy = step === 'submitting'\n    const heroBlock = `\n      <div class=\"hero\">\n        <svg class=\"dudlogo\" xmlns=\"http://www.w3.org/2000/svg\" width=\"210\" height=\"29\" viewBox=\"0 0 1305.71 179.8\"><path d=\"M66.52,55.29c1.99,6.71,10.01,32.4,11.94,38.64.87,3.03,4.33,4.07,7.31,4.07.03,0,.06,0,.09,0s.06,0,.08,0c2.97,0,6.44-1.04,7.31-4.07,1.93-6.24,9.95-31.93,11.94-38.64.79-2.66,1.61-7.33,1.98-9.58.13-.81.25-1.62.32-2.44.27-3.17.23-6-.11-8.64-.88-6.8-3.73-12.04-8.35-18.79l-8.63-13.12c-1.72-2.35-3.35-2.71-4.54-2.71-1.55,0-3.22.94-4.54,2.71l-8.63,13.12c-4.62,6.75-7.47,11.99-8.35,18.79-.34,2.64-.38,5.47-.11,8.64.07.82.18,1.63.32,2.44.37,2.25,1.19,6.92,1.98,9.58\" fill=\"#c9a97a\"/><path d=\"M96.66,106.86h-21.61c-.23,0-.47.01-.69.04-3.35.36-5.87,3.16-5.87,6.53s2.52,6.17,5.86,6.52c.23.03.46.04.7.04h21.61c.23,0,.47-.01.7-.04,3.34-.35,5.86-3.16,5.86-6.52s-2.52-6.17-5.87-6.53c-.23-.02-.46-.04-.69-.04\" fill=\"#c9a97a\"/><path d=\"M90.67,140.96c-.11-1.15-.22-2.25-.35-3.27-.29-2.31-2.23-4.03-4.46-4.07-2.23.04-4.17,1.76-4.46,4.07-.13,1.02-.24,2.12-.35,3.27-.6,6.1-1.34,13.69-6.25,19.01-1.66,1.47-2.47,2.89-2.43,4.22.02.62.26,1.53,1.21,2.27.27.23,6.67,5.62,10.06,8.01l.24.16c.24.16.51.34.79.49.74.39,1.64.39,2.38,0,.29-.15.56-.33.8-.49l.24-.16c3.38-2.4,9.79-7.78,10.06-8.01.96-.74,1.19-1.64,1.21-2.27.05-1.32-.77-2.74-2.43-4.22-4.91-5.33-5.65-12.92-6.25-19.01\" fill=\"#c9a97a\"/><path d=\"M57.63,99.53c1.58,1.17,3.27,1.61,4.75,1.24,1.15-.29,2.11-1.07,2.61-2.15.51-1.09.52-2.36.02-3.57-.26-.64-.66-1.23-1.17-1.76-1.06-1.15-2.13-2.31-3.2-3.48-8.2-8.93-16.68-18.16-25.57-23.17-11.91-5.6-23.31-3-30.48,6.95C.05,80.15-1.19,88.28,1.18,95.89c2.72,8.74,10.2,13.2,16.41,13.74.43.04.84.06,1.25.06,3.4,0,6.06-1.29,7.23-3.56,1.12-2.17,1.34-6.07-3.93-12.24-1.82-2.32-1.86-6.17-.08-8.95,1.16-1.83,4.08-4.65,10.48-3.18,9.07,3.49,16.75,10.34,24.18,16.96l.92.81Z\" fill=\"#c9a97a\"/><path d=\"M75.03,133.01c.65-1.53.67-3.02.04-4.11-.44-.76-1.17-1.25-2.01-1.35-1.66-.18-3.22,1.13-4.17,3.48-.89,2.09-2.56,4.91-5.49,6.46-1.05.56-2.12.91-3.06,1.03-3.45.09-4.34-1.04-5.36-2.34-.68-.86-1.45-1.84-2.87-2.41-1.52-.79-4.04-.3-5.78,1.13-1.93,1.59-2.55,4.02-1.71,6.62,1.29,4.72,6.3,8.49,10.94,8.29.57.07,1.13.1,1.69.1,2.53,0,4.98-.7,7.28-2.09,3.87-2.33,7.14-6.51,9.47-12.09.37-.88.71-1.8,1.03-2.74\" fill=\"#c9a97a\"/><path d=\"M167.11,73.6c-7.18-9.95-18.57-12.54-30.48-6.95-8.89,5-17.37,14.24-25.57,23.17-1.07,1.16-2.14,2.33-3.2,3.47-.5.53-.9,1.12-1.17,1.76-.5,1.21-.49,2.48.02,3.57.5,1.07,1.45,1.85,2.61,2.15,1.48.38,3.17-.07,4.75-1.24l.92-.81c7.43-6.62,15.11-13.47,24.18-16.96,6.4-1.47,9.31,1.36,10.48,3.18,1.77,2.78,1.74,6.63-.08,8.95-5.27,6.17-5.04,10.07-3.92,12.24,1.17,2.27,3.83,3.56,7.23,3.56.41,0,.83-.02,1.25-.06,6.21-.54,13.69-5,16.41-13.74,2.37-7.62,1.13-15.74-3.42-22.3\" fill=\"#c9a97a\"/><path d=\"M125.37,134.91c-1.74-1.43-4.26-1.91-5.78-1.13-1.42.57-2.19,1.54-2.86,2.41-1.03,1.3-1.91,2.43-5.36,2.34-.94-.13-2.01-.48-3.06-1.03-2.93-1.55-4.6-4.37-5.49-6.46-.95-2.36-2.51-3.67-4.17-3.48-.83.09-1.56.58-2,1.35-.63,1.09-.61,2.58.04,4.11.32.94.66,1.86,1.02,2.74,2.32,5.58,5.59,9.76,9.47,12.09,2.3,1.39,4.74,2.09,7.28,2.09.56,0,1.12-.03,1.69-.1,4.64.2,9.64-3.57,10.94-8.29.84-2.6.23-5.03-1.7-6.62\" fill=\"#c9a97a\"/><path d=\"M367.09,169.8c32.88,0,51.54-26.21,51.54-76.65s-18.44-75.31-51.1-75.31c-4.44,0-13.11.44-17.77.89v150.18c4.66.45,12.89.89,17.33.89M314.88,151.14V36.51c0-14.66-4.89-21.99-20-22.22v-2.67h7.11c9.55,0,18.88.22,30.44.22,15.55,0,28.21-.44,41.1-.44,50.21,0,81.53,30.66,81.53,80.2s-32.88,84.64-84.2,84.64c-12.89,0-23.99-.44-38.43-.44-11.55,0-20.22.22-30.44.22h-7.11v-2.67c15.11-.22,20-7.55,20-22.22\" fill=\"#c9a97a\"/><path d=\"M610.88,173.36v2.67h-45.77l-2.44-22.22c-7.33,13.33-21.55,25.99-42.21,25.99s-38.43-13.11-38.43-40.88v-55.1c0-21.55-1.78-26.22-17.11-26.22v-2.67c26.66,0,40.88-.89,51.32-4.22l1.33,1.56c-2.44,6-3.11,14-3.11,31.55v53.76c0,17.99,10,25.77,23.1,25.77,9.78,0,18.66-4.66,23.99-14v-65.54c0-21.55-2-26.22-17.11-26.22v-2.67c26.66,0,40.88-.89,51.32-4.22l1.33,1.56c-2.45,6-3.11,14-3.11,31.55v70.65c0,14.22,2.44,18.88,16.89,18.88\" fill=\"#c9a97a\"/><path d=\"M679.57,166.47c9.33,0,16.88-4.66,22.22-10.22v-86.2c-4.44-3.33-11.33-7.33-20.22-7.33-20.44,0-32.88,18.66-32.88,51.76s11.55,51.99,30.88,51.99M702.24,160.47c-8,10.22-20.44,18.88-37.77,18.88-27.99,0-49.32-23.1-49.32-62.21s21.99-65.54,52.43-65.54c14.44,0,25.55,5.55,34.21,13.11v-26.58c0-21.55-2-26.22-17.11-26.22v-2.67c24.22-.22,38.21-2.67,51.1-6.89l1.56,1.33c-2.89,11.11-3.11,20.44-3.11,34.44v118.11c0,12.22,4.67,17.11,17.11,17.11v2.67c-11.55,0-33.77,0-45.54.22l-3.55-15.77Z\" fill=\"#c9a97a\"/><path d=\"M806.19,167.58c8.66,0,15.55-4.22,20.44-9.78v-48.21c-25.11-4-41.99,4.22-41.99,29.33,0,19.11,8.44,28.66,21.55,28.66M797.97,67.39c-13.55,0-25.55,6.44-32.44,21.55l-2.44-.89c5.33-21.11,22.66-37.77,50.43-37.77s45.77,16.22,45.77,42.43v63.54c0,12.22,4.67,17.11,17.11,17.11v2.67c-11.78,0-33.77,0-45.54.22l-3.33-14c-7.11,9.33-19.33,17.11-35.1,17.11-19.99,0-38.88-13.11-38.88-36.88,0-32.21,33.33-45.77,73.09-37.55v-9.33c0-18.88-12.22-28.22-28.66-28.22\" fill=\"#c9a97a\"/><path d=\"M883.6,11.93v-2.67c24.44-.22,38.43-2.67,51.32-6.89l1.33,1.33c-2.89,11.11-3.11,20.44-3.11,34.44v118.11c0,12.22,4.44,17.11,17.11,17.11v2.67h-5.33c-9.55,0-17.33-.22-27.99-.22s-18.44.22-27.77.22h-5.55v-2.67c12.88,0,17.11-4.89,17.11-17.11V38.14c0-21.55-1.78-26.22-17.11-26.22\" fill=\"#c9a97a\"/><path d=\"M991.2,6.11c10.44,0,18.66,7.55,18.66,17.33s-8.22,17.33-18.66,17.33-18.44-7.55-18.44-17.33,8.22-17.33,18.44-17.33M975.87,156.25v-72.43c0-21.55-2-26.21-17.11-26.21v-2.67c26.66,0,40.88-.89,51.32-4.22l1.33,1.56c-2.44,6-3.11,14-3.11,31.55v72.43c0,12.22,4.22,17.11,17.11,17.11v2.67h-5.33c-9.55,0-17.55-.22-27.99-.22s-18.44.22-27.99.22h-5.33v-2.67c12.89,0,17.11-4.89,17.11-17.11\" fill=\"#c9a97a\"/><path d=\"M1033.47,57.61v-2.67c26.21,0,39.32-.89,50.21-4.22l1.33,1.78c-2.44,5.11-3.11,12-3.11,24.44,7.33-12.89,21.55-25.77,42.21-25.77s38.43,13.11,38.43,41.1v63.98c0,12.22,4.22,17.11,16.89,17.11v2.67h-5.11c-9.55,0-17.55-.22-27.99-.22s-18.66.22-27.99.22h-5.55v-2.67c12.89,0,17.11-4.89,17.11-17.11v-62.65c0-18.22-10-25.77-23.1-25.77-9.55,0-18.44,4.44-23.77,13.33v75.09c0,12.22,4.22,17.11,17.11,17.11v2.67h-5.33c-9.55,0-17.55-.22-27.99-.22s-18.44.22-27.99.22h-5.33v-2.67c12.88,0,17.11-4.89,17.11-17.11v-72.42c0-21.55-2-26.22-17.11-26.22\" fill=\"#c9a97a\"/><path d=\"M1235.5,167.58c8.66,0,15.55-4.22,20.44-9.78v-48.21c-25.1-4-41.99,4.22-41.99,29.33,0,19.11,8.44,28.66,21.55,28.66M1227.28,67.39c-13.55,0-25.55,6.44-32.44,21.55l-2.44-.89c5.33-21.11,22.66-37.77,50.43-37.77s45.77,16.22,45.77,42.43v63.54c0,12.22,4.67,17.11,17.11,17.11v2.67c-11.78,0-33.77,0-45.54.22l-3.33-14c-7.11,9.33-19.33,17.11-35.1,17.11-19.99,0-38.88-13.11-38.88-36.88,0-32.21,33.33-45.77,73.09-37.55v-9.33c0-18.88-12.22-28.22-28.66-28.22\" fill=\"#c9a97a\"/></svg>\n        <h1 class=\"head\">Prove antes de comprar.</h1>\n        <p class=\"sub\">Experimente digitalmente uma camisa Dudalina no seu proprio corpo, em segundos, com o nosso provador virtual com IA, antes de decidir a compra.</p>\n        <div class=\"tag\">\"um homem multiplo e autentico\"</div>\n      </div>`\n    if (step === 'success'){\n      return `<div class=\"root\"><div class=\"wrap\">${heroBlock}\n        <div class=\"panel\">\n          <div class=\"success\">\n            <div class=\"eyebrow\">Cadastro confirmado</div>\n            <h3>Tudo pronto.</h3>\n            <p class=\"fine\">Enviamos seu acesso ao provador virtual. Clique abaixo para experimentar uma camisa agora.</p>\n            <button class=\"link go-tryon\">Ir para o provador virtual &#8594;</button>\n          </div>\n        </div></div></div>`\n    }\n    return `<div class=\"root\"><div class=\"wrap\">${heroBlock}\n      <div class=\"panel\">\n        <div class=\"eyebrow\">Acesso ao provador virtual</div>\n        <h2 class=\"ptitle\">Comece por aqui</h2>\n        <div class=\"field\"><label>Nome (opcional)</label><input class=\"in-name\" placeholder=\"Seu nome\" ${busy?'disabled':''}/></div>\n        <div class=\"field\"><label>E-mail</label><input class=\"in-email\" type=\"email\" placeholder=\"voce@email.com\" ${busy?'disabled':''}/></div>\n        ${err ? `<div class=\"err\">${err}</div>` : ''}\n        <button class=\"btn go\" ${busy?'disabled':''}>${busy?'Enviando...':'Entrar no provador'}</button>\n        <div class=\"fine\">Usamos seu e-mail apenas para liberar o provador virtual e enviar novidades da Dudalina. Sem spam.</div>\n      </div></div></div>`\n  },\n  mounted(d2){\n    // TEMP: d2.router().goTo() e no-op (bug no bridge). Remover quando o fix sair.\n    const nav = (path) => {\n      const R = 'dud-routerInterface'\n      try {\n        const i = d2.process(R) && d2.process(R).instance\n        if (i && typeof i.goTo === 'function') return i.goTo(path)\n        if (i && i.history && typeof i.history.push === 'function') return i.history.push(path)\n      } catch (e) {}\n      try {\n        const L = (window.D2Env && window.D2Env.layers) || {}\n        for (const n of Object.keys(L)) {\n          const i = L[n] && L[n].processes && L[n].processes[R] && L[n].processes[R].instance\n          if (i && typeof i.goTo === 'function') return i.goTo(path)\n        }\n      } catch (e) {}\n      window.location.assign(path)\n    }\n    d2.on('.go','click', async ()=>{\n      const emailEl = d2.$('.in-email'), nameEl = d2.$('.in-name')\n      const email = (emailEl && emailEl.value || '').trim()\n      const name = (nameEl && nameEl.value || '').trim()\n      if(!email || !email.includes('@')){ d2.state.error = 'Informe um e-mail valido.'; return }\n      d2.state.error = ''\n      d2.state.step = 'submitting'\n      try{\n        await d2.rush(d2.params.leadsRush).invoke({ email: email, name: name })\n        d2.store(d2.params.session).set('gateOk', true)\n        d2.store(d2.params.session).set('email', email)\n        d2.store(d2.params.session).set('name', name)\n        d2.state.step = 'success'\n      }catch(e){\n        d2.state.error = 'Nao foi possivel concluir o cadastro agora. Tente novamente.'\n        d2.state.step = 'form'\n      }\n    })\n    d2.on('.in-email','keydown',(e)=>{ if(e.key==='Enter'){ const b=d2.$('.go'); if(b) b.click() } })\n    d2.on('.go-tryon','click', ()=> nav('/tryon'))\n  },\n}"}},"leadsRush":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"leadsRush"}}}},"session":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"session"}}}},"tryonUrl":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"tryonUrl"}}}}}}}},"__d2PrevCode":{"code":"export default {\n  css: `\n    .root{height:100%;display:flex;align-items:center;justify-content:center;background:#1a2744;font-family:-apple-system,BlinkMacSystemFont,'Helvetica Neue',Arial,sans-serif;color:#f3efe6;box-sizing:border-box;padding:32px;overflow:auto}\n    .dudlogo{height:26px;width:auto;display:block}\n    .wrap{width:100%;max-width:960px;display:grid;grid-template-columns:1.1fr 1fr;gap:0;background:#f3efe6;border-radius:2px;overflow:hidden;box-shadow:0 30px 80px rgba(0,0,0,.45)}\n    .hero{background:#1a2744;color:#f3efe6;padding:56px 44px;display:flex;flex-direction:column;justify-content:center;gap:18px;min-height:420px;box-sizing:border-box}\n    .word{font-size:13px;letter-spacing:.35em;text-transform:uppercase;color:#c9a97a;font-family:Arial,sans-serif}\n    .head{font-size:32px;line-height:1.2;font-weight:400;margin:0}\n    .sub{font-size:14px;line-height:1.6;color:#cfd3de;font-family:Arial,sans-serif;max-width:360px}\n    .tag{margin-top:auto;font-size:12px;font-style:italic;color:#8b93a8;font-family:Arial,sans-serif}\n    .panel{padding:48px 40px;display:flex;flex-direction:column;gap:14px;background:#fff;box-sizing:border-box}\n    .eyebrow{font-size:11px;letter-spacing:.2em;text-transform:uppercase;color:#7a4a2b;font-family:Arial,sans-serif;font-weight:700}\n    .ptitle{font-size:20px;color:#1a2744;margin:0 0 6px;font-family:Arial,sans-serif;font-weight:600}\n    label{font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:#6b6f7c;font-family:Arial,sans-serif;font-weight:600}\n    input{font-family:Arial,sans-serif;font-size:15px;padding:12px 14px;border:1px solid #d8d3c8;border-radius:2px;outline:none;color:#1a2744;background:#faf9f6;box-sizing:border-box;width:100%}\n    input:focus{border-color:#7a4a2b}\n    .field{display:flex;flex-direction:column;gap:6px}\n    .btn{margin-top:8px;background:#6b2e2e;color:#f3efe6;border:0;padding:14px 20px;font-size:13px;letter-spacing:.12em;text-transform:uppercase;font-family:Arial,sans-serif;font-weight:700;cursor:pointer;border-radius:2px;transition:background .15s}\n    .btn:hover{background:#7a4a2b}\n    .btn[disabled]{opacity:.5;cursor:default}\n    .fine{font-size:11px;color:#9a9583;font-family:Arial,sans-serif;line-height:1.5}\n    .err{font-size:12px;color:#8b2020;font-family:Arial,sans-serif}\n    .success{display:flex;flex-direction:column;gap:16px;align-items:flex-start}\n    .success h3{margin:0;color:#1a2744;font-family:Arial,sans-serif}\n    .link{display:inline-block;background:#1a2744;color:#f3efe6;text-decoration:none;padding:13px 22px;font-size:12px;letter-spacing:.1em;text-transform:uppercase;font-family:Arial,sans-serif;font-weight:700;border-radius:2px;cursor:pointer;border:0;transition:background .15s}\n    .link:hover{background:#2a3a5c}\n    @media (max-width:720px){ .wrap{grid-template-columns:1fr} .hero{padding:36px 28px;min-height:220px} .panel{padding:32px 26px} }\n  `,\n  render(d2){\n    const step = d2.state.step || 'form'\n    const err = d2.state.error || ''\n    const busy = step === 'submitting'\n    const heroBlock = `\n      <div class=\"hero\">\n        <svg class=\"dudlogo\" xmlns=\"http://www.w3.org/2000/svg\" width=\"126\" height=\"26\" viewBox=\"0 0 194 40\" fill=\"none\"><rect width=\"193.02\" height=\"39.5791\" transform=\"translate(0.490234 0.210449)\" fill=\"#c9a97a\"/><path d=\"M42.1216 11.2361H50.1152C51.3786 11.2361 52.5547 11.4245 53.6435 11.8058C54.7322 12.1871 55.6694 12.7384 56.4642 13.4643C57.259 14.1901 57.8746 15.086 58.3248 16.1564C58.7704 17.2268 58.9955 18.4626 58.9955 19.8638C58.9955 21.265 58.7704 22.4732 58.3248 23.5436C57.8792 24.614 57.259 25.5144 56.4642 26.2357C55.6694 26.9616 54.7322 27.5083 53.6435 27.8804C52.5547 28.2525 51.3786 28.4363 50.1152 28.4363H42.1216V11.2361ZM46.9775 15.4351V24.2373H49.9131C51.1259 24.2373 52.109 23.856 52.8579 23.098C53.6067 22.34 53.9834 21.2604 53.9834 19.8592C53.9834 18.458 53.6067 17.3279 52.8579 16.5698C52.109 15.8118 51.1259 15.4305 49.9131 15.4305H46.9775V15.4351Z\" fill=\"#1a2744\"/><path d=\"M66.8102 20.6493C66.8102 21.7795 67.0904 22.6615 67.6463 23.2909C68.2022 23.9203 69.0199 24.2373 70.0995 24.2373C71.1791 24.2373 72.0245 23.9111 72.5895 23.2634C73.1546 22.6156 73.4348 21.7335 73.4348 20.6218V11.2361H78.2907V20.9755C78.2907 22.023 78.1116 23.0061 77.7486 23.9341C77.3857 24.8621 76.8574 25.6798 76.1683 26.3873C75.4746 27.0948 74.6201 27.6553 73.6002 28.0687C72.5803 28.4822 71.4134 28.6889 70.095 28.6889C68.7765 28.6889 67.6142 28.496 66.6035 28.1055C65.5928 27.7196 64.7383 27.1821 64.0492 26.4976C63.3555 25.8131 62.8364 24.9999 62.4826 24.0581C62.1289 23.1118 61.9497 22.0873 61.9497 20.9709V11.2361H66.8056V20.6448L66.8102 20.6493Z\" fill=\"#1a2744\"/><path d=\"M82.1406 11.2361H90.1343C91.3976 11.2361 92.5737 11.4245 93.6625 11.8058C94.7513 12.1871 95.6885 12.7384 96.4832 13.4643C97.278 14.1901 97.8936 15.086 98.3438 16.1564C98.7895 17.2268 99.0146 18.4626 99.0146 19.8638C99.0146 21.265 98.7895 22.4732 98.3438 23.5436C97.8982 24.614 97.278 25.5144 96.4832 26.2357C95.6885 26.9616 94.7513 27.5083 93.6625 27.8804C92.5737 28.2525 91.3976 28.4363 90.1343 28.4363H82.1406V11.2361ZM86.9965 15.4351V24.2373H89.9321C91.145 24.2373 92.1281 23.856 92.8769 23.098C93.6257 22.34 94.0025 21.2604 94.0025 19.8592C94.0025 18.458 93.6257 17.3279 92.8769 16.5698C92.1281 15.8118 91.145 15.4305 89.9321 15.4305H86.9965V15.4351Z\" fill=\"#1a2744\"/><path d=\"M106.223 11.2361H111.937L118.337 28.4363H113.431L112.392 25.5282H105.69L104.679 28.4363H99.7725L106.223 11.2361ZM106.902 21.9632H111.202L109.075 16.0185L106.898 21.9632H106.902Z\" fill=\"#1a2744\"/><path d=\"M120.437 28.4409V11.2361H125.292V24.2373H133.539V28.4363H120.437V28.4409Z\" fill=\"#1a2744\"/><path d=\"M136.02 11.2361H140.875V28.4363H136.02V11.2361Z\" fill=\"#1a2744\"/><path d=\"M149.83 18.9771V28.4363H144.974V11.2361H149.173L156.987 20.7229V11.2361H161.843V28.4363H157.644L149.83 18.9771Z\" fill=\"#1a2744\"/><path d=\"M170.369 11.2361H176.084L182.483 28.4363H177.577L176.539 25.5282H169.836L168.825 28.4363H163.919L170.369 11.2361ZM171.054 21.9632H175.354L173.226 16.0185L171.049 21.9632H171.054Z\" fill=\"#1a2744\"/></svg>\n        <h1 class=\"head\">Prove antes de comprar.</h1>\n        <p class=\"sub\">Experimente digitalmente uma camisa Dudalina no seu proprio corpo, em segundos, com o nosso provador virtual com IA, antes de decidir a compra.</p>\n        <div class=\"tag\">\"um homem multiplo e autentico\"</div>\n      </div>`\n    if (step === 'success'){\n      return `<div class=\"root\"><div class=\"wrap\">${heroBlock}\n        <div class=\"panel\">\n          <div class=\"success\">\n            <div class=\"eyebrow\">Cadastro confirmado</div>\n            <h3>Tudo pronto.</h3>\n            <p class=\"fine\">Enviamos seu acesso ao provador virtual. Clique abaixo para experimentar uma camisa agora.</p>\n            <button class=\"link go-tryon\">Ir para o provador virtual &#8594;</button>\n          </div>\n        </div></div></div>`\n    }\n    return `<div class=\"root\"><div class=\"wrap\">${heroBlock}\n      <div class=\"panel\">\n        <div class=\"eyebrow\">Acesso ao provador virtual</div>\n        <h2 class=\"ptitle\">Comece por aqui</h2>\n        <div class=\"field\"><label>Nome (opcional)</label><input class=\"in-name\" placeholder=\"Seu nome\" ${busy?'disabled':''}/></div>\n        <div class=\"field\"><label>E-mail</label><input class=\"in-email\" type=\"email\" placeholder=\"voce@email.com\" ${busy?'disabled':''}/></div>\n        ${err ? `<div class=\"err\">${err}</div>` : ''}\n        <button class=\"btn go\" ${busy?'disabled':''}>${busy?'Enviando...':'Entrar no provador'}</button>\n        <div class=\"fine\">Usamos seu e-mail apenas para liberar o provador virtual e enviar novidades da Dudalina. Sem spam.</div>\n      </div></div></div>`\n  },\n  mounted(d2){\n    // TEMP: d2.router().goTo() e no-op (bug no bridge). Remover quando o fix sair.\n    const nav = (path) => {\n      const R = 'dud-routerInterface'\n      try {\n        const i = d2.process(R) && d2.process(R).instance\n        if (i && typeof i.goTo === 'function') return i.goTo(path)\n        if (i && i.history && typeof i.history.push === 'function') return i.history.push(path)\n      } catch (e) {}\n      try {\n        const L = (window.D2Env && window.D2Env.layers) || {}\n        for (const n of Object.keys(L)) {\n          const i = L[n] && L[n].processes && L[n].processes[R] && L[n].processes[R].instance\n          if (i && typeof i.goTo === 'function') return i.goTo(path)\n        }\n      } catch (e) {}\n      window.location.assign(path)\n    }\n    d2.on('.go','click', async ()=>{\n      const emailEl = d2.$('.in-email'), nameEl = d2.$('.in-name')\n      const email = (emailEl && emailEl.value || '').trim()\n      const name = (nameEl && nameEl.value || '').trim()\n      if(!email || !email.includes('@')){ d2.state.error = 'Informe um e-mail valido.'; return }\n      d2.state.error = ''\n      d2.state.step = 'submitting'\n      try{\n        await d2.rush(d2.params.leadsRush).invoke({ email: email, name: name })\n        d2.store(d2.params.session).set('gateOk', true)\n        d2.store(d2.params.session).set('email', email)\n        d2.store(d2.params.session).set('name', name)\n        d2.state.step = 'success'\n      }catch(e){\n        d2.state.error = 'Nao foi possivel concluir o cadastro agora. Tente novamente.'\n        d2.state.step = 'form'\n      }\n    })\n    d2.on('.in-email','keydown',(e)=>{ if(e.key==='Enter'){ const b=d2.$('.go'); if(b) b.click() } })\n    d2.on('.go-tryon','click', ()=> nav('/tryon'))\n  },\n}","at":"2026-08-04T18:33:41.070Z"}}},{"_id":"5ed9bed7b9e0891ce913e884","component":"data2-core-types@Component","params":{"package":"data2-core","component":"DataSource","renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1366,"exactWidth":false,"exactHeight":false,"height":768}}}}},{"_id":"5f472ae463c680de4ff296e9","component":"data2-core-types@Component","params":{"package":"data2-core","component":"Data2TableDataSource","extends":"data2-core@DataSource","renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1366,"exactWidth":false,"exactHeight":false,"height":768}}}}}]}},{"reference":"ExternalComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"_id":"5f060d9b1ca96def42f3c40a","displayName":"Builder AuthStrategy","component":"data2-core@AuthenticationStrategy","system":"5e3b796d6228227ca637d0f4","params":{"credentials":[{"component":"data2-core-types@DataSetColumnReference","params":{"column":"email"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"password"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"status"}}],"verifier":{"component":"data2-core-types@DataSetReference","params":{"reference":"UsersDataSet"}},"sessionShared":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"password":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"password"}},"email":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"email"}},"resetPassword":{"resetEmail":{"artboard":{"params":{"preventEvaluation":true,"reference":"nR6Q9d7qdaPtZhJ28Q8Dy"},"component":"data2-core-types@ArtboardReference"}},"resetSuccessEmail":{"artboard":{"params":{"preventEvaluation":true,"reference":"yPCJBTKo8q1Mw0B_3Kpwl"},"component":"data2-core-types@ArtboardReference"}}},"session":[{"component":"data2-core-types@DataSetColumnReference","params":{"column":"name"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"email"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"password"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"status"}}],"sessionMetadata":{"params":{"actions":[{"params":{"compare":{"params":{"subject":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user._id"}}}},{"params":{"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"active"}},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user.status"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is active user"}]},"component":"data2-core-logical-operators@And","displayName":"is active and has _id"}},"component":"data2-core-logical-operators@Not"},"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"check $user"},{"params":{"action":{"params":{"pattern":{"component":"data2-core-primitives@String","params":{"content":"@data2.app"}},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user.email"}}}}},"component":"data2-core-functions@Includes","displayName":"isData2User"},"resultName":{"component":"data2-core-primitives@String","params":{"content":"is_data2_user"}}},"component":"data2-core-flow@Step"},{"params":{"action":{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.d2_app"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"management"}}]},"component":"data2-core-functions@Includes","displayName":"isData2App Exception"},"resultName":{"component":"data2-core-primitives@String","params":{"content":"is_data2_app_exception"}}},"component":"data2-core-flow@Step"},{"params":{"resultName":{"component":"data2-core-primitives@String","params":{"content":"has_access"}},"action":{"params":{"compare":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"is_data2_user"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"is_data2_app_exception"}}}}]},"component":"data2-core-logical-operators@Or"},"else":{"params":{"actions":[{"params":{"actions":[{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}},"component":"data2-core-logical-operators@Not"},"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"check $metadata.system"},{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":"filter","args":[{"_id":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}}]},"component":"data2-core-types@Interaction"},{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records.length"}}}}},"component":"data2-core-logical-operators@Not","displayName":"systems not found"},"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"check system found"},{"params":{"actions":[{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":"filter","args":[{"user":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user._id"}}}},"organization":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.organization._id"}}}}}]},"component":"data2-core-types@Interaction"},{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"NqKAY34n2ffFL64zamp7t"}},"prop":"filter","args":[{"user":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user._id"}}}},"system":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}}]},"component":"data2-core-types@Interaction"}]},"component":"data2-core-flow@Parallel"}]},"component":"data2-core-flow@Series","displayName":"common setup"},{"params":{"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"else":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"compare":{"params":{"components":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"system"}}],"body":{"params":{"expression":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.visibility"}}}},"defaultCase":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"public"}},"value":{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is org member"},{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.role"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"owner"}},{"component":"data2-core-primitives@String","params":{"content":"billing-owner"}},{"component":"data2-core-primitives@String","params":{"content":"admin"}},{"component":"data2-core-primitives@String","params":{"content":"member"}}]},"component":"data2-core-functions@Includes","displayName":"has role with access"}]},"component":"data2-core-logical-operators@And","displayName":"has org member role with access"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is org member"},{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is org member"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.role"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"collaborator"}}},"component":"data2-core-comparison-operators@Equal","displayName":"is collaborator"}]},"component":"data2-core-logical-operators@And","displayName":"is org member and collaborator"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is collaborator"},{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"NqKAY34n2ffFL64zamp7t"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"access"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"access.system._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system._id"}}}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFind","displayName":"has system access"}]},"component":"data2-core-logical-operators@And","displayName":"is collaborator and has system access"}]},"component":"data2-core-logical-operators@Or"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"private"}},"value":{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is org member"},{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.role"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"owner"}},{"component":"data2-core-primitives@String","params":{"content":"admin"}}]},"component":"data2-core-functions@Includes","displayName":"is owner/admin"}]},"component":"data2-core-logical-operators@And","displayName":"has org member role with access"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is owner/admin"},{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is org member"},{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"NqKAY34n2ffFL64zamp7t"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"access"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"access.system._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system._id"}}}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFind","displayName":"has system access"}]},"component":"data2-core-logical-operators@And","displayName":"is member and has system access"}]},"component":"data2-core-logical-operators@Or","displayName":"is owner/admin or has system access"}}}]},"component":"data2-core-flow@Switch"}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-logical-operators@And","displayName":"has org member for all systems in request"}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series"},"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-flow@If"}},"component":"data2-core-flow@Step"},{"params":{"then":{"system":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}},"else":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"},"compare":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"has_access"}}}}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series"},"sessionExpiresIn":{"component":"data2-core-primitives@Number","params":{"content":604800}},"sessionRenewal":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"reference":"Data2BuilderAuthentication","updatedAt":"2025-10-28T02:48:49.233Z"},{"_id":"5f060ee51ca96def42f3fbd1","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"UsersTableDataSource"}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"reference":"UsersDataSet","updatedAt":"2026-03-04T21:16:40.291Z"},{"_id":"68f938cf5fb002e33752a43d","displayName":"InternalApplicationsAuthenticationStrategy","component":"data2-core@AuthenticationStrategy","system":"5e3b796d6228227ca637d0f4","params":{"resetPassword":{"resetEmail":{"artboard":{"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"}},"resetSuccessEmail":{"artboard":{"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"}}},"verifier":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"InternalApplicationsVerifierDataSet"}},"password":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"secret"}},"credentials":[{"component":"data2-core-types@FieldReference","params":{"key":"application"}},{"component":"data2-core-types@FieldReference","params":{"key":"secret"}},{"component":"data2-core-types@FieldReference","params":{"key":"status"}}],"session":[{"component":"data2-core-types@FieldReference","params":{"key":"application"}},{"component":"data2-core-types@FieldReference","params":{"key":"secret"}},{"component":"data2-core-types@FieldReference","params":{"key":"status"}}]},"reference":"InternalApplicationsAuthenticationStrategy","updatedAt":"2025-10-22T20:08:54.442Z","createdAt":"2025-10-22T20:04:31.198Z"},{"component":"data2-core@DataSet","reference":"SessionsDataSet","params":{"requiresConfirmation":false,"pk":"key","datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"data2sessionsdatasource"}}}},{"reference":"UsersTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@ServerSessionsDataSource","reference":"data2sessionsdatasource","params":{}},{"_id":"5f1600b70528b92601890f75","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ServiceComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ServiceComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:20.208Z","createdAt":"2020-07-20T20:38:15.436Z"},{"_id":"5f1602190528b92601890f7d","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":40000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentInstancesTableDataSource"}},"sort":{"_id":1},"pk":"_id","autoEdit":true,"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:07.089Z","createdAt":"2020-07-20T20:44:09.350Z"},{"_id":"5f16017f0528b92601890f7a","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"clientApplicationDomain"}}},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"reference":"FileComponentInstancesDataSet","updatedAt":"2023-08-03T16:08:18.193Z","createdAt":"2020-07-20T20:41:35.797Z"},{"_id":"5f1601990528b92601890f7b","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ApplicationsTableDataSource"}},"pk":"_id","autoEdit":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"params":{"column":"_id"},"component":"data2-core-types@DataSetColumnReference"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"reference":"ApplicationsDataSet","updatedAt":"2022-12-13T21:51:13.995Z","createdAt":"2020-07-20T20:42:01.657Z"},{"_id":"5f16172a0528b92601890f85","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":10000}}},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"DataComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"DataComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:12.831Z","createdAt":"2020-07-20T22:14:02.097Z"},{"_id":"60ddc1bbda3861ca65407c5a","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"clientApplicationDomain"}}},"pagination":{"size":1},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"}},"reference":"OneFileComponentInstancesDataSet","updatedAt":"2022-02-09T19:44:38.036Z","createdAt":"2020-07-20T20:41:35.797Z"},{"_id":"63ee3d38b8c9838c62fb05fb","displayName":"DriveFileComponentInstancesDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"filter":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core@Drive"}}},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"reference":"DriveFileComponentInstancesDataSet","updatedAt":"2025-12-04T21:58:32.367Z","createdAt":"2023-02-16T14:27:07.797Z"},{"reference":"ServiceComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a7204e8a9d7cf0ea992d618","component":"data2-rush@HTTPListener","reference":"dud-tryon-run","system":"6a71fb04034c99fe6b932f42","params":{"enableExecutionLogs":true,"insertLogsDataSet":{"component":"data2-core-types@DataSetReference","params":{"reference":"dud-tryon-runLogInsertDataSet"}},"readLogsDataSet":{"component":"data2-core-types@DataSetReference","params":{"reference":"dud-tryon-runLogReadDataSet"}},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":true}}]}},{"_id":"6a7201f7f827d6ddfb480425","component":"data2-rush@HTTPListener","reference":"dud-seed-catalog","system":"6a71fb04034c99fe6b932f42","params":{"enableExecutionLogs":true,"insertLogsDataSet":{"component":"data2-core-types@DataSetReference","params":{"reference":"dud-seed-catalogLogInsertDataSet"}},"readLogsDataSet":{"component":"data2-core-types@DataSetReference","params":{"reference":"dud-seed-catalogLogReadDataSet"}},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":true}}]}},{"_id":"6a72049ff6cb21d729ac1394","component":"data2-rush@HTTPListener","reference":"dud-lead-capture","system":"6a71fb04034c99fe6b932f42","params":{"enableExecutionLogs":true,"insertLogsDataSet":{"component":"data2-core-types@DataSetReference","params":{"reference":"dud-lead-captureLogInsertDataSet"}},"readLogsDataSet":{"component":"data2-core-types@DataSetReference","params":{"reference":"dud-lead-captureLogReadDataSet"}},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":true}}]}}]}},{"reference":"ComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a720d0aa9d7cf0ea992f794","component":"data2-core-primitives@Router","system":"6a71fb04034c99fe6b932f42","displayName":"dud-router","params":{"routerType":{"component":"data2-core-primitives@String","params":{"content":"browser"}},"routes":[{"component":"data2-core-primitives@Route","params":{"path":"","name":"Dudalina — Provador Virtual","content":{"component":"data2-core-types@ArtboardReference","params":{"reference":"_M06sT6E6UGYLrY8Kl030"}}}},{"component":"data2-core-primitives@Route","params":{"path":"/tryon","name":"Dudalina — Try-On","content":{"component":"data2-core-types@ArtboardReference","params":{"reference":"WEUiL8YgeACdVIo9LIfZn"}}}},{"component":"data2-core-primitives@Route","params":{"path":"/dashboard","name":"Dudalina — Dashboard","content":{"component":"data2-core-types@ArtboardReference","params":{"reference":"YQgpTTqrA-EbqSQZkPVrY"}}}},{"component":"data2-core-primitives@Route","params":{"path":"/sobre","name":"Dudalina — Business Case","content":{"component":"data2-core-types@ArtboardReference","params":{"reference":"NozKiPE6-UniwA8s2oM6q"}}}}]},"reference":"dud-router"},{"_id":"6a7203892d5391dbb692c329","component":"data2-core-primitives@Artboard","system":"6a71fb04034c99fe6b932f42","displayName":"dud-business-case","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"dud-business-case"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1100,"height":1500}},"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0}}},"reference":"NozKiPE6-UniwA8s2oM6q"},{"_id":"6a72058ff6cb21d729ac1771","component":"data2-core-primitives@Artboard","system":"6a71fb04034c99fe6b932f42","displayName":"dud-dashboard","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"dud-dashboard"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}},"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0}}},"reference":"YQgpTTqrA-EbqSQZkPVrY"},{"_id":"6a72058ce3e23473fe6dbe65","component":"data2-core-primitives@Artboard","system":"6a71fb04034c99fe6b932f42","displayName":"dud-tryon","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"dud-tryon"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":1180}},"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0}}},"reference":"WEUiL8YgeACdVIo9LIfZn"},{"_id":"6a72058642cd2f647001f662","component":"data2-core-primitives@Artboard","system":"6a71fb04034c99fe6b932f42","displayName":"dud-landing-gate","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"dud-landing-gate"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}},"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0}}},"reference":"_M06sT6E6UGYLrY8Kl030"},{"_id":"8b61c464d7bd30bb15781b63","parent":"6a7203892d5391dbb692c329","component":"data2-core-primitives@Block","system":"6a71fb04034c99fe6b932f42","displayName":"BizCase","params":{"position":{"component":"data2-core-types@Position","params":{"x":40,"y":40,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1020,"height":1420}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#1a2744"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":20}},"text":"DUDALINA — Provador Virtual (Grupo Veste)\nDemo comercial · Moda / Camisaria masculina\n\nO NEGÓCIO\nDudalina é a marca de menswear do Grupo Veste (BR premium fashion — também dono de Le Lis Blanc, John John, Bo.Bô, Individual), historicamente centrada em camisaria social/casual e alfaiataria (blazers, calças).\n\nO DESAFIO\nNo 1T26 o Grupo Veste cresceu receita líquida ajustada +14% (>R$306M), puxado por e-commerce — mas a Dudalina é a retardatária do portfólio: apenas +3% de crescimento consolidado (+10% mesmas lojas), contra +30,7% da Bo.Bô e +13,9% da Le Lis. Camisaria e alfaiataria são categorias muito sensíveis a caimento: e-commerce de moda no Brasil roda com devolução de 25–40%, e cada devolução custa 5–10% da receita do canal (~R$38 em logística reversa + mão de obra), em grande parte por erro de caimento (colarinho/manga/corte).\n\nA HIPÓTESE DO PILOTO\nUm provador virtual com IA — o cliente sobe uma foto (ou escolhe uma referência), experimenta a camisa digitalmente antes de comprar — ataca o problema de caimento na ponta e vira, ao mesmo tempo, uma isca de leads de altíssima intenção (quem experimenta uma peça está a um passo da compra).\n\nOS 4 KPIs QUE ESTA DEMO ENDEREÇA\n① Redução da taxa de devolução por caimento incorreto\n② Aumento da conversão no PDP / funil de compra online\n③ Aumento do ticket médio via upsell de \"look completo\" (camisa + blazer/acessório)\n④ Captura de leads qualificados para remarketing (a sessão de try-on é o gate)\n\nIDENTIDADE VISUAL (referências extraídas de dudalina.com.br)\nNavy #1a2744 · Creme/off-white #f3efe6 · Vinho #6b2e2e / Cognac #7a4a2b como destaque · Branco. Tipografia limpa, moderna, com tracking generoso no wordmark. Fotografia de produto em catálogo — fundo neutro, nunca lifestyle. Tagline do site: \"um homem múltiplo e autêntico\".\n\nCATÁLOGO\nAs 5 camisas do provador foram puxadas em tempo real do buscador público da própria Dudalina (VTEX Intelligent Search — endpoint público, sem autenticação) — nomes, cores e fotos reais do catálogo vigente. Fotos de modelo no seletor de foto são ilustrações placeholder (não são fotos de pessoas reais).\n\nESCOPO DESTA DEMO\n1 tela de gate (e-mail) → 1 tela de provador virtual (IA) → 1 dashboard de uso. Sem carrinho, sem checkout, sem conta, sem admin. Dados sintéticos exceto o catálogo público acima.\n\n---\nATUALIZAÇÃO 2026-08-04 (data2-architect)\nDudalina (Grupo Veste) — provador virtual com IA. 3 telas kind:code (gate/e-mail, try-on com Assistant.draw, dashboard data-driven) + tabelas dud-leads/dud-usage-events/dud-shirts + Rush dud-lead-capture/dud-tryon-run/dud-seed-catalog(VTEX). Status: STAGED, não publicado. ACHADO DE PLATAFORMA: este system (Industrias) retorna 401 em TODA chamada de data-plane (execute_rush_request, query_dataset, save_records, e uma chamada HTTP anônima direta ao endpoint do rush) mesmo com listeners UNGATED e nenhuma AuthenticationStrategy configurada — bloqueia a verificação em runtime dos 3 rushes para qualquer chamador (não é peculiaridade deste agente). inspect_code_component (sessão de builder autenticada) conseguiu ler as DataSets normalmente (dashboard renderizou zero-state real), mas não foi possível confirmar se um visitante anônimo real teria o mesmo acesso. Ver mcpFeedback submetido para detalhes.","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#f3efe6"}},"textSize":24,"textFormat":{"component":"data2-core-types@TextFormat","params":{"lineHeight":1.55}}},"index":0,"reference":"G9C_TCUXRo2cbt6vRX8oo"},{"_id":"3117c4ab63934e6445b3b90a","parent":"6a72058ff6cb21d729ac1771","component":"industrias@dud-dashboard-ui","system":"6a71fb04034c99fe6b932f42","displayName":"DashboardInstance","params":{"leads":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"dud-leadsDataSet"}},"usage":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"dud-usage-eventsDataSet"}},"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}}}},"reference":"MX4WN9AMOZLVjIBsDIN1h"},{"_id":"fb3e38f5d4fe99c85a759d54","parent":"6a72058ce3e23473fe6dbe65","component":"industrias@dud-tryon-ui","system":"6a71fb04034c99fe6b932f42","displayName":"TryOnInstance","params":{"session":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"dud-session"}},"catalogRush":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"dud-seed-catalog"}},"tryonRush":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"dud-tryon-run"}},"gateUrl":"https://industrias.data2.qa/preview/_M06sT6E6UGYLrY8Kl030","super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true,"exactX":0,"exactY":0}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":1180}}}},"reference":"z0_UvKw0OM-DhswDPktCg"},{"_id":"6a4dd96696654f3f79e44d20","parent":"6a72058642cd2f647001f662","component":"industrias@dud-gate-ui","system":"6a71fb04034c99fe6b932f42","displayName":"GateInstance","params":{"leadsRush":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"dud-lead-capture"}},"session":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"dud-session"}},"tryonUrl":"https://industrias.data2.qa/preview/WEUiL8YgeACdVIo9LIfZn","super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}}}},"reference":"zp1QpKkqweMtoep5ufgKR"}]}},{"_id":"5fc4faeec8da12be8bf3d08a","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"paginate":{"default":1000},"super":{},"table":"fileComponentInstances","schema":[{"component":"data2-core-types@Field","params":{"key":"component","title":"Component","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"system","title":"System","component":"data2-core-primitives@ObjectId"}},{"component":"data2-core-types@Field","params":{"key":"displayName","title":"Display Name","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"params","title":"Params","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"key":"reference","title":"Reference","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"fileId"}},"title":"File ID","component":"data2-core-primitives@ObjectId"},"break":true}],"hooks":{"before":{"all":[{"hook":"softDelete"}],"find":[{"hook":"useCache","options":{"additionalGroupKeys":["$and.0.system","$and.1.system"],"skipCache":true}}],"create":[{"hook":"timestamp","options":{"fields":["createdAt","updatedAt"]}}],"update":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}],"patch":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}]},"after":{"all":[{"hook":"fileUrl","options":{"downloadField":"params.fileUrl","uploadField":"params.uploadFileUrl","enhanceSchema":false}}],"find":[{"hook":"useCache","options":{"additionalGroupKeys":["$and.0.system","$and.1.system"],"skipCache":true}}],"create":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}],"update":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}],"patch":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}],"remove":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}]}},"multi":["create"],"useEstimatedDocumentCount":true},"reference":"FileComponentInstancesTableDataSource","updatedAt":"2022-12-19T20:42:51.837Z","createdAt":"2020-11-30T13:59:52.294Z"},{"reference":"ApplicationsTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a720d11d074528343bd23e5","displayName":"Dudalina Try-On","reference":"NaR7WeMfEg8ILwImqFU1f","params":{"name":{"component":"data2-core-primitives@String","params":{"content":"Dudalina Try-On"}},"shortName":{"component":"data2-core-primitives@String","params":{"content":"Dudalina Try-On"}},"domain":{"component":"data2-core-primitives@String","params":{"content":"dudalina-tryon"}},"serverSideRendering":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"entryPoint":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Router","reference":"dud-router"}},"responseHeaders":{"X-Frame-Options":{"component":"data2-core-primitives@String","params":{"content":""}},"Content-Security-Policy":{"component":"data2-core-primitives@String","params":{"content":""}},"X-XSS-Protection":{"component":"data2-core-primitives@String","params":{"content":""}}}},"system":"6a71fb04034c99fe6b932f42","component":"data2-core-primitives@Application"}]}},{"reference":"DataComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a7201cec8e65f51f83657c1","component":"data2-core@DataSet","system":"6a71fb04034c99fe6b932f42","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"dud-usage-events"}}},"reference":"dud-usage-eventsDataSet"},{"_id":"6a7201ca5edb8625eba44ead","component":"data2-core@DataSet","system":"6a71fb04034c99fe6b932f42","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"dud-leads"}}},"reference":"dud-leadsDataSet"},{"_id":"6a72044fa9d7cf0ea992d38d","component":"data2-core@Store","system":"6a71fb04034c99fe6b932f42","params":{"initialData":{"leadCaptured":false,"email":"","name":"","gateEmailInput":"","gateNameInput":"","selectedShirtId":"","selectedShirtName":"","selectedShirtImage":"","selectedPhotoUrl":"","tryonLoading":false,"tryonResultUrl":"","tryonSuccess":false,"tryonDone":false}},"reference":"dud-session"},{"_id":"6a7201ce034c99fe6b934d4d","component":"data2-core@Data2TableDataSource","system":"6a71fb04034c99fe6b932f42","params":{"table":"dud-usage-events","schema":[{"component":"data2-core-types@Field","params":{"key":"email","title":"Email","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"product","title":"Product","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"timestamp","title":"Timestamp","component":"data2-core-primitives@Date"}},{"component":"data2-core-types@Field","params":{"key":"success","title":"Success","component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@Field","params":{"key":"resultUrl","title":"Result URL","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"day","title":"Day","component":"data2-core-primitives@String"}}]},"reference":"dud-usage-events"},{"_id":"6a7201caf6cb21d729ac0682","component":"data2-core@Data2TableDataSource","system":"6a71fb04034c99fe6b932f42","params":{"table":"dud-leads","schema":[{"component":"data2-core-types@Field","params":{"key":"email","title":"Email","component":"data2-core-primitives@String","required":true}},{"component":"data2-core-types@Field","params":{"key":"name","title":"Name","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"capturedAt","title":"Captured At","component":"data2-core-primitives@Date"}}]},"reference":"dud-leads"},{"_id":"6a7204e8c8e65f51f8366611","component":"data2-core@DataSet","system":"6a71fb04034c99fe6b932f42","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"d2-rush-http-logs--dud-tryon-run"}},"pagination":{"size":20},"sort":{"_id":-1}},"reference":"dud-tryon-runLogReadDataSet","type":"logs"},{"_id":"6a7204e899fe635f26e787c1","component":"data2-core@DataSet","system":"6a71fb04034c99fe6b932f42","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"d2-rush-http-logs--dud-tryon-run"}},"pagination":{"size":0}},"reference":"dud-tryon-runLogInsertDataSet","type":"logs"},{"_id":"6a7201f7e3e23473fe6dad18","component":"data2-core@DataSet","system":"6a71fb04034c99fe6b932f42","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"d2-rush-http-logs--dud-seed-catalog"}},"pagination":{"size":20},"sort":{"_id":-1}},"reference":"dud-seed-catalogLogReadDataSet","type":"logs"},{"_id":"6a7201f75edb8625eba44f4b","component":"data2-core@DataSet","system":"6a71fb04034c99fe6b932f42","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"d2-rush-http-logs--dud-seed-catalog"}},"pagination":{"size":0}},"reference":"dud-seed-catalogLogInsertDataSet","type":"logs"},{"_id":"6a72049d42cd2f647001f1fc","component":"data2-core@DataSet","system":"6a71fb04034c99fe6b932f42","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"d2-rush-http-logs--dud-lead-capture"}},"pagination":{"size":20},"sort":{"_id":-1}},"reference":"dud-lead-captureLogReadDataSet","type":"logs"},{"_id":"6a72049df6cb21d729ac1379","component":"data2-core@DataSet","system":"6a71fb04034c99fe6b932f42","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"d2-rush-http-logs--dud-lead-capture"}},"pagination":{"size":0}},"reference":"dud-lead-captureLogInsertDataSet","type":"logs"},{"_id":"6a7204e85edb8625eba45d2b","component":"data2-core@Data2TableDataSource","system":"6a71fb04034c99fe6b932f42","params":{"table":{"component":"data2-core-primitives@String","params":{"content":"d2-rush-http-logs--dud-tryon-run"}},"multi":["create"],"useEstimatedDocumentCount":true},"reference":"d2-rush-http-logs--dud-tryon-run","type":"logs"},{"_id":"6a7201f73f478ccd119d43b7","component":"data2-core@Data2TableDataSource","system":"6a71fb04034c99fe6b932f42","params":{"table":{"component":"data2-core-primitives@String","params":{"content":"d2-rush-http-logs--dud-seed-catalog"}},"multi":["create"],"useEstimatedDocumentCount":true},"reference":"d2-rush-http-logs--dud-seed-catalog","type":"logs"},{"_id":"6a72049de3e23473fe6db989","component":"data2-core@Data2TableDataSource","system":"6a71fb04034c99fe6b932f42","params":{"table":{"component":"data2-core-primitives@String","params":{"content":"d2-rush-http-logs--dud-lead-capture"}},"multi":["create"],"useEstimatedDocumentCount":true},"reference":"d2-rush-http-logs--dud-lead-capture","type":"logs"}]}},{"reference":"BundlesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}}],"processesParams":{}}}}