{"context":{"domain":"babi-lf"},"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},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"settings.defaultAccessPolicy"}}},"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":"2026-08-07T21:51:24.037Z","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":"6ab58b1260cbe7aa719c6d7b","name":"Lucas Fontana","domain":"babi-lf","visibility":"private","updatedAt":"2026-09-24T20:41:54.351Z","createdAt":"2026-09-24T20:41:54.351Z"}]}},{"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":"6ab5b717d41d6b6b0d5623ac","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"Footer","package":"babi-lf","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 DEFAULT_COLUMNS = [\n  { title: 'A loja', links: [\n    { label: 'Sobre o Lucas Fontana', href: '#' },\n    { label: 'Perguntas frequentes', href: '#' },\n    { label: 'Fale com o Lucas', href: '#' },\n    { label: 'Minha conta', href: '#' }\n  ] },\n  { title: 'Políticas', links: [\n    { label: 'Trocas e devoluções', href: '#' },\n    { label: 'Envio e entrega', href: '#' },\n    { label: 'Política de privacidade', short: 'Privacidade', href: '#' },\n    { label: 'Termos e condições de venda', short: 'Termos de venda', href: '#' }\n  ] },\n  { title: 'Atendimento (SAC)', plain: true, links: [\n    { label: '[E-MAIL DO SAC]' },\n    { label: '[WHATSAPP DO SAC]' },\n    { label: '[HORÁRIO DE ATENDIMENTO]' }\n  ] }\n];\n\nconst esc = (s) => String(s == null ? '' : s)\n  .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n\nconst svg = (inner) => `<svg class=\"ic\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">${inner}</svg>`;\nconst ICON_IG = svg('<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"5\"/><circle cx=\"12\" cy=\"12\" r=\"4\"/><circle cx=\"17.5\" cy=\"6.5\" r=\"0.8\" fill=\"currentColor\"/>');\nconst ICON_YT = svg('<rect x=\"2.5\" y=\"5\" width=\"19\" height=\"14\" rx=\"4\"/><path d=\"m10 9 5 3-5 3V9Z\"/>');\n\nexport default {\n  css: `\n:host { display: block; width: 100%; }\n* { box-sizing: border-box; }\n.lf-footer {\n  --red-500: #c8102e; --ink: #0b0b0c; --white: #ffffff;\n  --grey-200: #c9cacd; --grey-300: #a7a9ad; --graphite-700: #34363a; --line-inverse: #26282b;\n  container: lf / inline-size;\n  font-family: 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif;\n  -webkit-font-smoothing: antialiased;\n  background: var(--ink); color: var(--grey-200); width: 100%;\n}\n.lf-footer a:focus-visible { outline: 2px solid var(--red-500); outline-offset: 2px; }\n.rule { height: 6px; display: flex; }\n.rule span { flex: 1; background: var(--red-500); }\n.rule i { width: 240px; background: repeating-conic-gradient(var(--white) 0 25%, var(--ink) 0 50%) 0 0 / 6px 6px; }\n.in { padding: 72px 96px 40px; display: flex; flex-direction: column; gap: 56px; }\n.top { display: flex; gap: 72px; }\n.brand { flex: 0 0 340px; display: flex; flex-direction: column; gap: 20px; }\n\n.logo { display: inline-flex; align-items: center; gap: 12px; color: var(--white); text-decoration: none; flex-shrink: 0; align-self: flex-start; }\n.logo-bars { display: flex; gap: 4px; }\n.logo-bars span { width: 7px; height: 30px; transform: skewX(-18deg); background: var(--red-500); }\n.logo-bars span + span { background: var(--white); }\n.logo-words { display: flex; flex-direction: column; gap: 3px; }\n.logo-name { font-size: 22px; font-weight: 800; font-stretch: 125%; font-style: italic; letter-spacing: .02em; line-height: 1; }\n.logo-tag { font-size: 10px; font-weight: 600; letter-spacing: .44em; color: var(--grey-300); line-height: 1; text-transform: uppercase; }\n\n.about { margin: 0; font-size: 14px; line-height: 1.6; }\n.social { display: flex; gap: 10px; }\n.social a { width: 44px; height: 44px; border: 1px solid var(--graphite-700); color: var(--grey-200); display: flex; align-items: center; justify-content: center; }\n.social a:hover { border-color: var(--white); color: var(--white); }\n.ic { width: 18px; height: 18px; flex: none; }\n\n.cols { flex: 1; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 32px; }\n.col { display: flex; flex-direction: column; gap: 14px; font-size: 14px; }\n.col h3 { margin: 0; font-size: 12px; font-weight: 700; letter-spacing: .2em; color: var(--white); text-transform: uppercase; }\n.col a { color: var(--grey-200); text-decoration: none; }\n.col a:hover { color: var(--white); }\n.short { display: none; }\n\n.legal { border-top: 1px solid var(--line-inverse); padding-top: 28px; display: flex; justify-content: space-between; align-items: center; gap: 24px; font-size: 13px; color: var(--grey-300); }\n.legal strong { color: var(--white); font-weight: 600; }\n.addr::before { content: ' · '; }\n\n@container lf (max-width: 1199px) {\n  .rule { height: 5px; }\n  .rule i { width: 160px; }\n  .in { padding: 56px 40px 32px; gap: 40px; }\n  .top { flex-wrap: wrap; justify-content: space-between; align-items: center; gap: 24px; }\n  .brand { flex: 1 1 100%; flex-direction: row; justify-content: space-between; align-items: center; gap: 24px; }\n  .about { display: none; }\n  .cols { flex: 1 1 100%; gap: 24px; }\n  .col { gap: 12px; } .col h3 { font-size: 11px; }\n  .legal { flex-direction: column; align-items: flex-start; gap: 8px; padding-top: 24px; font-size: 12px; line-height: 1.5; }\n  .logo { gap: 10px; } .logo-bars { gap: 3px; } .logo-bars span { width: 6px; height: 28px; }\n  .logo-name { font-size: 20px; } .logo-tag { font-size: 9px; }\n}\n@container lf (max-width: 767px) {\n  .rule i { width: 96px; background-size: 5px 5px; }\n  .in { padding: 48px 20px 32px; gap: 36px; }\n  .brand { flex-direction: column; align-items: flex-start; gap: 16px; }\n  .about { display: block; }\n  .cols { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 32px 20px; }\n  .col { gap: 4px; }\n  .col h3 { padding-bottom: 6px; }\n  .col a { min-height: 36px; display: flex; align-items: center; }\n  .col-contact { gap: 10px; }\n  .legal { gap: 10px; }\n  .addr { display: block; } .addr::before { content: none; }\n  .long { display: none; } .short { display: inline; }\n  .logo { gap: 10px; } .logo-bars span { width: 6px; height: 26px; }\n  .logo-name { font-size: 19px; } .logo-tag { font-size: 9px; }\n}\n`,\n\n  mounted() {\n    if (typeof document !== 'undefined' && document.head && !document.getElementById('lf-archivo-font')) {\n      const l = document.createElement('link');\n      l.id = 'lf-archivo-font';\n      l.rel = 'stylesheet';\n      l.href = 'https://fonts.googleapis.com/css2?family=Archivo:ital,wdth,wght@0,62..125,100..900;1,62..125,100..900&display=swap';\n      document.head.appendChild(l);\n    }\n  },\n\n  render(d2) {\n    const p = d2.params || {};\n    const cols = Array.isArray(p.columns) && p.columns.length ? p.columns : DEFAULT_COLUMNS;\n    const about = p.about || 'Os produtos que aparecem no canal, com a curadoria de quem testa de verdade.';\n    const company = p.company || '[RAZÃO SOCIAL] · CNPJ [00.000.000/0000-00]';\n    const address = p.address || '[ENDEREÇO COMPLETO]';\n    const home = p.homeHref || '#';\n    const ig = p.instagram === null ? null : (p.instagram || '#');\n    const yt = p.youtube === null ? null : (p.youtube || '#');\n\n    const colsHtml = cols.map((c, i) => {\n      const links = (c.links || []).map((l, k) => {\n        const text = l.short\n          ? `<span class=\"long\">${esc(l.label)}</span><span class=\"short\">${esc(l.short)}</span>`\n          : esc(l.label);\n        return c.plain\n          ? `<span data-key=\"c${i}l${k}\">${text}</span>`\n          : `<a data-key=\"c${i}l${k}\" href=\"${esc(l.href || '#')}\">${text}</a>`;\n      }).join('');\n      return `<div class=\"col${c.plain ? ' col-contact' : ''}\" data-key=\"c${i}\"><h3>${esc(c.title)}</h3>${links}</div>`;\n    }).join('');\n\n    return `\n<footer class=\"lf-footer\">\n  <div class=\"rule\" aria-hidden=\"true\"><span></span><i></i></div>\n  <div class=\"in\">\n    <div class=\"top\">\n      <div class=\"brand\">\n        <a class=\"logo\" href=\"${esc(home)}\" aria-label=\"Loja Lucas Fontana — início\">\n          <span class=\"logo-bars\" aria-hidden=\"true\"><span></span><span></span></span>\n          <span class=\"logo-words\" aria-hidden=\"true\"><span class=\"logo-name\">LUCAS FONTANA</span><span class=\"logo-tag\">Loja oficial</span></span>\n        </a>\n        <p class=\"about\">${esc(about)}</p>\n        <div class=\"social\">\n          ${ig !== null ? `<a href=\"${esc(ig)}\" target=\"_blank\" rel=\"noopener\" aria-label=\"Instagram do Lucas\">${ICON_IG}</a>` : ''}\n          ${yt !== null ? `<a href=\"${esc(yt)}\" target=\"_blank\" rel=\"noopener\" aria-label=\"YouTube do Lucas\">${ICON_YT}</a>` : ''}\n        </div>\n      </div>\n      <div class=\"cols\">${colsHtml}</div>\n    </div>\n    <div class=\"legal\">\n      <span>${esc(company)}<span class=\"addr\">${esc(address)}</span></span>\n      <span>Pagamento: <strong>Pix</strong> · <strong>Cartão de crédito</strong></span>\n    </div>\n  </div>\n</footer>`;\n  }\n};"}},"about":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"about"}}}},"address":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"address"}}}},"columns":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"columns"}}}},"company":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"company"}}}},"homeHref":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"homeHref"}}}},"instagram":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"instagram"}}}},"youtube":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"youtube"}}}}}}}}}},{"_id":"6ab5ba1fb58135ae6e6d7daa","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"AnnouncementBar","package":"babi-lf","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 DEFAULT_ITEMS = ['Pix ou cartão em até [N]x', 'Enviamos para todo o Brasil', 'Loja oficial do canal'];\n\nconst esc = (s) => String(s == null ? '' : s)\n  .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n\nexport default {\n  css: `\n:host { display: block; width: 100%; }\n* { box-sizing: border-box; }\n.lf-ab {\n  --red-500: #c8102e; --ink: #0b0b0c; --white: #ffffff;\n  container: lf / inline-size; width: 100%;\n  font-family: 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif;\n  -webkit-font-smoothing: antialiased;\n}\n.in { height: 40px; display: flex; align-items: center; justify-content: center; gap: 28px; background: var(--ink); color: var(--white);\n  font-size: 12px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; white-space: nowrap; overflow: hidden; }\n.sep { width: 14px; height: 2px; background: var(--red-500); transform: skewX(-30deg); flex: none; }\n.edge { display: none; }\n@container lf (max-width: 1199px) { .in { gap: 20px; font-size: 11px; } .in > .x3 { display: none; } }\n@container lf (max-width: 767px) {\n  .in { height: 36px; gap: 10px; letter-spacing: .12em; }\n  .in > .item, .in > .sep { display: none; }\n  .in > .primary { display: inline; }\n  .in > .edge { display: block; width: 12px; }\n}\n`,\n\n  mounted() {\n    if (typeof document !== 'undefined' && document.head && !document.getElementById('lf-archivo-font')) {\n      const l = document.createElement('link');\n      l.id = 'lf-archivo-font';\n      l.rel = 'stylesheet';\n      l.href = 'https://fonts.googleapis.com/css2?family=Archivo:ital,wdth,wght@0,62..125,100..900;1,62..125,100..900&display=swap';\n      document.head.appendChild(l);\n    }\n  },\n\n  render(d2) {\n    const p = d2.params || {};\n    const items = Array.isArray(p.items) && p.items.length ? p.items : DEFAULT_ITEMS;\n    const n = Number(p.primary);\n    const primary = Number.isInteger(n) && n >= 0 && n < items.length ? n : Math.min(1, items.length - 1);\n    let out = '<span class=\"sep edge\" aria-hidden=\"true\"></span>';\n    items.forEach((t, i) => {\n      const third = i >= 2 ? ' x3' : '';\n      if (i) out += `<span class=\"sep${third}\" aria-hidden=\"true\"></span>`;\n      out += `<span class=\"item${third}${i === primary ? ' primary' : ''}\" data-key=\"i${i}\">${esc(t)}</span>`;\n    });\n    out += '<span class=\"sep edge\" aria-hidden=\"true\"></span>';\n    return `<div class=\"lf-ab\" role=\"region\" aria-label=\"Avisos da loja\"><div class=\"in\">${out}</div></div>`;\n  }\n};"}},"items":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"items"}}}},"primary":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"primary"}}}}}}}}}},{"_id":"6ab5be22d41d6b6b0d5630b6","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"Select","package":"babi-lf","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 DEFAULT_OPTIONS = [\n  { value: 'relevancia', label: 'Relevância' },\n  { value: 'menor-preco', label: 'Menor preço' },\n  { value: 'maior-preco', label: 'Maior preço' },\n  { value: 'mais-vendidos', label: 'Mais vendidos' }\n];\n\nconst esc = (s) => String(s == null ? '' : s)\n  .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n\nconst CHEVRON = '<svg class=\"ic\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M6 9l6 6 6-6\"/></svg>';\n\nconst TABLET = (p) => `\n${p} .box { height: 48px; }\n${p} .label .long { display: none; }\n${p} .label .short { display: inline; }`;\nconst MOBILE = (p) => `\n${p} { display: flex; width: 100%; }\n${p} .label { display: none; }\n${p} .prefix { display: inline; font-weight: 500; }\n${p} .box { flex: 1; min-width: 0; padding: 0 8px; font-size: 13px; gap: 4px; }\n${p} .box .ic { width: 14px; height: 14px; }`;\n\nconst norm = (list) => (Array.isArray(list) && list.length ? list : DEFAULT_OPTIONS).map((o) =>\n  o && typeof o === 'object' ? { value: String(o.value != null ? o.value : o.label), label: String(o.label != null ? o.label : o.value) } : { value: String(o), label: String(o) });\n\nexport default {\n  css: `\n:host { display: block; }\n* { box-sizing: border-box; }\n.lf-select {\n  --red-500: #c8102e; --ink: #0b0b0c; --white: #ffffff; --grey-500: #6b6e73; --line-strong: #d9d9d6;\n  font-family: 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif;\n  -webkit-font-smoothing: antialiased;\n  position: relative; display: inline-flex; align-items: center; gap: 12px; min-width: 0; max-width: 100%;\n}\n.label { font-size: 14px; color: var(--grey-500); white-space: nowrap; }\n.short { display: none; }\n.box { position: relative; display: flex; align-items: center; justify-content: space-between; gap: 12px; height: 44px; min-width: 160px;\n  padding: 0 12px 0 16px; border: 1px solid var(--line-strong); border-radius: 2px; background: var(--white);\n  font-size: 15px; font-weight: 700; color: var(--ink); white-space: nowrap; }\n.box > .cur { min-width: 0; overflow: hidden; text-overflow: ellipsis; }\n.box .ic { width: 16px; height: 16px; flex: none; }\n.box select { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; font-size: 16px; margin: 0; border: 0; }\n.box:focus-within { border-color: var(--ink); outline: 2px solid var(--red-500); outline-offset: 2px; }\n.prefix { display: none; }\n${TABLET('.v-tablet')}\n${TABLET('.v-mobile')}\n${MOBILE('.v-mobile')}\n@media (max-width: 1199px) { ${TABLET('.v-auto')} }\n@media (max-width: 767px) { ${MOBILE('.v-auto')} }\n`,\n\n  mounted(d2) {\n    if (typeof document !== 'undefined' && document.head && !document.getElementById('lf-archivo-font')) {\n      const l = document.createElement('link');\n      l.id = 'lf-archivo-font';\n      l.rel = 'stylesheet';\n      l.href = 'https://fonts.googleapis.com/css2?family=Archivo:ital,wdth,wght@0,62..125,100..900;1,62..125,100..900&display=swap';\n      document.head.appendChild(l);\n    }\n    d2.on('select', 'change', (e, el) => {\n      d2.state.value = el.value;\n      try { d2.emit('onChange', el.value); } catch (err) { /* nenhum handler ligado */ }\n    });\n  },\n\n  render(d2) {\n    const p = d2.params || {};\n    const opts = norm(p.options);\n    const label = p.label || 'Ordenar por';\n    const shortLabel = p.shortLabel || 'Ordenar';\n    const layout = ['desktop', 'tablet', 'mobile'].indexOf(p.layout) >= 0 ? p.layout : 'auto';\n    const want = d2.state.value != null ? d2.state.value : (p.value != null && p.value !== '' ? String(p.value) : opts[0].value);\n    const cur = opts.filter((o) => o.value === String(want))[0] || opts[0];\n\n    const options = opts.map((o, i) =>\n      `<option data-key=\"o${i}\" value=\"${esc(o.value)}\"${o.value === cur.value ? ' selected' : ''}>${esc(o.label)}</option>`).join('');\n\n    return `\n<div class=\"lf-select v-${layout}\">\n  <span class=\"label\" aria-hidden=\"true\"><span class=\"long\">${esc(label)}</span><span class=\"short\">${esc(shortLabel)}</span></span>\n  <span class=\"box\">\n    <span class=\"cur\"><span class=\"prefix\">${esc(shortLabel)}: </span>${esc(cur.label)}</span>\n    ${CHEVRON}\n    <select aria-label=\"${esc(label)}\">${options}</select>\n  </span>\n</div>`;\n  }\n};"}},"label":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"label"}}}},"layout":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"layout"}}}},"onChange":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onChange"}}}},"options":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"options"}}}},"shortLabel":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"shortLabel"}}}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"value"}}}}}}}}}},{"_id":"6ab5c0802086c2e434179cac","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"Button","package":"babi-lf","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// Button — Loja Lucas Fontana\n// Um único componente para todos os botões da loja, controlado por parâmetros.\n// `glyph` põe um ícone à esquerda do texto (\"Assistir no YouTube\" com o ícone do YouTube).\n// `ghost` é o contorno branco para fundos escuros (SupportCard, cards escuros): transparente, inverte no hover.\nconst VARIANTS = ['primary', 'brand', 'light', 'outline', 'ghost'];\nconst SIZES = ['sm', 'md', 'lg', 'hero', 'inset'];\nconst WIDTHS = ['auto', 'mobile', 'always'];\nconst LAYOUTS = ['desktop', 'tablet', 'mobile'];\n\nconst esc = (s) => String(s == null ? '' : s)\n  .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\nconst pick = (v, list, fb) => (list.indexOf(String(v)) >= 0 ? String(v) : fb);\nconst truthy = (v) => v === true || v === 'true' || v === 1 || v === '1';\n\nconst ARROW = '<svg class=\"ic\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12h14M13 6l6 6-6 6\"/></svg>';\n\n// Ícones à esquerda: mesmos desenhos do componente Icon (grade de 24px, traço 1.6)\nconst GLYPHS = {\n  youtube: '<rect x=\"2.5\" y=\"5\" width=\"19\" height=\"14\" rx=\"4\"/><path d=\"m10 9 5 3-5 3V9Z\"/>',\n  instagram: '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"5\"/><circle cx=\"12\" cy=\"12\" r=\"4\"/><circle cx=\"17.5\" cy=\"6.5\" r=\"0.8\" fill=\"currentColor\"/>',\n  play: '<path d=\"M8 5.5v13l10-6.5-10-6.5Z\" fill=\"currentColor\" stroke=\"none\"/>',\n  message: '<path d=\"M4 5h16v11H9l-5 4V5Z\"/>',\n  briefcase: '<rect x=\"3\" y=\"7\" width=\"18\" height=\"13\" rx=\"1\"/><path d=\"M9 7V5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2\"/><path d=\"M3 13h18\"/>',\n  bag: '<path d=\"M5 8h14l-1.2 12.2a1 1 0 0 1-1 .8H7.2a1 1 0 0 1-1-.8L5 8Z\"/><path d=\"M9 8V6a3 3 0 0 1 6 0v2\"/>',\n  user: '<circle cx=\"12\" cy=\"8\" r=\"4\"/><path d=\"M4 21c1.5-4 4.5-6 8-6s6.5 2 8 6\"/>',\n  truck: '<path d=\"M3 6h11v10H3zM14 9h4l3 3v4h-7\"/><circle cx=\"7\" cy=\"17.5\" r=\"1.8\"/><circle cx=\"17\" cy=\"17.5\" r=\"1.8\"/>'\n};\nconst glyphSvg = (n) => (n && GLYPHS[n]\n  ? `<svg class=\"ic g\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">${GLYPHS[n]}</svg>`\n  : '');\n\n// Regras de tablet (<1200) e mobile (<768), aplicadas pela variante fixa ou pela largura da tela (auto)\nconst TABLET = (p) => `\n${p} .btn.s-hero { height: 52px; padding: 0 28px; font-size: 13px; gap: 12px; }\n${p} .btn.s-hero .ic { width: 16px; height: 16px; }\n${p} .btn.s-inset { height: 36px; padding: 0 14px; font-size: 12px; letter-spacing: .08em; }`;\nconst MOBILE = (p) => `\n${p} .btn.w-mobile { display: flex; width: 100%; padding: 0 20px; }\n${p} .long { display: none; }\n${p} .short { display: inline; }`;\n\nexport default {\n  css: `\n:host { display: block; }\n* { box-sizing: border-box; }\n.wrap { --red-500: #c8102e; --ink: #0b0b0c; --white: #ffffff; --graphite-800: #2a2b2e; --grey-100: #ececea;\n  font-family: 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; -webkit-font-smoothing: antialiased;\n  display: block; width: 100%; }\n.btn { display: inline-flex; align-items: center; justify-content: center; gap: 12px; height: 48px; padding: 0 24px;\n  border: 1.5px solid transparent; border-radius: 2px; font-family: inherit; font-size: 13px; font-weight: 700;\n  letter-spacing: .1em; line-height: 1; text-transform: uppercase; text-decoration: none; cursor: pointer; white-space: nowrap;\n  transition: background-color .15s ease, color .15s ease, border-color .15s ease; margin: 0; }\n.btn:focus-visible { outline: 2px solid var(--red-500); outline-offset: 2px; }\n.btn .ic { width: 16px; height: 16px; flex: none; }\n.btn .ic.g { width: 18px; height: 18px; margin-right: -2px; }\n.short { display: none; }\n\n.s-sm { height: 44px; padding: 0 18px; }\n.s-lg { height: 52px; padding: 0 28px; }\n.s-hero { height: 56px; padding: 0 32px; font-size: 14px; gap: 14px; }\n.s-hero .ic { width: 18px; height: 18px; }\n.s-inset { height: 40px; padding: 0 20px; border: 0; }\n\n.w-always { display: flex; width: 100%; }\n\n.v-primary { background: var(--ink); color: var(--white); }\n.v-primary:hover { background: var(--graphite-800); color: var(--white); }\n.v-brand { background: var(--red-500); color: var(--white); }\n.v-brand:hover { background: var(--ink); color: var(--white); }\n.v-light { background: var(--white); color: var(--ink); }\n.v-light:hover { background: var(--grey-100); color: var(--ink); }\n.v-outline { background: var(--white); color: var(--ink); border-color: var(--ink); }\n.v-outline:hover { background: var(--ink); color: var(--white); }\n.v-ghost { background: transparent; color: var(--white); border-color: var(--white); }\n.v-ghost:hover { background: var(--white); color: var(--ink); }\n.v-ghost:focus-visible { outline-color: var(--white); }\n.btn.is-disabled { opacity: .4; cursor: not-allowed; pointer-events: none; }\n\n${TABLET('.l-tablet')}\n${TABLET('.l-mobile')}\n${MOBILE('.l-mobile')}\n@media (max-width: 1199px) { ${TABLET('.l-auto')} }\n@media (max-width: 767px) { ${MOBILE('.l-auto')} }\n`,\n\n  mounted(d2) {\n    if (typeof document !== 'undefined' && document.head && !document.getElementById('lf-archivo-font')) {\n      const l = document.createElement('link');\n      l.id = 'lf-archivo-font';\n      l.rel = 'stylesheet';\n      l.href = 'https://fonts.googleapis.com/css2?family=Archivo:ital,wdth,wght@0,62..125,100..900;1,62..125,100..900&display=swap';\n      document.head.appendChild(l);\n    }\n    d2.on('.btn', 'click', (e, el) => {\n      if (el.classList.contains('is-disabled')) { e.preventDefault(); return; }\n      if (el.tagName === 'BUTTON') {\n        try { d2.emit('onClick'); } catch (err) { /* nenhum handler ligado */ }\n      }\n    });\n  },\n\n  render(d2) {\n    const p = d2.params || {};\n    const label = p.label || 'Botão';\n    const variant = pick(p.variant, VARIANTS, 'primary');\n    const size = pick(p.size, SIZES, 'md');\n    const width = pick(p.fullWidth, WIDTHS, 'auto');\n    const layout = pick(p.layout, LAYOUTS, 'auto');\n    const disabled = truthy(p.isDisabled);\n    const arrow = truthy(p.arrow);\n    const href = p.href ? String(p.href) : '';\n\n    const text = p.shortLabel\n      ? `<span class=\"long\">${esc(label)}</span><span class=\"short\">${esc(p.shortLabel)}</span>`\n      : `<span>${esc(label)}</span>`;\n    const cls = `btn v-${variant} s-${size} w-${width}${disabled ? ' is-disabled' : ''}`;\n    const inner = `${glyphSvg(p.glyph)}${text}${arrow ? ARROW : ''}`;\n\n    const el = href\n      ? `<a class=\"${cls}\" href=\"${esc(href)}\"${truthy(p.newTab) ? ' target=\"_blank\" rel=\"noopener\"' : ''}${disabled ? ' aria-disabled=\"true\" tabindex=\"-1\"' : ''}>${inner}</a>`\n      : `<button type=\"button\" class=\"${cls}\"${disabled ? ' disabled' : ''}>${inner}</button>`;\n\n    return `<div class=\"wrap l-${layout}\">${el}</div>`;\n  }\n};"}},"arrow":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"arrow"}}}},"fullWidth":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"fullWidth"}}}},"glyph":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"glyph"}}}},"href":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"href"}}}},"isDisabled":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"isDisabled"}}}},"label":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"label"}}}},"layout":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"layout"}}}},"newTab":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"newTab"}}}},"onClick":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onClick"}}}},"shortLabel":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"shortLabel"}}}},"size":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"size"}}}},"variant":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"variant"}}}}}}}}}},{"_id":"6ab5c22eb58135ae6e6d8a73","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"Doc","package":"babi-lf","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// Documentação — Loja Lucas Fontana\n// Renderiza um texto em formato markdown simples (títulos, listas, tabelas, código) no visual da loja.\nconst esc = (s) => String(s == null ? '' : s)\n  .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n\nconst inline = (s) => esc(s)\n  .replace(/`([^`]+)`/g, '<code>$1</code>')\n  .replace(/\\*\\*([^*]+)\\*\\*/g, '<b>$1</b>');\n\nfunction md(src) {\n  const lines = String(src || '').replace(/\\r/g, '').split('\\n');\n  let html = '', i = 0;\n  while (i < lines.length) {\n    const l = lines[i];\n    if (!l.trim()) { i++; continue; }\n    if (l.startsWith('```')) {\n      const buf = []; i++;\n      while (i < lines.length && !lines[i].startsWith('```')) { buf.push(lines[i]); i++; }\n      i++;\n      html += `<pre>${esc(buf.join('\\n'))}</pre>`;\n      continue;\n    }\n    if (l.startsWith('### ')) { html += `<h4>${inline(l.slice(4))}</h4>`; i++; continue; }\n    if (l.startsWith('## ')) { html += `<h3>${inline(l.slice(3))}</h3>`; i++; continue; }\n    if (l.startsWith('> ')) {\n      const buf = [];\n      while (i < lines.length && lines[i].startsWith('> ')) { buf.push(inline(lines[i].slice(2))); i++; }\n      html += `<div class=\"note\">${buf.join('<br>')}</div>`;\n      continue;\n    }\n    if (l.trim().startsWith('|')) {\n      const rows = [];\n      while (i < lines.length && lines[i].trim().startsWith('|')) { rows.push(lines[i].trim()); i++; }\n      const cells = (r) => r.replace(/^\\||\\|$/g, '').split('|').map((c) => c.trim());\n      const body = rows.filter((r, k) => !(k === 1 && /^\\|?[\\s:-]+\\|/.test(r)));\n      const [head, ...rest] = body;\n      html += '<div class=\"tw\"><table><thead><tr>' + cells(head).map((c) => `<th>${inline(c)}</th>`).join('') + '</tr></thead><tbody>' +\n        rest.map((r) => '<tr>' + cells(r).map((c) => `<td>${inline(c)}</td>`).join('') + '</tr>').join('') + '</tbody></table></div>';\n      continue;\n    }\n    if (l.startsWith('- ')) {\n      const buf = [];\n      while (i < lines.length && lines[i].startsWith('- ')) { buf.push(`<li>${inline(lines[i].slice(2))}</li>`); i++; }\n      html += `<ul>${buf.join('')}</ul>`;\n      continue;\n    }\n    const buf = [];\n    while (i < lines.length && lines[i].trim() && !/^(#|- |\\||> |```)/.test(lines[i])) { buf.push(inline(lines[i])); i++; }\n    html += `<p>${buf.join(' ')}</p>`;\n  }\n  return html;\n}\n\nexport default {\n  css: `\n:host { display: block; width: 100%; }\n* { box-sizing: border-box; }\n.doc { --red-500: #c8102e; --ink: #0b0b0c; --white: #ffffff; --grey-50: #f5f5f3; --grey-100: #ececea; --grey-500: #6b6e73; --grey-700: #45474b; --line: #e4e4e2;\n  font-family: 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; -webkit-font-smoothing: antialiased;\n  background: var(--white); color: var(--ink); width: 100%; min-height: 100%; }\n.rule { height: 6px; background: var(--red-500); }\n.in { padding: 48px 56px 64px; max-width: 1040px; }\n.eyebrow { margin: 0 0 12px; font-size: 12px; font-weight: 700; letter-spacing: .3em; text-transform: uppercase; color: var(--grey-500); }\n.eyebrow b { color: var(--red-500); }\nh1 { margin: 0 0 12px; font-size: 44px; font-weight: 800; font-stretch: 115%; line-height: 1; text-transform: uppercase; letter-spacing: -.01em; }\n.type { display: inline-block; margin: 0 0 28px; padding: 6px 10px; background: var(--ink); color: var(--white); font: 700 13px/1 ui-monospace, SFMono-Regular, Menlo, monospace; }\nh3 { margin: 40px 0 14px; padding-top: 24px; border-top: 1px solid var(--line); font-size: 13px; font-weight: 800; letter-spacing: .24em; text-transform: uppercase; }\nh4 { margin: 24px 0 10px; font-size: 16px; font-weight: 700; }\np { margin: 0 0 14px; font-size: 16px; line-height: 1.6; color: var(--grey-700); }\np b, li b, td b { color: var(--ink); }\nul { margin: 0 0 16px; padding-left: 20px; }\nli { margin: 0 0 8px; font-size: 15px; line-height: 1.55; color: var(--grey-700); }\nli::marker { color: var(--red-500); }\ncode { font: 600 13px/1.4 ui-monospace, SFMono-Regular, Menlo, monospace; background: var(--grey-100); color: var(--ink); padding: 2px 6px; border-radius: 2px; }\npre { margin: 0 0 16px; padding: 16px 18px; background: var(--ink); color: #e9e9e7; font: 13px/1.6 ui-monospace, SFMono-Regular, Menlo, monospace; white-space: pre-wrap; overflow-x: auto; }\n.tw { overflow-x: auto; margin: 0 0 16px; }\ntable { width: 100%; border-collapse: collapse; font-size: 14px; }\nth { text-align: left; padding: 0 12px 10px 0; border-bottom: 2px solid var(--ink); font-size: 11px; font-weight: 800; letter-spacing: .14em; text-transform: uppercase; white-space: nowrap; }\ntd { padding: 12px 12px 12px 0; border-bottom: 1px solid var(--line); vertical-align: top; line-height: 1.5; color: var(--grey-700); }\ntd:first-child { white-space: nowrap; }\n.note { margin: 0 0 16px; padding: 14px 16px; border-left: 4px solid var(--red-500); background: var(--grey-50); font-size: 14px; line-height: 1.55; color: var(--grey-700); }\n`,\n\n  mounted() {\n    if (typeof document !== 'undefined' && document.head && !document.getElementById('lf-archivo-font')) {\n      const l = document.createElement('link');\n      l.id = 'lf-archivo-font';\n      l.rel = 'stylesheet';\n      l.href = 'https://fonts.googleapis.com/css2?family=Archivo:ital,wdth,wght@0,62..125,100..900;1,62..125,100..900&display=swap';\n      document.head.appendChild(l);\n    }\n  },\n\n  render(d2) {\n    const p = d2.params || {};\n    return `<div class=\"doc\"><div class=\"rule\"></div><div class=\"in\">\n      <p class=\"eyebrow\"><b>Doc</b> — Componentes UI</p>\n      <h1>${esc(p.heading || 'Componente')}</h1>\n      ${p.typeId ? `<span class=\"type\">${esc(p.typeId)}</span>` : ''}\n      ${md(p.content)}\n    </div></div>`;\n  }\n};"}},"content":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"content"}}}},"heading":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"heading"}}}},"typeId":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"typeId"}}}}}}}}}},{"_id":"6ab5c4bfa44198fd3fbf3e1b","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"Logo","package":"babi-lf","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// Logo — Loja Lucas Fontana\n// Wordmark em texto vivo: duas barras inclinadas, \"LUCAS FONTANA\" e \"LOJA OFICIAL\".\nconst esc = (s) => String(s == null ? '' : s)\n  .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\nconst truthy = (v) => v === true || v === 'true' || v === 1 || v === '1';\nconst LAYOUTS = ['desktop', 'tablet', 'mobile'];\n\nconst TABLET = (p) => `\n${p} .logo { gap: 10px; }\n${p} .bars { gap: 3px; }\n${p} .bars span { width: 6px; height: 26px; }\n${p} .name { font-size: 20px; }\n${p} .tag { font-size: 9px; }\n${p} .dark .bars span { height: 28px; }\n${p} .dark .name { font-size: 20px; }`;\nconst MOBILE = (p) => `\n${p} .logo { gap: 8px; }\n${p} .bars span { width: 5px; height: 22px; }\n${p} .words { gap: 2px; }\n${p} .name { font-size: 17px; }\n${p} .tag { font-size: 8px; }\n${p} .dark { gap: 10px; }\n${p} .dark .bars span { width: 6px; height: 26px; }\n${p} .dark .name { font-size: 19px; }\n${p} .dark .tag { font-size: 9px; }`;\n\nexport default {\n  css: `\n:host { display: block; }\n* { box-sizing: border-box; }\n.wrap { --red-500: #c8102e; --ink: #0b0b0c; --white: #ffffff; --grey-500: #6b6e73; --grey-300: #a7a9ad;\n  font-family: 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; -webkit-font-smoothing: antialiased;\n  display: flex; align-items: center; height: 100%; padding: 0 8px; }\n.logo { display: inline-flex; align-items: center; gap: 12px; color: var(--ink); text-decoration: none; flex-shrink: 0; }\n.logo:focus-visible { outline: 2px solid var(--red-500); outline-offset: 4px; }\n.bars { display: flex; gap: 4px; }\n.bars span { display: block; width: 7px; height: 30px; transform: skewX(-18deg); background: var(--red-500); }\n.bars span + span { background: var(--ink); }\n.words { display: flex; flex-direction: column; gap: 3px; }\n.name { font-size: 24px; font-weight: 800; font-stretch: 125%; font-style: italic; letter-spacing: .02em; line-height: 1; white-space: nowrap; }\n.tag { font-size: 10px; font-weight: 600; letter-spacing: .44em; color: var(--grey-500); line-height: 1; text-transform: uppercase; white-space: nowrap; }\n.dark { color: var(--white); }\n.dark .bars span + span { background: var(--white); }\n.dark .tag { color: var(--grey-300); }\n.dark .name { font-size: 22px; }\n${TABLET('.l-tablet')}\n${TABLET('.l-mobile')}\n${MOBILE('.l-mobile')}\n@media (max-width: 1199px) { ${TABLET('.l-auto')} }\n@media (max-width: 767px) { ${MOBILE('.l-auto')} }\n`,\n\n  mounted() {\n    if (typeof document !== 'undefined' && document.head && !document.getElementById('lf-archivo-font')) {\n      const l = document.createElement('link');\n      l.id = 'lf-archivo-font';\n      l.rel = 'stylesheet';\n      l.href = 'https://fonts.googleapis.com/css2?family=Archivo:ital,wdth,wght@0,62..125,100..900;1,62..125,100..900&display=swap';\n      document.head.appendChild(l);\n    }\n  },\n\n  render(d2) {\n    const p = d2.params || {};\n    const tone = p.tone === 'dark' ? 'dark' : 'light';\n    const layout = LAYOUTS.indexOf(p.layout) >= 0 ? p.layout : 'auto';\n    const inner = `<span class=\"bars\" aria-hidden=\"true\"><span></span><span></span></span>` +\n      `<span class=\"words\" aria-hidden=\"true\"><span class=\"name\">LUCAS FONTANA</span><span class=\"tag\">Loja oficial</span></span>`;\n    const cls = `logo${tone === 'dark' ? ' dark' : ''}`;\n    const el = truthy(p.noLink)\n      ? `<span class=\"${cls}\" role=\"img\" aria-label=\"Loja Lucas Fontana\">${inner}</span>`\n      : `<a class=\"${cls}\" href=\"${esc(p.href || '/')}\" aria-label=\"Loja Lucas Fontana — início\">${inner}</a>`;\n    return `<div class=\"wrap l-${layout}\">${el}</div>`;\n  }\n};"}},"href":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"href"}}}},"layout":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"layout"}}}},"noLink":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"noLink"}}}},"tone":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"tone"}}}}}}}}}},{"_id":"6ab66f325f5a9fd2e7a7bd0c","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"Badge","package":"babi-lf","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// Badge — Loja Lucas Fontana\n// Selos quadrados em maiúsculas: status, parceria e tópicos.\nconst esc = (s) => String(s == null ? '' : s)\n  .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\nconst truthy = (v) => v === true || v === 'true' || v === 1 || v === '1';\nconst TONES = ['ink', 'red', 'outline'];\nconst LAYOUTS = ['desktop', 'tablet', 'mobile'];\n\nconst TABLET = (p) => `\n${p} .badge.outline { font-size: 10px; padding: 5px 8px; }`;\nconst MOBILE = (p) => `\n${p} .badge { font-size: 9px; padding: 4px 6px; letter-spacing: .1em; }\n${p} .badge.status { padding: 4px 7px; letter-spacing: .08em; }\n${p} .badge.outline { font-size: 10px; padding: 5px 8px; }\n${p} .long { display: none; }\n${p} .short { display: inline; }`;\n\nexport default {\n  css: `\n:host { display: block; }\n* { box-sizing: border-box; }\n.wrap { --red-500: #c8102e; --ink: #0b0b0c; --white: #ffffff; --grey-700: #45474b;\n  font-family: 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; -webkit-font-smoothing: antialiased;\n  display: flex; align-items: center; height: 100%; }\n.badge { display: inline-flex; align-items: center; font-size: 10px; font-weight: 800; letter-spacing: .12em; line-height: 1.2;\n  text-transform: uppercase; padding: 5px 8px; color: var(--white); background: var(--ink); white-space: nowrap; }\n.badge.red { background: var(--red-500); }\n.badge.outline { background: transparent; border: 1px solid var(--grey-700); font-weight: 700; font-size: 11px; padding: 5px 9px; }\n.badge.status { font-size: 11px; padding: 6px 10px; letter-spacing: .1em; }\n.short { display: none; }\n${TABLET('.l-tablet')}\n${TABLET('.l-mobile')}\n${MOBILE('.l-mobile')}\n@media (max-width: 1199px) { ${TABLET('.l-auto')} }\n@media (max-width: 767px) { ${MOBILE('.l-auto')} }\n`,\n\n  mounted() {\n    if (typeof document !== 'undefined' && document.head && !document.getElementById('lf-archivo-font')) {\n      const l = document.createElement('link');\n      l.id = 'lf-archivo-font';\n      l.rel = 'stylesheet';\n      l.href = 'https://fonts.googleapis.com/css2?family=Archivo:ital,wdth,wght@0,62..125,100..900;1,62..125,100..900&display=swap';\n      document.head.appendChild(l);\n    }\n  },\n\n  render(d2) {\n    const p = d2.params || {};\n    const label = p.label || 'Badge';\n    const tone = TONES.indexOf(p.tone) >= 0 ? p.tone : 'ink';\n    const layout = LAYOUTS.indexOf(p.layout) >= 0 ? p.layout : 'auto';\n    const cls = `badge${tone !== 'ink' ? ' ' + tone : ''}${truthy(p.isStatus) ? ' status' : ''}`;\n    const text = p.shortLabel\n      ? `<span class=\"long\">${esc(label)}</span><span class=\"short\">${esc(p.shortLabel)}</span>`\n      : esc(label);\n    return `<div class=\"wrap l-${layout}\"><span class=\"${cls}\">${text}</span></div>`;\n  }\n};"}},"isStatus":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"isStatus"}}}},"label":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"label"}}}},"layout":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"layout"}}}},"shortLabel":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"shortLabel"}}}},"tone":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"tone"}}}}}}}}}},{"_id":"6ab6a330b39f683eb1b33564","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"Icon","package":"babi-lf","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// Icon — Loja Lucas Fontana\n// Os 30 ícones de contorno do design system (grade de 24px, pontas arredondadas).\n// Um componente só: o parâmetro `name` escolhe o desenho. Use name = \"all\" para ver o catálogo.\nconst ICONS = {\n    search: [['circle', { cx: 11, cy: 11, r: 7 }], ['path', { d: 'm20 20-3.5-3.5' }]],\n    user: [['circle', { cx: 12, cy: 8, r: 4 }], ['path', { d: 'M4 21c1.5-4 4.5-6 8-6s6.5 2 8 6' }]],\n    bag: [['path', { d: 'M5 8h14l-1.2 12.2a1 1 0 0 1-1 .8H7.2a1 1 0 0 1-1-.8L5 8Z' }], ['path', { d: 'M9 8V6a3 3 0 0 1 6 0v2' }]],\n    menu: [['path', { d: 'M4 7h16M4 12h16M4 17h10' }]],\n    'arrow-right': [['path', { d: 'M5 12h14M13 6l6 6-6 6' }]],\n    'chevron-left': [['path', { d: 'M15 5l-7 7 7 7' }]],\n    'chevron-right': [['path', { d: 'M9 5l7 7-7 7' }]],\n    image: [['rect', { x: 3, y: 5, width: 18, height: 14, rx: 1 }], ['circle', { cx: 9, cy: 10, r: 2 }], ['path', { d: 'm21 16-5-5-9 8' }]],\n    message: [['path', { d: 'M4 5h16v11H9l-5 4V5Z' }]],\n    briefcase: [['rect', { x: 3, y: 7, width: 18, height: 13, rx: 1 }], ['path', { d: 'M9 7V5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2' }], ['path', { d: 'M3 13h18' }]],\n    instagram: [['rect', { x: 3, y: 3, width: 18, height: 18, rx: 5 }], ['circle', { cx: 12, cy: 12, r: 4 }], ['circle', { cx: 17.5, cy: 6.5, r: 0.8, fill: 'currentColor' }]],\n    youtube: [['rect', { x: 2.5, y: 5, width: 19, height: 14, rx: 4 }], ['path', { d: 'm10 9 5 3-5 3V9Z' }]],\n    filter: [['path', { d: 'M4 8h9M17 8h3M4 16h3M11 16h9' }], ['circle', { cx: 15, cy: 8, r: 2 }], ['circle', { cx: 9, cy: 16, r: 2 }]],\n    close: [['path', { d: 'M6 6l12 12M18 6 6 18' }]],\n    check: [['path', { d: 'm5 12.5 4.5 4.5L19 7.5' }]],\n    'chevron-down': [['path', { d: 'M6 9l6 6 6-6' }]],\n    'search-x': [['circle', { cx: 11, cy: 11, r: 7 }], ['path', { d: 'm20 20-3.5-3.5M8.5 8.5l5 5M13.5 8.5l-5 5' }]],\n    truck: [['path', { d: 'M3 6h11v10H3zM14 9h4l3 3v4h-7' }], ['circle', { cx: 7, cy: 17.5, r: 1.8 }], ['circle', { cx: 17, cy: 17.5, r: 1.8 }]],\n    card: [['rect', { x: 3, y: 5.5, width: 18, height: 13, rx: 1 }], ['path', { d: 'M3 10h18M7 15h4' }]],\n    swap: [['path', { d: 'M4 8h14l-3-3M20 16H6l3 3' }]],\n    play: [['path', { d: 'M8 5.5v13l10-6.5-10-6.5Z', fill: 'currentColor', stroke: 'none' }]],\n    plus: [['path', { d: 'M12 5v14M5 12h14' }]],\n    minus: [['path', { d: 'M5 12h14' }]],\n    pin: [['path', { d: 'M12 21s-7-6.2-7-11.5A7 7 0 0 1 19 9.5C19 14.8 12 21 12 21Z' }], ['circle', { cx: 12, cy: 9.5, r: 2.5 }]],\n    logout: [['path', { d: 'M10 4H5v16h5M14 8l4 4-4 4M18 12H9' }]],\n    lock: [['rect', { x: 5, y: 10.5, width: 14, height: 10, rx: 1 }], ['path', { d: 'M8.5 10.5V7.5a3.5 3.5 0 0 1 7 0v3' }]],\n    eye: [['path', { d: 'M2.5 12S6 5.5 12 5.5 21.5 12 21.5 12 18 18.5 12 18.5 2.5 12 2.5 12Z' }], ['circle', { cx: 12, cy: 12, r: 3 }]],\n    'eye-off': [['path', { d: 'M4 4l16 16M10.6 5.6c.5-.1.9-.1 1.4-.1 6 0 9.5 6.5 9.5 6.5a17 17 0 0 1-3 3.6M6.5 7.4A16 16 0 0 0 2.5 12S6 18.5 12 18.5c1.6 0 3-.4 4.2-1M9.9 9.9a3 3 0 0 0 4.2 4.2' }]],\n    copy: [['rect', { x: 8.5, y: 8.5, width: 11, height: 11, rx: 1 }], ['path', { d: 'M15.5 8.5v-3a1 1 0 0 0-1-1h-9a1 1 0 0 0-1 1v9a1 1 0 0 0 1 1h3' }]],\n    'arrow-left': [['path', { d: 'M19 12H5M11 6l-6 6 6 6' }]]\n  };\nconst BOLD = { 'arrow-right': 1, 'chevron-left': 1, 'chevron-right': 1, 'chevron-down': 1, close: 1, check: 1, plus: 1, minus: 1, 'arrow-left': 1 };\nconst MEDIUM = { menu: 1, search: 1, 'search-x': 1, filter: 1 };\n\nconst esc = (s) => String(s == null ? '' : s)\n  .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n\nfunction svg(name, size, stroke) {\n  const parts = ICONS[name] || [];\n  const sw = stroke || (BOLD[name] ? 2 : MEDIUM[name] ? 1.8 : 1.6);\n  const inner = parts.map(([tag, attrs]) =>\n    `<${tag} ${Object.keys(attrs).map((k) => `${k}=\"${esc(attrs[k])}\"`).join(' ')}/>`).join('');\n  return `<svg class=\"ic\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"${sw}\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">${inner}</svg>`;\n}\n\nexport default {\n  css: `\n:host { display: block; }\n* { box-sizing: border-box; }\n.wrap { display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; }\n.ic { display: block; flex: none; }\n.all { display: grid; grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); gap: 0; background: #ffffff; border-top: 1px solid #e4e4e2; border-left: 1px solid #e4e4e2;\n  font-family: 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; width: 100%; }\n.cell { background: #ffffff; border-right: 1px solid #e4e4e2; border-bottom: 1px solid #e4e4e2; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; padding: 22px 8px 16px; }\n.cell code { font: 600 12px/1.2 ui-monospace, SFMono-Regular, Menlo, monospace; color: #45474b; }\n`,\n\n  render(d2) {\n    const p = d2.params || {};\n    const color = p.iconColor || '#0b0b0c';\n    const size = Number(p.size) > 0 ? Number(p.size) : 24;\n    const stroke = Number(p.strokeWidth) > 0 ? Number(p.strokeWidth) : 0;\n    if (p.name === 'all') {\n      const cells = Object.keys(ICONS).map((n) =>\n        `<div class=\"cell\" data-key=\"${esc(n)}\">${svg(n, size, stroke)}<code>${esc(n)}</code></div>`).join('');\n      return `<div class=\"all\" style=\"color:${esc(color)}\">${cells}</div>`;\n    }\n    const name = ICONS[p.name] ? p.name : 'bag';\n    return `<div class=\"wrap\" style=\"color:${esc(color)}\">${svg(name, size, stroke)}</div>`;\n  }\n};"}},"iconColor":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"iconColor"}}}},"name":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"name"}}}},"size":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"size"}}}},"strokeWidth":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"strokeWidth"}}}}}}}}}},{"_id":"6ab6a8e0356aa1fc96e964ea","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"SearchBar","package":"babi-lf","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// SearchBar — Loja Lucas Fontana\n// Campo de busca cinza com ícone de lupa e botão \"Buscar\" embutido à direita.\n// Reaproveita os componentes Button e Icon da loja pelos parâmetros `button` e `searchIcon`.\n// `size: \"lg\"` é a busca grande das páginas (FAQ): 56px (52px no tablet/mobile), fundo branco, borda ink de 1,5px, texto 16px.\n// `showButton: false` tira o botão \"Buscar\" (no PageHeader do FAQ a busca filtra enquanto a pessoa digita).\n// `busTopic` avisa outros componentes da página a cada letra digitada (o FaqLayout escuta \"faq:search\").\nconst LAYOUTS = ['desktop', 'tablet', 'mobile'];\nconst esc = (s) => String(s == null ? '' : s)\n  .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\nconst truthy = (v) => v === true || v === 'true' || v === 1 || v === '1';\n\n// O parâmetro de componente chega como o componente vivo; o d2.render usa a referência dele.\nconst refOf = (v) => { const r = (v && typeof v === 'object' ? (typeof v.getReference === 'function' ? v.getReference() : v.reference) : v) || ''; return r && r.indexOf('@') < 0 ? 'babi-lf@' + r : r; };\n\nconst COMPACT = (p) => `\n${p} .field { height: 44px; padding: 0 4px 0 14px; gap: 10px; }\n${p} input { height: 40px; }\n${p}.lg .field { height: 52px; padding: 0 4px 0 14px; }\n${p}.lg.nobtn .field { padding-right: 14px; }\n${p}.lg input { height: 48px; }`;\n\nexport default {\n  css: `\n:host { display: block; width: 100%; }\n* { box-sizing: border-box; }\n.sb { --ink: #0b0b0c; --white: #ffffff; --grey-50: #f5f5f3; --grey-500: #6b6e73; --line-strong: #d9d9d6;\n  font-family: 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; -webkit-font-smoothing: antialiased;\n  display: flex; align-items: center; width: 100%; height: 100%; }\n.field { display: flex; align-items: center; gap: 12px; width: 100%; height: 48px; padding: 0 4px 0 18px;\n  background: var(--grey-50); border: 1px solid var(--line-strong); border-radius: 2px; min-width: 0; margin: 0; }\n.field:focus-within { border-color: var(--ink); }\ninput { flex: 1; min-width: 0; height: 44px; border: 0; outline: none; background: transparent; margin: 0; padding: 0;\n  font: 400 15px/1.2 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; color: var(--ink); -webkit-appearance: none; appearance: none; }\ninput::placeholder { color: var(--grey-500); }\ninput::-webkit-search-cancel-button { -webkit-appearance: none; }\n.nobtn .field { padding-right: 18px; }\n\n/* Tamanho grande (busca das páginas) */\n.lg .field { height: 56px; background: var(--white); border: 1.5px solid var(--ink); padding: 0 4px 0 18px; }\n.lg.nobtn .field { padding-right: 14px; }\n.lg input { height: 52px; font-size: 16px; }\n${COMPACT('.l-tablet')}\n${COMPACT('.l-mobile')}\n@media (max-width: 1199px) { ${COMPACT('.l-auto')} }\n`,\n\n  mounted(d2, root) {\n    if (typeof document !== 'undefined' && document.head && !document.getElementById('lf-archivo-font')) {\n      const l = document.createElement('link');\n      l.id = 'lf-archivo-font';\n      l.rel = 'stylesheet';\n      l.href = 'https://fonts.googleapis.com/css2?family=Archivo:ital,wdth,wght@0,62..125,100..900;1,62..125,100..900&display=swap';\n      document.head.appendChild(l);\n    }\n    // Placeholder curto quando o campo fica estreito (menos de 420px), como no design system\n    if (typeof ResizeObserver !== 'undefined') {\n      const ro = new ResizeObserver((e) => {\n        const narrow = e[0].contentRect.width < 420;\n        if (d2.state.narrow !== narrow) d2.state.narrow = narrow;\n      });\n      ro.observe(root);\n      d2.onUnmount(() => ro.disconnect());\n    }\n    d2.on('form', 'submit', (e) => { e.preventDefault(); submit(d2); });\n    d2.on('input', 'keydown', (e) => { if (e.key === 'Enter') { e.preventDefault(); submit(d2); } });\n    // Enquanto digita: avisa quem estiver ouvindo (onInput e o tópico do bus), com uma pausa curta\n    let t = null;\n    d2.on('input', 'input', (e, el) => {\n      if (t) clearTimeout(t);\n      t = setTimeout(() => {\n        const q = String(el.value || '').trim();\n        try { d2.emit('onInput', q); } catch (err) { /* nenhum handler ligado */ }\n        const topic = (d2.params || {}).busTopic;\n        if (topic && d2.bus) d2.bus.emit(String(topic), q);\n      }, 150);\n    });\n    d2.onUnmount(() => { if (t) clearTimeout(t); });\n  },\n\n  render(d2) {\n    const p = d2.params || {};\n    const layout = LAYOUTS.indexOf(p.layout) >= 0 ? p.layout : 'auto';\n    const lg = p.size === 'lg';\n    const withButton = p.showButton == null ? true : truthy(p.showButton);\n    const placeholder = d2.state.narrow\n      ? (p.shortPlaceholder || 'Buscar produto ou marca')\n      : (p.placeholder || 'Busque por produto, categoria ou marca');\n    const compact = layout === 'tablet' || layout === 'mobile';\n\n    const iconRef = refOf(d2.param('searchIcon'));\n    const buttonRef = withButton ? refOf(d2.param('button')) : '';\n    const icon = iconRef\n      ? d2.render(iconRef, { name: 'search', size: lg ? 20 : 18, iconColor: lg ? '#0b0b0c' : '#6b6e73' },\n          { key: 'ic', width: lg ? 20 : 18, height: lg ? 20 : 18, style: 'flex:none' })\n      : '';\n    const button = buttonRef\n      ? d2.render(buttonRef,\n          { label: p.buttonLabel || 'Buscar', variant: 'primary', size: 'inset', fullWidth: 'auto', layout: layout === 'auto' ? '' : layout },\n          { key: 'btn', width: 'auto', height: compact ? 36 : 40, style: 'flex:none', onClick: () => submit(d2) })\n      : '';\n\n    return `<div class=\"sb l-${layout}${lg ? ' lg' : ''}${buttonRef ? '' : ' nobtn'}\">\n      <form class=\"field\" role=\"search\" onsubmit=\"return false\">\n        ${icon}\n        <input type=\"search\" name=\"q\" aria-label=\"${esc(p.ariaLabel || 'Buscar produtos')}\" placeholder=\"${esc(placeholder)}\" autocomplete=\"off\">\n        ${button}\n      </form>\n    </div>`;\n  }\n};\n\nfunction submit(d2) {\n  const el = d2.$('input');\n  const q = el ? String(el.value || '').trim() : '';\n  try { d2.emit('onSearch', q); } catch (err) { /* nenhum handler ligado */ }\n  const topic = (d2.params || {}).busTopic;\n  if (topic && d2.bus) d2.bus.emit(String(topic), q);\n}"}},"ariaLabel":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"ariaLabel"}}}},"busTopic":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"busTopic"}}}},"button":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"button"}}}},"buttonLabel":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"buttonLabel"}}}},"layout":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"layout"}}}},"onInput":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onInput"}}}},"onSearch":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onSearch"}}}},"placeholder":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"placeholder"}}}},"searchIcon":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"searchIcon"}}}},"shortPlaceholder":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"shortPlaceholder"}}}},"showButton":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"showButton"}}}},"size":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"size"}}}}}}}}}},{"_id":"6ab6bcb197b00074cbeff455","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"Header","package":"babi-lf","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// Header — Loja Lucas Fontana\n// Cabeçalho da loja nas três telas. Não desenha logo, busca, botão nem ícones:\n// reaproveita Logo, SearchBar, Button e Icon pelos parâmetros `logo`, `searchBar`, `button` e `iconComponent`.\nconst LAYOUTS = ['desktop', 'tablet', 'mobile'];\nconst DEFAULT_CATS = [\n  { label: 'Performance BPower', href: '/c/performance-bpower' },\n  { label: 'Limpeza automotiva', href: '/c/limpeza-automotiva' },\n  { label: 'Cuidado automotivo', href: '/c/cuidado-automotivo' },\n  { label: 'Vestuário', href: '/c/vestuario' },\n  { label: 'Acessórios', href: '/c/acessorios' }\n];\nconst esc = (s) => String(s == null ? '' : s)\n  .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\nconst slug = (s) => String(s || '').toLowerCase().normalize('NFD').replace(/[\\u0300-\\u036f]/g, '').replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');\n\nfunction cats(v) {\n  let list = v;\n  if (typeof list === 'string') list = list.split(',').map((s) => s.trim()).filter(Boolean);\n  if (!Array.isArray(list) || !list.length) return DEFAULT_CATS;\n  return list.map((c) => typeof c === 'string'\n    ? { label: c, href: '/c/' + slug(c) }\n    : { label: c.label || c.name || '', href: c.href || '/c/' + slug(c.label || c.name) });\n}\n\n// O parâmetro de componente chega como o componente vivo; o d2.render usa a referência dele.\nconst refOf = (v) => { const r = (v && typeof v === 'object' ? (typeof v.getReference === 'function' ? v.getReference() : v.reference) : v) || ''; return r && r.indexOf('@') < 0 ? 'babi-lf@' + r : r; };\n\nfunction detect(w) { return w >= 1200 ? 'desktop' : w >= 768 ? 'tablet' : 'mobile'; }\n\nexport default {\n  css: `\n:host { display: block; width: 100%; }\n* { box-sizing: border-box; }\n.hd { --red-500: #c8102e; --ink: #0b0b0c; --white: #ffffff; --grey-500: #6b6e73; --line: #e4e4e2;\n  font-family: 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; -webkit-font-smoothing: antialiased;\n  background: var(--white); color: var(--ink); width: 100%; }\n.row { display: flex; align-items: center; gap: 32px; height: 88px; padding: 0 96px; }\n.logo { flex: none; height: 44px; width: 320px; margin-left: -8px; }\n.search { flex: 1; min-width: 0; height: 48px; max-width: 640px; margin: 0 auto; }\n.actions { display: flex; align-items: center; gap: 8px; flex: none; }\n.ibtn { position: relative; display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 44px;\n  background: transparent; border: 0; border-radius: 2px; padding: 0; margin: 0; color: var(--ink); cursor: pointer; text-decoration: none; }\n.ibtn:hover { color: var(--red-500); }\n.ibtn:focus-visible, .acct:focus-visible, .nav a:focus-visible, .all:focus-visible { outline: 2px solid var(--red-500); outline-offset: 2px; }\n.ibtn .slot { width: 24px; height: 24px; pointer-events: none; }\n.count { position: absolute; top: 4px; right: 2px; min-width: 18px; height: 18px; padding: 0 5px; border-radius: 999px;\n  background: var(--red-500); color: var(--white); font-size: 11px; font-weight: 700; line-height: 18px; text-align: center; pointer-events: none; }\n.acct { display: inline-flex; align-items: center; gap: 10px; height: 44px; padding: 0 8px; color: var(--ink); text-decoration: none; background: transparent; border: 0; cursor: pointer; font-family: inherit; }\n.acct .slot { width: 24px; height: 24px; flex: none; pointer-events: none; }\n.acct .txt { display: flex; flex-direction: column; align-items: flex-start; gap: 3px; text-align: left; }\n.acct .hint { font-size: 12px; color: var(--grey-500); line-height: 1; white-space: nowrap; }\n.acct .lbl { font-size: 12px; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; line-height: 1; white-space: nowrap; }\n.acct:hover .lbl { color: var(--red-500); }\n.navrow { display: flex; align-items: center; justify-content: space-between; gap: 24px; height: 48px; padding: 0 96px; border-top: 1px solid var(--line); box-shadow: inset 0 -1px 0 var(--line); }\n.nav { display: flex; align-items: center; gap: 32px; height: 100%; min-width: 0; overflow-x: auto; scrollbar-width: none; -webkit-overflow-scrolling: touch; }\n.nav::-webkit-scrollbar { display: none; }\n.nav a { position: relative; display: inline-flex; align-items: center; height: 100%; flex: none; color: var(--ink); text-decoration: none;\n  font-size: 12px; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; white-space: nowrap; }\n.nav a:hover { color: var(--red-500); }\n.nav a.on::after { content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 2px; background: var(--red-500); }\n.all { display: inline-flex; align-items: center; gap: 8px; flex: none; min-height: 44px; color: var(--ink); text-decoration: none;\n  font-size: 12px; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; white-space: nowrap; }\n.all span { border-bottom: 2px solid var(--red-500); padding-bottom: 3px; }\n.all:hover { color: var(--red-500); }\n.all .slot { width: 16px; height: 16px; pointer-events: none; }\n\n/* Tablet: linha de 72px, botão de menu, busca, ícones; nav rola */\n.l-tablet .row { height: 72px; padding: 0 40px; gap: 20px; }\n.l-tablet .row { gap: 12px; }\n.l-tablet .logo { width: 268px; height: 40px; margin-left: 0; }\n.l-tablet .search { height: 44px; max-width: none; }\n.l-tablet .actions { gap: 0; margin-right: -10px; }\n.l-tablet .row > .ibtn:first-child { margin-left: -10px; }\n.l-tablet .navrow { height: 44px; padding: 0 0 0 40px; }\n.l-tablet .nav { gap: 28px; padding-right: 40px; }\n\n/* Mobile: menu · logo central · ícones; busca em linha própria; nav rola */\n.l-mobile .row { display: grid; grid-template-columns: 44px 1fr 88px; height: 64px; padding: 0 8px; gap: 0; }\n.l-mobile .left { justify-self: start; }\n.l-mobile .logo { width: 240px; height: 36px; justify-self: center; margin-left: 0; }\n.l-mobile .actions { justify-self: end; gap: 0; }\n.l-mobile .srow { padding: 0 20px 12px; }\n.l-mobile .srow .search { height: 44px; max-width: none; }\n.l-mobile .navrow { height: 44px; padding: 0 0 0 20px; }\n.l-mobile .nav { gap: 24px; padding-right: 20px; }\n`,\n\n  mounted(d2, root) {\n    if (typeof document !== 'undefined' && document.head && !document.getElementById('lf-archivo-font')) {\n      const l = document.createElement('link');\n      l.id = 'lf-archivo-font';\n      l.rel = 'stylesheet';\n      l.href = 'https://fonts.googleapis.com/css2?family=Archivo:ital,wdth,wght@0,62..125,100..900;1,62..125,100..900&display=swap';\n      document.head.appendChild(l);\n    }\n    // Sem `layout` fixo, o header mede a própria largura (como a container query do design system)\n    if (typeof ResizeObserver !== 'undefined') {\n      const ro = new ResizeObserver((e) => {\n        const w = detect(e[0].contentRect.width);\n        if (d2.state.auto !== w) d2.state.auto = w;\n      });\n      ro.observe(root);\n      d2.onUnmount(() => ro.disconnect());\n    }\n    const fire = (name, payload) => { try { d2.emit(name, payload); } catch (err) { /* nenhum handler ligado */ } };\n    d2.on('[data-act=\"menu\"]', 'click', () => fire('onMenu'));\n    d2.on('[data-act=\"account\"]', 'click', () => fire('onAccount'));\n    d2.on('[data-act=\"cart\"]', 'click', () => fire('onCart'));\n    d2.on('.nav a', 'click', (e, el) => fire('onCategory', el.dataset.slug));\n  },\n\n  render(d2) {\n    const p = d2.params || {};\n    const layout = LAYOUTS.indexOf(p.layout) >= 0 ? p.layout : (d2.state.auto || 'desktop');\n    const desk = layout === 'desktop';\n    const mob = layout === 'mobile';\n\n    const iconMod = refOf(d2.param('iconComponent'));\n    const logoMod = refOf(d2.param('logo'));\n    const searchMod = refOf(d2.param('searchBar'));\n    const buttonMod = refOf(d2.param('button'));\n\n    const ic = (name, key, size) => iconMod\n      ? d2.render(iconMod, { name, size: size || 24, iconColor: 'currentColor' },\n          { key: 'ic-' + key, width: size || 24, height: size || 24, class: 'slot' })\n      : '';\n\n    const logo = logoMod\n      ? `<div class=\"logo\">${d2.render(logoMod, { layout, href: p.homeHref || '/' }, { key: 'logo' })}</div>` : '';\n\n    const search = searchMod\n      ? `<div class=\"search\">${d2.render(searchMod,\n          { layout, button: buttonMod, searchIcon: iconMod, shortPlaceholder: layout === 'tablet' ? (p.tabletPlaceholder || 'Buscar produto') : undefined },\n          { key: 'search', onSearch: (q) => { try { d2.emit('onSearch', q); } catch (err) { /* sem handler */ } } })}</div>`\n      : '';\n\n    const count = Number(p.cartCount) > 0 ? Math.min(Number(p.cartCount), 99) : 0;\n    const cart = `<button type=\"button\" class=\"ibtn\" data-act=\"cart\" aria-label=\"Carrinho${count ? ', ' + count + (count === 1 ? ' item' : ' itens') : ''}\">${ic('bag', 'bag')}${count ? `<span class=\"count\">${count}</span>` : ''}</button>`;\n    const userIcon = `<button type=\"button\" class=\"ibtn\" data-act=\"account\" aria-label=\"${p.userName ? 'Minha conta' : 'Entrar na sua conta'}\">${ic('user', 'user')}</button>`;\n    const menu = `<button type=\"button\" class=\"ibtn\" data-act=\"menu\" aria-label=\"Abrir menu\">${ic('menu', 'menu')}</button>`;\n\n    const hint = p.userName ? 'Olá, ' + p.userName : (p.accountHint || 'Entre ou cadastre-se');\n    const acct = `<button type=\"button\" class=\"acct\" data-act=\"account\">${ic('user', 'user-d')}<span class=\"txt\"><span class=\"hint\">${esc(hint)}</span><span class=\"lbl\">Minha conta</span></span></button>`;\n\n    const list = cats(p.categories);\n    const active = slug(p.activeCategory);\n    const allLabel = p.allProductsLabel || 'Todos os produtos';\n    const allHref = p.allProductsHref || '/produtos';\n    const links = list.map((c) => {\n      const s = slug(c.label);\n      const on = s === active;\n      return `<a href=\"${esc(c.href)}\" data-key=\"${esc(s)}\" data-slug=\"${esc(s)}\" class=\"${on ? 'on' : ''}\"${on ? ' aria-current=\"page\"' : ''}>${esc(c.label)}</a>`;\n    }).join('');\n    const allOn = active === 'todos';\n    const allInNav = `<a href=\"${esc(allHref)}\" data-key=\"todos\" data-slug=\"todos\" class=\"${allOn ? 'on' : ''}\"${allOn ? ' aria-current=\"page\"' : ''}>${esc(allLabel)}</a>`;\n\n    const navrow = desk\n      ? `<div class=\"navrow\"><nav class=\"nav\" aria-label=\"Categorias\">${links}</nav><a class=\"all\" href=\"${esc(allHref)}\"><span>${esc(allLabel)}</span>${ic('arrow-right', 'arrow', 16)}</a></div>`\n      : `<div class=\"navrow\"><nav class=\"nav\" aria-label=\"Categorias\">${allInNav}${links}</nav></div>`;\n\n    let top;\n    if (desk) {\n      top = `<div class=\"row\">${logo}${search}<div class=\"actions\">${acct}${cart}</div></div>`;\n    } else if (mob) {\n      top = `<div class=\"row\"><div class=\"left\">${menu}</div>${logo}<div class=\"actions\">${userIcon}${cart}</div></div><div class=\"srow\">${search}</div>`;\n    } else {\n      top = `<div class=\"row\">${menu}${logo}${search}<div class=\"actions\">${userIcon}${cart}</div></div>`;\n    }\n\n    return `<header class=\"hd l-${layout}\">${top}${navrow}</header>`;\n  }\n};"}},"accountHint":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"accountHint"}}}},"activeCategory":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"activeCategory"}}}},"allProductsHref":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"allProductsHref"}}}},"allProductsLabel":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"allProductsLabel"}}}},"button":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"button"}}}},"cartCount":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"cartCount"}}}},"categories":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"categories"}}}},"homeHref":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"homeHref"}}}},"iconComponent":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"iconComponent"}}}},"layout":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"layout"}}}},"logo":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"logo"}}}},"onAccount":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onAccount"}}}},"onCart":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onCart"}}}},"onCategory":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onCategory"}}}},"onMenu":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onMenu"}}}},"onSearch":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onSearch"}}}},"searchBar":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"searchBar"}}}},"userName":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"userName"}}}}}}}}}},{"_id":"6ab6c6edc37038941e4f0cad","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"Hero","package":"babi-lf","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// Hero — Loja Lucas Fontana\n// Carrossel de abertura da home. Não desenha botão nem ícones:\n// reaproveita Button (CTA) e Icon (setas e placeholder de foto) pelos parâmetros `button` e `iconComponent`.\nconst LAYOUTS = ['desktop', 'tablet', 'mobile'];\nconst DEFAULT_SLIDES = [\n  {\n    eyebrow: 'Loja oficial do canal',\n    title: 'Testado no canal.\\nAprovado na garagem.',\n    shortTitle: 'Testado no canal.\\nAprovado na garagem.',\n    text: 'Os produtos que o Lucas usa nos vídeos, agora direto da garagem para a sua. Assiste primeiro. Compra depois.',\n    shortText: 'O que aparece nos vídeos, tá aqui na loja.',\n    ctaLabel: 'Ver mais vendidos', ctaShortLabel: 'Mais vendidos', ctaHref: '/produtos?ordem=mais-vendidos'\n  },\n  {\n    eyebrow: 'Performance BPower',\n    title: 'Peça boa.\\nEnviada pela BPower.',\n    shortTitle: 'Peça boa.\\nEnviada pela BPower.',\n    text: 'A linha de performance da parceira, com a garantia da loja oficial e parcelamento no cartão.',\n    shortText: 'Linha de performance com a garantia da loja oficial.',\n    ctaLabel: 'Conhecer a linha', ctaShortLabel: 'Conhecer', ctaHref: '/c/performance-bpower'\n  },\n  {\n    eyebrow: 'Limpeza automotiva',\n    title: 'O que não sai\\nda garagem do Lucas.',\n    shortTitle: 'O que não sai\\nda garagem.',\n    text: 'Shampoo, pretinho e tudo o que deixa o carro no ponto de gravação.',\n    shortText: 'Tudo o que deixa o carro no ponto de gravação.',\n    ctaLabel: 'Ver limpeza', ctaShortLabel: 'Ver limpeza', ctaHref: '/c/limpeza-automotiva'\n  }\n];\nconst PHOTO = { desktop: '1440 × 580', tablet: '1536 × 1040', mobile: '780 × 1120' };\n\nconst esc = (s) => String(s == null ? '' : s)\n  .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\nconst lines = (s) => esc(s).split(/\\n|\\\\n/).join('<br>');\nconst refOf = (v) => { const r = (v && typeof v === 'object' ? (typeof v.getReference === 'function' ? v.getReference() : v.reference) : v) || ''; return r && r.indexOf('@') < 0 ? 'babi-lf@' + r : r; };\nconst detect = (w) => (w >= 1200 ? 'desktop' : w >= 768 ? 'tablet' : 'mobile');\nconst pad = (n) => (n < 10 ? '0' + n : String(n));\n\nfunction slidesOf(v) {\n  let list = v;\n  if (typeof list === 'string') { try { list = JSON.parse(list); } catch (e) { list = null; } }\n  return Array.isArray(list) && list.length ? list : DEFAULT_SLIDES;\n}\n\nexport default {\n  css: `\n:host { display: block; width: 100%; height: 100%; }\n* { box-sizing: border-box; }\n.hero { --red-500: #c8102e; --red-300: #f0707f; --ink: #0b0b0c; --white: #ffffff; --graphite-800: #2a2b2e; --graphite-900: #1c1d1f; --graphite-950: #121314;\n  --text-inv-2: #b9bbbe;\n  font-family: 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; -webkit-font-smoothing: antialiased;\n  position: relative; width: 100%; height: 580px; overflow: hidden; background: var(--ink); color: var(--white); touch-action: pan-y; }\n.slide { position: absolute; inset: 0; opacity: 0; visibility: hidden; transition: opacity .45s ease, visibility 0s linear .45s; }\n.slide.on { opacity: 1; visibility: visible; transition: opacity .45s ease; }\n\n/* Foto */\n.photo { position: absolute; top: 0; right: 0; bottom: 0; width: 56%; background: var(--graphite-900); overflow: hidden; }\n.photo::before { content: ''; position: absolute; top: 0; bottom: 0; left: 0; width: 240px; z-index: 1; background: linear-gradient(90deg, var(--ink), rgba(11,11,12,0)); pointer-events: none; }\n.photo img { display: block; width: 100%; height: 100%; object-fit: cover; }\n.ph { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; color: #6b6e73;\n  background: repeating-linear-gradient(-18deg, var(--graphite-900) 0 22px, var(--graphite-800) 22px 24px); }\n.ph .slot { width: 40px; height: 40px; }\n.l-desktop .ph { padding-left: 32%; }\n.l-tablet .ph, .l-mobile .ph { justify-content: flex-start; padding-top: 64px; }\n.l-tablet .title .t-long, .l-tablet .title .t-short, .l-mobile .title .t-long, .l-mobile .title .t-short { white-space: normal; }\n.ph span { font-size: 12px; font-weight: 700; letter-spacing: .14em; text-transform: uppercase; }\n.checker { position: absolute; top: 0; right: 0; z-index: 2; width: 120px; height: 60px; pointer-events: none;\n  background: repeating-conic-gradient(var(--white) 0 25%, var(--ink) 0 50%) 0 0 / 60px 60px; }\n\n/* Texto */\n.copy { position: absolute; top: 0; bottom: 0; left: 0; width: 62%; padding: 0 48px 0 96px; display: flex; flex-direction: column; justify-content: center; z-index: 1; }\n.title .t-long, .title .t-short { white-space: nowrap; }\n.eyebrow { display: flex; align-items: center; gap: 12px; margin: 0 0 20px; color: var(--red-300); font-size: 12px; font-weight: 700; letter-spacing: .3em; text-transform: uppercase; }\n.eyebrow b { font-weight: 800; letter-spacing: .1em; }\n.eyebrow i { display: block; width: 24px; height: 2px; background: var(--red-500); transform: skewX(-30deg); }\n.title { margin: 0; font-size: 64px; line-height: .98; font-weight: 800; font-style: italic; font-stretch: 118%; letter-spacing: -.005em; text-transform: uppercase; }\n.lead { margin: 20px 0 0; max-width: 460px; font-size: 17px; line-height: 1.5; color: var(--text-inv-2); }\n.cta { margin-top: 32px; height: 56px; width: auto; align-self: flex-start; }\n.t-short, .x-short { display: none; }\n\n/* Controles */\n.ctrl { position: absolute; right: 96px; bottom: 40px; display: flex; align-items: center; gap: 24px; z-index: 2; }\n.dots { display: flex; align-items: center; }\n.dot { display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 44px; padding: 0; margin: 0; border: 0; background: transparent; cursor: pointer; }\n.dot span { display: block; width: 24px; height: 3px; background: rgba(255,255,255,.4); transition: width .2s ease, background-color .2s ease; }\n.dot.on span { width: 36px; background: var(--red-500); }\n.dot:hover span { background: var(--white); }\n.dot.on:hover span { background: var(--red-500); }\n.arrows { display: flex; gap: 8px; }\n.arr { display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 44px; padding: 0; margin: 0; background: transparent;\n  border: 1.5px solid rgba(255,255,255,.4); border-radius: 2px; color: var(--white); cursor: pointer; }\n.arr:hover { background: var(--white); color: var(--ink); border-color: var(--white); }\n.arr .slot { width: 20px; height: 20px; pointer-events: none; }\n.dot:focus-visible, .arr:focus-visible { outline: 2px solid var(--white); outline-offset: 2px; }\n\n/* Tablet: foto atrás, texto embaixo, sem setas */\n.l-tablet { height: 520px; }\n.l-tablet .photo { width: 100%; left: 0; }\n.l-tablet .photo::before { display: none; }\n.l-tablet .photo::after { content: ''; position: absolute; inset: 0; background: linear-gradient(0deg, rgba(11,11,12,.92) 0%, rgba(11,11,12,.6) 42%, rgba(11,11,12,0) 75%); }\n.l-tablet .copy { top: auto; width: 100%; padding: 0 40px 88px; justify-content: flex-end; }\n.l-tablet .title { font-size: 48px; font-stretch: 104%; }\n.l-tablet .lead { font-size: 16px; margin-top: 16px; max-width: 520px; }\n.l-tablet .eyebrow { margin-bottom: 16px; }\n.l-tablet .cta { margin-top: 24px; height: 52px; }\n.l-tablet .ctrl { left: 30px; right: auto; bottom: 20px; }\n.l-tablet .arrows { display: none; }\n\n/* Mobile: foto atrás, texto embaixo, CTA com largura total */\n.l-mobile { height: 560px; }\n.l-mobile .photo { width: 100%; left: 0; }\n.l-mobile .photo::before { display: none; }\n.l-mobile .photo::after { content: ''; position: absolute; inset: 0; background: linear-gradient(0deg, rgba(11,11,12,.95) 0%, rgba(11,11,12,.7) 45%, rgba(11,11,12,0) 78%); }\n.l-mobile .checker { width: 96px; height: 48px; background-size: 48px 48px; }\n.l-mobile .copy { top: auto; width: 100%; padding: 0 20px 76px; justify-content: flex-end; }\n.l-mobile .eyebrow { margin-bottom: 14px; font-size: 11px; letter-spacing: .24em; gap: 10px; }\n.l-mobile .title { font-size: 34px; line-height: 1; font-stretch: 112%; }\n.l-mobile .lead { font-size: 15px; margin-top: 12px; }\n.l-mobile .cta { margin-top: 20px; height: 52px; width: 100%; align-self: stretch; }\n.l-mobile .t-long, .l-mobile .x-long { display: none; }\n.l-mobile .t-short, .l-mobile .x-short { display: inline; }\n.l-mobile .ctrl { left: 50%; right: auto; transform: translateX(-50%); bottom: 16px; }\n.l-mobile .arrows { display: none; }\n`,\n\n  mounted(d2, root) {\n    if (typeof document !== 'undefined' && document.head && !document.getElementById('lf-archivo-font')) {\n      const l = document.createElement('link');\n      l.id = 'lf-archivo-font';\n      l.rel = 'stylesheet';\n      l.href = 'https://fonts.googleapis.com/css2?family=Archivo:ital,wdth,wght@0,62..125,100..900;1,62..125,100..900&display=swap';\n      document.head.appendChild(l);\n    }\n    if (typeof ResizeObserver !== 'undefined') {\n      const ro = new ResizeObserver((e) => {\n        const w = detect(e[0].contentRect.width);\n        if (d2.state.auto !== w) d2.state.auto = w;\n      });\n      ro.observe(root);\n      d2.onUnmount(() => ro.disconnect());\n    }\n    const total = () => slidesOf(d2.params && d2.params.slides).length;\n    const go = (i) => {\n      const n = total();\n      const next = ((i % n) + n) % n;\n      if (d2.state.i !== next) {\n        d2.state.i = next;\n        try { d2.emit('onSlideChange', next); } catch (err) { /* sem handler */ }\n      }\n    };\n    const cur = () => d2.state.i || 0;\n    d2.on('.arr.prev', 'click', () => { go(cur() - 1); restart(); });\n    d2.on('.arr.next', 'click', () => { go(cur() + 1); restart(); });\n    d2.on('.dot', 'click', (e, el) => { go(Number(el.dataset.i)); restart(); });\n    d2.on('.hero', 'keydown', (e) => {\n      if (e.key === 'ArrowLeft') { go(cur() - 1); restart(); }\n      if (e.key === 'ArrowRight') { go(cur() + 1); restart(); }\n    });\n\n    // Arrastar para o lado troca o slide (celular e tablet)\n    let x0 = null;\n    d2.on('.hero', 'pointerdown', (e) => { x0 = e.clientX; });\n    d2.on('.hero', 'pointerup', (e) => {\n      if (x0 == null) return;\n      const dx = e.clientX - x0; x0 = null;\n      if (Math.abs(dx) > 48) { go(cur() + (dx < 0 ? 1 : -1)); restart(); }\n    });\n\n    // Troca automática opcional (autoplay em segundos; 0 desliga). Pausa ao passar o mouse.\n    let timer = null;\n    const stop = () => { if (timer) { clearInterval(timer); timer = null; } };\n    const start = () => {\n      stop();\n      const s = Number(d2.params && d2.params.autoplay) || 0;\n      const reduce = typeof matchMedia !== 'undefined' && matchMedia('(prefers-reduced-motion: reduce)').matches;\n      if (s > 0 && !reduce && total() > 1) timer = setInterval(() => go(cur() + 1), s * 1000);\n    };\n    function restart() { start(); }\n    d2.on('.hero', 'mouseover', stop);\n    d2.on('.hero', 'mouseout', (e) => { const h = d2.$('.hero'); if (!h || !e.relatedTarget || !h.contains(e.relatedTarget)) start(); });\n    start();\n    d2.onUnmount(stop);\n  },\n\n  render(d2) {\n    const p = d2.params || {};\n    const layout = LAYOUTS.indexOf(p.layout) >= 0 ? p.layout : (d2.state.auto || 'desktop');\n    const slides = slidesOf(p.slides);\n    const n = slides.length;\n    const active = Math.min(d2.state.i || 0, n - 1);\n    const iconRef = refOf(d2.param('iconComponent'));\n    const buttonRef = refOf(d2.param('button'));\n    const mob = layout === 'mobile';\n\n    const ic = (name, key, size, color) => iconRef\n      ? d2.render(iconRef, { name, size, iconColor: color || 'currentColor' }, { key, width: size, height: size, class: 'slot' })\n      : '';\n\n    const html = slides.map((s, i) => {\n      const img = (layout === 'mobile' && s.imageMobile) || (layout !== 'desktop' && s.imageTablet) || s.image || '';\n      const photo = img\n        ? `<img src=\"${esc(img)}\" alt=\"${esc(s.imageAlt || '')}\"${i === 0 ? '' : ' loading=\"lazy\"'}>`\n        : `<div class=\"ph\">${ic('image', 'ph-' + i, 40, '#6b6e73')}<span>Foto ${PHOTO[layout]}</span></div>`;\n      const cta = buttonRef && s.ctaLabel\n        ? `<div class=\"cta\">${d2.render(buttonRef, {\n            label: mob && s.ctaShortLabel ? s.ctaShortLabel : s.ctaLabel,\n            variant: 'brand', size: 'hero', fullWidth: 'mobile', arrow: true, layout, href: s.ctaHref || ''\n          }, { key: 'cta-' + i, onClick: () => { try { d2.emit('onCta', { index: i, href: s.ctaHref || '' }); } catch (err) { /* sem handler */ } } })}</div>`\n        : '';\n      const shortT = s.shortTitle || s.title;\n      const shortX = s.shortText || s.text;\n      return `<div class=\"slide${i === active ? ' on' : ''}\" data-key=\"s${i}\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"${i + 1} de ${n}\"${i === active ? '' : ' aria-hidden=\"true\"'}>\n        <div class=\"photo\">${photo}<div class=\"checker\" aria-hidden=\"true\"></div></div>\n        <div class=\"copy\">\n          ${s.eyebrow ? `<p class=\"eyebrow\"><b>${pad(i + 1)}</b><i></i>${esc(s.eyebrow)}</p>` : ''}\n          <h${i === 0 ? 1 : 2} class=\"title\"><span class=\"t-long\">${lines(s.title)}</span><span class=\"t-short\">${lines(shortT)}</span></h${i === 0 ? 1 : 2}>\n          ${s.text ? `<p class=\"lead\"><span class=\"x-long\">${esc(s.text)}</span><span class=\"x-short\">${esc(shortX)}</span></p>` : ''}\n          ${cta}\n        </div>\n      </div>`;\n    }).join('');\n\n    const dots = n > 1 ? `<div class=\"dots\">${slides.map((s, i) =>\n      `<button type=\"button\" class=\"dot${i === active ? ' on' : ''}\" data-i=\"${i}\" data-key=\"d${i}\" aria-label=\"Ir para o slide ${i + 1}\"${i === active ? ' aria-current=\"true\"' : ''}><span></span></button>`).join('')}</div>` : '';\n    const arrows = n > 1 && layout === 'desktop'\n      ? `<div class=\"arrows\"><button type=\"button\" class=\"arr prev\" aria-label=\"Slide anterior\">${ic('chevron-left', 'al', 20)}</button><button type=\"button\" class=\"arr next\" aria-label=\"Próximo slide\">${ic('chevron-right', 'ar', 20)}</button></div>`\n      : '';\n\n    return `<section class=\"hero l-${layout}\" aria-roledescription=\"carrossel\" aria-label=\"Destaques da loja\" tabindex=\"-1\">${html}${n > 1 ? `<div class=\"ctrl\">${dots}${arrows}</div>` : ''}</section>`;\n  }\n};"}},"autoplay":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"autoplay"}}}},"button":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"button"}}}},"iconComponent":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"iconComponent"}}}},"layout":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"layout"}}}},"onCta":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onCta"}}}},"onSlideChange":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onSlideChange"}}}},"slides":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"slides"}}}}}}}}}},{"_id":"6ab6c9e2df879c35ebaf3043","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"CategoryCard","package":"babi-lf","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// CategoryCard — Loja Lucas Fontana\n// Card de categoria da home: fundo escuro, numeral vermelho, nome largo e a seta num quadrado vermelho.\n// Não desenha ícones: reaproveita o Icon da loja pelo parâmetro `iconComponent`.\nconst LAYOUTS = ['desktop', 'tablet', 'mobile'];\nconst esc = (s) => String(s == null ? '' : s)\n  .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\nconst refOf = (v) => { const r = (v && typeof v === 'object' ? (typeof v.getReference === 'function' ? v.getReference() : v.reference) : v) || ''; return r && r.indexOf('@') < 0 ? 'babi-lf@' + r : r; };\nconst detect = (w) => (w >= 280 ? 'desktop' : w >= 200 ? 'tablet' : 'mobile');\nconst numeral = (v) => {\n  if (v == null || v === '') return '';\n  const n = Number(v);\n  return Number.isFinite(n) ? (n < 10 ? '0' + n : String(n)) : String(v);\n};\n\nexport default {\n  css: `\n:host { display: block; width: 100%; height: 100%; }\n* { box-sizing: border-box; }\n.card { --red-500: #c8102e; --ink: #0b0b0c; --white: #ffffff; --graphite-800: #2a2b2e; --graphite-900: #1c1d1f; --text-inv-2: #b9bbbe;\n  font-family: 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; -webkit-font-smoothing: antialiased;\n  position: relative; display: flex; flex-direction: column; justify-content: space-between; width: 100%; height: 100%; min-height: 160px;\n  padding: 28px; overflow: hidden; border-radius: 0; background: var(--graphite-900); color: var(--white); text-decoration: none; cursor: pointer; }\n.card.t-ink { background: var(--ink); }\n.card:focus-visible { outline: 2px solid var(--red-500); outline-offset: 2px; }\n\n.bg { position: absolute; inset: 0; z-index: 0; }\n.bg img { display: block; width: 100%; height: 100%; object-fit: cover; transition: transform .5s ease; }\n.bg::after { content: ''; position: absolute; inset: 0; background: linear-gradient(0deg, rgba(11,11,12,.92) 0%, rgba(11,11,12,.45) 55%, rgba(11,11,12,.25) 100%); }\n.card:hover .bg img { transform: scale(1.04); }\n\n.num { position: relative; z-index: 1; margin: 0; font-size: 44px; line-height: 1; font-weight: 800; font-style: italic; font-stretch: 125%; color: var(--red-500); }\n.foot { position: relative; z-index: 1; display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; }\n.words { display: flex; flex-direction: column; gap: 8px; min-width: 0; }\n.name { margin: 0; font-size: 22px; line-height: 1.05; font-weight: 800; font-stretch: 108%; text-transform: uppercase; letter-spacing: 0; overflow-wrap: normal; word-break: normal; hyphens: none; }\n.cap { margin: 0; font-size: 14px; line-height: 1.35; color: var(--text-inv-2); }\n.go { flex: none; display: inline-flex; align-items: center; justify-content: center; width: 40px; height: 40px; background: var(--red-500); color: var(--white);\n  transition: background-color .15s ease, color .15s ease; }\n.go .slot { width: 20px; height: 20px; pointer-events: none; }\n.card:hover .go { background: var(--white); color: var(--ink); }\n.card:hover .name { color: var(--white); }\n\n/* Tablet */\n.l-tablet { padding: 24px; }\n.l-tablet .num { font-size: 36px; font-stretch: 120%; }\n.l-tablet .name { font-size: 20px; font-stretch: 108%; }\n.l-tablet .cap { font-size: 13px; }\n\n/* Mobile: seta some, tudo menor */\n.l-mobile { padding: 16px; min-height: 140px; }\n.l-mobile .num { font-size: 26px; font-stretch: 115%; }\n.l-mobile .words { gap: 4px; }\n.l-mobile .name { font-size: 16px; font-stretch: 104%; }\n.l-mobile .cap { font-size: 12px; }\n.l-mobile .go { display: none; }\n`,\n\n  mounted(d2, root) {\n    if (typeof document !== 'undefined' && document.head && !document.getElementById('lf-archivo-font')) {\n      const l = document.createElement('link');\n      l.id = 'lf-archivo-font';\n      l.rel = 'stylesheet';\n      l.href = 'https://fonts.googleapis.com/css2?family=Archivo:ital,wdth,wght@0,62..125,100..900;1,62..125,100..900&display=swap';\n      document.head.appendChild(l);\n    }\n    // Sem `layout` fixo, o card segue a largura da própria coluna da grade\n    if (typeof ResizeObserver !== 'undefined') {\n      const ro = new ResizeObserver((e) => {\n        const w = detect(e[0].contentRect.width);\n        if (d2.state.auto !== w) d2.state.auto = w;\n      });\n      ro.observe(root);\n      d2.onUnmount(() => ro.disconnect());\n    }\n    d2.on('.card', 'click', (e, el) => {\n      if (el.tagName !== 'A') {\n        try { d2.emit('onSelect', d2.params && d2.params.slug); } catch (err) { /* sem handler */ }\n      }\n    });\n  },\n\n  render(d2) {\n    const p = d2.params || {};\n    const layout = LAYOUTS.indexOf(p.layout) >= 0 ? p.layout : (d2.state.auto || 'desktop');\n    const tone = p.tone === 'ink' ? 'ink' : 'graphite';\n    const label = p.label || 'Limpeza automotiva';\n    const cap = layout === 'mobile' && p.shortCaption ? p.shortCaption : (p.caption == null ? '24 produtos' : p.caption);\n    const num = numeral(p.number == null ? 1 : p.number);\n    const iconRef = refOf(d2.param('iconComponent'));\n    const arrow = iconRef\n      ? `<span class=\"go\" aria-hidden=\"true\">${d2.render(iconRef, { name: 'arrow-right', size: 20, iconColor: 'currentColor' }, { key: 'arrow', width: 20, height: 20, class: 'slot' })}</span>`\n      : '';\n    const bg = p.image ? `<div class=\"bg\"><img src=\"${esc(p.image)}\" alt=\"\" loading=\"lazy\"></div>` : '';\n    const inner = `${bg}${num ? `<p class=\"num\" aria-hidden=\"true\">${esc(num)}</p>` : '<span></span>'}\n      <div class=\"foot\"><div class=\"words\"><p class=\"name\">${esc(label)}</p>${cap ? `<p class=\"cap\">${esc(cap)}</p>` : ''}</div>${arrow}</div>`;\n    const cls = `card t-${tone} l-${layout}`;\n    return p.href\n      ? `<a class=\"${cls}\" href=\"${esc(p.href)}\" aria-label=\"${esc(label)}${cap ? ', ' + esc(cap) : ''}\">${inner}</a>`\n      : `<button type=\"button\" class=\"${cls}\" style=\"border:0;text-align:left;font:inherit\" aria-label=\"${esc(label)}${cap ? ', ' + esc(cap) : ''}\">${inner}</button>`;\n  }\n};"}},"caption":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"caption"}}}},"href":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"href"}}}},"iconComponent":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"iconComponent"}}}},"image":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"image"}}}},"label":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"label"}}}},"layout":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"layout"}}}},"number":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"number"}}}},"onSelect":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onSelect"}}}},"shortCaption":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"shortCaption"}}}},"slug":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"slug"}}}},"tone":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"tone"}}}}}}}}}},{"_id":"6ab6ca7fff43b91b61b9b044","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"Price","package":"babi-lf","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// Price — Loja Lucas Fontana\n// Bloco de preço: preço cheio grande, valor no Pix e parcelamento no cartão.\n// Dois tamanhos: `card` (ProductCard) e `buybox` (página de produto).\nconst LAYOUTS = ['desktop', 'tablet', 'mobile'];\nconst SIZES = ['card', 'buybox'];\nconst esc = (s) => String(s == null ? '' : s)\n  .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\nconst truthy = (v) => v === true || v === 'true' || v === 1 || v === '1';\nconst num = (v) => { const n = typeof v === 'string' ? Number(v.replace(/\\./g, '').replace(',', '.')) : Number(v); return Number.isFinite(n) ? n : 0; };\nconst brl = (n) => 'R$\\u00a0' + n.toFixed(2).replace('.', ',').replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n\nexport default {\n  css: `\n:host { display: block; width: 100%; }\n* { box-sizing: border-box; }\n.pr { --red-500: #c8102e; --ink: #0b0b0c; --grey-500: #6b6e73; --grey-700: #45474b;\n  font-family: 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; -webkit-font-smoothing: antialiased;\n  display: flex; flex-direction: column; gap: 4px; color: var(--ink); }\np { margin: 0; }\n.old { font-size: 13px; color: var(--grey-500); text-decoration: line-through; line-height: 1.2; }\n.main { font-size: 22px; line-height: 1.1; font-weight: 800; font-stretch: 110%; letter-spacing: -.005em; white-space: nowrap; }\n.sub { font-size: 13px; line-height: 1.4; color: var(--grey-700); }\n.sub b { font-weight: 700; color: var(--ink); }\n.sub .br { display: none; }\n.muted .main, .muted .sub b { color: var(--grey-500); }\n\n/* card: tablet e mobile */\n.s-card.l-tablet .main { font-size: 20px; }\n.s-card.l-mobile .main { font-size: 17px; font-stretch: 106%; }\n.s-card.l-mobile .sub { font-size: 12px; line-height: 1.35; }\n.s-card.l-mobile .dot { display: none; }\n.s-card.l-mobile .sub .br { display: block; }\n\n/* buybox */\n.s-buybox { gap: 6px; }\n.s-buybox .old { font-size: 15px; }\n.s-buybox .main { font-size: 36px; }\n.s-buybox .pix { font-size: 17px; font-weight: 700; color: var(--ink); line-height: 1.3; margin-top: 4px; }\n.s-buybox .pix span { color: var(--red-500); }\n.s-buybox .inst { font-size: 14px; color: var(--grey-700); line-height: 1.4; }\n.s-buybox.l-tablet .main { font-size: 32px; }\n.s-buybox.l-mobile .main { font-size: 28px; font-stretch: 106%; }\n.s-buybox.l-mobile .pix { font-size: 16px; }\n.s-buybox.l-mobile .inst { font-size: 13px; }\n`,\n\n  mounted() {\n    if (typeof document !== 'undefined' && document.head && !document.getElementById('lf-archivo-font')) {\n      const l = document.createElement('link');\n      l.id = 'lf-archivo-font';\n      l.rel = 'stylesheet';\n      l.href = 'https://fonts.googleapis.com/css2?family=Archivo:ital,wdth,wght@0,62..125,100..900;1,62..125,100..900&display=swap';\n      document.head.appendChild(l);\n    }\n  },\n\n  render(d2) {\n    const p = d2.params || {};\n    const layout = LAYOUTS.indexOf(p.layout) >= 0 ? p.layout : 'desktop';\n    const size = SIZES.indexOf(p.size) >= 0 ? p.size : 'card';\n    const price = num(p.price == null ? 89.9 : p.price);\n    const disc = p.pixDiscount == null || p.pixDiscount === '' ? 10 : num(p.pixDiscount);\n    const pix = p.pixPrice != null && p.pixPrice !== '' ? num(p.pixPrice) : Math.round(price * (100 - disc)) / 100;\n    const n = Math.max(1, Math.round(num(p.installments == null ? 3 : p.installments)));\n    const old = num(p.oldPrice);\n    const showPix = pix > 0 && pix < price;\n    const cls = `pr s-${size} l-${layout}${truthy(p.muted) ? ' muted' : ''}`;\n    const oldHtml = old > price ? `<p class=\"old\"><span class=\"sr\" style=\"position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)\">De </span>${brl(old)}</p>` : '';\n\n    if (size === 'buybox') {\n      return `<div class=\"${cls}\">${oldHtml}\n        <p class=\"main\">${brl(price)}</p>\n        ${showPix ? `<p class=\"pix\"><span>${brl(pix)}</span> no Pix</p>` : ''}\n        ${n > 1 ? `<p class=\"inst\">ou ${n}x de ${brl(Math.floor((price / n) * 100) / 100)} sem juros no cartão</p>` : ''}\n      </div>`;\n    }\n    const card = n > 1 ? `ou ${n}x no cartão` : 'no cartão';\n    return `<div class=\"${cls}\">${oldHtml}\n      <p class=\"main\">${brl(price)}</p>\n      <p class=\"sub\">${showPix ? `<b>${brl(pix)} no Pix</b><span class=\"dot\"> · </span><span class=\"br\"></span>` : ''}${esc(card)}</p>\n    </div>`;\n  }\n};"}},"installments":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"installments"}}}},"layout":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"layout"}}}},"muted":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"muted"}}}},"oldPrice":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"oldPrice"}}}},"pixDiscount":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"pixDiscount"}}}},"pixPrice":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"pixPrice"}}}},"price":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"price"}}}},"size":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"size"}}}}}}}}}},{"_id":"6ab6caa02283ab0cf1c3c187","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"ProductCard","package":"babi-lf","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// ProductCard — Loja Lucas Fontana\n// Card de produto: foto quadrada, selos, nome, preço e o botão de compra.\n// Não desenha preço, botão, selos nem ícones: reaproveita Price, Button, Badge e Icon\n// pelos parâmetros `priceComponent`, `button`, `badge` e `iconComponent`.\nconst LAYOUTS = ['desktop', 'tablet', 'mobile'];\nconst esc = (s) => String(s == null ? '' : s)\n  .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\nconst truthy = (v) => v === true || v === 'true' || v === 1 || v === '1';\nconst refOf = (v) => { const r = (v && typeof v === 'object' ? (typeof v.getReference === 'function' ? v.getReference() : v.reference) : v) || ''; return r && r.indexOf('@') < 0 ? 'babi-lf@' + r : r; };\nconst detect = (w) => (w >= 290 ? 'desktop' : w >= 200 ? 'tablet' : 'mobile');\nconst fire = (d2, name, payload) => { try { d2.emit(name, payload); } catch (err) { /* sem handler */ } };\n\nexport default {\n  css: `\n:host { display: block; width: 100%; height: 100%; }\n* { box-sizing: border-box; }\n.pc { --red-500: #c8102e; --ink: #0b0b0c; --white: #ffffff; --grey-50: #f5f5f3; --grey-100: #ececea; --grey-500: #6b6e73; --line: #e4e4e2;\n  font-family: 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; -webkit-font-smoothing: antialiased;\n  display: flex; flex-direction: column; width: 100%; height: 100%; background: var(--white); color: var(--ink); border-radius: 0; }\n.pc.outlined { border: 1px solid var(--line); transition: border-color .15s ease; }\n.pc.outlined:hover { border-color: var(--ink); }\n\n.media { position: relative; display: block; width: 100%; flex: 1 1 0; min-height: 120px; background: var(--grey-100); overflow: hidden; }\n.media img { display: block; width: 100%; height: 100%; object-fit: cover; transition: transform .4s ease; }\n.pc:hover .media img { transform: scale(1.03); }\n.media:focus-visible, .name a:focus-visible { outline: 2px solid var(--red-500); outline-offset: 2px; }\n.ph { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; color: #a7a9ad; }\n.ph .slot { width: 40px; height: 40px; }\n.oos .media img, .oos .ph { opacity: .45; }\n.tags { position: absolute; top: 12px; left: 12px; right: 12px; display: flex; flex-wrap: wrap; gap: 6px; pointer-events: none; }\n.tag { height: 24px; }\n.soon { position: absolute; left: 0; right: 0; bottom: 0; padding: 10px 12px; background: var(--ink); color: var(--white);\n  font-size: 12px; font-weight: 800; letter-spacing: .14em; text-transform: uppercase; text-align: center; }\n\n.body { display: flex; flex-direction: column; flex: none; padding: 16px 0 0; }\n.outlined .body { padding: 16px; }\n.brand { margin: 0 0 6px; font-size: 11px; font-weight: 700; letter-spacing: .14em; text-transform: uppercase; color: var(--grey-500); }\n.name { margin: 0; font-size: 15px; line-height: 1.35; font-weight: 600; min-height: calc(1.35em * 2);\n  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }\n.name a { color: inherit; text-decoration: none; }\n.name a:hover { color: var(--red-500); }\n.price { margin-top: 12px; }\n.act { margin-top: auto; padding-top: 16px; height: 60px; flex: none; }\n\n/* Tablet */\n.l-tablet .name { font-size: 15px; }\n\n/* Mobile */\n.l-mobile .tags { top: 8px; left: 8px; right: 8px; gap: 4px; }\n.l-mobile .tag { height: 20px; }\n.l-mobile .soon { padding: 8px; font-size: 10px; letter-spacing: .1em; }\n.l-mobile .body { padding-top: 12px; }\n.l-mobile.outlined .body { padding: 12px; }\n.l-mobile .brand { font-size: 10px; margin-bottom: 4px; }\n.l-mobile .name { font-size: 13px; }\n.l-mobile .price { margin-top: 8px; }\n.l-mobile .act { padding-top: 12px; height: 56px; }\n`,\n\n  mounted(d2, root) {\n    if (typeof document !== 'undefined' && document.head && !document.getElementById('lf-archivo-font')) {\n      const l = document.createElement('link');\n      l.id = 'lf-archivo-font';\n      l.rel = 'stylesheet';\n      l.href = 'https://fonts.googleapis.com/css2?family=Archivo:ital,wdth,wght@0,62..125,100..900;1,62..125,100..900&display=swap';\n      document.head.appendChild(l);\n    }\n    // Sem `layout` fixo, o card segue a largura da própria coluna da grade\n    if (typeof ResizeObserver !== 'undefined') {\n      const ro = new ResizeObserver((e) => {\n        const w = detect(e[0].contentRect.width);\n        if (d2.state.auto !== w) d2.state.auto = w;\n      });\n      ro.observe(root);\n      d2.onUnmount(() => ro.disconnect());\n    }\n    d2.on('.media, .name a', 'click', () => fire(d2, 'onOpen', d2.params && d2.params.sku));\n  },\n\n  render(d2) {\n    const p = d2.params || {};\n    const layout = LAYOUTS.indexOf(p.layout) >= 0 ? p.layout : (d2.state.auto || 'desktop');\n    const mob = layout === 'mobile';\n    const oos = truthy(p.outOfStock);\n    const outlined = p.variant === 'outlined';\n    const name = p.name || 'Shampoo automotivo neutro';\n    const href = p.href || '#';\n    const sku = p.sku || '';\n\n    const priceRef = refOf(d2.param('priceComponent'));\n    const buttonRef = refOf(d2.param('button'));\n    const badgeRef = refOf(d2.param('badge'));\n    const iconRef = refOf(d2.param('iconComponent'));\n\n    const photo = p.image\n      ? `<img src=\"${esc(p.image)}\" alt=\"${esc(p.imageAlt || name)}\" loading=\"lazy\">`\n      : `<div class=\"ph\">${iconRef ? d2.render(iconRef, { name: 'image', size: 40, iconColor: '#a7a9ad' }, { key: 'ph', width: 40, height: 40, class: 'slot' }) : ''}</div>`;\n\n    // Selos: parceiro (preto) + selo livre (vermelho). Sem estoque, o selo livre sai.\n    const tags = [];\n    if (p.partner) tags.push({ k: 'partner', label: p.partner, tone: 'ink' });\n    if (p.tag && !oos) tags.push({ k: 'tag', label: p.tag, tone: 'red' });\n    const tagHtml = badgeRef && tags.length\n      ? `<div class=\"tags\">${tags.map((t) => `<div class=\"tag\">${d2.render(badgeRef, { label: t.label, tone: t.tone, layout }, { key: 'b-' + t.k, width: 'auto', height: mob ? 20 : 24 })}</div>`).join('')}</div>`\n      : '';\n\n    const price = priceRef\n      ? `<div class=\"price\">${d2.render(priceRef, {\n          price: p.price, pixPrice: p.pixPrice, pixDiscount: p.pixDiscount, installments: p.installments, oldPrice: p.oldPrice,\n          size: 'card', layout, muted: oos\n        }, { key: 'price', height: 'auto' })}</div>`\n      : '';\n\n    const btn = buttonRef\n      ? `<div class=\"act\">${d2.render(buttonRef, oos\n          ? { label: p.notifyLabel || 'Me avise quando chegar', shortLabel: 'Avise-me', variant: 'outline', size: 'sm', fullWidth: 'always', layout }\n          : { label: p.addLabel || 'Adicionar ao carrinho', shortLabel: 'Adicionar', variant: 'primary', size: 'sm', fullWidth: 'always', layout },\n          { key: oos ? 'notify' : 'add', height: 44, onClick: () => fire(d2, oos ? 'onNotify' : 'onAdd', sku) })}</div>`\n      : '';\n\n    return `<article class=\"pc l-${layout}${outlined ? ' outlined' : ''}${oos ? ' oos' : ''}\">\n      <a class=\"media\" href=\"${esc(href)}\" tabindex=\"-1\" aria-hidden=\"true\">${photo}${tagHtml}${oos ? `<span class=\"soon\">${esc(p.soonLabel || 'Volta já já')}</span>` : ''}</a>\n      <div class=\"body\">\n        ${p.brand ? `<p class=\"brand\">${esc(p.brand)}</p>` : ''}\n        <h3 class=\"name\"><a href=\"${esc(href)}\">${esc(name)}</a></h3>\n        ${price}\n        ${btn}\n      </div>\n    </article>`;\n  }\n};"}},"addLabel":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"addLabel"}}}},"badge":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"badge"}}}},"brand":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"brand"}}}},"button":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"button"}}}},"href":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"href"}}}},"iconComponent":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"iconComponent"}}}},"image":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"image"}}}},"imageAlt":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"imageAlt"}}}},"installments":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"installments"}}}},"layout":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"layout"}}}},"name":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"name"}}}},"notifyLabel":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"notifyLabel"}}}},"oldPrice":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"oldPrice"}}}},"onAdd":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onAdd"}}}},"onNotify":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onNotify"}}}},"onOpen":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onOpen"}}}},"outOfStock":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"outOfStock"}}}},"partner":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"partner"}}}},"pixDiscount":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"pixDiscount"}}}},"pixPrice":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"pixPrice"}}}},"price":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"price"}}}},"priceComponent":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"priceComponent"}}}},"sku":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"sku"}}}},"soonLabel":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"soonLabel"}}}},"tag":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"tag"}}}},"variant":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"variant"}}}}}}}}}},{"_id":"6ab6cd8b97b00074cbf00e09","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"FeaturePanel","package":"babi-lf","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// FeaturePanel — Loja Lucas Fontana\n// Painel escuro de destaque (ex.: parceria BPower): eyebrow numerado, título largo, texto,\n// lista de vantagens, CTA e foto com o xadrez no canto inferior direito.\n// Não desenha botão nem ícones: reaproveita Button e Icon pelos parâmetros `button` e `iconComponent`.\n// O texto de apoio chega por `body` (o nome `text` é reservado do bloco base do Data2).\nconst LAYOUTS = ['desktop', 'tablet', 'mobile'];\nconst DEFAULT_POINTS = ['Enviado direto pela BPower', 'Garantia da loja oficial', 'Até 6x sem juros no cartão'];\nconst PHOTO = { desktop: '624 × 520', tablet: '688 × 387', mobile: '350 × 262' };\n\nconst esc = (s) => String(s == null ? '' : s)\n  .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\nconst lines = (s) => esc(s).split(/\\n|\\\\n/).join('<br>');\nconst truthy = (v) => v === true || v === 'true' || v === 1 || v === '1';\nconst refOf = (v) => { const r = (v && typeof v === 'object' ? (typeof v.getReference === 'function' ? v.getReference() : v.reference) : v) || ''; return r && r.indexOf('@') < 0 ? 'babi-lf@' + r : r; };\nconst detect = (w) => (w >= 1000 ? 'desktop' : w >= 600 ? 'tablet' : 'mobile');\nconst pad = (v) => { const n = Number(v); return Number.isFinite(n) && v !== '' && v != null ? (n < 10 ? '0' + n : String(n)) : String(v || ''); };\nfunction listOf(v) {\n  let l = v;\n  if (typeof l === 'string') l = l.split('\\n').map((s) => s.trim()).filter(Boolean);\n  return Array.isArray(l) ? l : DEFAULT_POINTS;\n}\n\nexport default {\n  css: `\n:host { display: block; width: 100%; height: 100%; }\n* { box-sizing: border-box; }\n.fp { --red-500: #c8102e; --red-400: #e23a52; --ink: #0b0b0c; --white: #ffffff; --graphite-800: #2a2b2e; --graphite-900: #1c1d1f; --graphite-950: #121314;\n  --text-inv-2: #b9bbbe;\n  font-family: 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; -webkit-font-smoothing: antialiased;\n  display: grid; grid-template-columns: 1fr 1fr; grid-template-rows: minmax(0, 1fr); width: 100%; height: 100%; min-height: 520px; background: var(--graphite-900); color: var(--white); border-radius: 0; overflow: hidden; }\n.fp.t-ink { background: var(--ink); }\n.fp.rev .photo { order: -1; }\np, h2, ul { margin: 0; }\n\n.copy { display: flex; flex-direction: column; justify-content: center; padding: 48px 56px; min-width: 0; }\n.eyebrow { display: flex; align-items: center; gap: 12px; margin-bottom: 20px; color: var(--red-400); font-size: 12px; font-weight: 700; letter-spacing: .3em; text-transform: uppercase; }\n.eyebrow b { font-weight: 800; letter-spacing: .1em; }\n.eyebrow i { display: block; width: 24px; height: 2px; background: var(--red-500); transform: skewX(-30deg); }\n.title { font-size: 44px; line-height: .98; font-weight: 800; font-style: italic; font-stretch: 118%; text-transform: uppercase; letter-spacing: -.005em; }\n.t-short { display: none; }\n.text { margin-top: 18px; max-width: 480px; font-size: 16px; line-height: 1.5; color: var(--text-inv-2); }\n.points { list-style: none; padding: 0; margin-top: 20px; display: flex; flex-direction: column; gap: 10px; }\n.points li { display: flex; align-items: center; gap: 12px; font-size: 15px; font-weight: 600; line-height: 1.3; }\n.points .slot { flex: none; width: 20px; height: 20px; }\n.cta { margin-top: 28px; height: 52px; align-self: flex-start; }\n\n.photo { position: relative; min-height: 0; height: 100%; background: var(--graphite-800); overflow: hidden; }\n.photo img { position: absolute; inset: 0; display: block; width: 100%; height: 100%; object-fit: cover; }\n.ph { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; color: #6b6e73;\n  background: repeating-linear-gradient(-18deg, var(--graphite-800) 0 22px, #34353a 22px 24px); }\n.ph .slot { width: 40px; height: 40px; }\n.ph span { font-size: 12px; font-weight: 700; letter-spacing: .14em; text-transform: uppercase; }\n.checker { position: absolute; right: 0; bottom: 0; width: 120px; height: 60px; pointer-events: none;\n  background: repeating-conic-gradient(var(--white) 0 25%, var(--ink) 0 50%) 0 0 / 60px 60px; }\n\n/* Tablet: foto em cima, texto embaixo */\n.l-tablet { grid-template-columns: 1fr; grid-template-rows: auto 1fr; min-height: 0; }\n.l-tablet .photo { order: -1; aspect-ratio: 16 / 9; height: auto; }\n.l-tablet .copy { padding: 40px; justify-content: flex-start; }\n.l-tablet .title { font-size: 40px; font-stretch: 112%; }\n.l-tablet .text { max-width: 560px; }\n.l-tablet .cta { margin-top: 28px; }\n\n/* Mobile: empilhado, CTA com largura total */\n.l-mobile { grid-template-columns: 1fr; grid-template-rows: auto 1fr; min-height: 0; }\n.l-mobile .photo { order: -1; aspect-ratio: 4 / 3; height: auto; }\n.l-mobile .checker { width: 96px; height: 48px; background-size: 48px 48px; }\n.l-mobile .copy { padding: 28px 20px 32px; justify-content: flex-start; }\n.l-mobile .eyebrow { margin-bottom: 14px; font-size: 11px; letter-spacing: .24em; gap: 10px; }\n.l-mobile .title { font-size: 30px; line-height: 1; font-stretch: 110%; }\n.l-mobile .t-long { display: none; }\n.l-mobile .t-short { display: inline; }\n.l-mobile .text { margin-top: 14px; font-size: 15px; }\n.l-mobile .points { margin-top: 20px; gap: 10px; }\n.l-mobile .points li { font-size: 14px; }\n.l-mobile .cta { margin-top: 24px; width: 100%; align-self: stretch; }\n`,\n\n  mounted(d2, root) {\n    if (typeof document !== 'undefined' && document.head && !document.getElementById('lf-archivo-font')) {\n      const l = document.createElement('link');\n      l.id = 'lf-archivo-font';\n      l.rel = 'stylesheet';\n      l.href = 'https://fonts.googleapis.com/css2?family=Archivo:ital,wdth,wght@0,62..125,100..900;1,62..125,100..900&display=swap';\n      document.head.appendChild(l);\n    }\n    if (typeof ResizeObserver !== 'undefined') {\n      const ro = new ResizeObserver((e) => {\n        const w = detect(e[0].contentRect.width);\n        if (d2.state.auto !== w) d2.state.auto = w;\n      });\n      ro.observe(root);\n      d2.onUnmount(() => ro.disconnect());\n    }\n  },\n\n  render(d2) {\n    const p = d2.params || {};\n    const layout = LAYOUTS.indexOf(p.layout) >= 0 ? p.layout : (d2.state.auto || 'desktop');\n    const mob = layout === 'mobile';\n    const tone = p.tone === 'ink' ? 'ink' : 'graphite';\n    const iconRef = refOf(d2.param('iconComponent'));\n    const buttonRef = refOf(d2.param('button'));\n\n    const eyebrow = p.eyebrow == null ? 'Parceria oficial' : p.eyebrow;\n    const num = p.number == null ? '02' : pad(p.number);\n    const title = p.title || 'Peça de pista.\\nNa sua garagem.';\n    const shortTitle = p.shortTitle || title;\n    const body = p.body == null ? 'A linha de performance da BPower Motorsport. Produtos enviados diretamente pela BPower, com a garantia da loja oficial.' : p.body;\n    const points = listOf(p.points);\n    const ctaLabel = p.ctaLabel == null ? 'Conhecer a linha BPower' : p.ctaLabel;\n\n    const ic = (name, key, size, color) => iconRef\n      ? d2.render(iconRef, { name, size, iconColor: color }, { key, width: size, height: size, class: 'slot' })\n      : '';\n\n    const photo = p.image\n      ? `<img src=\"${esc(p.image)}\" alt=\"${esc(p.imageAlt || '')}\" loading=\"lazy\">`\n      : `<div class=\"ph\">${ic('image', 'ph', 40, '#6b6e73')}<span>Foto ${PHOTO[layout]}</span></div>`;\n\n    const cta = buttonRef && ctaLabel\n      ? `<div class=\"cta\">${d2.render(buttonRef, {\n          label: mob && p.ctaShortLabel ? p.ctaShortLabel : ctaLabel,\n          variant: p.ctaVariant === 'light' ? 'light' : 'brand', size: 'lg', fullWidth: 'mobile', arrow: true, layout, href: p.ctaHref || ''\n        }, { key: 'cta', onClick: () => { try { d2.emit('onCta', p.ctaHref || ''); } catch (err) { /* sem handler */ } } })}</div>`\n      : '';\n\n    return `<section class=\"fp l-${layout} t-${tone}${truthy(p.reverse) ? ' rev' : ''}\">\n      <div class=\"copy\">\n        ${eyebrow ? `<p class=\"eyebrow\">${num ? `<b>${esc(num)}</b><i></i>` : ''}${esc(eyebrow)}</p>` : ''}\n        <h2 class=\"title\"><span class=\"t-long\">${lines(title)}</span><span class=\"t-short\">${lines(shortTitle)}</span></h2>\n        ${body ? `<p class=\"text\">${esc(body)}</p>` : ''}\n        ${points.length ? `<ul class=\"points\">${points.map((t, i) => `<li data-key=\"pt${i}\">${ic('check', 'ck' + i, 20, '#e23a52')}<span>${esc(t)}</span></li>`).join('')}</ul>` : ''}\n        ${cta}\n      </div>\n      <div class=\"photo\">${photo}<div class=\"checker\" aria-hidden=\"true\"></div></div>\n    </section>`;\n  }\n};"}},"body":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body"}}}},"button":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"button"}}}},"ctaHref":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"ctaHref"}}}},"ctaLabel":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"ctaLabel"}}}},"ctaShortLabel":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"ctaShortLabel"}}}},"ctaVariant":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"ctaVariant"}}}},"eyebrow":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"eyebrow"}}}},"iconComponent":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"iconComponent"}}}},"image":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"image"}}}},"imageAlt":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"imageAlt"}}}},"layout":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"layout"}}}},"number":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"number"}}}},"onCta":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onCta"}}}},"points":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"points"}}}},"reverse":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"reverse"}}}},"shortTitle":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"shortTitle"}}}},"title":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"title"}}}},"tone":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"tone"}}}}}}}}}},{"_id":"6ab6ce10cf6e94d42983237c","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"InfoCard","package":"babi-lf","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// InfoCard — Loja Lucas Fontana\n// Card de informação (frete, troca, atendimento…): ícone, título, texto e CTA opcional.\n// Claro (cinza) ou escuro (preto, com o xadrez no canto). Um card só, tudo por parâmetro.\n// Não desenha botão, link nem ícones: reaproveita Button, TextLink e Icon pelos parâmetros `button`, `link` e `iconComponent`.\n// `ctaKind` escolhe o CTA: \"button\" (padrão, botão com contorno/branco) ou \"link\" (TextLink sublinhado, como na página Sobre).\n// O texto de apoio chega por `body` (o nome `text` é reservado do bloco base do Data2).\nconst LAYOUTS = ['desktop', 'tablet', 'mobile'];\nconst esc = (s) => String(s == null ? '' : s)\n  .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\nconst truthy = (v) => v === true || v === 'true' || v === 1 || v === '1';\nconst refOf = (v) => { const r = (v && typeof v === 'object' ? (typeof v.getReference === 'function' ? v.getReference() : v.reference) : v) || ''; return r && r.indexOf('@') < 0 ? 'babi-lf@' + r : r; };\n\nexport default {\n  css: `\n:host { display: block; width: 100%; height: 100%; }\n* { box-sizing: border-box; }\n.ic { --red-500: #c8102e; --ink: #0b0b0c; --white: #ffffff; --grey-50: #f5f5f3; --grey-700: #45474b; --text-inv-2: #b9bbbe;\n  font-family: 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; -webkit-font-smoothing: antialiased;\n  position: relative; display: flex; flex-direction: column; width: 100%; height: 100%; padding: 36px; overflow: hidden;\n  background: var(--grey-50); color: var(--ink); border-radius: 0; }\n.ic.dark { background: var(--ink); color: var(--white); }\np, h3 { margin: 0; }\n.glyph { width: 32px; height: 32px; flex: none; margin-bottom: 28px; }\n.title { font-size: 24px; line-height: 1.08; font-weight: 800; font-stretch: 115%; text-transform: uppercase; letter-spacing: .005em; }\n.text { margin-top: 12px; font-size: 15px; line-height: 1.55; color: var(--grey-700); max-width: 440px; }\n.dark .text { color: var(--text-inv-2); }\n.cta { margin-top: auto; padding-top: 28px; height: 72px; align-self: flex-start; }\n.cta.as-link { padding-top: 24px; height: 68px; }\n.checker { position: absolute; top: 0; right: 0; width: 60px; height: 60px; pointer-events: none;\n  background: repeating-conic-gradient(var(--white) 0 25%, var(--ink) 0 50%) 0 0 / 60px 60px; }\n.dark .checker { background: repeating-conic-gradient(var(--white) 0 25%, #2a2b2e 0 50%) 0 0 / 60px 60px; }\n\n/* Tablet */\n.l-tablet { padding: 32px; }\n.l-tablet .glyph { margin-bottom: 24px; }\n.l-tablet .title { font-size: 22px; font-stretch: 112%; }\n\n/* Card largo do tablet: ícone e texto à esquerda, CTA à direita */\n.wide.l-tablet { flex-direction: row; align-items: center; gap: 28px; }\n.wide.l-tablet .glyph { margin: 0; }\n.wide.l-tablet .words { flex: 1; min-width: 0; }\n.wide.l-tablet .cta { margin: 0; padding: 0; height: 48px; flex: none; align-self: center; }\n.wide.l-tablet .cta.as-link { height: 44px; }\n.wide.l-tablet .checker { width: 48px; height: 48px; background-size: 48px 48px; }\n\n/* Mobile: botão com largura total; o link continua do tamanho do texto */\n.l-mobile { padding: 28px 24px; }\n.l-mobile .glyph { width: 28px; height: 28px; margin-bottom: 20px; }\n.l-mobile .title { font-size: 20px; font-stretch: 108%; }\n.l-mobile .text { font-size: 14px; margin-top: 10px; }\n.l-mobile .cta { width: 100%; align-self: stretch; padding-top: 24px; height: 68px; }\n.l-mobile .cta.as-link { width: auto; align-self: flex-start; padding-top: 20px; height: 64px; }\n.l-mobile .checker { width: 48px; height: 48px; background-size: 48px 48px; }\n`,\n\n  mounted() {\n    if (typeof document !== 'undefined' && document.head && !document.getElementById('lf-archivo-font')) {\n      const l = document.createElement('link');\n      l.id = 'lf-archivo-font';\n      l.rel = 'stylesheet';\n      l.href = 'https://fonts.googleapis.com/css2?family=Archivo:ital,wdth,wght@0,62..125,100..900;1,62..125,100..900&display=swap';\n      document.head.appendChild(l);\n    }\n  },\n\n  render(d2) {\n    const p = d2.params || {};\n    const layout = LAYOUTS.indexOf(p.layout) >= 0 ? p.layout : 'desktop';\n    const mob = layout === 'mobile';\n    const dark = p.tone === 'dark';\n    const wide = truthy(p.wide);\n    const iconRef = refOf(d2.param('iconComponent'));\n    const buttonRef = refOf(d2.param('button'));\n    const linkRef = refOf(d2.param('link'));\n    const asLink = p.ctaKind === 'link' && !!linkRef;\n\n    const glyphName = p.glyph || 'truck';\n    const title = p.title || 'Frete para todo o Brasil';\n    const body = p.body == null ? 'A gente envia para qualquer CEP. Você vê o prazo e o valor antes de fechar o pedido.' : p.body;\n    const ctaLabel = p.ctaLabel || '';\n    const label = mob && p.ctaShortLabel ? p.ctaShortLabel : ctaLabel;\n    const size = mob ? 28 : 32;\n    const fire = () => { try { d2.emit('onCta', p.ctaHref || ''); } catch (err) { /* sem handler */ } };\n\n    const glyph = iconRef\n      ? `<div class=\"glyph\">${d2.render(iconRef, { name: glyphName, size, iconColor: 'currentColor' }, { key: 'glyph', width: size, height: size })}</div>`\n      : '';\n\n    let cta = '';\n    if (ctaLabel && asLink) {\n      cta = `<div class=\"cta as-link\">${d2.render(linkRef, {\n        label, href: p.ctaHref || '', tone: dark ? 'light' : 'dark', layout\n      }, { key: 'cta-link', onClick: fire })}</div>`;\n    } else if (ctaLabel && buttonRef) {\n      cta = `<div class=\"cta\">${d2.render(buttonRef, {\n        label, variant: dark ? 'light' : 'outline', size: 'sm', fullWidth: 'mobile', arrow: true, layout, href: p.ctaHref || ''\n      }, { key: 'cta', onClick: fire })}</div>`;\n    }\n\n    return `<article class=\"ic l-${layout}${dark ? ' dark' : ''}${wide ? ' wide' : ''}\">\n      ${dark ? '<div class=\"checker\" aria-hidden=\"true\"></div>' : ''}\n      ${glyph}\n      <div class=\"words\"><h3 class=\"title\">${esc(title)}</h3>${body ? `<p class=\"text\">${esc(body)}</p>` : ''}</div>\n      ${cta}\n    </article>`;\n  }\n};"}},"body":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body"}}}},"button":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"button"}}}},"ctaHref":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"ctaHref"}}}},"ctaKind":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"ctaKind"}}}},"ctaLabel":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"ctaLabel"}}}},"ctaShortLabel":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"ctaShortLabel"}}}},"glyph":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"glyph"}}}},"iconComponent":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"iconComponent"}}}},"layout":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"layout"}}}},"link":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"link"}}}},"onCta":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onCta"}}}},"title":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"title"}}}},"tone":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"tone"}}}},"wide":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"wide"}}}}}}}}}},{"_id":"6ab6d0c42086c2e4341913c7","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"SectionHeader","package":"babi-lf","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// SectionHeader — Loja Lucas Fontana\n// Cabeçalho das seções: eyebrow numerado (\"01 — Categorias\") ou kicker vermelho (\"— Por que comprar aqui\"),\n// título largo em caixa alta e um link opcional à direita (\"Ver tudo\"). No mobile o link some (a seção mostra um botão embaixo).\nconst LAYOUTS = ['desktop', 'tablet', 'mobile'];\nconst esc = (s) => String(s == null ? '' : s)\n  .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\nconst truthy = (v) => v === true || v === 'true' || v === 1 || v === '1';\nconst pad = (v) => { const n = Number(v); return v !== '' && v != null && Number.isFinite(n) ? (n < 10 ? '0' + n : String(n)) : String(v || ''); };\n\nexport default {\n  css: `\n:host { display: block; width: 100%; }\n* { box-sizing: border-box; }\n.sh { --red-500: #c8102e; --ink: #0b0b0c; --grey-500: #6b6e73;\n  font-family: 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; -webkit-font-smoothing: antialiased;\n  display: flex; align-items: flex-end; justify-content: space-between; gap: 32px; width: 100%; color: var(--ink); }\np, h2 { margin: 0; }\n.words { min-width: 0; }\n.eyebrow { display: flex; align-items: center; gap: 10px; margin-bottom: 14px; font-size: 12px; font-weight: 700; letter-spacing: .3em; text-transform: uppercase; color: var(--grey-500); }\n.eyebrow b { color: var(--red-500); font-weight: 800; letter-spacing: .1em; }\n.eyebrow i { font-style: normal; color: var(--grey-500); letter-spacing: 0; }\n.eyebrow .dash { display: block; width: 20px; height: 2px; background: var(--red-500); }\n.kicker { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; font-size: 12px; font-weight: 700; letter-spacing: .3em; line-height: 1.3; text-transform: uppercase; color: var(--red-500); }\n.kicker::before { content: ''; width: 22px; height: 3px; background: var(--red-500); flex: none; }\n.title { font-size: 44px; line-height: 1; font-weight: 800; font-stretch: 115%; letter-spacing: -.01em; text-transform: uppercase; }\n.link { flex: none; display: inline-flex; align-items: center; min-height: 44px; color: var(--ink); text-decoration: none;\n  font-size: 12px; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; white-space: nowrap; }\n.link span { border-bottom: 2px solid var(--red-500); padding-bottom: 3px; }\n.link:hover { color: var(--red-500); }\n.link:focus-visible { outline: 2px solid var(--red-500); outline-offset: 2px; }\n.l-tablet .title { font-size: 36px; }\n.l-mobile .eyebrow { font-size: 11px; letter-spacing: .26em; margin-bottom: 12px; }\n.l-mobile .kicker { font-size: 11px; letter-spacing: .26em; margin-bottom: 12px; }\n.l-mobile .title { font-size: 28px; line-height: 1.02; font-stretch: 112%; }\n.l-mobile .link { display: none; }\n`,\n\n  mounted(d2) {\n    if (typeof document !== 'undefined' && document.head && !document.getElementById('lf-archivo-font')) {\n      const l = document.createElement('link');\n      l.id = 'lf-archivo-font';\n      l.rel = 'stylesheet';\n      l.href = 'https://fonts.googleapis.com/css2?family=Archivo:ital,wdth,wght@0,62..125,100..900;1,62..125,100..900&display=swap';\n      document.head.appendChild(l);\n    }\n    d2.on('.link', 'click', () => { try { d2.emit('onAction', d2.params && d2.params.actionHref); } catch (err) { /* sem handler */ } });\n  },\n\n  render(d2) {\n    const p = d2.params || {};\n    const layout = LAYOUTS.indexOf(p.layout) >= 0 ? p.layout : 'desktop';\n    const num = pad(p.number);\n    const eyebrow = p.eyebrow == null ? 'Categorias' : p.eyebrow;\n    const title = p.title || 'Por onde a gente começa?';\n    const lead = num ? `<b>${esc(num)}</b><i>—</i>` : '<span class=\"dash\"></span>';\n    const top = !eyebrow ? ''\n      : truthy(p.kicker) ? `<p class=\"kicker\">${esc(eyebrow)}</p>`\n      : `<p class=\"eyebrow\">${lead}${esc(eyebrow)}</p>`;\n    return `<div class=\"sh l-${layout}\">\n      <div class=\"words\">\n        ${top}\n        <h2 class=\"title\">${esc(title)}</h2>\n      </div>\n      ${p.actionLabel ? `<a class=\"link\" href=\"${esc(p.actionHref || '#')}\"><span>${esc(p.actionLabel)}</span></a>` : ''}\n    </div>`;\n  }\n};"}},"actionHref":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"actionHref"}}}},"actionLabel":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"actionLabel"}}}},"eyebrow":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"eyebrow"}}}},"kicker":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"kicker"}}}},"layout":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"layout"}}}},"number":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"number"}}}},"onAction":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onAction"}}}},"title":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"title"}}}}}}}}}},{"_id":"6ab6e5dee92b0a717903157e","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"docCreateOrder","package":"babi-lf","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    .doc { box-sizing:border-box; font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,sans-serif; background:#f5f5f3; color:#0f172a; min-height:100%; height:100%; overflow-y:auto; padding:48px 24px; }\n    .doc *{ box-sizing:border-box; }\n    .wrap{ max-width:920px; margin:0 auto; }\n    .h1{ font-size:34px; font-weight:800; letter-spacing:-0.02em; margin:0 0 8px; }\n    .sub{ font-size:16px; color:#475569; line-height:1.55; margin:0 0 14px; }\n    .badge{ display:inline-flex; align-items:center; gap:6px; font-size:12px; font-weight:700; color:#b45309; background:#fef3c7; border:1px solid #fde68a; padding:5px 12px; border-radius:999px; text-transform:uppercase; letter-spacing:.05em; }\n    .card{ background:#fff; border:1px solid #e7e7e4; border-radius:16px; padding:22px 26px; margin-top:20px; box-shadow:0 1px 2px rgba(15,23,42,.04); }\n    .card h2{ font-size:19px; font-weight:700; margin:0 0 12px; }\n    .card p{ font-size:14px; line-height:1.6; color:#475569; margin:0 0 4px; }\n    .flow{ font-size:14px; font-weight:600; color:#0f172a; line-height:1.6; margin:0 0 12px; }\n    .chip{ display:inline-block; background:#eef2ff; color:#4338ca; border-radius:6px; padding:1px 7px; font-weight:600; font-family:\"Roboto Mono\",ui-monospace,monospace; font-size:12.5px; }\n    ul{ margin:8px 0 0; padding-left:20px; }\n    li{ font-size:14px; line-height:1.6; color:#475569; margin:4px 0; }\n    code.k{ font-family:\"Roboto Mono\",ui-monospace,monospace; background:#f1f5f9; padding:1px 6px; border-radius:5px; font-size:13px; color:#0f172a; }\n    pre{ background:#0f172a; color:#e2e8f0; border-radius:10px; padding:18px 20px; overflow-x:auto; font-family:\"Roboto Mono\",ui-monospace,SFMono-Regular,monospace; font-size:12.5px; line-height:1.6; margin:12px 0 0; white-space:pre; }\n    table{ width:100%; border-collapse:collapse; margin-top:6px; }\n    th,td{ text-align:left; padding:8px 10px; font-size:13px; border-bottom:1px solid #eef0f2; vertical-align:top; }\n    th{ color:#64748b; font-weight:600; font-size:11px; text-transform:uppercase; letter-spacing:.04em; }\n    td .kk{ font-family:\"Roboto Mono\",ui-monospace,monospace; color:#0f172a; font-weight:600; }\n    .req{ color:#dc2626; font-size:10px; font-weight:700; margin-left:4px; }\n    .warn{ color:#b45309; background:#fffbeb; border:1px solid #fde68a; border-radius:8px; padding:10px 12px; font-size:13px; font-weight:600; margin-top:12px; }\n    .muted{ color:#64748b; font-size:13px; line-height:1.6; margin-top:12px; }\n  `,\n  render() {\n    return `\n      <div class=\"doc\"><div class=\"wrap\">\n        <div class=\"h1\">Criar Order — Mercado Pago</div>\n        <p class=\"sub\">Guia de integração do endpoint interno de criação de pedidos (Checkout Pro Orders). Use como referência para chamar essa criação de qualquer lugar do app.</p>\n        <span class=\"badge\">● Ambiente de TESTE (sandbox)</span>\n\n        <div class=\"card\">\n          <h2>Arquitetura</h2>\n          <p class=\"flow\">Cliente &rarr; Rush Listener (<span class=\"chip\">createOrderHandler</span>) &rarr; HTTP Request (<span class=\"chip\">createOrder</span>) &rarr; API Mercado Pago (POST /v1/orders)</p>\n          <p>Componentes no workspace <b>Mercado Pago</b>:</p>\n          <ul>\n            <li><b>Key Vault</b> <code class=\"k\">mercado-pago-test</code> — guarda <code class=\"k\">ACCESS_TOKEN</code> (token da API) e <code class=\"k\">CreateOrderRush</code> (chave de acesso ao endpoint).</li>\n            <li><b>HTTP Client</b> <code class=\"k\">mercadoPago</code> — base <code class=\"k\">https://api.mercadopago.com</code></li>\n            <li><b>HTTP Request</b> <code class=\"k\">createOrder</code> — POST /v1/orders (dinâmico: recebe data + headers).</li>\n            <li><b>Rush Listener</b> <code class=\"k\">createOrderHandler</code> — ponto de entrada: valida a chave, gera a idempotência, monta o body e chama a API.</li>\n          </ul>\n        </div>\n\n        <div class=\"card\">\n          <h2>Endpoint</h2>\n          <table>\n            <tr><td class=\"kk\">Método</td><td>POST</td></tr>\n            <tr><td class=\"kk\">URL</td><td>https://babi-lf.data2apis.com/rush/createOrderHandler</td></tr>\n            <tr><td class=\"kk\">Content-Type</td><td>application/json</td></tr>\n            <tr><td class=\"kk\">Authorization</td><td>&lt;chave CreateOrderRush&gt;</td></tr>\n          </table>\n        </div>\n\n        <div class=\"card\">\n          <h2>Autenticação</h2>\n          <p>O handler valida a chave <b>antes</b> de criar qualquer order:</p>\n          <ul>\n            <li>Lê o valor de <code class=\"k\">CreateOrderRush</code> no Key Vault (resolvido em runtime dentro do handler).</li>\n            <li>Compara com o header <code class=\"k\">Authorization</code> enviado na chamada.</li>\n            <li>Se não bater (ou faltar) &rarr; responde <code class=\"k\">{ \"error\": \"Unauthorized\" }</code> e <b>não cria order</b>.</li>\n          </ul>\n          <p class=\"muted\">Aceita o header nos dois formatos: <code class=\"k\">Authorization: &lt;chave&gt;</code> ou <code class=\"k\">Authorization: Bearer &lt;chave&gt;</code>. Nunca coloque a chave no front-end público — ela deve vir do backend/vault.</p>\n        </div>\n\n        <div class=\"card\">\n          <h2>Corpo da requisição (body)</h2>\n          <table>\n            <tr><th>Campo</th><th>Tipo</th><th>Descrição</th></tr>\n            <tr><td class=\"kk\">total_amount<span class=\"req\">OBRIGATÓRIO</span></td><td>string</td><td>Valor total do pedido. Ex: \"1000.00\"</td></tr>\n            <tr><td class=\"kk\">external_reference</td><td>string</td><td>Seu identificador do pedido.</td></tr>\n            <tr><td class=\"kk\">payer_email</td><td>string</td><td>E-mail do comprador.</td></tr>\n            <tr><td class=\"kk\">items[]<span class=\"req\">OBRIGATÓRIO</span></td><td>array</td><td>Cada item: title (string), unit_price (string), quantity (número).</td></tr>\n          </table>\n          <p class=\"muted\">Definidos automaticamente pelo handler (não enviar): <code class=\"k\">type=\"online\"</code>, <code class=\"k\">processing_mode=\"manual\"</code>, <code class=\"k\">X-Idempotency-Key</code> (único por chamada) e o Authorization do token da API.</p>\n          <div class=\"warn\">⚠️ NÃO envie <code class=\"k\">unit_measure</code> nem <code class=\"k\">total_amount</code> DENTRO de items — a API rejeita (erro unsupported_properties).</div>\n        </div>\n\n        <div class=\"card\">\n          <h2>Exemplo de chamada</h2>\n          <pre>curl -X POST 'https://babi-lf.data2apis.com/rush/createOrderHandler' \\\\\n  -H 'Content-Type: application/json' \\\\\n  -H 'Authorization: SUA_CHAVE_CreateOrderRush' \\\\\n  -d '{\n    \"total_amount\": \"1000.00\",\n    \"external_reference\": \"order_pro_123\",\n    \"payer_email\": \"buyer@email.com\",\n    \"items\": [\n      { \"title\": \"Meu produto\", \"unit_price\": \"1000.00\", \"quantity\": 1 }\n    ]\n  }'</pre>\n        </div>\n\n        <div class=\"card\">\n          <h2>Resposta de sucesso</h2>\n          <p>Retorna <code class=\"k\">{ \"data\": { \"idempotency_key\": \"...\", \"status\": 201, \"order\": { ... } } }</code>:</p>\n          <table>\n            <tr><th>Campo</th><th>Descrição</th></tr>\n            <tr><td class=\"kk\">idempotency_key</td><td>Chave única gerada pelo handler para esta criação.</td></tr>\n            <tr><td class=\"kk\">status</td><td>Status HTTP devolvido pelo Mercado Pago. <b>201</b> = order criada; 4xx/5xx = erro (os detalhes vêm em <code class=\"k\">order</code>).</td></tr>\n            <tr><td class=\"kk\">order</td><td>A order completa retornada pelo Mercado Pago (ou o corpo do erro).</td></tr>\n          </table>\n          <p style=\"margin-top:12px\">Campos úteis em <code class=\"k\">order</code>:</p>\n          <pre>{\n  \"id\": \"ORDTST01M3D5S9EW932A8S9MNXGYW775\",\n  \"status\": \"created\",\n  \"total_amount\": \"1000.00\",\n  \"checkout_url\": \"https://www.mercadopago.com.br/checkout/v1/redirect?order_id=...\"\n}</pre>\n          <p class=\"muted\">Redirecione o comprador para o <code class=\"k\">checkout_url</code> para concluir o pagamento. Guarde o <code class=\"k\">order.id</code> para consultar o status depois (endpoint <code class=\"k\">getOrderHandler</code>).</p>\n          <div class=\"warn\">⚠️ Mudança de formato: antes a order vinha em <code class=\"k\">order.data</code>, junto com dados internos da chamada. Agora vem direto em <code class=\"k\">order</code> (ex.: <code class=\"k\">order.id</code>, <code class=\"k\">order.checkout_url</code>). Ajuste quem lia <code class=\"k\">order.data.*</code>.</div>\n        </div>\n\n        <div class=\"card\">\n          <h2>Erros comuns</h2>\n          <ul>\n            <li><code class=\"k\">Unauthorized</code> — chave ausente/errada no header Authorization. Nenhuma order é criada.</li>\n            <li><code class=\"k\">unsupported_properties</code> — campos não suportados no body (ex.: unit_measure / total_amount dentro de items).</li>\n            <li><code class=\"k\">idempotency_key_already_used</code> — não deve ocorrer: o handler gera uma chave única por chamada.</li>\n            <li><code class=\"k\">status: 401</code> — problema com o ACCESS_TOKEN do vault (credencial inválida ou vencida).</li>\n            <li>Sempre confira o campo <code class=\"k\">status</code>: se não for 201, a order não foi criada e <code class=\"k\">order</code> traz o erro do Mercado Pago.</li>\n          </ul>\n        </div>\n\n        <div class=\"card\">\n          <h2>Como reutilizar em outros lugares</h2>\n          <p>De um botão no app (onClick) ou de outro Rush handler, chame o listener diretamente:</p>\n          <pre>@createOrderHandler.invoke({\n  body: { total_amount, external_reference, payer_email, items },\n  headers: { Authorization: &lt;chave CreateOrderRush&gt; }\n})</pre>\n          <p class=\"muted\">Endpoints relacionados (mesma chave): <code class=\"k\">getOrderHandler</code> (consultar uma order pelo ID) e <code class=\"k\">searchOrdersHandler</code> (buscar orders por período e filtros).</p>\n          <p class=\"muted\">De um serviço externo (backend/curl): use a URL do endpoint com o header Authorization. Regra de ouro: a chave <code class=\"k\">CreateOrderRush</code> vem do vault/backend, nunca hardcoded no front público.</p>\n        </div>\n\n      </div></div>\n    `\n  }\n}"}}}}}}}},{"_id":"6ab6ee94449a23c1c1376d4f","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"docGetOrder","package":"babi-lf","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    .doc { box-sizing:border-box; font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,sans-serif; background:#f5f5f3; color:#0f172a; min-height:100%; height:100%; overflow-y:auto; padding:48px 24px; }\n    .doc *{ box-sizing:border-box; }\n    .wrap{ max-width:920px; margin:0 auto; }\n    .h1{ font-size:34px; font-weight:800; letter-spacing:-0.02em; margin:0 0 8px; }\n    .sub{ font-size:16px; color:#475569; line-height:1.55; margin:0 0 14px; }\n    .badge{ display:inline-flex; align-items:center; gap:6px; font-size:12px; font-weight:700; color:#b45309; background:#fef3c7; border:1px solid #fde68a; padding:5px 12px; border-radius:999px; text-transform:uppercase; letter-spacing:.05em; }\n    .card{ background:#fff; border:1px solid #e7e7e4; border-radius:16px; padding:22px 26px; margin-top:20px; box-shadow:0 1px 2px rgba(15,23,42,.04); }\n    .card h2{ font-size:19px; font-weight:700; margin:0 0 12px; }\n    .card p{ font-size:14px; line-height:1.6; color:#475569; margin:0 0 4px; }\n    .flow{ font-size:14px; font-weight:600; color:#0f172a; line-height:1.6; margin:0 0 12px; }\n    .chip{ display:inline-block; background:#eef2ff; color:#4338ca; border-radius:6px; padding:1px 7px; font-weight:600; font-family:\"Roboto Mono\",ui-monospace,monospace; font-size:12.5px; }\n    ul{ margin:8px 0 0; padding-left:20px; }\n    li{ font-size:14px; line-height:1.6; color:#475569; margin:4px 0; }\n    code.k{ font-family:\"Roboto Mono\",ui-monospace,monospace; background:#f1f5f9; padding:1px 6px; border-radius:5px; font-size:13px; color:#0f172a; }\n    pre{ background:#0f172a; color:#e2e8f0; border-radius:10px; padding:18px 20px; overflow-x:auto; font-family:\"Roboto Mono\",ui-monospace,SFMono-Regular,monospace; font-size:12.5px; line-height:1.6; margin:12px 0 0; white-space:pre; }\n    table{ width:100%; border-collapse:collapse; margin-top:6px; }\n    th,td{ text-align:left; padding:8px 10px; font-size:13px; border-bottom:1px solid #eef0f2; vertical-align:top; }\n    th{ color:#64748b; font-weight:600; font-size:11px; text-transform:uppercase; letter-spacing:.04em; }\n    td .kk, td.kk{ font-family:\"Roboto Mono\",ui-monospace,monospace; color:#0f172a; font-weight:600; }\n    .req{ color:#dc2626; font-size:10px; font-weight:700; margin-left:4px; }\n    .warn{ color:#b45309; background:#fffbeb; border:1px solid #fde68a; border-radius:8px; padding:10px 12px; font-size:13px; font-weight:600; margin-top:12px; }\n    .muted{ color:#64748b; font-size:13px; line-height:1.6; margin-top:12px; }\n  `,\n  render() {\n    return `\n      <div class=\"doc\"><div class=\"wrap\">\n        <div class=\"h1\">Consultar Order — Mercado Pago</div>\n        <p class=\"sub\">Guia de integração do endpoint interno de consulta de pedidos (Checkout Pro Orders). Use para buscar todos os dados e o status atual de uma order a partir do ID retornado na criação.</p>\n        <span class=\"badge\">● Ambiente de TESTE (sandbox)</span>\n\n        <div class=\"card\">\n          <h2>Arquitetura</h2>\n          <p class=\"flow\">Cliente &rarr; Rush Listener (<span class=\"chip\">getOrderHandler</span>) &rarr; HTTP Request (<span class=\"chip\">getOrder</span>) &rarr; API Mercado Pago (GET /v1/orders/{order_id})</p>\n          <p>Componentes no workspace <b>Mercado Pago</b>:</p>\n          <ul>\n            <li><b>Key Vault</b> <code class=\"k\">mercado-pago-test</code> — guarda <code class=\"k\">ACCESS_TOKEN</code> (token da API) e <code class=\"k\">CreateOrderRush</code> (chave de acesso ao endpoint, a mesma do Criar Order).</li>\n            <li><b>HTTP Client</b> <code class=\"k\">mercadoPago</code> — base <code class=\"k\">https://api.mercadopago.com</code></li>\n            <li><b>HTTP Request</b> <code class=\"k\">getOrder</code> — GET /v1/orders/{order_id} (dinâmico: recebe url + headers).</li>\n            <li><b>Rush Listener</b> <code class=\"k\">getOrderHandler</code> — ponto de entrada: valida a chave, valida o order_id, injeta o token e chama a API.</li>\n          </ul>\n        </div>\n\n        <div class=\"card\">\n          <h2>Endpoint</h2>\n          <table>\n            <tr><td class=\"kk\">Método</td><td>GET (também aceita POST com o order_id no body)</td></tr>\n            <tr><td class=\"kk\">URL</td><td>https://babi-lf.data2apis.com/rush/getOrderHandler?order_id=&lt;ID&gt;</td></tr>\n            <tr><td class=\"kk\">Authorization</td><td>&lt;chave CreateOrderRush&gt;</td></tr>\n          </table>\n        </div>\n\n        <div class=\"card\">\n          <h2>Autenticação</h2>\n          <p>O handler valida a chave <b>antes</b> de consultar qualquer order:</p>\n          <ul>\n            <li>Lê o valor de <code class=\"k\">CreateOrderRush</code> no Key Vault (resolvido em runtime dentro do handler).</li>\n            <li>Compara com o header <code class=\"k\">Authorization</code> enviado na chamada.</li>\n            <li>Se não bater (ou faltar) &rarr; responde <code class=\"k\">{ \"error\": \"Unauthorized\" }</code> e <b>não chama o Mercado Pago</b>.</li>\n          </ul>\n          <p class=\"muted\">Aceita o header nos dois formatos: <code class=\"k\">Authorization: &lt;chave&gt;</code> ou <code class=\"k\">Authorization: Bearer &lt;chave&gt;</code>. Nunca coloque a chave no front-end público — ela deve vir do backend/vault. A resposta traz dados do comprador e do pagamento, por isso o endpoint é protegido.</p>\n        </div>\n\n        <div class=\"card\">\n          <h2>Parâmetros</h2>\n          <table>\n            <tr><th>Campo</th><th>Onde</th><th>Descrição</th></tr>\n            <tr><td class=\"kk\">order_id<span class=\"req\">OBRIGATÓRIO</span></td><td>query (ou body)</td><td>ID da order retornado no <code class=\"k\">order.id</code> da criação. Ex: \"ORDTST01M3D7PXZ6XEYQFCMY7HY9VSA4\"</td></tr>\n          </table>\n          <p class=\"muted\">Definido automaticamente pelo handler (não enviar): o Authorization com o <code class=\"k\">ACCESS_TOKEN</code> da API do Mercado Pago.</p>\n          <div class=\"warn\">⚠️ O order_id só pode ter letras e números. Qualquer outro caractere (/, espaço, ?, etc.) é recusado com Bad Request antes de chamar a API.</div>\n        </div>\n\n        <div class=\"card\">\n          <h2>Exemplo de chamada</h2>\n          <pre>curl -X GET 'https://babi-lf.data2apis.com/rush/getOrderHandler?order_id=ORDTST01M3D7PXZ6XEYQFCMY7HY9VSA4' \\\\\n  -H 'Authorization: SUA_CHAVE_CreateOrderRush'</pre>\n        </div>\n\n        <div class=\"card\">\n          <h2>Resposta de sucesso</h2>\n          <p>Retorna <code class=\"k\">{ \"data\": { \"status\": 200, \"order\": { ... } } }</code>, com a order completa do Mercado Pago. Campos mais úteis em <code class=\"k\">order</code>:</p>\n          <pre>{\n  \"id\": \"ORDTST01M3D7PXZ6XEYQFCMY7HY9VSA4\",\n  \"status\": \"created\",\n  \"status_detail\": \"...\",\n  \"external_reference\": \"order_auth_test\",\n  \"total_amount\": \"1000.00\",\n  \"checkout_url\": \"https://www.mercadopago.com.br/checkout/v1/redirect?order_id=...\",\n  \"items\": [ { \"title\": \"Meu produto\", \"unit_price\": \"1000.00\", \"quantity\": 1 } ]\n}</pre>\n          <p class=\"muted\">Use <code class=\"k\">order.status</code> para saber em que pé está o pedido: <code class=\"k\">created</code> (criada, aguardando pagamento), <code class=\"k\">processed</code> (pagamento processado) ou <code class=\"k\">action_required</code> (precisa de ação do integrador). O campo <code class=\"k\">status</code> fora da order é o status HTTP devolvido pelo Mercado Pago.</p>\n        </div>\n\n        <div class=\"card\">\n          <h2>Erros comuns</h2>\n          <ul>\n            <li><code class=\"k\">Unauthorized</code> — chave ausente/errada no header Authorization. O Mercado Pago não é chamado.</li>\n            <li><code class=\"k\">Bad Request</code> — order_id ausente ou com caracteres inválidos.</li>\n            <li><code class=\"k\">status: 404</code> / <code class=\"k\">order_not_found</code> — o ID não existe (ou é de outro ambiente/conta).</li>\n            <li><code class=\"k\">status: 401</code> — problema com o ACCESS_TOKEN do vault (credencial inválida ou vencida).</li>\n          </ul>\n        </div>\n\n        <div class=\"card\">\n          <h2>Como reutilizar em outros lugares</h2>\n          <p>De um botão no app (onClick) ou de outro Rush handler, chame o listener diretamente:</p>\n          <pre>@getOrderHandler.invoke({\n  body: { order_id },\n  headers: { Authorization: &lt;chave CreateOrderRush&gt; }\n})</pre>\n          <p class=\"muted\">Fluxo típico: guarde o <code class=\"k\">order.id</code> retornado pelo Criar Order e use este endpoint para checar o status depois que o comprador volta do checkout. Regra de ouro: a chave <code class=\"k\">CreateOrderRush</code> vem do vault/backend, nunca hardcoded no front público.</p>\n        </div>\n\n      </div></div>\n    `\n  }\n}"}}}}}}}},{"_id":"6ab6ef326b9804cbc48b26d3","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"docSearchOrders","package":"babi-lf","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    .doc { box-sizing:border-box; font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,sans-serif; background:#f5f5f3; color:#0f172a; min-height:100%; height:100%; overflow-y:auto; padding:48px 24px; }\n    .doc *{ box-sizing:border-box; }\n    .wrap{ max-width:920px; margin:0 auto; }\n    .h1{ font-size:34px; font-weight:800; letter-spacing:-0.02em; margin:0 0 8px; }\n    .sub{ font-size:16px; color:#475569; line-height:1.55; margin:0 0 14px; }\n    .badge{ display:inline-flex; align-items:center; gap:6px; font-size:12px; font-weight:700; color:#b45309; background:#fef3c7; border:1px solid #fde68a; padding:5px 12px; border-radius:999px; text-transform:uppercase; letter-spacing:.05em; }\n    .card{ background:#fff; border:1px solid #e7e7e4; border-radius:16px; padding:22px 26px; margin-top:20px; box-shadow:0 1px 2px rgba(15,23,42,.04); }\n    .card h2{ font-size:19px; font-weight:700; margin:0 0 12px; }\n    .card p{ font-size:14px; line-height:1.6; color:#475569; margin:0 0 4px; }\n    .flow{ font-size:14px; font-weight:600; color:#0f172a; line-height:1.6; margin:0 0 12px; }\n    .chip{ display:inline-block; background:#eef2ff; color:#4338ca; border-radius:6px; padding:1px 7px; font-weight:600; font-family:\"Roboto Mono\",ui-monospace,monospace; font-size:12.5px; }\n    ul{ margin:8px 0 0; padding-left:20px; }\n    li{ font-size:14px; line-height:1.6; color:#475569; margin:4px 0; }\n    code.k{ font-family:\"Roboto Mono\",ui-monospace,monospace; background:#f1f5f9; padding:1px 6px; border-radius:5px; font-size:13px; color:#0f172a; }\n    pre{ background:#0f172a; color:#e2e8f0; border-radius:10px; padding:18px 20px; overflow-x:auto; font-family:\"Roboto Mono\",ui-monospace,SFMono-Regular,monospace; font-size:12.5px; line-height:1.6; margin:12px 0 0; white-space:pre; }\n    table{ width:100%; border-collapse:collapse; margin-top:6px; }\n    th,td{ text-align:left; padding:8px 10px; font-size:13px; border-bottom:1px solid #eef0f2; vertical-align:top; }\n    th{ color:#64748b; font-weight:600; font-size:11px; text-transform:uppercase; letter-spacing:.04em; }\n    td .kk, td.kk{ font-family:\"Roboto Mono\",ui-monospace,monospace; color:#0f172a; font-weight:600; }\n    .req{ color:#dc2626; font-size:10px; font-weight:700; margin-left:4px; }\n    .warn{ color:#b45309; background:#fffbeb; border:1px solid #fde68a; border-radius:8px; padding:10px 12px; font-size:13px; font-weight:600; margin-top:12px; }\n    .muted{ color:#64748b; font-size:13px; line-height:1.6; margin-top:12px; }\n  `,\n  render() {\n    return `\n      <div class=\"doc\"><div class=\"wrap\">\n        <div class=\"h1\">Buscar Orders — Mercado Pago</div>\n        <p class=\"sub\">Guia de integração do endpoint interno de busca de pedidos (Checkout Pro Orders). Use para listar orders por período de criação, com filtros opcionais e paginação.</p>\n        <span class=\"badge\">● Ambiente de TESTE (sandbox)</span>\n\n        <div class=\"card\">\n          <h2>Arquitetura</h2>\n          <p class=\"flow\">Cliente &rarr; Rush Listener (<span class=\"chip\">searchOrdersHandler</span>) &rarr; HTTP Request (<span class=\"chip\">searchOrders</span>) &rarr; API Mercado Pago (GET /v1/orders)</p>\n          <p>Componentes no workspace <b>Mercado Pago</b>:</p>\n          <ul>\n            <li><b>Key Vault</b> <code class=\"k\">mercado-pago-test</code> — guarda <code class=\"k\">ACCESS_TOKEN</code> (token da API) e <code class=\"k\">CreateOrderRush</code> (chave de acesso ao endpoint, a mesma do Criar Order).</li>\n            <li><b>HTTP Client</b> <code class=\"k\">mercadoPago</code> — base <code class=\"k\">https://api.mercadopago.com</code></li>\n            <li><b>HTTP Request</b> <code class=\"k\">searchOrders</code> — GET /v1/orders (dinâmico: recebe url + headers).</li>\n            <li><b>Rush Listener</b> <code class=\"k\">searchOrdersHandler</code> — ponto de entrada: valida a chave, valida os filtros, monta a URL de busca, injeta o token e chama a API.</li>\n          </ul>\n        </div>\n\n        <div class=\"card\">\n          <h2>Endpoint</h2>\n          <table>\n            <tr><td class=\"kk\">Método</td><td>GET (também aceita POST com os filtros no body)</td></tr>\n            <tr><td class=\"kk\">URL</td><td>https://babi-lf.data2apis.com/rush/searchOrdersHandler?begin_date=...&amp;end_date=...</td></tr>\n            <tr><td class=\"kk\">Authorization</td><td>&lt;chave CreateOrderRush&gt;</td></tr>\n          </table>\n        </div>\n\n        <div class=\"card\">\n          <h2>Autenticação</h2>\n          <p>O handler valida a chave <b>antes</b> de buscar qualquer order:</p>\n          <ul>\n            <li>Lê o valor de <code class=\"k\">CreateOrderRush</code> no Key Vault (resolvido em runtime dentro do handler).</li>\n            <li>Compara com o header <code class=\"k\">Authorization</code> enviado na chamada.</li>\n            <li>Se não bater (ou faltar) &rarr; responde <code class=\"k\">{ \"error\": \"Unauthorized\" }</code> e <b>não chama o Mercado Pago</b>.</li>\n          </ul>\n          <p class=\"muted\">Aceita o header nos dois formatos: <code class=\"k\">Authorization: &lt;chave&gt;</code> ou <code class=\"k\">Authorization: Bearer &lt;chave&gt;</code>. Nunca coloque a chave no front-end público — a busca devolve orders de todos os compradores.</p>\n        </div>\n\n        <div class=\"card\">\n          <h2>Filtros</h2>\n          <table>\n            <tr><th>Campo</th><th>Formato</th><th>Descrição</th></tr>\n            <tr><td class=\"kk\">begin_date<span class=\"req\">OBRIGATÓRIO</span></td><td>RFC 3339</td><td>Início do período de criação. Ex: \"2026-09-25T00:00:00Z\"</td></tr>\n            <tr><td class=\"kk\">end_date<span class=\"req\">OBRIGATÓRIO</span></td><td>RFC 3339</td><td>Fim do período de criação. Ex: \"2026-09-26T00:00:00Z\"</td></tr>\n            <tr><td class=\"kk\">external_reference</td><td>string</td><td>Seu identificador do pedido (o mesmo enviado no Criar Order). Letras, números, _ ou -, até 64.</td></tr>\n            <tr><td class=\"kk\">status</td><td>string</td><td>Status da order: <code class=\"k\">created</code>, <code class=\"k\">processed</code>, <code class=\"k\">action_required</code>…</td></tr>\n            <tr><td class=\"kk\">limit</td><td>número</td><td>Quantidade por página.</td></tr>\n            <tr><td class=\"kk\">offset</td><td>número</td><td>A partir de qual resultado (paginação).</td></tr>\n          </table>\n          <p class=\"muted\">Pode enviar os filtros na query (GET) ou no body (POST). O handler cuida do encoding das datas e injeta o Authorization com o <code class=\"k\">ACCESS_TOKEN</code> — não enviar.</p>\n          <div class=\"warn\">⚠️ Qualquer filtro fora do formato é recusado com Bad Request antes de chamar a API. Datas precisam do horário e do fuso (Z ou ±hh:mm).</div>\n        </div>\n\n        <div class=\"card\">\n          <h2>Exemplo de chamada</h2>\n          <pre>curl -X GET 'https://babi-lf.data2apis.com/rush/searchOrdersHandler?begin_date=2026-09-25T00:00:00Z&amp;end_date=2026-09-26T00:00:00Z&amp;status=created&amp;limit=10' \\\\\n  -H 'Authorization: SUA_CHAVE_CreateOrderRush'</pre>\n        </div>\n\n        <div class=\"card\">\n          <h2>Resposta de sucesso</h2>\n          <p>Retorna <code class=\"k\">{ \"data\": { \"status\": 200, \"result\": { \"data\": [ ... ], \"paging\": { ... } } } }</code>:</p>\n          <table>\n            <tr><th>Campo</th><th>Descrição</th></tr>\n            <tr><td class=\"kk\">status</td><td>Status HTTP devolvido pelo Mercado Pago. <b>200</b> = busca ok; 4xx/5xx = erro (detalhes em <code class=\"k\">result</code>).</td></tr>\n            <tr><td class=\"kk\">result.data[]</td><td>Lista de orders encontradas.</td></tr>\n            <tr><td class=\"kk\">result.paging</td><td>total, total_pages, offset e limit.</td></tr>\n          </table>\n          <pre>{\n  \"status\": 200,\n  \"result\": {\n    \"data\": [\n      {\n        \"id\": \"ORDTST01M3D7PXZ6XEYQFCMY7HY9VSA4\",\n        \"external_reference\": \"order_auth_test\",\n        \"status\": \"created\",\n        \"total_amount\": \"1000.00\",\n        \"created_date\": \"2026-09-25T21:31:59.86Z\",\n        \"items\": [ { \"title\": \"Meu produto\", \"unit_price\": \"1000.00\", \"quantity\": 1 } ]\n      }\n    ],\n    \"paging\": { \"total\": \"3\", \"total_pages\": \"1\", \"offset\": \"0\", \"limit\": \"20\" }\n  }\n}</pre>\n        </div>\n\n        <div class=\"card\">\n          <h2>Erros comuns</h2>\n          <ul>\n            <li><code class=\"k\">Unauthorized</code> — chave ausente/errada no header Authorization. O Mercado Pago não é chamado.</li>\n            <li><code class=\"k\">Bad Request</code> — begin_date/end_date ausentes ou algum filtro fora do formato.</li>\n            <li><code class=\"k\">status: 400</code> / <code class=\"k\">invalid_parameter</code> — o Mercado Pago recusou algum valor (ex.: período inválido).</li>\n            <li><code class=\"k\">status: 401</code> — problema com o ACCESS_TOKEN do vault (credencial inválida ou vencida).</li>\n          </ul>\n        </div>\n\n        <div class=\"card\">\n          <h2>Como reutilizar em outros lugares</h2>\n          <p>De um botão no app (onClick) ou de outro Rush handler, chame o listener diretamente:</p>\n          <pre>@searchOrdersHandler.invoke({\n  body: { begin_date, end_date, status, external_reference, limit, offset },\n  headers: { Authorization: &lt;chave CreateOrderRush&gt; }\n})</pre>\n          <p class=\"muted\">Usos típicos: relatório de vendas do dia, conciliação por <code class=\"k\">external_reference</code> e listar orders pendentes (<code class=\"k\">status=created</code>). Para detalhes completos de uma order, use o <code class=\"k\">getOrderHandler</code> com o <code class=\"k\">id</code>. Regra de ouro: a chave <code class=\"k\">CreateOrderRush</code> vem do vault/backend, nunca hardcoded no front público.</p>\n        </div>\n\n      </div></div>\n    `\n  }\n}"}}}}}}}},{"_id":"6ab92bb295248f62d4cc596d","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"TextLink","package":"babi-lf","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// TextLink — Loja Lucas Fontana\n// O link em caixa alta com o sublinhado vermelho de 2px (\"Ver tudo\", \"Deixar uma mensagem\", \"Conheça a história\").\n// A área de toque tem no mínimo 44px de altura; só o texto é sublinhado.\n// `variant: inline` é o link discreto em caixa normal para ações utilitárias (\"Limpar tudo\", \"Limpar filtros\").\nconst LAYOUTS = ['desktop', 'tablet', 'mobile', 'auto'];\nconst TONES = ['dark', 'light', 'red'];\nconst VARIANTS = ['default', 'inline'];\nconst esc = (s) => String(s == null ? '' : s)\n  .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\nconst pick = (v, list, fb) => (list.indexOf(String(v)) >= 0 ? String(v) : fb);\nconst truthy = (v) => v === true || v === 'true' || v === 1 || v === '1';\nconst ARROW = '<svg class=\"ic\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12h14M13 6l6 6-6 6\"/></svg>';\n\nexport default {\n  css: `\n:host { display: block; }\n* { box-sizing: border-box; }\n.wrap { --red-500: #c8102e; --red-300: #ff4d62; --ink: #0b0b0c; --white: #ffffff;\n  font-family: 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; -webkit-font-smoothing: antialiased; display: block; }\n.lk { display: inline-flex; align-items: center; gap: 8px; min-height: 44px; margin: 0; padding: 0; background: none; border: 0; cursor: pointer;\n  font-family: inherit; font-size: 13px; font-weight: 700; letter-spacing: .1em; line-height: 1.2; text-transform: uppercase;\n  color: var(--ink); text-decoration: none; white-space: nowrap; transition: color .15s ease; }\n.lk > span { border-bottom: 2px solid var(--red-500); padding-bottom: 4px; }\n.lk .ic { width: 16px; height: 16px; flex: none; }\n.lk:hover { color: var(--red-500); }\n.lk:focus-visible { outline: 2px solid var(--red-500); outline-offset: 2px; }\n.t-light { color: var(--white); }\n.t-light:hover { color: var(--red-300); }\n.t-light:focus-visible { outline-color: var(--white); }\n.t-red { color: var(--red-500); }\n.t-red > span { border: 0; padding: 0; }\n.t-red:hover { color: var(--ink); }\n.v-inline { min-height: 32px; font-size: 14px; font-weight: 600; letter-spacing: 0; text-transform: none; }\n.v-inline > span { border-bottom: 1.5px solid currentColor; padding-bottom: 1px; }\n.l-tablet .lk:not(.v-inline), .l-mobile .lk:not(.v-inline) { font-size: 12px; }\n@media (max-width: 1199px) { .l-auto .lk:not(.v-inline) { font-size: 12px; } }\n`,\n\n  mounted(d2) {\n    if (typeof document !== 'undefined' && document.head && !document.getElementById('lf-archivo-font')) {\n      const l = document.createElement('link');\n      l.id = 'lf-archivo-font';\n      l.rel = 'stylesheet';\n      l.href = 'https://fonts.googleapis.com/css2?family=Archivo:ital,wdth,wght@0,62..125,100..900;1,62..125,100..900&display=swap';\n      document.head.appendChild(l);\n    }\n    d2.on('.lk', 'click', (e, el) => {\n      if (el.tagName === 'BUTTON') { try { d2.emit('onClick'); } catch (err) { /* sem handler */ } }\n    });\n  },\n\n  render(d2) {\n    const p = d2.params || {};\n    const layout = pick(p.layout, LAYOUTS, 'auto');\n    const tone = pick(p.tone, TONES, 'dark');\n    const variant = pick(p.variant, VARIANTS, 'default');\n    const label = p.label || 'Ver tudo';\n    const href = p.href ? String(p.href) : '';\n    const cls = `lk t-${tone} v-${variant}`;\n    const inner = `<span>${esc(label)}</span>${truthy(p.arrow) ? ARROW : ''}`;\n    const el = href\n      ? `<a class=\"${cls}\" href=\"${esc(href)}\"${truthy(p.newTab) ? ' target=\"_blank\" rel=\"noopener\"' : ''}>${inner}</a>`\n      : `<button type=\"button\" class=\"${cls}\">${inner}</button>`;\n    return `<div class=\"wrap l-${layout}\">${el}</div>`;\n  }\n};"}},"arrow":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"arrow"}}}},"href":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"href"}}}},"label":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"label"}}}},"layout":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"layout"}}}},"newTab":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"newTab"}}}},"onClick":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onClick"}}}},"tone":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"tone"}}}},"variant":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"variant"}}}}}}}}}},{"_id":"6ab92bdae69f22645a56e5a3","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"Breadcrumb","package":"babi-lf","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// Breadcrumb — Loja Lucas Fontana\n// A trilha acima do título da página: \"Início / Cuidado automotivo\".\n// Passos anteriores são links cinza; a página atual é preta, 600, e não é link.\n// No mobile fica numa linha só e rola para o lado (nomes de produto longos); `scroll: false` deixa quebrar.\nconst LAYOUTS = ['desktop', 'tablet', 'mobile'];\nconst esc = (s) => String(s == null ? '' : s)\n  .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\nconst list = (v) => {\n  if (Array.isArray(v)) return v;\n  if (typeof v === 'string' && v.trim()) { try { const j = JSON.parse(v); return Array.isArray(j) ? j : []; } catch (e) { return []; } }\n  return [];\n};\nconst norm = (it) => (it && typeof it === 'object' ? { label: it.label || '', href: it.href || '' } : { label: String(it || ''), href: '' });\n\nexport default {\n  css: `\n:host { display: block; width: 100%; }\n* { box-sizing: border-box; }\n.bc { --red-500: #c8102e; --ink: #0b0b0c; --grey-500: #6b6e73;\n  font-family: 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; -webkit-font-smoothing: antialiased; width: 100%; }\nol { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; align-items: center; gap: 8px; font-size: 14px; line-height: 1.4; }\nli { display: flex; align-items: center; gap: 8px; color: var(--grey-500); }\nli + li::before { content: '/'; color: var(--grey-500); }\na { color: var(--grey-500); text-decoration: none; }\na:hover { color: var(--red-500); }\na:focus-visible { outline: 2px solid var(--red-500); outline-offset: 2px; }\n[aria-current] { color: var(--ink); font-weight: 600; }\n.l-mobile ol { font-size: 13px; }\n.scroll ol { flex-wrap: nowrap; overflow-x: auto; white-space: nowrap; scrollbar-width: thin; padding-bottom: 6px; }\n.scroll li { flex-shrink: 0; }\n`,\n\n  mounted(d2) {\n    if (typeof document !== 'undefined' && document.head && !document.getElementById('lf-archivo-font')) {\n      const l = document.createElement('link');\n      l.id = 'lf-archivo-font';\n      l.rel = 'stylesheet';\n      l.href = 'https://fonts.googleapis.com/css2?family=Archivo:ital,wdth,wght@0,62..125,100..900;1,62..125,100..900&display=swap';\n      document.head.appendChild(l);\n    }\n    d2.on('a', 'click', (e, el) => { try { d2.emit('onNavigate', el.getAttribute('href')); } catch (err) { /* sem handler */ } });\n  },\n\n  render(d2) {\n    const p = d2.params || {};\n    const layout = LAYOUTS.indexOf(p.layout) >= 0 ? p.layout : 'desktop';\n    let items = list(p.items).map(norm).filter((i) => i.label);\n    if (!items.length) items = [{ label: 'Início', href: '/' }, { label: 'Página atual', href: '' }];\n    const scroll = layout === 'mobile' && !(p.scroll === false || p.scroll === 'false');\n    const last = items.length - 1;\n    const lis = items.map((it, i) => {\n      if (i === last) return `<li><span aria-current=\"page\">${esc(it.label)}</span></li>`;\n      return it.href ? `<li><a href=\"${esc(it.href)}\">${esc(it.label)}</a></li>` : `<li><span>${esc(it.label)}</span></li>`;\n    }).join('');\n    return `<nav class=\"bc l-${layout}${scroll ? ' scroll' : ''}\" aria-label=\"Você está em\"><ol>${lis}</ol></nav>`;\n  }\n};"}},"items":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"items"}}}},"layout":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"layout"}}}},"onNavigate":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onNavigate"}}}},"scroll":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"scroll"}}}}}}}}}},{"_id":"6ab92bf97a2786dc7b34d7f6","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"AboutHero","package":"babi-lf","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// AboutHero — Loja Lucas Fontana\n// A abertura de \"Sobre o Lucas\": breadcrumb, kicker vermelho, título em duas linhas com a segunda em\n// vermelho itálico (\"Prazer, / Lucas Fontana.\"), apresentação curta e dois botões, ao lado de um retrato\n// com a régua vermelha embaixo. Não desenha breadcrumb nem botão: usa Breadcrumb e Button por parâmetro.\nconst LAYOUTS = ['desktop', 'tablet', 'mobile'];\nconst esc = (s) => String(s == null ? '' : s)\n  .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\nconst refOf = (v) => { const r = (v && typeof v === 'object' ? (typeof v.getReference === 'function' ? v.getReference() : v.reference) : v) || ''; return r && r.indexOf('@') < 0 ? 'babi-lf@' + r : r; };\nconst list = (v) => {\n  if (Array.isArray(v)) return v;\n  if (typeof v === 'string' && v.trim()) { try { const j = JSON.parse(v); return Array.isArray(j) ? j : []; } catch (e) { return []; } }\n  return [];\n};\nconst IMG = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"1\"/><circle cx=\"9\" cy=\"10\" r=\"2\"/><path d=\"m21 16-5-5-9 8\"/></svg>';\n\nexport default {\n  css: `\n:host { display: block; width: 100%; height: 100%; }\n* { box-sizing: border-box; }\n.ah { --red-500: #c8102e; --ink: #0b0b0c; --white: #ffffff; --grey-300: #a7a9ad; --grey-700: #45474b; --graphite-900: #1c1d1f;\n  font-family: 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; -webkit-font-smoothing: antialiased;\n  width: 100%; height: 100%; background: var(--white); color: var(--ink); }\np, h1 { margin: 0; }\n.in { padding: 56px 96px 88px; display: grid; grid-template-columns: minmax(0, 1fr) 560px; gap: 64px; align-items: center; }\n.copy { display: flex; flex-direction: column; gap: 16px; min-width: 0; }\n.crumb { height: 24px; margin-bottom: 8px; }\n.kicker { display: flex; align-items: center; gap: 12px; font-size: 12px; font-weight: 700; letter-spacing: .3em; line-height: 1.3; text-transform: uppercase; color: var(--red-500); }\n.kicker::before { content: ''; width: 22px; height: 3px; background: var(--red-500); flex: none; }\n.title { margin: 4px 0 8px; font-size: 54px; font-weight: 800; font-stretch: 118%; line-height: .98; letter-spacing: -.015em; text-transform: uppercase; }\n.title em { display: block; font-style: italic; color: var(--red-500); }\n.text { max-width: 640px; font-size: 18px; line-height: 1.6; color: var(--grey-700); }\n.actions { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 12px; }\n.act { flex: none; height: 52px; }\n.media { position: relative; aspect-ratio: 560 / 600; background: var(--graphite-900); border-bottom: 6px solid var(--red-500);\n  display: flex; align-items: center; justify-content: center; overflow: hidden; }\n.media img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }\n.ph { display: flex; flex-direction: column; align-items: center; gap: 10px; padding: 0 24px; text-align: center;\n  color: var(--grey-300); font-size: 12px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; }\n.ph svg { width: 28px; height: 28px; }\n\n.l-tablet .in { padding: 40px 40px 64px; grid-template-columns: minmax(0, 1fr) 300px; gap: 40px; }\n.l-tablet .title { font-size: 40px; font-stretch: 115%; letter-spacing: -.01em; }\n.l-tablet .text { font-size: 17px; }\n.l-tablet .media { border-bottom-width: 5px; }\n\n.l-mobile .in { padding: 24px 20px 48px; grid-template-columns: minmax(0, 1fr); gap: 32px; }\n.l-mobile .crumb { height: 30px; margin-bottom: 4px; }\n.l-mobile .kicker { font-size: 11px; letter-spacing: .26em; }\n.l-mobile .title { font-size: 34px; font-stretch: 110%; line-height: 1; }\n.l-mobile .text { font-size: 15px; }\n.l-mobile .actions { flex-direction: column; }\n.l-mobile .act { width: 100%; }\n.l-mobile .media { aspect-ratio: 4 / 5; border-bottom-width: 5px; }\n`,\n\n  mounted() {\n    if (typeof document !== 'undefined' && document.head && !document.getElementById('lf-archivo-font')) {\n      const l = document.createElement('link');\n      l.id = 'lf-archivo-font';\n      l.rel = 'stylesheet';\n      l.href = 'https://fonts.googleapis.com/css2?family=Archivo:ital,wdth,wght@0,62..125,100..900;1,62..125,100..900&display=swap';\n      document.head.appendChild(l);\n    }\n  },\n\n  render(d2) {\n    const p = d2.params || {};\n    const layout = LAYOUTS.indexOf(p.layout) >= 0 ? p.layout : 'desktop';\n    const mob = layout === 'mobile';\n    const bcRef = refOf(d2.param('breadcrumb'));\n    const btnRef = refOf(d2.param('button'));\n\n    const crumbs = list(p.crumbs).length ? list(p.crumbs) : [{ label: 'Início', href: '/' }, { label: 'Sobre o Lucas Fontana' }];\n    const eyebrow = p.eyebrow == null ? 'Sobre o Lucas' : p.eyebrow;\n    const title = p.title || 'Prazer,';\n    const accent = p.titleAccent == null ? 'Lucas Fontana.' : p.titleAccent;\n    const body = p.body == null ? '[Apresentação curta do Lucas em 2 ou 3 frases: quem é, o que faz no canal e o jeito dele de falar de carro.]' : p.body;\n    const pLabel = p.primaryLabel == null ? 'Assistir no YouTube' : p.primaryLabel;\n    const sLabel = p.secondaryLabel == null ? 'Ver a loja' : p.secondaryLabel;\n\n    const btn = (key, label, variant, glyph, href, evt) => d2.render(btnRef, {\n      label, variant, size: 'lg', glyph: glyph || '', fullWidth: mob ? 'always' : 'auto', layout, href: href || '', newTab: /^https?:/.test(href || '')\n    }, { key, onClick: () => { try { d2.emit(evt, href || ''); } catch (err) { /* sem handler */ } } });\n\n    const actions = btnRef && (pLabel || sLabel) ? `<div class=\"actions\">\n        ${pLabel ? `<div class=\"act\">${btn('primary', pLabel, 'brand', p.primaryGlyph == null ? 'youtube' : p.primaryGlyph, p.primaryHref, 'onPrimary')}</div>` : ''}\n        ${sLabel ? `<div class=\"act\">${btn('secondary', sLabel, 'outline', '', p.secondaryHref || '/', 'onSecondary')}</div>` : ''}\n      </div>` : '';\n\n    const crumb = bcRef ? `<div class=\"crumb\">${d2.render(bcRef, { items: crumbs, layout }, { key: 'bc' })}</div>` : '';\n    const media = p.image\n      ? `<img src=\"${esc(p.image)}\" alt=\"${esc(p.imageAlt || 'Lucas Fontana')}\">`\n      : `<div class=\"ph\">${IMG}<span>${esc(p.placeholder || 'Retrato do Lucas')}</span></div>`;\n\n    return `<section class=\"ah l-${layout}\"><div class=\"in\">\n      <div class=\"copy\">\n        ${crumb}\n        ${eyebrow ? `<p class=\"kicker\">${esc(eyebrow)}</p>` : ''}\n        <h1 class=\"title\">${esc(title)}${accent ? `<em>${esc(accent)}</em>` : ''}</h1>\n        ${body ? `<p class=\"text\">${esc(body)}</p>` : ''}\n        ${actions}\n      </div>\n      <div class=\"media\">${media}</div>\n    </div></section>`;\n  }\n};"}},"body":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body"}}}},"breadcrumb":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"breadcrumb"}}}},"button":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"button"}}}},"crumbs":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"crumbs"}}}},"eyebrow":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"eyebrow"}}}},"image":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"image"}}}},"imageAlt":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"imageAlt"}}}},"layout":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"layout"}}}},"onPrimary":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onPrimary"}}}},"onSecondary":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onSecondary"}}}},"placeholder":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"placeholder"}}}},"primaryGlyph":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"primaryGlyph"}}}},"primaryHref":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"primaryHref"}}}},"primaryLabel":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"primaryLabel"}}}},"secondaryHref":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"secondaryHref"}}}},"secondaryLabel":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"secondaryLabel"}}}},"title":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"title"}}}},"titleAccent":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"titleAccent"}}}}}}}}}},{"_id":"6ab92c098b1ad6cc3e92d8e2","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"StatBand","package":"babi-lf","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// StatBand — Loja Lucas Fontana\n// Faixa preta com os números do canal: cada número tem uma régua vermelha de 3px à esquerda,\n// o valor em display itálico largo e um rótulo cinza. Xadrez discreto no canto superior direito.\n// 4 lado a lado no desktop; 2 × 2 no tablet e no mobile.\nconst LAYOUTS = ['desktop', 'tablet', 'mobile'];\nconst esc = (s) => String(s == null ? '' : s)\n  .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\nconst list = (v) => {\n  if (Array.isArray(v)) return v;\n  if (typeof v === 'string' && v.trim()) { try { const j = JSON.parse(v); return Array.isArray(j) ? j : []; } catch (e) { return []; } }\n  return [];\n};\nconst DEFAULTS = [\n  { value: '[000 mil]', label: 'inscritos no YouTube' },\n  { value: '[000 mil]', label: 'seguidores no Instagram' },\n  { value: '[00 mi]', label: 'de visualizações' },\n  { value: '[000]', label: 'vídeos publicados' }\n];\n\nexport default {\n  css: `\n:host { display: block; width: 100%; height: 100%; }\n* { box-sizing: border-box; }\n.sb { --red-500: #c8102e; --ink: #0b0b0c; --white: #ffffff; --grey-300: #a7a9ad;\n  font-family: 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; -webkit-font-smoothing: antialiased;\n  position: relative; width: 100%; height: 100%; background: var(--ink); color: var(--white); overflow: hidden; }\n.checker { position: absolute; top: 0; right: 0; width: 180px; height: 60px; pointer-events: none;\n  background: repeating-conic-gradient(rgba(255,255,255,.06) 0 25%, transparent 0 50%) 0 0 / 30px 30px; }\n.in { position: relative; padding: 56px 96px; display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 32px; margin: 0; list-style: none; }\n.stat { display: flex; flex-direction: column; gap: 6px; padding-left: 16px; border-left: 3px solid var(--red-500); min-width: 0; }\n.stat b { font-size: 40px; font-weight: 800; font-style: italic; font-stretch: 125%; line-height: 1; white-space: nowrap; }\n.stat span { font-size: 14px; line-height: 1.35; color: var(--grey-300); }\n.l-tablet .in { padding: 48px 40px; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 32px 24px; }\n.l-mobile .in { padding: 40px 20px; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 28px 16px; }\n.l-mobile .stat { padding-left: 12px; }\n.l-mobile .stat b { font-size: 26px; font-stretch: 115%; }\n.l-mobile .stat span { font-size: 13px; }\n.l-mobile .checker { width: 96px; height: 48px; background-size: 24px 24px; }\n`,\n\n  mounted() {\n    if (typeof document !== 'undefined' && document.head && !document.getElementById('lf-archivo-font')) {\n      const l = document.createElement('link');\n      l.id = 'lf-archivo-font';\n      l.rel = 'stylesheet';\n      l.href = 'https://fonts.googleapis.com/css2?family=Archivo:ital,wdth,wght@0,62..125,100..900;1,62..125,100..900&display=swap';\n      document.head.appendChild(l);\n    }\n  },\n\n  render(d2) {\n    const p = d2.params || {};\n    const layout = LAYOUTS.indexOf(p.layout) >= 0 ? p.layout : 'desktop';\n    const given = list(p.items).filter((i) => i && typeof i === 'object');\n    const items = (given.length ? given : DEFAULTS).slice(0, 4);\n    return `<section class=\"sb l-${layout}\" aria-label=\"O canal em números\">\n      <div class=\"checker\" aria-hidden=\"true\"></div>\n      <ul class=\"in\">${items.map((s) => `<li class=\"stat\"><b>${esc(s.value)}</b><span>${esc(s.label)}</span></li>`).join('')}</ul>\n    </section>`;\n  }\n};"}},"items":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"items"}}}},"layout":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"layout"}}}}}}}}}},{"_id":"6ab92c21b6119616261ffb00","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"MediaText","package":"babi-lf","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// MediaText — Loja Lucas Fontana\n// Uma foto ao lado de um kicker vermelho, um título em caixa alta e um ou dois parágrafos\n// (\"A história / Da garagem pro canal. Do canal pra sua garagem.\").\n// Duas colunas iguais no desktop e no tablet (`flip` põe a foto à direita); empilhado, foto primeiro, no mobile.\n// O bloco ocupa só a largura do conteúdo: posicione-o no gutter da página (96 / 40 / 20px).\nconst LAYOUTS = ['desktop', 'tablet', 'mobile'];\nconst esc = (s) => String(s == null ? '' : s)\n  .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\nconst truthy = (v) => v === true || v === 'true' || v === 1 || v === '1';\nconst list = (v) => {\n  if (Array.isArray(v)) return v;\n  if (typeof v === 'string' && v.trim()) { try { const j = JSON.parse(v); return Array.isArray(j) ? j : [v]; } catch (e) { return [v]; } }\n  return [];\n};\nconst IMG = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"1\"/><circle cx=\"9\" cy=\"10\" r=\"2\"/><path d=\"m21 16-5-5-9 8\"/></svg>';\n\nexport default {\n  css: `\n:host { display: block; width: 100%; height: 100%; }\n* { box-sizing: border-box; }\n.mt { --red-500: #c8102e; --ink: #0b0b0c; --grey-100: #ececea; --grey-500: #6b6e73; --grey-700: #45474b;\n  font-family: 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; -webkit-font-smoothing: antialiased;\n  width: 100%; height: 100%; display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 64px; align-items: center; color: var(--ink); background: #ffffff; }\np, h2 { margin: 0; }\n.media { position: relative; aspect-ratio: 592 / 460; background: var(--grey-100); display: flex; align-items: center; justify-content: center; overflow: hidden; }\n.media img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }\n.ph { display: flex; flex-direction: column; align-items: center; gap: 10px; padding: 0 24px; text-align: center;\n  color: var(--grey-500); font-size: 12px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; }\n.ph svg { width: 28px; height: 28px; }\n.copy { display: flex; flex-direction: column; gap: 16px; min-width: 0; }\n.kicker { display: flex; align-items: center; gap: 12px; font-size: 12px; font-weight: 700; letter-spacing: .3em; line-height: 1.3; text-transform: uppercase; color: var(--red-500); }\n.kicker::before { content: ''; width: 22px; height: 3px; background: var(--red-500); flex: none; }\n.title { margin: 0 0 4px; font-size: 44px; font-weight: 800; font-stretch: 115%; line-height: 1; letter-spacing: -.01em; text-transform: uppercase; }\n.copy p.body { font-size: 17px; line-height: 1.65; color: var(--grey-700); }\n.flip .media { order: 2; }\n.l-tablet { gap: 40px; }\n.l-tablet .title { font-size: 32px; }\n.l-tablet .copy p.body { font-size: 16px; }\n.l-mobile { grid-template-columns: minmax(0, 1fr); gap: 28px; align-items: start; align-content: start; }\n.l-mobile.flip .media { order: 0; }\n.l-mobile .kicker { font-size: 11px; letter-spacing: .26em; }\n.l-mobile .title { font-size: 28px; font-stretch: 112%; letter-spacing: 0; }\n.l-mobile .copy p.body { font-size: 15px; }\n`,\n\n  mounted() {\n    if (typeof document !== 'undefined' && document.head && !document.getElementById('lf-archivo-font')) {\n      const l = document.createElement('link');\n      l.id = 'lf-archivo-font';\n      l.rel = 'stylesheet';\n      l.href = 'https://fonts.googleapis.com/css2?family=Archivo:ital,wdth,wght@0,62..125,100..900;1,62..125,100..900&display=swap';\n      document.head.appendChild(l);\n    }\n  },\n\n  render(d2) {\n    const p = d2.params || {};\n    const layout = LAYOUTS.indexOf(p.layout) >= 0 ? p.layout : 'desktop';\n    const eyebrow = p.eyebrow == null ? 'A história' : p.eyebrow;\n    const title = p.title || 'Da garagem pro canal. Do canal pra sua garagem.';\n    let paras = list(p.paragraphs).map((x) => String(x || '')).filter(Boolean);\n    if (!paras.length && p.paragraphs == null) paras = ['[Primeiro parágrafo]', '[Segundo parágrafo]'];\n    const media = p.image\n      ? `<img src=\"${esc(p.image)}\" alt=\"${esc(p.imageAlt || '')}\">`\n      : `<div class=\"ph\">${IMG}<span>${esc(p.placeholder || 'Foto')}</span></div>`;\n    return `<div class=\"mt l-${layout}${truthy(p.flip) ? ' flip' : ''}\">\n      <div class=\"media\">${media}</div>\n      <div class=\"copy\">\n        ${eyebrow ? `<p class=\"kicker\">${esc(eyebrow)}</p>` : ''}\n        <h2 class=\"title\">${esc(title)}</h2>\n        ${paras.map((t) => `<p class=\"body\">${esc(t)}</p>`).join('')}\n      </div>\n    </div>`;\n  }\n};"}},"eyebrow":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"eyebrow"}}}},"flip":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"flip"}}}},"image":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"image"}}}},"imageAlt":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"imageAlt"}}}},"layout":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"layout"}}}},"paragraphs":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"paragraphs"}}}},"placeholder":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"placeholder"}}}},"title":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"title"}}}}}}}}}},{"_id":"6ab92c2fd638cff4260db230","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"ValueCard","package":"babi-lf","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// ValueCard — Loja Lucas Fontana\n// Um motivo numerado para comprar aqui: numeral vermelho em itálico (\"01\"), título em caixa alta e um texto curto,\n// num card branco com borda fina. Use três lado a lado sobre uma Section cinza (tone \"alt\").\n// O texto chega por `body` (o nome `text` é reservado do bloco base do Data2).\nconst LAYOUTS = ['desktop', 'tablet', 'mobile'];\nconst esc = (s) => String(s == null ? '' : s)\n  .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\nconst pad = (v) => { const n = Number(v); return v !== '' && v != null && Number.isFinite(n) ? (n < 10 ? '0' + n : String(n)) : String(v || ''); };\n\nexport default {\n  css: `\n:host { display: block; width: 100%; height: 100%; }\n* { box-sizing: border-box; }\n.vc { --red-500: #c8102e; --ink: #0b0b0c; --white: #ffffff; --grey-700: #45474b; --line: #e4e4e2;\n  font-family: 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; -webkit-font-smoothing: antialiased;\n  display: flex; flex-direction: column; gap: 10px; width: 100%; height: 100%; padding: 28px;\n  background: var(--white); border: 1px solid var(--line); color: var(--ink); }\np, h3 { margin: 0; }\n.num { font-size: 34px; font-weight: 800; font-style: italic; font-stretch: 125%; line-height: 1; color: var(--red-500); }\n.title { margin: 4px 0 0; font-size: 20px; font-weight: 800; font-stretch: 112%; line-height: 1.1; text-transform: uppercase; }\n.text { font-size: 15px; line-height: 1.6; color: var(--grey-700); }\n.l-tablet { padding: 22px; }\n.l-tablet .num, .l-mobile .num { font-size: 28px; }\n.l-tablet .title, .l-mobile .title { font-size: 17px; }\n.l-tablet .text, .l-mobile .text { font-size: 14px; }\n.l-mobile { padding: 22px 20px; }\n`,\n\n  mounted() {\n    if (typeof document !== 'undefined' && document.head && !document.getElementById('lf-archivo-font')) {\n      const l = document.createElement('link');\n      l.id = 'lf-archivo-font';\n      l.rel = 'stylesheet';\n      l.href = 'https://fonts.googleapis.com/css2?family=Archivo:ital,wdth,wght@0,62..125,100..900;1,62..125,100..900&display=swap';\n      document.head.appendChild(l);\n    }\n  },\n\n  render(d2) {\n    const p = d2.params || {};\n    const layout = LAYOUTS.indexOf(p.layout) >= 0 ? p.layout : 'desktop';\n    const num = pad(p.number == null ? '1' : p.number);\n    const title = p.title || 'Testado de verdade';\n    const body = p.body == null ? 'O que entra na loja é o que o Lucas usa, testa e mostra nos vídeos.' : p.body;\n    return `<article class=\"vc l-${layout}\">\n      ${num ? `<p class=\"num\" aria-hidden=\"true\">${esc(num)}</p>` : ''}\n      <h3 class=\"title\">${esc(title)}</h3>\n      ${body ? `<p class=\"text\">${esc(body)}</p>` : ''}\n    </article>`;\n  }\n};"}},"body":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body"}}}},"layout":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"layout"}}}},"number":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"number"}}}},"title":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"title"}}}}}}}}}},{"_id":"6ab92c3be69f22645a56e5fa","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"Section","package":"babi-lf","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// Section — Loja Lucas Fontana\n// A faixa de uma seção de página: aplica o fundo (branco ou cinza \"alt\"), o gutter (96 / 40 / 20px),\n// o respiro de topo (120 / 88 / 64px; na faixa cinza 96 / 64 / 48px) e desenha o SectionHeader no lugar certo.\n// O conteúdo (cards, grids…) é posicionado por cima, na página, logo abaixo do cabeçalho — veja o Doc.\n// Não desenha o cabeçalho: usa o SectionHeader pelo parâmetro `sectionHeader`.\nconst LAYOUTS = ['desktop', 'tablet', 'mobile'];\nconst truthy = (v) => v === true || v === 'true' || v === 1 || v === '1';\nconst refOf = (v) => { const r = (v && typeof v === 'object' ? (typeof v.getReference === 'function' ? v.getReference() : v.reference) : v) || ''; return r && r.indexOf('@') < 0 ? 'babi-lf@' + r : r; };\nconst TOP = { desktop: 120, tablet: 88, mobile: 64 };\nconst TOP_ALT = { desktop: 96, tablet: 64, mobile: 48 };\nconst GUTTER = { desktop: 96, tablet: 40, mobile: 20 };\nconst HEAD = { desktop: 80, tablet: 72, mobile: 90 };\n\nexport default {\n  css: `\n:host { display: block; width: 100%; height: 100%; }\n* { box-sizing: border-box; }\n.sec { width: 100%; height: 100%; background: #ffffff; }\n.sec.alt { background: #f5f5f3; }\n.head { width: 100%; }\n`,\n\n  render(d2) {\n    const p = d2.params || {};\n    const layout = LAYOUTS.indexOf(p.layout) >= 0 ? p.layout : 'desktop';\n    const alt = p.tone === 'alt';\n    const top = truthy(p.flush) ? 0 : (alt ? TOP_ALT[layout] : TOP[layout]);\n    const gutter = GUTTER[layout];\n    const h = Number(p.headerHeight) > 0 ? Number(p.headerHeight) : HEAD[layout];\n    const shRef = refOf(d2.param('sectionHeader'));\n    const header = shRef && (p.title || p.eyebrow)\n      ? `<div class=\"head\" style=\"height:${h}px\">${d2.render(shRef, {\n          number: p.number || '', eyebrow: p.eyebrow || '', title: p.title || '', kicker: truthy(p.kicker),\n          actionLabel: p.actionLabel || '', actionHref: p.actionHref || '', layout\n        }, { key: 'sh', onAction: () => { try { d2.emit('onAction', p.actionHref || ''); } catch (err) { /* sem handler */ } } })}</div>`\n      : '';\n    return `<section class=\"sec${alt ? ' alt' : ''}\" style=\"padding:${top}px ${gutter}px 0\">${header}</section>`;\n  }\n};"}},"actionHref":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"actionHref"}}}},"actionLabel":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"actionLabel"}}}},"eyebrow":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"eyebrow"}}}},"flush":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"flush"}}}},"headerHeight":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"headerHeight"}}}},"kicker":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"kicker"}}}},"layout":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"layout"}}}},"number":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"number"}}}},"onAction":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onAction"}}}},"sectionHeader":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"sectionHeader"}}}},"title":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"title"}}}},"tone":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"tone"}}}}}}}}}},{"_id":"6aba776d6c715c0b701ea1e0","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"Accordion","package":"babi-lf","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// Accordion — Loja Lucas Fontana\n// Linhas de pergunta e resposta do FAQ (e, depois, das abas da página de produto no mobile).\n// Pergunta 17px bold com um quadrado de 28px à direita: \"+\" em ink fechado, \"−\" em vermelho aberto.\n// Resposta em 15px cinza, hairline entre as linhas. Cada pergunta é um botão dentro de um título, com aria-expanded.\n// Não desenha ícone: usa o Icon pelo parâmetro `iconComponent` (sem ele, cai num traço próprio igual).\n// `query` filtra as perguntas (sem acento, sem maiúscula) e abre as que batem — é o que a busca do FAQ usa.\nconst LAYOUTS = ['desktop', 'tablet', 'mobile'];\nconst esc = (s) => String(s == null ? '' : s)\n  .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\nconst truthy = (v) => v === true || v === 'true' || v === 1 || v === '1';\nconst refOf = (v) => { const r = (v && typeof v === 'object' ? (typeof v.getReference === 'function' ? v.getReference() : v.reference) : v) || ''; return r && r.indexOf('@') < 0 ? 'babi-lf@' + r : r; };\nconst list = (v) => {\n  if (Array.isArray(v)) return v;\n  if (typeof v === 'string' && v.trim()) { try { const j = JSON.parse(v); return Array.isArray(j) ? j : []; } catch (e) { return []; } }\n  return [];\n};\nconst nums = (v) => {\n  if (Array.isArray(v)) return v.map(Number).filter((n) => !isNaN(n));\n  if (typeof v === 'number') return [v];\n  if (typeof v === 'string' && v.trim()) {\n    try { const j = JSON.parse(v); if (Array.isArray(j)) return j.map(Number).filter((n) => !isNaN(n)); if (typeof j === 'number') return [j]; } catch (e) { /* lista separada por vírgula */ }\n    return v.split(',').map((s) => Number(s.trim())).filter((n) => !isNaN(n));\n  }\n  return [];\n};\nconst fold = (s) => String(s == null ? '' : s).normalize('NFD').replace(/[\\u0300-\\u036f]/g, '').toLowerCase().trim();\nconst paras = (t) => String(t == null ? '' : t).split(/\\n\\s*\\n/).map((x) => x.trim()).filter(Boolean)\n  .map((x) => `<p>${esc(x).replace(/\\n/g, '<br>')}</p>`).join('');\nconst SVG = {\n  plus: '<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M12 5v14M5 12h14\"/></svg>',\n  minus: '<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M5 12h14\"/></svg>'\n};\nconst DEMO = [\n  { question: 'Quais formas de pagamento vocês aceitam?', answer: 'Pix e cartão de crédito, com parcelamento em até [N]x. Não trabalhamos com boleto.' },\n  { question: 'É seguro comprar aqui?', answer: '[Resposta]' },\n  { question: 'Preciso ter conta para comprar?', answer: '[Resposta]' }\n];\n\nexport default {\n  css: `\n:host { display: block; width: 100%; }\n* { box-sizing: border-box; }\n.acc { --red-500: #c8102e; --ink: #0b0b0c; --white: #ffffff; --grey-700: #45474b; --grey-500: #6b6e73; --line: #e4e4e2;\n  font-family: 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; -webkit-font-smoothing: antialiased;\n  width: 100%; color: var(--ink); }\nh3, h4, p { margin: 0; }\n.item { border-bottom: 1px solid var(--line); }\n.q { display: flex; width: 100%; align-items: center; justify-content: space-between; gap: 16px; min-height: 60px; padding: 14px 0; margin: 0;\n  border: 0; background: transparent; font: 700 17px/1.35 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif;\n  color: var(--ink); text-align: left; cursor: pointer; transition: color .15s ease; }\n.q:hover { color: var(--red-500); }\n.q:focus-visible { outline: 2px solid var(--red-500); outline-offset: 2px; }\n.tg { flex: none; width: 28px; height: 28px; background: var(--ink); color: var(--white); display: flex; align-items: center; justify-content: center; }\n.q[aria-expanded=\"true\"] .tg { background: var(--red-500); }\n.tg svg { display: block; }\n.a { padding: 0 44px 20px 0; font-size: 15px; line-height: 1.65; color: var(--grey-700); }\n.a[hidden] { display: none; }\n.a p { margin: 0 0 10px; }\n.a p:last-child { margin: 0; }\n.none { padding: 20px 0; font-size: 15px; color: var(--grey-500); }\n.l-mobile .q { font-size: 16px; }\n.l-mobile .a { padding-right: 0; }\n`,\n\n  mounted(d2) {\n    if (typeof document !== 'undefined' && document.head && !document.getElementById('lf-archivo-font')) {\n      const l = document.createElement('link');\n      l.id = 'lf-archivo-font';\n      l.rel = 'stylesheet';\n      l.href = 'https://fonts.googleapis.com/css2?family=Archivo:ital,wdth,wght@0,62..125,100..900;1,62..125,100..900&display=swap';\n      document.head.appendChild(l);\n    }\n    d2.on('.q', 'click', (e, el) => {\n      const k = Number(el.dataset.i);\n      const p = d2.params || {};\n      const searching = !!fold(p.query);\n      const isOpen = el.getAttribute('aria-expanded') === 'true';\n      if (searching) {\n        // Durante a busca tudo que bate começa aberto; guardamos só o que a pessoa fechou.\n        const q = fold(p.query);\n        const st = d2.state.closedQ;\n        const closed = st && st.q === q ? st.list.slice() : [];\n        d2.state.closedQ = { q, list: isOpen ? closed.concat([k]) : closed.filter((x) => x !== k) };\n      } else {\n        const cur = (d2.state.open || nums(p.defaultOpen)).slice();\n        d2.state.open = isOpen ? cur.filter((x) => x !== k) : (truthy(p.single) ? [k] : cur.concat([k]));\n      }\n      try { d2.emit('onToggle', { index: k, open: !isOpen }); } catch (err) { /* sem handler */ }\n    });\n  },\n\n  render(d2) {\n    const p = d2.params || {};\n    const layout = LAYOUTS.indexOf(p.layout) >= 0 ? p.layout : 'desktop';\n    const all = (list(p.items).length ? list(p.items) : DEMO)\n      .map((it) => ({ question: (it && it.question) || '', answer: (it && it.answer) || '' }))\n      .filter((it) => it.question);\n    const hl = Number(p.headingLevel) === 4 ? 'h4' : 'h3';\n    const iconMod = refOf(d2.param('iconComponent'));\n    const uid = 'acc'; // ids vivem no shadow root de cada instância, não colidem\n\n    // Linhas abertas: o que a pessoa abriu/fechou, ou `defaultOpen` enquanto ninguém mexeu.\n    const opened = d2.state.open || nums(p.defaultOpen);\n    const q = fold(p.query);\n    const st = d2.state.closedQ;\n    const closedQ = st && st.q === q ? st.list : [];\n\n    const rows = all.map((it, k) => ({ it, k }))\n      .filter(({ it }) => !q || fold(it.question).indexOf(q) >= 0 || fold(it.answer).indexOf(q) >= 0);\n    if (!rows.length) {\n      return `<div class=\"acc l-${layout}\"><p class=\"none\">${esc(p.emptyLabel || 'Nenhuma pergunta por aqui.')}</p></div>`;\n    }\n    const openSet = q ? rows.map((r) => r.k).filter((k) => closedQ.indexOf(k) < 0) : opened;\n\n    const html = rows.map(({ it, k }) => {\n      const isOpen = openSet.indexOf(k) >= 0;\n      const glyph = iconMod\n        ? d2.render(iconMod, { name: isOpen ? 'minus' : 'plus', size: 14, iconColor: 'currentColor' }, { key: 'ic-' + k + (isOpen ? '-m' : '-p'), width: 14, height: 14 })\n        : SVG[isOpen ? 'minus' : 'plus'];\n      return `<div class=\"item\" data-key=\"${k}\">\n        <${hl}><button type=\"button\" class=\"q\" data-i=\"${k}\" aria-expanded=\"${isOpen ? 'true' : 'false'}\" aria-controls=\"${uid}-${k}\">\n          <span>${esc(it.question)}</span><span class=\"tg\" aria-hidden=\"true\">${glyph}</span>\n        </button></${hl}>\n        <div class=\"a\" id=\"${uid}-${k}\"${isOpen ? '' : ' hidden'}>${paras(it.answer)}</div>\n      </div>`;\n    }).join('');\n    return `<div class=\"acc l-${layout}\">${html}</div>`;\n  }\n};"}},"defaultOpen":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"defaultOpen"}}}},"emptyLabel":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"emptyLabel"}}}},"headingLevel":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"headingLevel"}}}},"iconComponent":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"iconComponent"}}}},"items":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"items"}}}},"layout":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"layout"}}}},"onToggle":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onToggle"}}}},"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"query"}}}},"single":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"single"}}}}}}}}}},{"_id":"6aba777c976d61457441e04f","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"FaqGroup","package":"babi-lf","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// FaqGroup — Loja Lucas Fontana\n// Um tema do FAQ: título em caixa alta (24px, 20px no mobile) sobre uma régua ink de 2px, e o Accordion logo abaixo.\n// `anchor` é o id do tema: o menu \"Temas\" do FaqLayout usa para pular até ele.\n// Não desenha as perguntas: usa o Accordion pelo parâmetro `accordion` (e repassa o Icon por `iconComponent`).\nconst LAYOUTS = ['desktop', 'tablet', 'mobile'];\nconst esc = (s) => String(s == null ? '' : s)\n  .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\nconst truthy = (v) => v === true || v === 'true' || v === 1 || v === '1';\nconst refOf = (v) => { const r = (v && typeof v === 'object' ? (typeof v.getReference === 'function' ? v.getReference() : v.reference) : v) || ''; return r && r.indexOf('@') < 0 ? 'babi-lf@' + r : r; };\nconst list = (v) => {\n  if (Array.isArray(v)) return v;\n  if (typeof v === 'string' && v.trim()) { try { const j = JSON.parse(v); return Array.isArray(j) ? j : []; } catch (e) { return []; } }\n  return [];\n};\nconst DEMO = [\n  { question: 'Quais formas de pagamento vocês aceitam?', answer: 'Pix e cartão de crédito, com parcelamento em até [N]x. Não trabalhamos com boleto.' },\n  { question: 'É seguro comprar aqui?', answer: '[Resposta]' },\n  { question: 'Preciso ter conta para comprar?', answer: '[Resposta]' }\n];\n\nexport default {\n  css: `\n:host { display: block; width: 100%; }\n* { box-sizing: border-box; }\n.grp { --ink: #0b0b0c;\n  font-family: 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; -webkit-font-smoothing: antialiased;\n  display: flex; flex-direction: column; width: 100%; color: var(--ink); scroll-margin-top: 24px; }\n.gt { margin: 0; padding-bottom: 12px; border-bottom: 2px solid var(--ink); font-size: 24px; font-weight: 800; font-stretch: 115%;\n  line-height: 1.05; letter-spacing: .005em; text-transform: uppercase; color: var(--ink); overflow-wrap: break-word; }\n.l-mobile .gt { font-size: 20px; font-stretch: 112%; }\n`,\n\n  mounted() {\n    if (typeof document !== 'undefined' && document.head && !document.getElementById('lf-archivo-font')) {\n      const l = document.createElement('link');\n      l.id = 'lf-archivo-font';\n      l.rel = 'stylesheet';\n      l.href = 'https://fonts.googleapis.com/css2?family=Archivo:ital,wdth,wght@0,62..125,100..900;1,62..125,100..900&display=swap';\n      document.head.appendChild(l);\n    }\n  },\n\n  render(d2) {\n    const p = d2.params || {};\n    const layout = LAYOUTS.indexOf(p.layout) >= 0 ? p.layout : 'desktop';\n    const accMod = refOf(d2.param('accordion'));\n    const iconMod = refOf(d2.param('iconComponent'));\n    const items = list(p.items).length ? list(p.items) : DEMO;\n    const title = p.title == null ? 'Compras e pagamento' : p.title;\n    const anchor = p.anchor ? String(p.anchor) : '';\n    const tid = anchor ? anchor + '-t' : 'faq-group-t';\n\n    const acc = accMod\n      ? d2.render(accMod, {\n          items, defaultOpen: p.defaultOpen == null ? [] : p.defaultOpen, single: truthy(p.single),\n          query: p.query || '', layout, headingLevel: 3, iconComponent: iconMod\n        }, { key: 'acc', style: 'height:auto', onToggle: (e) => { try { d2.emit('onToggle', e); } catch (err) { /* sem handler */ } } })\n      : '';\n\n    return `<section class=\"grp l-${layout}\"${anchor ? ` id=\"${esc(anchor)}\"` : ''} aria-labelledby=\"${esc(tid)}\">\n      <h2 class=\"gt\" id=\"${esc(tid)}\">${esc(title)}</h2>\n      ${acc}\n    </section>`;\n  }\n};"}},"accordion":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"accordion"}}}},"anchor":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"anchor"}}}},"defaultOpen":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"defaultOpen"}}}},"iconComponent":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"iconComponent"}}}},"items":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"items"}}}},"layout":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"layout"}}}},"onToggle":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onToggle"}}}},"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"query"}}}},"single":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"single"}}}},"title":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"title"}}}}}}}}}},{"_id":"6aba778f6c715c0b701ea228","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"SupportCard","package":"babi-lf","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// SupportCard — Loja Lucas Fontana\n// O card escuro \"Não achou sua resposta?\" do FAQ: xadrez discreto no canto, título, uma linha apontando o SAC,\n// botão vermelho (WhatsApp do SAC), botão de contorno branco (e-mail) e uma nota pequena com link no rodapé.\n// Não desenha botão: usa o Button pelo parâmetro `button` (variantes `brand` e `ghost`).\n// O texto de apoio chega por `body` (o nome `text` é reservado do bloco base do Data2).\nconst LAYOUTS = ['desktop', 'tablet', 'mobile'];\nconst esc = (s) => String(s == null ? '' : s)\n  .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\nconst refOf = (v) => { const r = (v && typeof v === 'object' ? (typeof v.getReference === 'function' ? v.getReference() : v.reference) : v) || ''; return r && r.indexOf('@') < 0 ? 'babi-lf@' + r : r; };\nconst dflt = (v, d) => (v == null ? d : v);\n\nexport default {\n  css: `\n:host { display: block; width: 100%; height: 100%; }\n* { box-sizing: border-box; }\n.sc { --red-500: #c8102e; --ink: #0b0b0c; --white: #ffffff; --grey-200: #c9cacd; --grey-300: #a7a9ad;\n  font-family: 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; -webkit-font-smoothing: antialiased;\n  position: relative; display: flex; flex-direction: column; gap: 14px; width: 100%; height: 100%; padding: 28px 24px;\n  background: var(--ink); color: var(--white); overflow: hidden; }\nh2, p { margin: 0; position: relative; }\n.checker { position: absolute; top: 0; right: 0; width: 72px; height: 48px; pointer-events: none;\n  background: repeating-conic-gradient(rgba(255,255,255,.08) 0 25%, transparent 0 50%) 0 0 / 16px 16px; }\n.title { font-size: 22px; font-weight: 800; font-stretch: 112%; line-height: 1.05; text-transform: uppercase; padding-right: 48px; }\n.body { font-size: 14px; line-height: 1.55; color: var(--grey-200); }\n.btns { position: relative; display: flex; flex-direction: column; gap: 10px; margin-top: 2px; }\n.btn { width: 100%; height: 48px; }\n.foot { font-size: 13px; line-height: 1.5; color: var(--grey-300); }\n.foot a { display: inline-block; color: var(--white); font-weight: 600; text-decoration: underline; text-underline-offset: 3px; }\n.foot a:hover { color: var(--red-500); }\n.foot a:focus-visible { outline: 2px solid var(--white); outline-offset: 2px; }\n\n/* Tablet: o card vai para o fim da página, largo; os botões ficam lado a lado */\n.l-tablet { padding: 32px; }\n.l-tablet .body { max-width: 520px; }\n.l-tablet .btns { flex-direction: row; }\n.l-tablet .btn { flex: 1 1 0; }\n\n/* Mobile: igual ao desktop, empilhado */\n.l-mobile .title { font-size: 20px; }\n`,\n\n  mounted(d2) {\n    if (typeof document !== 'undefined' && document.head && !document.getElementById('lf-archivo-font')) {\n      const l = document.createElement('link');\n      l.id = 'lf-archivo-font';\n      l.rel = 'stylesheet';\n      l.href = 'https://fonts.googleapis.com/css2?family=Archivo:ital,wdth,wght@0,62..125,100..900;1,62..125,100..900&display=swap';\n      document.head.appendChild(l);\n    }\n    d2.on('.foot a', 'click', (e, el) => { try { d2.emit('onFootLink', el.getAttribute('href')); } catch (err) { /* sem handler */ } });\n  },\n\n  render(d2) {\n    const p = d2.params || {};\n    const layout = LAYOUTS.indexOf(p.layout) >= 0 ? p.layout : 'desktop';\n    const btnMod = refOf(d2.param('button'));\n\n    const title = dflt(p.title, 'Não achou sua resposta?');\n    const body = dflt(p.body, 'Fala com o SAC — é o caminho mais rápido para dúvidas sobre pedido, troca ou entrega.');\n    const pLabel = dflt(p.primaryLabel, 'WhatsApp do SAC');\n    const sLabel = dflt(p.secondaryLabel, '[E-mail do SAC]');\n    const footText = dflt(p.footText, 'Quer mandar um recado pro Lucas?');\n    const footLink = dflt(p.footLinkLabel, 'Fale com o Lucas');\n    const footHref = p.footLinkHref || '/fale-com-o-lucas';\n\n    const btn = (key, label, variant, glyph, href, evt) => `<div class=\"btn\">${d2.render(btnMod, {\n      label, variant, size: 'md', fullWidth: 'always', glyph: glyph || '', layout, href: href || '', newTab: /^https?:/.test(href || '')\n    }, { key, height: 48, onClick: () => { try { d2.emit(evt, href || ''); } catch (err) { /* sem handler */ } } })}</div>`;\n\n    const btns = btnMod && (pLabel || sLabel) ? `<div class=\"btns\">\n        ${pLabel ? btn('primary', pLabel, 'brand', dflt(p.primaryGlyph, 'message'), p.primaryHref, 'onPrimary') : ''}\n        ${sLabel ? btn('secondary', sLabel, 'ghost', '', p.secondaryHref, 'onSecondary') : ''}\n      </div>` : '';\n\n    const foot = footText || footLink\n      ? `<p class=\"foot\">${esc(footText)}${footText && footLink ? '<br>' : ''}${footLink ? `<a href=\"${esc(footHref)}\">${esc(footLink)}</a>` : ''}</p>`\n      : '';\n\n    return `<section class=\"sc l-${layout}\">\n      <span class=\"checker\" aria-hidden=\"true\"></span>\n      ${title ? `<h2 class=\"title\">${esc(title)}</h2>` : ''}\n      ${body ? `<p class=\"body\">${esc(body)}</p>` : ''}\n      ${btns}\n      ${foot}\n    </section>`;\n  }\n};"}},"body":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"body"}}}},"button":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"button"}}}},"footLinkHref":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"footLinkHref"}}}},"footLinkLabel":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"footLinkLabel"}}}},"footText":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"footText"}}}},"layout":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"layout"}}}},"onFootLink":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onFootLink"}}}},"onPrimary":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onPrimary"}}}},"onSecondary":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onSecondary"}}}},"primaryGlyph":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"primaryGlyph"}}}},"primaryHref":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"primaryHref"}}}},"primaryLabel":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"primaryLabel"}}}},"secondaryHref":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"secondaryHref"}}}},"secondaryLabel":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"secondaryLabel"}}}},"title":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"title"}}}}}}}}}},{"_id":"6aba77a6f7e943b8aee8e432","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"PageHeader","package":"babi-lf","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// PageHeader — Loja Lucas Fontana\n// A faixa de título que abre as páginas de listagem e as institucionais (categoria, busca, FAQ):\n// breadcrumb, kicker vermelho com régua curta (\"— Ajuda\"), título 44/36/28px, uma linha de descrição\n// e, no desktop, a contagem à direita (`meta`). Uma hairline fecha a faixa.\n// Com `showSearch`, põe o SearchBar grande embaixo da descrição (é o FAQ), sem o botão \"Buscar\".\n// Não desenha breadcrumb nem busca: usa Breadcrumb e SearchBar por parâmetro (e repassa Icon e Button para a busca).\n// A descrição chega por `description` (o nome `text` é reservado do bloco base do Data2).\nconst LAYOUTS = ['desktop', 'tablet', 'mobile'];\nconst esc = (s) => String(s == null ? '' : s)\n  .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\nconst truthy = (v) => v === true || v === 'true' || v === 1 || v === '1';\nconst refOf = (v) => { const r = (v && typeof v === 'object' ? (typeof v.getReference === 'function' ? v.getReference() : v.reference) : v) || ''; return r && r.indexOf('@') < 0 ? 'babi-lf@' + r : r; };\nconst list = (v) => {\n  if (Array.isArray(v)) return v;\n  if (typeof v === 'string' && v.trim()) { try { const j = JSON.parse(v); return Array.isArray(j) ? j : []; } catch (e) { return []; } }\n  return [];\n};\nconst PAD = { desktop: '32px 96px 40px', tablet: '28px 40px 32px', mobile: '24px 20px 28px' };\nconst CRUMB_H = { desktop: 24, tablet: 24, mobile: 30 };\nconst SEARCH_H = { desktop: 56, tablet: 52, mobile: 52 };\n\nexport default {\n  css: `\n:host { display: block; width: 100%; height: 100%; }\n* { box-sizing: border-box; }\n.pgh { --red-500: #c8102e; --ink: #0b0b0c; --white: #ffffff; --grey-500: #6b6e73; --grey-700: #45474b; --line: #e4e4e2;\n  font-family: 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; -webkit-font-smoothing: antialiased;\n  width: 100%; height: 100%; background: var(--white); border-bottom: 1px solid var(--line); color: var(--ink); }\np, h1 { margin: 0; }\n.in { display: flex; flex-direction: column; gap: 16px; }\n.crumb { width: 100%; }\n.row { display: flex; align-items: flex-end; justify-content: space-between; gap: 24px; }\n.txt { display: flex; flex-direction: column; gap: 10px; min-width: 0; }\n.kicker { display: flex; align-items: center; gap: 12px; font-size: 12px; font-weight: 700; letter-spacing: .3em; line-height: 1.3; text-transform: uppercase; color: var(--red-500); }\n.kicker::before { content: ''; width: 22px; height: 3px; background: var(--red-500); flex: none; }\n.title { font-size: 44px; font-weight: 800; font-stretch: 115%; line-height: 1; letter-spacing: -.01em; text-transform: uppercase; color: var(--ink); overflow-wrap: break-word; }\n.desc { margin-top: 6px; font-size: 17px; line-height: 1.5; color: var(--grey-700); max-width: 640px; }\n.meta { flex-shrink: 0; font-size: 14px; color: var(--grey-500); padding-bottom: 2px; }\n.search { width: 100%; max-width: 656px; margin-top: 8px; }\n\n.l-tablet .in { gap: 14px; }\n.l-tablet .title { font-size: 36px; }\n.l-tablet .desc { font-size: 16px; }\n\n.l-mobile .in { gap: 12px; }\n.l-mobile .kicker { font-size: 11px; letter-spacing: .26em; }\n.l-mobile .title { font-size: 28px; font-stretch: 112%; line-height: 1.02; letter-spacing: 0; }\n.l-mobile .desc { font-size: 15px; }\n`,\n\n  mounted(d2) {\n    if (typeof document !== 'undefined' && document.head && !document.getElementById('lf-archivo-font')) {\n      const l = document.createElement('link');\n      l.id = 'lf-archivo-font';\n      l.rel = 'stylesheet';\n      l.href = 'https://fonts.googleapis.com/css2?family=Archivo:ital,wdth,wght@0,62..125,100..900;1,62..125,100..900&display=swap';\n      document.head.appendChild(l);\n    }\n  },\n\n  render(d2) {\n    const p = d2.params || {};\n    const layout = LAYOUTS.indexOf(p.layout) >= 0 ? p.layout : 'desktop';\n    const bcRef = refOf(d2.param('breadcrumb'));\n    const sbRef = refOf(d2.param('searchBar'));\n    const iconRef = refOf(d2.param('searchIcon'));\n    const btnRef = refOf(d2.param('button'));\n\n    const crumbs = list(p.crumbs).length ? list(p.crumbs) : [{ label: 'Início', href: '/' }, { label: p.title || 'Perguntas frequentes' }];\n    const eyebrow = p.eyebrow == null ? 'Ajuda' : p.eyebrow;\n    const title = p.title || 'Perguntas frequentes';\n    const desc = p.description == null ? 'As dúvidas que mais chegam por aqui, respondidas sem enrolação.' : p.description;\n    const showSearch = p.showSearch == null ? true : truthy(p.showSearch);\n\n    const crumb = bcRef\n      ? `<div class=\"crumb\" style=\"height:${CRUMB_H[layout]}px\">${d2.render(bcRef, { items: crumbs, layout }, {\n          key: 'bc', onNavigate: (h) => { try { d2.emit('onNavigate', h); } catch (err) { /* sem handler */ } } })}</div>`\n      : '';\n\n    const search = showSearch && sbRef\n      ? `<div class=\"search\" style=\"height:${SEARCH_H[layout]}px\">${d2.render(sbRef, {\n          layout, size: 'lg', showButton: false, searchIcon: iconRef, button: btnRef,\n          placeholder: p.searchPlaceholder || 'Busque sua dúvida: frete, troca, pagamento...',\n          shortPlaceholder: p.searchShortPlaceholder || 'Busque sua dúvida',\n          ariaLabel: p.searchLabel || 'Buscar nas perguntas frequentes',\n          busTopic: p.searchTopic == null ? 'faq:search' : p.searchTopic\n        }, { key: 'search', onSearch: (q) => { try { d2.emit('onSearch', q); } catch (err) { /* sem handler */ } } })}</div>`\n      : '';\n\n    const meta = layout === 'desktop' && p.meta ? `<span class=\"meta\">${esc(p.meta)}</span>` : '';\n\n    return `<div class=\"pgh l-${layout}\"><div class=\"in\" style=\"padding:${PAD[layout]}\">\n      ${crumb}\n      <div class=\"row\">\n        <div class=\"txt\">\n          ${eyebrow ? `<p class=\"kicker\">${esc(eyebrow)}</p>` : ''}\n          <h1 class=\"title\">${esc(title)}</h1>\n          ${desc ? `<p class=\"desc\">${esc(desc)}</p>` : ''}\n        </div>\n        ${meta}\n      </div>\n      ${search}\n    </div></div>`;\n  }\n};"}},"breadcrumb":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"breadcrumb"}}}},"button":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"button"}}}},"crumbs":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"crumbs"}}}},"description":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"description"}}}},"eyebrow":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"eyebrow"}}}},"layout":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"layout"}}}},"meta":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"meta"}}}},"onNavigate":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onNavigate"}}}},"onSearch":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onSearch"}}}},"searchBar":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"searchBar"}}}},"searchIcon":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"searchIcon"}}}},"searchLabel":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"searchLabel"}}}},"searchPlaceholder":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"searchPlaceholder"}}}},"searchShortPlaceholder":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"searchShortPlaceholder"}}}},"searchTopic":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"searchTopic"}}}},"showSearch":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"showSearch"}}}},"title":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"title"}}}}}}}}}},{"_id":"6aba77d12c4424598ddc5a99","component":"data2-core-types@Component","system":"6ab58b1260cbe7aa719c6d7b","params":{"extends":"data2-core-primitives@Block","component":"FaqLayout","package":"babi-lf","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// FaqLayout — Loja Lucas Fontana\n// O corpo da página de perguntas frequentes.\n// Desktop: coluna de 264px à esquerda, presa no scroll, com o menu \"Temas\" (tema atual preenchido em ink)\n// e o SupportCard embaixo; as perguntas (FaqGroups) à direita.\n// Tablet e mobile: os temas viram uma fileira de chips que rola para o lado, acima das perguntas,\n// e o SupportCard vai para o fim.\n// O tema atual acompanha a rolagem da página; clicar num tema rola até ele.\n// Busca: escuta o tópico `searchTopic` (padrão \"faq:search\", o mesmo que o PageHeader manda) ou recebe `query`,\n// mostra só os temas e perguntas que batem e, se nada bater, a mensagem de \"não achamos\".\n// Não desenha tema, pergunta nem card: usa FaqGroup, Accordion, Icon, SupportCard e Button por parâmetro.\nconst LAYOUTS = ['desktop', 'tablet', 'mobile'];\nconst esc = (s) => String(s == null ? '' : s)\n  .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\nconst truthy = (v) => v === true || v === 'true' || v === 1 || v === '1';\nconst refOf = (v) => { const r = (v && typeof v === 'object' ? (typeof v.getReference === 'function' ? v.getReference() : v.reference) : v) || ''; return r && r.indexOf('@') < 0 ? 'babi-lf@' + r : r; };\nconst list = (v) => {\n  if (Array.isArray(v)) return v;\n  if (typeof v === 'string' && v.trim()) { try { const j = JSON.parse(v); return Array.isArray(j) ? j : []; } catch (e) { return []; } }\n  return [];\n};\nconst obj = (v) => {\n  if (v && typeof v === 'object' && !Array.isArray(v)) return v;\n  if (typeof v === 'string' && v.trim()) { try { const j = JSON.parse(v); return j && typeof j === 'object' ? j : {}; } catch (e) { return {}; } }\n  return {};\n};\nconst fold = (s) => String(s == null ? '' : s).normalize('NFD').replace(/[\\u0300-\\u036f]/g, '').toLowerCase().trim();\nconst PAD = { desktop: '40px 96px 120px', tablet: '32px 40px 88px', mobile: '24px 20px 64px' };\n\nconst DEMO = [\n  { id: 'compras', title: 'Compras e pagamento', open: [0], items: [\n    { question: 'Quais formas de pagamento vocês aceitam?', answer: 'Pix e cartão de crédito, com parcelamento em até [N]x. Não trabalhamos com boleto.' },\n    { question: 'É seguro comprar aqui?', answer: '[Resposta]' },\n    { question: 'Preciso ter conta para comprar?', answer: '[Resposta]' }] },\n  { id: 'entrega', title: 'Entrega e rastreio', items: [\n    { question: 'Vocês entregam para todo o Brasil?', answer: '[Resposta]' },\n    { question: 'Como acompanho meu pedido?', answer: '[Resposta]' },\n    { question: 'Por que meu pedido veio em mais de uma entrega?', answer: '[Resposta]' }] },\n  { id: 'trocas', title: 'Trocas e devoluções', items: [\n    { question: 'Posso desistir da compra?', answer: '[Resposta]' },\n    { question: 'O produto chegou com defeito. E agora?', answer: '[Resposta]' }] },\n  { id: 'produtos', title: 'Produtos', items: [\n    { question: 'O produto que eu quero está esgotado. Vai voltar?', answer: '[Resposta]' },\n    { question: 'Como sei se a peça serve no meu carro?', answer: '[Resposta]' }] },\n  { id: 'conta', title: 'Minha conta', items: [\n    { question: 'Esqueci minha senha. Como faço?', answer: '[Resposta]' },\n    { question: 'Como altero meus dados ou endereço?', answer: '[Resposta]' }] }\n];\n\nexport default {\n  css: `\n:host { display: block; width: 100%; }\n* { box-sizing: border-box; }\n.faq { --red-500: #c8102e; --ink: #0b0b0c; --white: #ffffff; --grey-50: #f5f5f3; --grey-500: #6b6e73; --grey-700: #45474b;\n  --line: #e4e4e2; --line-strong: #d9d9d6;\n  font-family: 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; -webkit-font-smoothing: antialiased;\n  width: 100%; background: var(--white); color: var(--ink); }\np, h2 { margin: 0; }\n.in { display: grid; grid-template-columns: 264px minmax(0, 1fr); gap: 56px; align-items: start; }\n.side { position: sticky; top: 24px; display: flex; flex-direction: column; gap: 32px; }\n.nav { display: flex; flex-direction: column; }\n.nt { margin: 0 0 12px; font-size: 12px; font-weight: 800; letter-spacing: .24em; text-transform: uppercase; color: var(--ink); }\n.topic { display: flex; align-items: center; width: 100%; min-height: 48px; padding: 0 16px; margin: 0; border: 0; background: transparent;\n  font: 700 15px/1.25 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif; color: var(--ink); text-align: left; cursor: pointer; }\n.topic:hover { background: var(--grey-50); }\n.topic[aria-current=\"true\"] { background: var(--ink); color: var(--white); }\n.topic:focus-visible, .chip:focus-visible { outline: 2px solid var(--red-500); outline-offset: 2px; }\n.main { display: flex; flex-direction: column; gap: 32px; min-width: 0; }\n.chips { display: flex; gap: 8px; overflow-x: auto; scrollbar-width: none; padding-bottom: 4px; }\n.chips::-webkit-scrollbar { display: none; }\n.chip { flex: none; display: inline-flex; align-items: center; height: 44px; padding: 0 16px; margin: 0; border: 1px solid var(--line-strong);\n  border-radius: 0; background: var(--white); font: 700 14px/1 'Archivo', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif;\n  color: var(--ink); white-space: nowrap; cursor: pointer; }\n.chip:hover { border-color: var(--ink); }\n.chip[aria-current=\"true\"] { background: var(--ink); border-color: var(--ink); color: var(--white); }\n.groups { display: flex; flex-direction: column; gap: 48px; }\n.g { scroll-margin-top: 24px; }\n.help-m { margin-top: 16px; }\n.empty { display: flex; flex-direction: column; gap: 10px; padding: 32px 0 8px; border-top: 2px solid var(--ink); }\n.empty .k { display: flex; align-items: center; gap: 12px; font-size: 12px; font-weight: 700; letter-spacing: .3em; text-transform: uppercase; color: var(--red-500); }\n.empty .k::before { content: ''; width: 22px; height: 3px; background: var(--red-500); flex: none; }\n.empty h2 { font-size: 24px; font-weight: 800; font-stretch: 115%; line-height: 1.1; text-transform: uppercase; overflow-wrap: anywhere; }\n.empty p { font-size: 15px; line-height: 1.6; color: var(--grey-700); max-width: 520px; }\n\n.l-tablet .in, .l-mobile .in { grid-template-columns: minmax(0, 1fr); gap: 32px; }\n.l-mobile .in { gap: 28px; }\n.l-mobile .main { gap: 28px; }\n.l-mobile .groups { gap: 40px; }\n.l-mobile .empty h2 { font-size: 20px; }\n`,\n\n  mounted(d2) {\n    if (typeof document !== 'undefined' && document.head && !document.getElementById('lf-archivo-font')) {\n      const l = document.createElement('link');\n      l.id = 'lf-archivo-font';\n      l.rel = 'stylesheet';\n      l.href = 'https://fonts.googleapis.com/css2?family=Archivo:ital,wdth,wght@0,62..125,100..900;1,62..125,100..900&display=swap';\n      document.head.appendChild(l);\n    }\n    // Busca vinda do PageHeader (ou de qualquer SearchBar com o mesmo busTopic)\n    const topic = (d2.params || {}).searchTopic;\n    const t = topic == null ? 'faq:search' : String(topic);\n    if (t && d2.bus && typeof d2.bus.on === 'function') d2.bus.on(t, (q) => { const v = String(q == null ? '' : q); if (d2.state.q !== v) d2.state.q = v; });\n\n    // Clique num tema: marca e rola até ele (a rolagem suspende o acompanhamento por um instante)\n    d2.on('[data-topic]', 'click', (e, el) => {\n      const id = el.getAttribute('data-topic');\n      d2.state.active = id;\n      if (d2.root) d2.root.__lfLock = Date.now() + 900;\n      const target = d2.$(`.g[data-g=\"${id}\"]`);\n      if (target && typeof target.scrollIntoView === 'function') target.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      try { d2.emit('onTopic', id); } catch (err) { /* sem handler */ }\n    });\n\n    // Tema atual acompanha a rolagem: o tema cujo topo passou da faixa de cima da tela\n    if (typeof IntersectionObserver !== 'undefined') {\n      const io = new IntersectionObserver((entries) => {\n        if (d2.root && d2.root.__lfLock && Date.now() < d2.root.__lfLock) return;\n        const hit = entries.filter((en) => en.isIntersecting)\n          .sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top)[0];\n        if (hit) {\n          const id = hit.target.getAttribute('data-g');\n          if (id && d2.state.active !== id) d2.state.active = id;\n        }\n      }, { rootMargin: '-15% 0px -70% 0px', threshold: 0 });\n      const watch = () => { io.disconnect(); d2.$$('.g[data-g]').forEach((el) => io.observe(el)); };\n      d2.onUnmount(() => io.disconnect());\n      // guarda o \"watch\" fora do estado reativo\n      d2.root.__lfWatch = watch;\n      watch();\n    }\n\n    // Link direto para um tema: /perguntas-frequentes#trocas abre a página já no tema\n    try {\n      const h = typeof location !== 'undefined' ? decodeURIComponent(String(location.hash || '').replace(/^#/, '')) : '';\n      if (h) {\n        setTimeout(() => {\n          const el = d2.$(`.g[data-g=\"${h.replace(/\"/g, '')}\"]`);\n          if (el) { d2.state.active = h; if (d2.root) d2.root.__lfLock = Date.now() + 900; el.scrollIntoView({ block: 'start' }); }\n        }, 300);\n      }\n    } catch (err) { /* sem hash */ }\n  },\n\n  updated(d2) {\n    if (d2.root && typeof d2.root.__lfWatch === 'function') d2.root.__lfWatch();\n    // mantém o chip do tema atual visível na fileira\n    const chip = d2.$('.chip[aria-current=\"true\"]');\n    const row = d2.$('.chips');\n    if (chip && row) {\n      const l = chip.offsetLeft, r = l + chip.offsetWidth;\n      if (l < row.scrollLeft || r > row.scrollLeft + row.clientWidth) row.scrollLeft = Math.max(0, l - 20);\n    }\n  },\n\n  render(d2) {\n    const p = d2.params || {};\n    const layout = LAYOUTS.indexOf(p.layout) >= 0 ? p.layout : 'desktop';\n    const desk = layout === 'desktop';\n    const fgMod = refOf(d2.param('faqGroup'));\n    const accMod = refOf(d2.param('accordion'));\n    const iconMod = refOf(d2.param('iconComponent'));\n    const scMod = refOf(d2.param('supportCard'));\n    const btnMod = refOf(d2.param('button'));\n\n    const groups = (list(p.groups).length ? list(p.groups) : DEMO)\n      .map((g, i) => ({ id: String((g && g.id) || 'tema-' + (i + 1)), title: (g && g.title) || '', items: list(g && g.items), open: g && g.open }))\n      .filter((g) => g.title);\n    const labels = {};\n    list(p.topics).forEach((t) => { if (t && t.id) labels[String(t.id)] = t.label; });\n\n    const q = fold(p.query != null && p.query !== '' ? p.query : d2.state.q);\n    const rawQ = String(p.query != null && p.query !== '' ? p.query : (d2.state.q || '')).trim();\n    const hits = (g) => !q || g.items.some((it) => fold(it && it.question).indexOf(q) >= 0 || fold(it && it.answer).indexOf(q) >= 0);\n    const visible = groups.filter(hits);\n\n    const current = d2.state.active && visible.some((g) => g.id === d2.state.active)\n      ? d2.state.active\n      : (p.current && visible.some((g) => g.id === String(p.current)) ? String(p.current) : (visible[0] && visible[0].id));\n\n    const topicBtn = (g, cls) => `<button type=\"button\" class=\"${cls}\" data-topic=\"${esc(g.id)}\" data-key=\"${cls}-${esc(g.id)}\"${g.id === current ? ' aria-current=\"true\"' : ''}>${esc(labels[g.id] || g.title)}</button>`;\n\n    const groupHtml = visible.map((g) => `<div class=\"g\" data-g=\"${esc(g.id)}\" data-key=\"g-${esc(g.id)}\">${fgMod\n      ? d2.render(fgMod, {\n          anchor: g.id, title: g.title, items: g.items, defaultOpen: g.open == null ? [] : g.open, single: truthy(p.single),\n          query: q ? rawQ : '', layout, accordion: accMod, iconComponent: iconMod\n        }, { key: 'fg-' + g.id, style: 'height:auto' })\n      : ''}</div>`).join('');\n\n    const empty = !visible.length ? `<div class=\"empty\" role=\"status\">\n        <p class=\"k\">${esc(p.emptyEyebrow || 'Busca')}</p>\n        <h2>Não achamos nada para “${esc(rawQ)}”</h2>\n        <p>${esc(p.emptyBody || 'Nem o Lucas achou isso na garagem. Tenta outra palavra ou fala com o SAC, que a gente resolve.')}</p>\n      </div>` : '';\n\n    const showSupport = p.showSupport == null ? true : truthy(p.showSupport);\n    const sup = obj(p.support);\n    const support = showSupport && scMod\n      ? d2.render(scMod, Object.assign({}, sup, { layout, button: btnMod }), {\n          key: 'sup-' + (desk ? 'side' : 'end'), style: 'height:auto',\n          onPrimary: (h) => { try { d2.emit('onSupport', { action: 'primary', href: h }); } catch (err) { /* sem handler */ } },\n          onSecondary: (h) => { try { d2.emit('onSupport', { action: 'secondary', href: h }); } catch (err) { /* sem handler */ } },\n          onFootLink: (h) => { try { d2.emit('onSupport', { action: 'foot', href: h }); } catch (err) { /* sem handler */ } }\n        })\n      : '';\n\n    const navTitle = p.navTitle || 'Temas';\n    const body = desk\n      ? `<aside class=\"side\">\n          <nav class=\"nav\" aria-label=\"${esc(navTitle)}\"><p class=\"nt\">${esc(navTitle)}</p>${visible.map((g) => topicBtn(g, 'topic')).join('')}</nav>\n          ${support}\n        </aside>\n        <div class=\"main\"><div class=\"groups\">${groupHtml}</div>${empty}</div>`\n      : `<div class=\"main\">\n          ${visible.length > 1 ? `<nav class=\"chips\" aria-label=\"${esc(navTitle)}\">${visible.map((g) => topicBtn(g, 'chip')).join('')}</nav>` : ''}\n          <div class=\"groups\">${groupHtml}</div>${empty}\n          ${support ? `<div class=\"help-m\">${support}</div>` : ''}\n        </div>`;\n\n    return `<div class=\"faq l-${layout}\"><div class=\"in\" style=\"padding:${PAD[layout]}\">${body}</div></div>`;\n  }\n};"}},"accordion":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"accordion"}}}},"button":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"button"}}}},"current":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"current"}}}},"emptyBody":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"emptyBody"}}}},"emptyEyebrow":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"emptyEyebrow"}}}},"faqGroup":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"faqGroup"}}}},"groups":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"groups"}}}},"iconComponent":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"iconComponent"}}}},"layout":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"layout"}}}},"navTitle":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"navTitle"}}}},"onSupport":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onSupport"}}}},"onTopic":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onTopic"}}}},"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"query"}}}},"searchTopic":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"searchTopic"}}}},"showSupport":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"showSupport"}}}},"single":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"single"}}}},"support":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"support"}}}},"supportCard":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"supportCard"}}}},"topics":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"topics"}}}}}}}}}}]}},{"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}},"identityProviders":[{"provider":{"component":"data2-core-primitives@String","params":{"content":"GOOGLE"}},"clientId":{"component":"data2-core-primitives@String","params":{"content":"55470861603-22pvfc1t49lp8cjnbfk71s5ct9hp1q1v.apps.googleusercontent.com"}}}]},"reference":"Data2BuilderAuthentication","updatedAt":"2026-08-06T19:31:23.557Z"},{"_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":[]}},{"reference":"ComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6aba8e5806a252f69adc21e8","component":"data2-core-primitives@Router","system":"6ab58b1260cbe7aa719c6d7b","displayName":"Loja","params":{"initialPath":{"component":"data2-core-primitives@String","params":{"content":"/"}},"routes":[{"component":"data2-core-primitives@Route","params":{"path":{"component":"data2-core-primitives@String","params":{"content":"/"}},"content":{"params":{"reference":"obfs92ngT2c1cERyPPfLV"},"component":"data2-core-types@ArtboardReference"}}}]},"reference":"anmyfKuDFQv6QEky_6q4i","deleteMetadata":{}},{"_id":"6ab6d0cccf6e94d429832880","component":"data2-core-primitives@Artboard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"Home — Desktop","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Home — Desktop"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":3948,"exactWidth":1440,"exactHeight":3948}},"position":{"component":"data2-core-types@Position","params":{"x":-3904,"y":-121,"exactX":-3904.31,"exactY":-120.61}},"alternativeArtboards":{"params":{"mobile":{"params":{"reference":"lV8q27JlUuxt5iCcJPR63"},"component":"data2-core-types@ArtboardReference"},"tablet":{"params":{"reference":"q4CVL0tRBNXdPozULfte0"},"component":"data2-core-types@ArtboardReference"}},"component":"data2-core-types@ResponsiveArtboards"}},"reference":"obfs92ngT2c1cERyPPfLV","deleteMetadata":{}},{"_id":"3a91e51fe26ed71618c869ec","parent":"6ab6d0cccf6e94d429832880","component":"data2-core-primitives@Block","system":"6ab58b1260cbe7aa719c6d7b","displayName":"Fundo da página","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false,"exactX":false,"exactY":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":3948}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#ffffff"}}}}]}}},"index":-1,"reference":"ARiaNQEQMuQnFZcQmVEd5","deleteMetadata":{}},{"_id":"390715576353d6460cdcf6bf","parent":"6ab6d0cccf6e94d429832880","component":"data2-core-primitives@Block","system":"6ab58b1260cbe7aa719c6d7b","displayName":"Faixa cinza — Mais vendidos","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":1516,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false,"exactX":false,"exactY":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":812}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#f5f5f3"}}}}]}}},"index":-0.5,"reference":"M3EjBhbMvorsgGtnaqR7M","deleteMetadata":{}},{"_id":"0168eb68a5403820ced3d175","parent":"6ab6d0cccf6e94d429832880","component":"babi-lf@Hero","system":"6ab58b1260cbe7aa719c6d7b","displayName":"Hero","params":{"button":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Button"}},"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"desktop","slides":[{"eyebrow":"No canal do Lucas","title":"Assiste primeiro.\nCompra depois.","text":"Vídeo novo toda semana. Tudo que aparece por lá, você encontra aqui.","ctaLabel":"Assistir no YouTube","ctaShortLabel":"Assistir","ctaHref":"https://www.youtube.com/@[CANAL]"},{"eyebrow":"A loja oficial do canal","title":"Testado no canal.\nAprovado na garagem.","text":"Os produtos que aparecem nos vídeos do Lucas, direto da loja oficial.","ctaLabel":"Ver os mais vendidos","ctaShortLabel":"Mais vendidos","ctaHref":"/produtos?ordem=mais-vendidos"},{"eyebrow":"Apareceu no vídeo","title":"Tá aqui\nna loja.","text":"O produto do último vídeo, com entrega para todo o Brasil.","ctaLabel":"Ver produto","ctaShortLabel":"Ver produto","ctaHref":"/p/[produto-do-video]"},{"eyebrow":"Parceria BPower Motorsport","title":"Performance\nde verdade.","text":"A linha de performance que o Lucas usa e recomenda, enviada direto pela BPower.","ctaLabel":"Ver linha BPower","ctaShortLabel":"Linha BPower","ctaHref":"/c/performance"}],"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":176,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":580}}},"position":{"component":"data2-core-types@Position","params":{"bottom":false,"exactX":false,"exactY":false}}},"index":0,"reference":"EJge_wLnZTtJdrjYEHMOR","deleteMetadata":{}},{"_id":"0473a2bbda6e257d3898bafd","parent":"6ab6d0cccf6e94d429832880","component":"babi-lf@ProductCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"ProductCard — Microfibra","params":{"priceComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Price"}},"button":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Button"}},"badge":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Badge"}},"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"desktop","brand":"Acessórios","name":"Kit de toalhas de microfibra","price":79.9,"installments":3,"sku":"LF-ACE-004","href":"/p/kit-toalhas-microfibra","super":{"position":{"component":"data2-core-types@Position","params":{"x":1047,"y":1732,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":297,"height":500}}},"position":{"component":"data2-core-types@Position","params":{"bottom":false,"exactX":false,"exactY":false}}},"index":1,"reference":"V-G7XuUi3XEqsMQkSopTz","deleteMetadata":{}},{"_id":"13af42995bbc98b54c25844e","parent":"6ab6d0cccf6e94d429832880","component":"babi-lf@Footer","system":"6ab58b1260cbe7aa719c6d7b","displayName":"Footer","params":{"pin":"strech","company":"[RAZÃO SOCIAL] · CNPJ [00.000.000/0000-00]","about":"Os produtos que aparecem no canal, com a curadoria de quem testa de verdade.","address":"[ENDEREÇO COMPLETO]","instagram":"https://www.instagram.com/[PERFIL]","youtube":"https://www.youtube.com/@[CANAL]","homeHref":"/","columns":[{"title":"A loja","links":[{"label":"Sobre o Lucas Fontana","href":"/sobre"},{"label":"Perguntas frequentes","href":"/faq"},{"label":"Fale com o Lucas","href":"/fale-com-o-lucas"},{"label":"Minha conta","href":"/minha-conta"}]},{"title":"Políticas","links":[{"label":"Trocas e devoluções","href":"/politicas/trocas-e-devolucoes"},{"label":"Envio e entrega","href":"/politicas/envio-e-entrega"},{"label":"Política de privacidade","short":"Privacidade","href":"/politicas/privacidade"},{"label":"Termos e condições de venda","short":"Termos de venda","href":"/politicas/termos-de-venda"}]},{"title":"Atendimento (SAC)","plain":true,"links":[{"label":"[E-MAIL DO SAC]"},{"label":"[WHATSAPP DO SAC]"},{"label":"[HORÁRIO DE ATENDIMENTO]"}]}],"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":3528,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":395,"exactWidth":1440,"exactHeight":395.19}}},"position":{"component":"data2-core-types@Position","params":{"bottom":false,"exactX":false,"exactY":false}}},"index":2,"reference":"-05ZwNsPNBLnnAMJttAaG","deleteMetadata":{}},{"_id":"19495d0fbe3b1be978a8ef41","parent":"6ab6d0cccf6e94d429832880","component":"babi-lf@SectionHeader","system":"6ab58b1260cbe7aa719c6d7b","displayName":"SectionHeader — Categorias","params":{"layout":"desktop","eyebrow":"Categorias","title":"Por onde a gente começa?","actionLabel":"Ver tudo","actionHref":"/produtos","super":{"position":{"component":"data2-core-types@Position","params":{"x":96,"y":876,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1248,"height":80}},"index":"01"},"number":"01","position":{"component":"data2-core-types@Position","params":{"bottom":false,"exactX":false,"exactY":false}}},"index":3,"reference":"_ik4lyUc3umiTBeq2BSap","deleteMetadata":{}},{"_id":"34e8271561d61f6d0b3cec17","parent":"6ab6d0cccf6e94d429832880","component":"babi-lf@FeaturePanel","system":"6ab58b1260cbe7aa719c6d7b","displayName":"FeaturePanel — BPower","params":{"button":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Button"}},"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"desktop","tone":"ink","number":"03","eyebrow":"Parceria oficial","title":"Performance\nBPower Motorsport","points":[],"ctaLabel":"Ver linha BPower","ctaShortLabel":"Linha BPower","ctaHref":"/c/performance","super":{"position":{"component":"data2-core-types@Position","params":{"x":96,"y":2448,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1248,"height":520}},"text":""},"body":"A linha de performance que o Lucas usa e recomenda. Produtos enviados diretamente pela BPower, com a garantia da loja oficial.","position":{"component":"data2-core-types@Position","params":{"bottom":false,"exactX":false,"exactY":false}}},"index":4,"reference":"5lWPESU_9yXQavL1SFFGs","deleteMetadata":{}},{"_id":"44c99f57baccb80949dc8f0d","parent":"6ab6d0cccf6e94d429832880","component":"babi-lf@ProductCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"ProductCard — Shampoo","params":{"priceComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Price"}},"button":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Button"}},"badge":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Badge"}},"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"desktop","brand":"Lavagem","name":"Shampoo automotivo neutro","price":89.9,"installments":3,"sku":"LF-LAV-001","href":"/p/shampoo-automotivo-neutro","super":{"position":{"component":"data2-core-types@Position","params":{"x":96,"y":1732,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":297,"height":500}}},"position":{"component":"data2-core-types@Position","params":{"bottom":false,"exactX":false,"exactY":false}}},"index":7,"reference":"JEzcSGhknHn3-odzXRJba","deleteMetadata":{}},{"_id":"6e694072e6ebdf4a280ce149","parent":"6ab6d0cccf6e94d429832880","component":"babi-lf@SectionHeader","system":"6ab58b1260cbe7aa719c6d7b","displayName":"SectionHeader — Mais vendidos","params":{"layout":"desktop","eyebrow":"Mais vendidos · Limpeza automotiva","title":"O que não sai da garagem do Lucas","actionLabel":"Ver categoria","actionHref":"/c/limpeza-automotiva","super":{"position":{"component":"data2-core-types@Position","params":{"x":96,"y":1612,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1248,"height":80}},"index":"02"},"number":"02","position":{"component":"data2-core-types@Position","params":{"bottom":false,"exactX":false,"exactY":false}}},"index":8,"reference":"seS8Rh7BmVfUftTCYVPb2","deleteMetadata":{}},{"_id":"7c88612fdc015c8febab10bd","parent":"6ab6d0cccf6e94d429832880","component":"babi-lf@InfoCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"InfoCard — Contratar o Lucas","params":{"button":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Button"}},"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"desktop","tone":"dark","glyph":"briefcase","title":"Quero contratar o Lucas","ctaLabel":"Entrar em contato","ctaHref":"/contato-comercial","super":{"position":{"component":"data2-core-types@Position","params":{"x":942,"y":3088,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":403,"height":320}},"text":""},"body":"Publis, parcerias, eventos e entrevistas. Conta pra gente o que você tem em mente.","position":{"component":"data2-core-types@Position","params":{"bottom":false,"exactX":false,"exactY":false}}},"index":9,"reference":"ih9lFSmtz6886ZezdDvnn","deleteMetadata":{}},{"_id":"80952a575ad4c4fb2b6ed93a","parent":"6ab6d0cccf6e94d429832880","component":"babi-lf@CategoryCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"CategoryCard — Cuidado automotivo","params":{"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"desktop","number":1,"label":"Cuidado automotivo","caption":"Shampoo, pretinho, cera e cia.","href":"/c/cuidado-automotivo","tone":"graphite","super":{"position":{"component":"data2-core-types@Position","params":{"x":96,"y":996,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":297,"height":400}}},"position":{"component":"data2-core-types@Position","params":{"bottom":false,"exactX":false,"exactY":false}}},"index":10,"reference":"eRIoIndwZ4jzsm1dl2SA2","deleteMetadata":{}},{"_id":"8df09ec823c3c9ed69c9190a","parent":"6ab6d0cccf6e94d429832880","component":"babi-lf@Header","system":"6ab58b1260cbe7aa719c6d7b","displayName":"Header","params":{"logo":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Logo"}},"searchBar":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"SearchBar"}},"button":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Button"}},"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"desktop","cartCount":2,"categories":["Cuidado automotivo","Performance","Vestuário","Bonés","Acessórios"],"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":40,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":136}}},"position":{"component":"data2-core-types@Position","params":{"bottom":false,"exactX":false,"exactY":false}}},"index":11,"reference":"qvnGQY8fHw-oXkoivrAg1","deleteMetadata":{}},{"_id":"9d3616c2013b73a949791598","parent":"6ab6d0cccf6e94d429832880","component":"babi-lf@CategoryCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"CategoryCard — Vestuário","params":{"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"desktop","number":3,"label":"Vestuário","caption":"Camisetas e moletons do canal","href":"/c/vestuario","tone":"graphite","super":{"position":{"component":"data2-core-types@Position","params":{"x":730,"y":996,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":297,"height":400}}},"position":{"component":"data2-core-types@Position","params":{"bottom":false,"exactX":false,"exactY":false}}},"index":12,"reference":"fAq92r22_K-rTqWM733AR","deleteMetadata":{}},{"_id":"9e2a5c45930473250cb24aa0","parent":"6ab6d0cccf6e94d429832880","component":"babi-lf@InfoCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"InfoCard — Fale com o Lucas","params":{"button":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Button"}},"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"desktop","tone":"light","glyph":"message","title":"Fale com o Lucas","ctaLabel":"Deixar uma mensagem","ctaHref":"/fale-com-o-lucas","super":{"position":{"component":"data2-core-types@Position","params":{"x":519,"y":3088,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":403,"height":320}},"text":""},"body":"Elogio, sugestão de vídeo ou aquela bronca construtiva: deixa sua mensagem que ela chega nele.","position":{"component":"data2-core-types@Position","params":{"bottom":false,"exactX":false,"exactY":false}}},"index":13,"reference":"1pzJVU6WLowS93dFhJS7k","deleteMetadata":{}},{"_id":"a315d2d51a1495c23f1a083d","parent":"6ab6d0cccf6e94d429832880","component":"babi-lf@AnnouncementBar","system":"6ab58b1260cbe7aa719c6d7b","displayName":"AnnouncementBar","params":{"items":["Pix ou cartão em até [N]x","Enviamos para todo o Brasil","Loja oficial do canal"],"primary":1,"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":40}}},"position":{"component":"data2-core-types@Position","params":{"bottom":false,"exactX":false,"exactY":false}}},"index":14,"reference":"0CtjU40OLj2yUbV4OL-wP","deleteMetadata":{}},{"_id":"d60bea7f73ae8569b6d2240c","parent":"6ab6d0cccf6e94d429832880","component":"babi-lf@ProductCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"ProductCard — Pretinho","params":{"priceComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Price"}},"button":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Button"}},"badge":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Badge"}},"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"desktop","brand":"Pneus","name":"Pretinho para pneus","price":59.9,"installments":2,"sku":"LF-PNE-002","href":"/p/pretinho-para-pneus","super":{"position":{"component":"data2-core-types@Position","params":{"x":413,"y":1732,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":297,"height":500}}},"position":{"component":"data2-core-types@Position","params":{"bottom":false,"exactX":false,"exactY":false}}},"index":15,"reference":"Yz-lYoUZXf9L1y8bRAmcV","deleteMetadata":{}},{"_id":"d9a4170ca614c30ab7ad6453","parent":"6ab6d0cccf6e94d429832880","component":"babi-lf@CategoryCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"CategoryCard — Bonés e acessórios","params":{"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"desktop","number":4,"label":"Bonés e acessórios","caption":"Bonés, chaveiros e adesivos","href":"/c/bones-e-acessorios","tone":"ink","super":{"position":{"component":"data2-core-types@Position","params":{"x":1047,"y":996,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":297,"height":400}}},"position":{"component":"data2-core-types@Position","params":{"bottom":false,"exactX":false,"exactY":false}}},"index":16,"reference":"IdJSH0hfrOCbD5VVnBTSp","deleteMetadata":{}},{"_id":"de7a1b19164baa1a141e3fbe","parent":"6ab6d0cccf6e94d429832880","component":"babi-lf@ProductCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"ProductCard — Cera (esgotado)","params":{"priceComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Price"}},"button":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Button"}},"badge":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Badge"}},"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"desktop","brand":"Proteção","name":"Cera líquida de acabamento","price":119.9,"installments":3,"outOfStock":true,"sku":"LF-PRO-003","href":"/p/cera-liquida-de-acabamento","super":{"position":{"component":"data2-core-types@Position","params":{"x":730,"y":1732,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":297,"height":500}}},"position":{"component":"data2-core-types@Position","params":{"bottom":false,"exactX":false,"exactY":false}}},"index":17,"reference":"Zx0RLkMRVkPontdvaJF5P","deleteMetadata":{}},{"_id":"fcb96948a6bf5052e94cd83a","parent":"6ab6d0cccf6e94d429832880","component":"babi-lf@CategoryCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"CategoryCard — Performance","params":{"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"desktop","number":2,"label":"Performance","caption":"Linha BPower Motorsport","href":"/c/performance","tone":"ink","super":{"position":{"component":"data2-core-types@Position","params":{"x":413,"y":996,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":297,"height":400}}},"position":{"component":"data2-core-types@Position","params":{"bottom":false,"exactX":false,"exactY":false}}},"index":18,"reference":"bQM_j6rKS3cMx1PzTUS77","deleteMetadata":{}},{"_id":"fe3c3ceabee482c83dc29a64","parent":"6ab6d0cccf6e94d429832880","component":"babi-lf@InfoCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"InfoCard — Quem é o Lucas","params":{"button":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Button"}},"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"desktop","tone":"light","glyph":"user","title":"Quem é o Lucas?","ctaLabel":"Conheça a história","ctaHref":"/sobre","super":{"position":{"component":"data2-core-types@Position","params":{"x":96,"y":3088,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":403,"height":320}},"text":""},"body":"[Texto curto sobre o Lucas e o canal — a definir com o cliente.]","position":{"component":"data2-core-types@Position","params":{"bottom":false,"exactX":false,"exactY":false}}},"index":19,"reference":"N3zTAxm42U9ZEZwTMpzBq","deleteMetadata":{}},{"_id":"6ab91d3fde41ee602c2484cb","component":"data2-core-primitives@Artboard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"Home — Tablet","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Home — Tablet"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":768,"height":4921}},"position":{"component":"data2-core-types@Position","params":{"x":-1120,"y":-120,"exactX":-1119.77,"exactY":-119.81}}},"reference":"q4CVL0tRBNXdPozULfte0","deleteMetadata":{}},{"_id":"6ab91dffbe22725b0d957327","component":"data2-core-primitives@Artboard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"Home — Mobile","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Home — Mobile"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":390,"height":5060}},"position":{"component":"data2-core-types@Position","params":{"x":-2042,"y":-94,"exactX":-2041.65,"exactY":-93.76}}},"reference":"lV8q27JlUuxt5iCcJPR63","deleteMetadata":{}},{"_id":"c9ace734898c921ade3aee55","parent":"6ab91d3fde41ee602c2484cb","component":"data2-core-primitives@Block","system":"6ab58b1260cbe7aa719c6d7b","displayName":"Fundo da página","params":{"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":768,"height":4921}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#ffffff"}}}}]}}},"index":-1,"reference":"jRJBjs8GG8N88Df9uZDBm","deleteMetadata":{}},{"_id":"a0c06f3448bc9616673d4bde","parent":"6ab91d3fde41ee602c2484cb","component":"data2-core-primitives@Block","system":"6ab58b1260cbe7aa719c6d7b","displayName":"Faixa cinza — Mais vendidos","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":1558,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":768,"height":1312}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#f5f5f3"}}}}]}}},"index":-0.5,"reference":"NQi-n0MA6Qc4uYU05acaT","deleteMetadata":{}},{"_id":"064ed5795faad33903eae7a0","parent":"6ab91d3fde41ee602c2484cb","component":"babi-lf@CategoryCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"CategoryCard — Performance","params":{"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"tablet","number":2,"label":"Performance","caption":"Linha BPower Motorsport","href":"/c/performance","tone":"ink","super":{"position":{"component":"data2-core-types@Position","params":{"x":392,"y":894,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":336,"height":280}}}},"index":0,"reference":"-pSHi_NYPl5mx5BBloGu6","deleteMetadata":{}},{"_id":"0dab5d0a2f7d17cf64934bea","parent":"6ab91d3fde41ee602c2484cb","component":"babi-lf@CategoryCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"CategoryCard — Cuidado automotivo","params":{"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"tablet","number":1,"label":"Cuidado automotivo","caption":"Shampoo, pretinho, cera e cia.","href":"/c/cuidado-automotivo","tone":"graphite","super":{"position":{"component":"data2-core-types@Position","params":{"x":40,"y":894,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":336,"height":280}}}},"index":1,"reference":"HwesqNAh3IEGVCNAVBRcU","deleteMetadata":{}},{"_id":"1eab1cfef44047cc567ff1c6","parent":"6ab91d3fde41ee602c2484cb","component":"babi-lf@ProductCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"ProductCard — Shampoo","params":{"priceComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Price"}},"button":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Button"}},"badge":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Badge"}},"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"tablet","brand":"Lavagem","name":"Shampoo automotivo neutro","price":89.9,"installments":3,"sku":"LF-LAV-001","href":"/p/shampoo-automotivo-neutro","super":{"position":{"component":"data2-core-types@Position","params":{"x":40,"y":1776,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":336,"height":495}}}},"index":2,"reference":"jNgCv937WR-PFir0h8gm5","deleteMetadata":{}},{"_id":"2404a9ee0bd4ace1085601c3","parent":"6ab91d3fde41ee602c2484cb","component":"babi-lf@Footer","system":"6ab58b1260cbe7aa719c6d7b","displayName":"Footer","params":{"company":"[RAZÃO SOCIAL] · CNPJ [00.000.000/0000-00]","about":"Os produtos que aparecem no canal, com a curadoria de quem testa de verdade.","address":"[ENDEREÇO COMPLETO]","instagram":"https://www.instagram.com/[PERFIL]","youtube":"https://www.youtube.com/@[CANAL]","homeHref":"/","columns":[{"title":"A loja","links":[{"label":"Sobre o Lucas Fontana","href":"/sobre"},{"label":"Perguntas frequentes","href":"/faq"},{"label":"Fale com o Lucas","href":"/fale-com-o-lucas"},{"label":"Minha conta","href":"/minha-conta"}]},{"title":"Políticas","links":[{"label":"Trocas e devoluções","href":"/politicas/trocas-e-devolucoes"},{"label":"Envio e entrega","href":"/politicas/envio-e-entrega"},{"label":"Política de privacidade","short":"Privacidade","href":"/politicas/privacidade"},{"label":"Termos e condições de venda","short":"Termos de venda","href":"/politicas/termos-de-venda"}]},{"title":"Atendimento (SAC)","plain":true,"links":[{"label":"[E-MAIL DO SAC]"},{"label":"[WHATSAPP DO SAC]"},{"label":"[HORÁRIO DE ATENDIMENTO]"}]}],"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":4525,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":768,"height":396}}}},"index":3,"reference":"zxpqfrk-7xdfgQqaY_o0O","deleteMetadata":{}},{"_id":"340e57ea84fcd4c03ea6d855","parent":"6ab91d3fde41ee602c2484cb","component":"babi-lf@CategoryCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"CategoryCard — Bonés e acessórios","params":{"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"tablet","number":4,"label":"Bonés e acessórios","caption":"Bonés, chaveiros e adesivos","href":"/c/bones-e-acessorios","tone":"graphite","super":{"position":{"component":"data2-core-types@Position","params":{"x":392,"y":1190,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":336,"height":280}}}},"index":4,"reference":"AKLPg8oPSdM8X1N2hEvVq","deleteMetadata":{}},{"_id":"374bb75318fb790c8664a4d4","parent":"6ab91d3fde41ee602c2484cb","component":"babi-lf@Hero","system":"6ab58b1260cbe7aa719c6d7b","displayName":"Hero","params":{"button":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Button"}},"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"tablet","slides":[{"eyebrow":"No canal do Lucas","title":"Assiste primeiro.\nCompra depois.","text":"Vídeo novo toda semana. Tudo que aparece por lá, você encontra aqui.","ctaLabel":"Assistir no YouTube","ctaShortLabel":"Assistir","ctaHref":"https://www.youtube.com/@[CANAL]"},{"eyebrow":"A loja oficial do canal","title":"Testado no canal.\nAprovado na garagem.","text":"Os produtos que aparecem nos vídeos do Lucas, direto da loja oficial.","ctaLabel":"Ver os mais vendidos","ctaShortLabel":"Mais vendidos","ctaHref":"/produtos?ordem=mais-vendidos"},{"eyebrow":"Apareceu no vídeo","title":"Tá aqui\nna loja.","text":"O produto do último vídeo, com entrega para todo o Brasil.","ctaLabel":"Ver produto","ctaShortLabel":"Ver produto","ctaHref":"/p/[produto-do-video]"},{"eyebrow":"Parceria BPower Motorsport","title":"Performance\nde verdade.","text":"A linha de performance que o Lucas usa e recomenda, enviada direto pela BPower.","ctaLabel":"Ver linha BPower","ctaShortLabel":"Linha BPower","ctaHref":"/c/performance"}],"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":156,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":768,"height":520}}}},"index":5,"reference":"o13KyK6G-j6waG-2YP1KX","deleteMetadata":{}},{"_id":"41a053b4ac266ac3d75f46d7","parent":"6ab91d3fde41ee602c2484cb","component":"babi-lf@InfoCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"InfoCard — Fale com o Lucas","params":{"button":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Button"}},"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"tablet","tone":"light","glyph":"message","title":"Fale com o Lucas","body":"Elogio, sugestão de vídeo ou aquela bronca construtiva: deixa sua mensagem que ela chega nele.","ctaLabel":"Deixar uma mensagem","ctaHref":"/fale-com-o-lucas","super":{"position":{"component":"data2-core-types@Position","params":{"x":392,"y":3876,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":336,"height":309}}}},"index":6,"reference":"Fbg2T19RE_JaOPG30ty4P","deleteMetadata":{}},{"_id":"42320a39fca6931437c67c2e","parent":"6ab91d3fde41ee602c2484cb","component":"babi-lf@ProductCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"ProductCard — Pretinho","params":{"priceComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Price"}},"button":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Button"}},"badge":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Badge"}},"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"tablet","brand":"Pneus","name":"Pretinho para pneus","price":59.9,"installments":2,"sku":"LF-PNE-002","href":"/p/pretinho-para-pneus","super":{"position":{"component":"data2-core-types@Position","params":{"x":392,"y":1776,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":336,"height":495}}}},"index":7,"reference":"_FIKo-KNGbifhHdUW3VuU","deleteMetadata":{}},{"_id":"806829aed76963bc0f11dda2","parent":"6ab91d3fde41ee602c2484cb","component":"babi-lf@SectionHeader","system":"6ab58b1260cbe7aa719c6d7b","displayName":"SectionHeader — Categorias","params":{"layout":"tablet","number":"01","eyebrow":"Categorias","title":"Por onde a gente começa?","actionLabel":"Ver tudo","actionHref":"/produtos","super":{"position":{"component":"data2-core-types@Position","params":{"x":40,"y":764,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":688,"height":98}}}},"index":8,"reference":"uH4p1ulIjfoXosCsK_mSj","deleteMetadata":{}},{"_id":"83bd6e18f6852563f672e136","parent":"6ab91d3fde41ee602c2484cb","component":"babi-lf@Header","system":"6ab58b1260cbe7aa719c6d7b","displayName":"Header","params":{"logo":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Logo"}},"searchBar":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"SearchBar"}},"button":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Button"}},"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"tablet","cartCount":2,"categories":["Cuidado automotivo","Performance","Vestuário","Bonés","Acessórios"],"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":40,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":768,"height":116}}}},"index":9,"reference":"XkilHPPT0g-UAfO_tY8rY","deleteMetadata":{}},{"_id":"92bdd39dd7442e2a6c6bf443","parent":"6ab91d3fde41ee602c2484cb","component":"babi-lf@InfoCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"InfoCard — Quem é o Lucas","params":{"button":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Button"}},"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"tablet","tone":"light","glyph":"user","title":"Quem é o Lucas?","body":"[Texto curto sobre o Lucas e o canal — a definir com o cliente.]","ctaLabel":"Conheça a história","ctaHref":"/sobre","super":{"position":{"component":"data2-core-types@Position","params":{"x":40,"y":3876,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":336,"height":309}}}},"index":10,"reference":"143tjps56OYzJHWXVOwXt","deleteMetadata":{}},{"_id":"9ab46132c633f0896cc46971","parent":"6ab91d3fde41ee602c2484cb","component":"babi-lf@FeaturePanel","system":"6ab58b1260cbe7aa719c6d7b","displayName":"FeaturePanel — BPower","params":{"button":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Button"}},"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"tablet","tone":"ink","number":"03","eyebrow":"Parceria oficial","title":"Performance\nBPower Motorsport","body":"A linha de performance que o Lucas usa e recomenda. Produtos enviados diretamente pela BPower, com a garantia da loja oficial.","points":[],"ctaLabel":"Ver linha BPower","ctaShortLabel":"Linha BPower","ctaHref":"/c/performance","super":{"position":{"component":"data2-core-types@Position","params":{"x":40,"y":2958,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":688,"height":830}}}},"index":11,"reference":"SzLg8h_guwiBEkDEtxI2d","deleteMetadata":{}},{"_id":"9fca4ec4d27efdf60ced2093","parent":"6ab91d3fde41ee602c2484cb","component":"babi-lf@ProductCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"ProductCard — Cera (esgotado)","params":{"priceComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Price"}},"button":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Button"}},"badge":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Badge"}},"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"tablet","brand":"Proteção","name":"Cera líquida de acabamento","price":119.9,"installments":3,"outOfStock":true,"sku":"LF-PRO-003","href":"/p/cera-liquida-de-acabamento","super":{"position":{"component":"data2-core-types@Position","params":{"x":40,"y":2287,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":336,"height":495}}}},"index":12,"reference":"2QyKlOq10PPWNRSrjgapk","deleteMetadata":{}},{"_id":"b49e73a397469f19906f0e7a","parent":"6ab91d3fde41ee602c2484cb","component":"babi-lf@ProductCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"ProductCard — Microfibra","params":{"priceComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Price"}},"button":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Button"}},"badge":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Badge"}},"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"tablet","brand":"Acessórios","name":"Kit de toalhas de microfibra","price":79.9,"installments":3,"sku":"LF-ACE-004","href":"/p/kit-toalhas-microfibra","super":{"position":{"component":"data2-core-types@Position","params":{"x":392,"y":2287,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":336,"height":495}}}},"index":14,"reference":"t6oRZZv3BC_sK5WQcZXxE","deleteMetadata":{}},{"_id":"c343749595856c7b32e80edf","parent":"6ab91d3fde41ee602c2484cb","component":"babi-lf@SectionHeader","system":"6ab58b1260cbe7aa719c6d7b","displayName":"SectionHeader — Mais vendidos","params":{"layout":"tablet","number":"02","eyebrow":"Mais vendidos · Limpeza automotiva","title":"O que não sai da garagem do Lucas","actionLabel":"Ver categoria","actionHref":"/c/limpeza-automotiva","super":{"position":{"component":"data2-core-types@Position","params":{"x":40,"y":1646,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":688,"height":98}}}},"index":15,"reference":"PRe3KLGSLrj_i6cWGo-3X","deleteMetadata":{}},{"_id":"c6c0ab2928ce887bc89cc476","parent":"6ab91d3fde41ee602c2484cb","component":"babi-lf@CategoryCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"CategoryCard — Vestuário","params":{"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"tablet","number":3,"label":"Vestuário","caption":"Camisetas e moletons do canal","href":"/c/vestuario","tone":"ink","super":{"position":{"component":"data2-core-types@Position","params":{"x":40,"y":1190,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":336,"height":280}}}},"index":16,"reference":"bSbqGdcVEWLHI_FVk3hmV","deleteMetadata":{}},{"_id":"d0e3afe82f1288d4456b80a8","parent":"6ab91d3fde41ee602c2484cb","component":"babi-lf@InfoCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"InfoCard — Contratar o Lucas (largo)","params":{"button":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Button"}},"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"tablet","tone":"dark","wide":true,"glyph":"briefcase","title":"Quero contratar o Lucas","body":"Publis, parcerias, eventos e entrevistas. Conta pra gente o que você tem em mente.","ctaLabel":"Entrar em contato","ctaHref":"/contato-comercial","super":{"position":{"component":"data2-core-types@Position","params":{"x":40,"y":4201,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":688,"height":236}}}},"index":18,"reference":"OqXDjNa7ksKLdeWjbfzDL","deleteMetadata":{}},{"_id":"ef65b76390b3a244c582aced","parent":"6ab91d3fde41ee602c2484cb","component":"babi-lf@AnnouncementBar","system":"6ab58b1260cbe7aa719c6d7b","displayName":"AnnouncementBar","params":{"items":["Pix ou cartão em até [N]x","Enviamos para todo o Brasil","Loja oficial do canal"],"primary":1,"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":768,"height":40}}}},"index":19,"reference":"1X9K278RBfjP3OK5R-D6V","deleteMetadata":{}},{"_id":"2f93f5c3cd2357bd3fa1ade6","parent":"6ab91dffbe22725b0d957327","component":"data2-core-primitives@Block","system":"6ab58b1260cbe7aa719c6d7b","displayName":"Fundo da página","params":{"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":390,"height":5060}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#ffffff"}}}}]}}},"index":0,"reference":"M3YLNyIAOOO_vSxztQOf0","deleteMetadata":{}},{"_id":"c56ece40fa4f131fe3a19686","parent":"6ab91dffbe22725b0d957327","component":"data2-core-primitives@Block","system":"6ab58b1260cbe7aa719c6d7b","displayName":"Faixa cinza — Mais vendidos","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":1408,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":390,"height":1116}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#f5f5f3"}}}}]}}},"index":0.5,"reference":"dgu37E_mLnMZzeGxbYE03","deleteMetadata":{}},{"_id":"36aab3b71386fc008dddb983","parent":"6ab91dffbe22725b0d957327","component":"babi-lf@CategoryCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"CategoryCard — Cuidado automotivo","params":{"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"mobile","number":1,"label":"Cuidado automotivo","caption":"Shampoo, pretinho, cera e cia.","href":"/c/cuidado-automotivo","tone":"graphite","super":{"position":{"component":"data2-core-types@Position","params":{"x":20,"y":932,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":200}}}},"index":1,"reference":"Ra9zOq5WSf0J33ltE9KKb","deleteMetadata":{}},{"_id":"3b673995d3a3b5e65c1a797c","parent":"6ab91dffbe22725b0d957327","component":"babi-lf@Header","system":"6ab58b1260cbe7aa719c6d7b","displayName":"Header","params":{"logo":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Logo"}},"searchBar":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"SearchBar"}},"button":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Button"}},"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"mobile","cartCount":2,"categories":["Cuidado automotivo","Performance","Vestuário","Bonés","Acessórios"],"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":36,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":390,"height":164}}}},"index":2,"reference":"p3T6hSCOh8Ud79VaxGJfl","deleteMetadata":{}},{"_id":"4fb509e887c799398f8da0cd","parent":"6ab91dffbe22725b0d957327","component":"babi-lf@AnnouncementBar","system":"6ab58b1260cbe7aa719c6d7b","displayName":"AnnouncementBar","params":{"items":["Pix ou cartão em até [N]x","Enviamos para todo o Brasil","Loja oficial do canal"],"primary":1,"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":390,"height":36}}}},"index":3,"reference":"c0bwQP9bRdOBEG9EULKLu","deleteMetadata":{}},{"_id":"57fe7296436b44576165e8f5","parent":"6ab91dffbe22725b0d957327","component":"babi-lf@ProductCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"ProductCard — Cera (esgotado)","params":{"priceComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Price"}},"button":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Button"}},"badge":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Badge"}},"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"mobile","brand":"Proteção","name":"Cera líquida de acabamento","price":119.9,"installments":3,"outOfStock":true,"sku":"LF-PRO-003","href":"/p/cera-liquida-de-acabamento","super":{"position":{"component":"data2-core-types@Position","params":{"x":20,"y":2004,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":384}}}},"index":4,"reference":"5jFV6JZVAcFewO0bJvUeU","deleteMetadata":{}},{"_id":"7699840750d9a708389404fd","parent":"6ab91dffbe22725b0d957327","component":"babi-lf@FeaturePanel","system":"6ab58b1260cbe7aa719c6d7b","displayName":"FeaturePanel — BPower","params":{"button":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Button"}},"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"mobile","tone":"ink","number":"03","eyebrow":"Parceria oficial","title":"Performance\nBPower Motorsport","body":"A linha de performance que o Lucas usa e recomenda. Produtos enviados diretamente pela BPower, com a garantia da loja oficial.","points":[],"ctaLabel":"Ver linha BPower","ctaShortLabel":"Linha BPower","ctaHref":"/c/performance","super":{"position":{"component":"data2-core-types@Position","params":{"x":20,"y":2588,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":350,"height":740}}}},"index":5,"reference":"p9MNs3UNAOrV5_Vzvl6FZ","deleteMetadata":{}},{"_id":"7e5195bbeb8973dba8772cc4","parent":"6ab91dffbe22725b0d957327","component":"babi-lf@InfoCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"InfoCard — Contratar o Lucas","params":{"button":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Button"}},"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"mobile","tone":"dark","glyph":"briefcase","title":"Quero contratar o Lucas","body":"Publis, parcerias, eventos e entrevistas. Conta pra gente o que você tem em mente.","ctaLabel":"Entrar em contato","ctaHref":"/contato-comercial","super":{"position":{"component":"data2-core-types@Position","params":{"x":20,"y":3996,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":350,"height":290}}}},"index":6,"reference":"J8zKGxuu8TI0AOLvpW1vF","deleteMetadata":{}},{"_id":"7e85b8b46acfe91842f8d340","parent":"6ab91dffbe22725b0d957327","component":"babi-lf@ProductCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"ProductCard — Pretinho","params":{"priceComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Price"}},"button":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Button"}},"badge":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Badge"}},"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"mobile","brand":"Pneus","name":"Pretinho para pneus","price":59.9,"installments":2,"sku":"LF-PNE-002","href":"/p/pretinho-para-pneus","super":{"position":{"component":"data2-core-types@Position","params":{"x":201,"y":1608,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":384}}}},"index":7,"reference":"9g6ykUAB6gvo78kdlNen4","deleteMetadata":{}},{"_id":"8b34274a9ff163b88f506230","parent":"6ab91dffbe22725b0d957327","component":"babi-lf@CategoryCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"CategoryCard — Vestuário","params":{"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"mobile","number":3,"label":"Vestuário","caption":"Camisetas e moletons do canal","href":"/c/vestuario","tone":"ink","super":{"position":{"component":"data2-core-types@Position","params":{"x":20,"y":1144,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":200}}}},"index":8,"reference":"KqtXmPJZiHKeyHkGF78F3","deleteMetadata":{}},{"_id":"a9b9e75ee1bc2fb8e5d8f9a9","parent":"6ab91dffbe22725b0d957327","component":"babi-lf@ProductCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"ProductCard — Microfibra","params":{"priceComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Price"}},"button":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Button"}},"badge":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Badge"}},"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"mobile","brand":"Acessórios","name":"Kit de toalhas de microfibra","price":79.9,"installments":3,"sku":"LF-ACE-004","href":"/p/kit-toalhas-microfibra","super":{"position":{"component":"data2-core-types@Position","params":{"x":201,"y":2004,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":384}}}},"index":9,"reference":"LkgWXLrl-A11s8tNh1xBx","deleteMetadata":{}},{"_id":"c1d9236bd7f2854f33daefde","parent":"6ab91dffbe22725b0d957327","component":"babi-lf@InfoCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"InfoCard — Quem é o Lucas","params":{"button":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Button"}},"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"mobile","tone":"light","glyph":"user","title":"Quem é o Lucas?","body":"[Texto curto sobre o Lucas e o canal — a definir com o cliente.]","ctaLabel":"Conheça a história","ctaShortLabel":"Conheça a história","ctaHref":"/sobre","super":{"position":{"component":"data2-core-types@Position","params":{"x":20,"y":3392,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":350,"height":290}}}},"index":10,"reference":"3NL9Xnj5m5eeA3vSQW18l","deleteMetadata":{}},{"_id":"c86d15b9b6c7bb94d7f291c0","parent":"6ab91dffbe22725b0d957327","component":"babi-lf@SectionHeader","system":"6ab58b1260cbe7aa719c6d7b","displayName":"SectionHeader — Mais vendidos","params":{"layout":"mobile","number":"02","eyebrow":"Mais vendidos · Limpeza automotiva","title":"O que não sai da garagem do Lucas","actionLabel":"Ver categoria","actionHref":"/c/limpeza-automotiva","super":{"position":{"component":"data2-core-types@Position","params":{"x":20,"y":1472,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":350,"height":112}}}},"index":12,"reference":"A0cmabjvUfjkA0EXjk-Mb","deleteMetadata":{}},{"_id":"c8b4e74c8da39adae11d9364","parent":"6ab91dffbe22725b0d957327","component":"babi-lf@SectionHeader","system":"6ab58b1260cbe7aa719c6d7b","displayName":"SectionHeader — Categorias","params":{"layout":"mobile","number":"01","eyebrow":"Categorias","title":"Por onde a gente começa?","actionLabel":"Ver tudo","actionHref":"/produtos","super":{"position":{"component":"data2-core-types@Position","params":{"x":20,"y":824,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":350,"height":84}}}},"index":13,"reference":"2fNq3MKK6WIiZCqfpBba7","deleteMetadata":{}},{"_id":"d267ae435cba3bdca037ae0e","parent":"6ab91dffbe22725b0d957327","component":"babi-lf@CategoryCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"CategoryCard — Performance","params":{"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"mobile","number":2,"label":"Performance","caption":"Linha BPower Motorsport","href":"/c/performance","tone":"ink","super":{"position":{"component":"data2-core-types@Position","params":{"x":201,"y":932,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":200}}}},"index":14,"reference":"a9S3q1YtmpPb03T2g0ZNb","deleteMetadata":{}},{"_id":"e0152e8ba6937d614a0508cc","parent":"6ab91dffbe22725b0d957327","component":"babi-lf@ProductCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"ProductCard — Shampoo","params":{"priceComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Price"}},"button":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Button"}},"badge":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Badge"}},"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"mobile","brand":"Lavagem","name":"Shampoo automotivo neutro","price":89.9,"installments":3,"sku":"LF-LAV-001","href":"/p/shampoo-automotivo-neutro","super":{"position":{"component":"data2-core-types@Position","params":{"x":20,"y":1608,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":384}}}},"index":15,"reference":"GnpnKhIv_O-k9Uz6fqHIu","deleteMetadata":{}},{"_id":"ef1e3caadb425817b570025f","parent":"6ab91dffbe22725b0d957327","component":"babi-lf@Footer","system":"6ab58b1260cbe7aa719c6d7b","displayName":"Footer","params":{"company":"[RAZÃO SOCIAL] · CNPJ [00.000.000/0000-00]","about":"Os produtos que aparecem no canal, com a curadoria de quem testa de verdade.","address":"[ENDEREÇO COMPLETO]","instagram":"https://www.instagram.com/[PERFIL]","youtube":"https://www.youtube.com/@[CANAL]","homeHref":"/","columns":[{"title":"A loja","links":[{"label":"Sobre o Lucas Fontana","href":"/sobre"},{"label":"Perguntas frequentes","href":"/faq"},{"label":"Fale com o Lucas","href":"/fale-com-o-lucas"},{"label":"Minha conta","href":"/minha-conta"}]},{"title":"Políticas","links":[{"label":"Trocas e devoluções","href":"/politicas/trocas-e-devolucoes"},{"label":"Envio e entrega","href":"/politicas/envio-e-entrega"},{"label":"Política de privacidade","short":"Privacidade","href":"/politicas/privacidade"},{"label":"Termos e condições de venda","short":"Termos de venda","href":"/politicas/termos-de-venda"}]},{"title":"Atendimento (SAC)","plain":true,"links":[{"label":"[E-MAIL DO SAC]"},{"label":"[WHATSAPP DO SAC]"},{"label":"[HORÁRIO DE ATENDIMENTO]"}]}],"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":4350,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":390,"height":710}}}},"index":16,"reference":"d-cPHEysRC6J9jM26HA9H","deleteMetadata":{}},{"_id":"f1f97032d66fd7d45464fb2b","parent":"6ab91dffbe22725b0d957327","component":"babi-lf@Hero","system":"6ab58b1260cbe7aa719c6d7b","displayName":"Hero","params":{"button":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Button"}},"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"mobile","slides":[{"eyebrow":"No canal do Lucas","title":"Assiste primeiro.\nCompra depois.","text":"Vídeo novo toda semana. Tudo que aparece por lá, você encontra aqui.","shortText":"Vídeo novo toda semana. Tá tudo aqui.","ctaLabel":"Assistir no YouTube","ctaShortLabel":"Assistir","ctaHref":"https://www.youtube.com/@[CANAL]"},{"eyebrow":"A loja oficial do canal","title":"Testado no canal.\nAprovado na garagem.","text":"Os produtos que aparecem nos vídeos do Lucas, direto da loja oficial.","shortText":"O que aparece nos vídeos, tá aqui na loja.","ctaLabel":"Ver os mais vendidos","ctaShortLabel":"Mais vendidos","ctaHref":"/produtos?ordem=mais-vendidos"},{"eyebrow":"Apareceu no vídeo","title":"Tá aqui\nna loja.","text":"O produto do último vídeo, com entrega para todo o Brasil.","shortText":"O produto do último vídeo, pra todo o Brasil.","ctaLabel":"Ver produto","ctaShortLabel":"Ver produto","ctaHref":"/p/[produto-do-video]"},{"eyebrow":"Parceria BPower Motorsport","title":"Performance\nde verdade.","text":"A linha de performance que o Lucas usa e recomenda, enviada direto pela BPower.","shortText":"A linha que o Lucas usa, enviada pela BPower.","ctaLabel":"Ver linha BPower","ctaShortLabel":"Linha BPower","ctaHref":"/c/performance"}],"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":200,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":390,"height":560}}}},"index":17,"reference":"Wf-KQRosLskye8-b3lDBE","deleteMetadata":{}},{"_id":"f351bca6176ef16203250113","parent":"6ab91dffbe22725b0d957327","component":"babi-lf@Button","system":"6ab58b1260cbe7aa719c6d7b","displayName":"Button — Ver categoria","params":{"label":"Ver categoria","variant":"outline","size":"md","fullWidth":"always","arrow":true,"layout":"mobile","href":"/c/limpeza-automotiva","super":{"position":{"component":"data2-core-types@Position","params":{"x":20,"y":2412,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":350,"height":48}}}},"index":18,"reference":"fg9GjkuL3llGEf9CS9qHd","deleteMetadata":{}},{"_id":"f7c36aad9421626954ee7af8","parent":"6ab91dffbe22725b0d957327","component":"babi-lf@CategoryCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"CategoryCard — Bonés e acessórios","params":{"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"mobile","number":4,"label":"Bonés e acessórios","caption":"Bonés, chaveiros e adesivos","href":"/c/bones-e-acessorios","tone":"graphite","super":{"position":{"component":"data2-core-types@Position","params":{"x":201,"y":1144,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":169,"height":200}}}},"index":19,"reference":"T74OcXrhSWNqdMfN5qwlR","deleteMetadata":{}},{"_id":"feb52e9ac07bceae13dd0b41","parent":"6ab91dffbe22725b0d957327","component":"babi-lf@InfoCard","system":"6ab58b1260cbe7aa719c6d7b","displayName":"InfoCard — Fale com o Lucas","params":{"button":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Button"}},"iconComponent":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Icon"}},"layout":"mobile","tone":"light","glyph":"message","title":"Fale com o Lucas","body":"Elogio, sugestão de vídeo ou aquela bronca construtiva: deixa sua mensagem que ela chega nele.","ctaLabel":"Deixar uma mensagem","ctaHref":"/fale-com-o-lucas","super":{"position":{"component":"data2-core-types@Position","params":{"x":20,"y":3694,"freeTransform":true,"left":false,"right":false,"top":true,"bottom":false,"growH":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":350,"height":290}}}},"index":20,"reference":"v43dAP70RoANDpU1pf6cA","deleteMetadata":{}}]}},{"_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":"6aba8e9906a252f69adc21e9","displayName":"Loja","reference":"E3x0l5K4Bl0KhITqOt-YH","params":{"domain":{"component":"data2-core-primitives@String","params":{"content":"loja"}},"entryPoint":{"params":{"component":"data2-core-primitives@Router","reference":"anmyfKuDFQv6QEky_6q4i"},"component":"data2-core-types@ComponentInstanceReference"}},"system":"6ab58b1260cbe7aa719c6d7b","component":"data2-core-primitives@Application"}]}},{"reference":"DataComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"BundlesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}}],"processesParams":{}}}}