{"context":{"domain":"tempo"},"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":"6a45d210b5865956b508ba84","name":"Tempo","domain":"tempo","visibility":"public","settings":{"defaultAccessPolicy":"public"},"updatedAt":"2026-07-27T14:19:36.810Z","createdAt":"2026-07-02T02:50:56.722Z"}]}},{"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":"6a45da51b0a857d0aa5c421c","component":"data2-core-types@Component","system":"6a45d210b5865956b508ba84","params":{"extends":"data2-core-primitives@Block","component":"deck-editor","package":"tempo","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 TYPES = [\n  ['cover','Capa'],['statement','Statement'],['section','Divisoria'],['text','Texto'],\n  ['split','Split (imagem+texto)'],['trio','Trio (3 cards)'],['gallery','Galeria'],\n  ['data','Dados (numeros)'],['bigstat','Numero gigante'],['chart','Grafico'],['amenities','Infraestrutura'],\n  ['quote','Citacao'],['list','Lista numerada'],['image','Imagem'],['contact','Contato'],['closing','Encerramento']\n];\nconst FIELDS = {\n  cover:[['kicker','text'],['title','text'],['subtitle','textarea'],['image','image'],['logo','bool']],\n  statement:[['kicker','text'],['title','text'],['sub','textarea'],['image','image']],\n  section:[['number','text'],['kicker','text'],['title','text'],['image','image']],\n  text:[['kicker','text'],['title','text'],['image','image'],['body','strings']],\n  split:[['kicker','text'],['title','text'],['side','text'],['image','image'],['body','strings']],\n  trio:[['kicker','text'],['title','text'],['cards','objs',[['image','image'],['title','text'],['text','textarea']]]],\n  gallery:[['kicker','text'],['title','text'],['items','objs',[['image','image']]]],\n  data:[['number','text'],['kicker','text'],['title','text'],['stats','objs',[['big','text'],['label','text'],['sub','text']]],['note','textarea'],['image','image']],\n  bigstat:[['kicker','text'],['big','text'],['label','text'],['sub','text'],['image','image']],\n  chart:[['number','text'],['kicker','text'],['title','text'],['chartType','text'],['prefix','text'],['suffix','text'],['compact','bool'],['xlabel','text'],['ylabel','text'],['data','objs',[['label','text'],['value','text'],['x','text'],['y','text'],['r','text']]],['note','textarea']],\n  amenities:[['number','text'],['kicker','text'],['title','text'],['items','objs',[['title','text'],['desc','textarea']]]],\n  quote:[['text','textarea'],['author','text'],['image','image']],\n  list:[['kicker','text'],['title','text'],['items','objs',[['lead','text'],['desc','textarea']]]],\n  image:[['image','image'],['caption','text']],\n  contact:[['title','text'],['address','text'],['hours','text'],['email','text'],['site','text'],['image','image']],\n  closing:[['title','text'],['subtitle','text'],['image','image'],['logo','bool']]\n};\nconst LBL = {title:'Titulo',subtitle:'Subtitulo',sub:'Texto de apoio',image:'Imagem',logo:'Mostrar logo',body:'Paragrafos (linha em branco separa)',cards:'Cards',kpis:'KPIs',stats:'Numeros',note:'Nota',items:'Itens',lead:'Destaque',desc:'Descricao',caption:'Legenda',text:'Texto',big:'Numero',label:'Rotulo',kicker:'Etiqueta (kicker)',number:'No da secao',side:'Lado da imagem (right/left)',author:'Autor',address:'Endereco',hours:'Horario',email:'Contato/e-mail',site:'Site',chartType:'Tipo: bar / hbar / line',prefix:'Prefixo (ex: R$ )',suffix:'Sufixo (ex: %)',compact:'Abreviar milhares (12,3k)',value:'Valor',data:'Series (rotulo + valor)',x:'X (scatter)',y:'Y (scatter)',r:'Tamanho bolha (scatter)',xlabel:'Rotulo eixo X',ylabel:'Rotulo eixo Y'};\nconst TEMPLATES = {\n  cover:{type:'cover',logo:true,kicker:'Etiqueta',title:'TITULO',subtitle:'subtitulo',image:''},\n  statement:{type:'statement',title:'FRASE DE IMPACTO',sub:'texto de apoio',image:''},\n  section:{type:'section',number:'01',kicker:'Secao',title:'SECAO',image:''},\n  text:{type:'text',kicker:'',title:'TITULO',image:'',body:['Paragrafo um.','Paragrafo dois.']},\n  split:{type:'split',kicker:'',side:'right',title:'TITULO',image:'',body:['Paragrafo um.','Paragrafo dois.']},\n  trio:{type:'trio',title:'TITULO',cards:[{image:'',title:'CARD 1',text:'texto'},{image:'',title:'CARD 2',text:'texto'},{image:'',title:'CARD 3',text:'texto'}]},\n  gallery:{type:'gallery',title:'GALERIA',items:[{image:''},{image:''},{image:''},{image:''}]},\n  data:{type:'data',number:'',kicker:'',title:'TITULO',stats:[{big:'00',label:'rotulo',sub:''},{big:'00',label:'rotulo',sub:''}],note:''},\n  bigstat:{type:'bigstat',big:'200',label:'rotulo',sub:'',image:''},\n  chart:{type:'chart',title:'GRAFICO',chartType:'bar',prefix:'',suffix:'',compact:false,data:[{label:'A',value:'10'},{label:'B',value:'20'},{label:'C',value:'15'}],note:''},\n  amenities:{type:'amenities',number:'',kicker:'',title:'TITULO',items:[{title:'ITEM',desc:'descricao'},{title:'ITEM',desc:'descricao'}]},\n  quote:{type:'quote',text:'Frase de impacto.',author:'Autor',image:''},\n  list:{type:'list',title:'TITULO',items:[{lead:'Destaque',desc:'descricao'}]},\n  image:{type:'image',image:'',caption:''},\n  contact:{type:'contact',title:'CONTATO',address:'Rua ...',hours:'Ter-Dom - 12h-22h',email:'eventos@tempobyporsche.com',site:'tempobyporsche.com',image:''},\n  closing:{type:'closing',logo:true,title:'ENCERRAMENTO',subtitle:'contato'}\n};\nlet _FOOT = 'TEMPO BY PORSCHE', _N = 0;\nfunction _fmtCls(meta){ const f = String((meta && meta.format) || 'a4').toLowerCase(); return (f==='16x9'||f==='paisagem'||f==='landscape'||f==='horizontal') ? 'land' : ''; }\n\nexport default {\n  css: `\n@font-face{font-family:'Pressio';src:url('https://tempobyporsche.com/wp-content/uploads/2026/02/pressio-no44.woff2') format('woff2');font-weight:400 900;font-display:swap}\n@font-face{font-family:'Raleway';src:url('https://tempobyporsche.com/wp-content/uploads/2026/02/Raleway-VariableFont_wght.ttf') format('truetype');font-weight:200 800;font-display:swap}\n:host,.root{--gold:#FFB81C;--paper:#0a0a0a;--line:#2b2b2b;--muted:#8a8a8a;--body:#cfcfcf}\n*{box-sizing:border-box}\n.root{position:absolute;inset:0;background:#0f0f0f;font-family:Raleway,system-ui,sans-serif;color:#eee;overflow:hidden}\n\n/* GATE */\n.gate{position:absolute;inset:0;z-index:1000;display:flex;flex-direction:column;align-items:center;justify-content:center;background:#0a0a0a;gap:22px}\n.gate .logo{height:120px;width:auto;opacity:.95}\n.gate .brand{font-weight:800;letter-spacing:5px;color:var(--gold);font-size:16px;text-transform:uppercase}\n.gate .sub{color:#888;font-size:13px;letter-spacing:2px;text-transform:uppercase}\n.gate input{background:#161616;border:1px solid #2a2a2a;color:#fff;border-radius:9px;padding:13px 16px;font-size:15px;font-family:Raleway;width:280px;text-align:center;letter-spacing:2px}\n.gate input:focus{outline:none;border-color:var(--gold)}\n.gate button{background:var(--gold);color:#000;border:none;border-radius:9px;padding:12px 30px;font-size:14px;font-weight:700;cursor:pointer;font-family:Raleway;letter-spacing:1px}\n.gate .err{color:#ff6b6b;font-size:12px;height:14px}\n\n/* TOP BAR */\n.top{height:56px;display:flex;align-items:center;gap:12px;padding:0 18px;background:#0b0b0b;border-bottom:1px solid #262626;flex-shrink:0}\n.top .brand{font-weight:800;letter-spacing:2px;color:var(--gold);font-size:14px;white-space:nowrap}\n.top input.tt{background:#161616;border:1px solid #2a2a2a;color:#fff;border-radius:7px;padding:7px 10px;font-size:13px;font-family:Raleway}\n.top .sp{flex:1}\nselect,.btn{background:#161616;border:1px solid #2a2a2a;color:#eee;border-radius:7px;padding:8px 12px;font-size:13px;cursor:pointer;font-family:Raleway}\nselect:focus,input:focus{outline:none}\n.btn.gold{background:var(--gold);color:#000;border-color:var(--gold);font-weight:700}\n.btn.g{background:transparent;color:var(--gold);border-color:#444}\n.dirty{color:#FF9F1C;font-size:12px;white-space:nowrap}\n\n/* LAYOUT */\n.wrap{display:grid;grid-template-columns:250px 1fr 400px;position:absolute;top:56px;left:0;right:0;bottom:0}\n.side{border-right:1px solid #222;overflow:auto;padding:12px}\n.side h3{font-size:11px;letter-spacing:1px;color:#888;text-transform:uppercase;margin:6px 4px}\n.sl{background:#151515;border:1px solid #242424;border-radius:9px;padding:9px 11px;margin-bottom:8px;cursor:pointer}\n.sl.sel{border-color:var(--gold);background:#1b1706}\n.sl .ty{font-size:10px;text-transform:uppercase;letter-spacing:1px;color:var(--gold)}\n.sl .tt{font-size:13px;color:#eee;margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.sl .row{display:flex;gap:4px;margin-top:7px}\n.sl .row button{flex:1;background:#0f0f0f;border:1px solid #2a2a2a;color:#aaa;border-radius:5px;padding:3px;font-size:11px;cursor:pointer}\n.addbar{display:flex;gap:6px;margin-top:10px}.addbar select{flex:1}\n.form{overflow:auto;padding:20px 24px}\n.form h2{font-size:14px;color:var(--gold);text-transform:uppercase;letter-spacing:1px;margin:0 0 16px}\n.f{margin-bottom:14px}.f label{display:block;font-size:11px;color:#999;text-transform:uppercase;letter-spacing:.5px;margin-bottom:5px}\n.f input[type=text],.f textarea{width:100%;background:#161616;border:1px solid #2a2a2a;color:#fff;border-radius:8px;padding:9px 11px;font-size:14px;font-family:Raleway}\n.f textarea{min-height:70px;resize:vertical;line-height:1.5}\n.imgf{display:flex;gap:8px;align-items:center}.imgf input{flex:1}.imgf img{width:44px;height:44px;object-fit:cover;border-radius:6px;background:#222}\n.objs{border:1px solid #242424;border-radius:10px;padding:12px;background:#121212}\n.obj{border-bottom:1px solid #222;padding:8px 0;margin-bottom:8px}.obj:last-child{border-bottom:0}\n.obj .oh{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}.obj .oh b{font-size:12px;color:#bbb}\n.mini{background:#0f0f0f;border:1px solid #2a2a2a;color:#f88;border-radius:5px;padding:2px 8px;font-size:11px;cursor:pointer}\n.addmini{background:#1a1a1a;border:1px dashed #3a3a3a;color:var(--gold);border-radius:7px;padding:7px;width:100%;cursor:pointer;font-size:12px;margin-top:6px}\n.prev{border-left:1px solid #222;background:#161616;overflow:auto;padding:18px;display:flex;flex-direction:column;align-items:center}\n.prevbox{width:794px;transform:scale(.44);transform-origin:top center;margin-bottom:-620px}\n.hint{color:#666;font-size:12px;margin-top:8px}\n\n/* GALLERY MODAL */\n.galm{position:absolute;inset:0;background:#000d;z-index:50;display:none;padding:36px}.galm.on{display:block}\n.galbox{max-width:1150px;margin:0 auto;background:#111;border:1px solid #2a2a2a;border-radius:12px;padding:16px;height:100%;display:flex;flex-direction:column}\n.galh{display:flex;justify-content:space-between;align-items:center;color:#ccc;margin-bottom:12px;font-size:13px}\n.galh button{background:#161616;border:1px solid #333;color:#aaa;border-radius:6px;padding:6px 12px;cursor:pointer}\n.gg{display:grid;grid-template-columns:repeat(5,1fr);gap:8px;overflow:auto}\n.gg img{width:100%;height:120px;object-fit:cover;border-radius:6px;cursor:pointer;border:2px solid transparent;background:#222}\n.gg img:hover{border-color:var(--gold)}\n\n/* SLIDE (deck.css, verbatim identity) */\n.slide{position:relative;width:794px;height:1123px;background:var(--paper);overflow:hidden;color:#fff;font-family:Raleway,system-ui,sans-serif;font-weight:300}\n.slide .bg{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}\n.slide .scrim{position:absolute;inset:0;background:linear-gradient(180deg,rgba(10,10,10,.82),rgba(10,10,10,.35) 45%,rgba(10,10,10,.92))}\n.slide .grain{display:none}\n.slide .pad{position:absolute;inset:0;padding:80px 76px;display:flex;flex-direction:column}\n.slide .logo{height:70px;width:auto}\n.slide h2.title{font-family:Pressio;font-weight:400;color:#fff;text-transform:uppercase;letter-spacing:.5px;line-height:.94;margin:0}\n.slide .gold{color:var(--gold)}\n.kick{font-family:Raleway;font-weight:600;letter-spacing:6px;text-transform:uppercase;color:var(--gold);font-size:12px;display:flex;align-items:center;gap:14px}\n.kick .num{font-family:Pressio;font-size:15px;color:#fff;opacity:.5}\n.kick .ln{flex:1;height:1px;background:var(--line);max-width:90px}\n.slide .body p{font-size:16px;line-height:1.75;color:var(--body);margin:0 0 15px;font-weight:300;max-width:600px}\n.slide .foot{position:absolute;bottom:34px;left:76px;right:76px;display:flex;justify-content:space-between;align-items:center;font-family:Raleway;letter-spacing:3px;font-size:9.5px;color:#7a7a7a;text-transform:uppercase;border-top:1px solid var(--line);padding-top:14px}\n.slide .foot .fl{display:flex;align-items:center;gap:10px}.slide .foot .fl img{height:15px;opacity:.7}\n.slide .ph{position:absolute;inset:0;background:repeating-linear-gradient(45deg,#121212,#121212 14px,#161616 14px,#161616 28px);display:flex;align-items:center;justify-content:center;color:#4a4a4a;font-size:12px;font-family:Raleway;letter-spacing:2px}\n.slide.cover .pad{justify-content:space-between}\n.slide.cover .top{display:flex;justify-content:space-between;align-items:flex-start}\n.slide.cover .ttl{margin-top:auto}\n.slide.cover h2.title{font-size:82px;margin-top:14px}\n.slide.cover .rule{width:64px;height:2px;background:var(--gold);margin:26px 0 18px}\n.slide.cover .sub{font-size:17px;color:#e6e6e6;font-weight:300;max-width:520px;line-height:1.6}\n.slide.statement .pad{align-items:flex-start;justify-content:center}\n.slide.statement h2.title{font-size:62px;max-width:660px;line-height:.98}\n.slide.statement .sub{font-size:18px;color:#eaeaea;margin-top:30px;font-weight:300;max-width:520px;line-height:1.7}\n.slide.section .pad{justify-content:center}\n.slide.section .ghost{position:absolute;right:60px;bottom:40px;font-family:Pressio;font-size:300px;line-height:.7;color:#ffffff0d}\n.slide.section h2.title{font-size:64px;max-width:600px}\n.slide.text h2.title{font-size:50px;margin:14px 0 26px;max-width:600px}\n.slide.text .body{columns:2;column-gap:40px}\n.slide.text .top-img{width:100%;height:300px;object-fit:cover;margin-bottom:30px}\n.slide.split{display:flex;align-items:stretch}\n.slide.split.rev{flex-direction:row-reverse}\n.slide.split .half.txt{flex:0 0 52%;min-width:0;display:flex;flex-direction:column;justify-content:center;padding:80px 60px 80px 76px}\n.slide.split .half.img{flex:0 0 48%;position:relative;overflow:hidden}\n.slide.split .half.img img,.slide.split .half.img .ph{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}\n.slide.split h2.title{font-size:40px;margin:14px 0 22px}\n.slide.split .body,.slide.split .body p{max-width:none}\n.slide.split .foot{display:none}\n.slide.trio h2.title{font-size:38px;margin:12px 0 34px}\n.slide .cols{display:grid;grid-template-columns:1fr 1fr 1fr;gap:26px}\n.slide .col img,.slide .col .ph{width:100%;height:250px;object-fit:cover}\n.slide .col h3{font-family:Pressio;font-weight:400;color:var(--gold);text-transform:uppercase;font-size:18px;margin:18px 0 10px;letter-spacing:.5px;line-height:1.05}\n.slide .col p{font-size:12.5px;line-height:1.6;color:#c9c9c9;font-weight:300}\n.slide.gallery h2.title{font-size:36px;margin:12px 0 24px}\n.slide .grid2{display:grid;grid-template-columns:1fr 1fr;grid-auto-rows:1fr;gap:14px;flex:1}\n.slide .grid2 img,.slide .grid2 .ph{width:100%;height:100%;object-fit:cover;min-height:200px}\n.slide.data h2.title{font-size:46px;margin:14px 0 40px}\n.slide .stats{display:grid;grid-template-columns:1fr 1fr}\n.slide .stat{padding:26px 24px 26px 0;border-top:1px solid var(--line)}\n.slide .stat .big{font-family:Pressio;font-weight:400;color:var(--gold);font-size:58px;line-height:.85}\n.slide .stat .lab{font-size:14px;color:#eee;margin-top:12px;font-weight:400;letter-spacing:.3px}\n.slide .stat .ksub{font-size:12px;color:var(--muted);margin-top:4px}\n.slide .note{margin-top:38px;font-size:15px;line-height:1.7;color:#dcdcdc;font-weight:300;max-width:600px}\n.slide.data .planta{display:block;width:100%;max-height:360px;object-fit:contain;object-position:center;margin:30px auto 0;padding-top:26px;border-top:1px solid var(--line);background:transparent}\n.slide.data .planta.ph{height:300px;background:repeating-linear-gradient(45deg,#121212,#121212 14px,#161616 14px,#161616 28px)}\n.slide.bigstat .pad{align-items:flex-start;justify-content:center}\n.slide.bigstat .big{font-family:Pressio;color:var(--gold);font-size:220px;line-height:.8}\n.slide.bigstat .lab{font-size:24px;color:#fff;margin-top:16px;font-weight:300;letter-spacing:.5px}\n.slide.bigstat .ksub{font-size:15px;color:var(--muted);margin-top:8px}\n.slide.amenities h2.title{font-size:42px;margin:12px 0 30px}\n.slide .amg{display:grid;grid-template-columns:1fr 1fr;gap:2px;background:var(--line)}\n.slide .am{background:var(--paper);padding:24px 22px}\n.slide .am h4{font-family:Pressio;font-weight:400;color:var(--gold);text-transform:uppercase;font-size:17px;margin:0 0 8px;letter-spacing:.5px}\n.slide .am p{font-size:12.5px;line-height:1.6;color:#c4c4c4;font-weight:300;margin:0}\n.slide.quote .pad{justify-content:center}\n.slide.quote .q{font-family:Pressio;font-weight:400;color:#fff;text-transform:uppercase;font-size:46px;line-height:1.05;max-width:640px}\n.slide.quote .q:before{content:'“';color:var(--gold);display:block;font-size:90px;line-height:.4;margin-bottom:20px}\n.slide.quote .au{margin-top:34px;font-size:13px;letter-spacing:3px;text-transform:uppercase;color:var(--muted)}\n.slide.list h2.title{font-size:44px;margin:12px 0 28px}\n.slide .li{display:grid;grid-template-columns:64px 1fr;gap:8px;padding:18px 0;border-top:1px solid var(--line)}\n.slide .li .n{font-family:Pressio;color:var(--gold);font-size:30px;line-height:1}\n.slide .li .lead{font-family:Raleway;font-weight:600;color:#fff;font-size:18px}\n.slide .li .desc{font-size:13.5px;color:#c4c4c4;font-weight:300;line-height:1.6;margin-top:4px}\n.slide.contact .pad{justify-content:center}\n.slide.contact h2.title{font-size:52px;margin-bottom:34px}\n.slide.contact .crow{display:flex;flex-direction:column;gap:20px}\n.slide.contact .ci .cl{font-size:11px;letter-spacing:3px;text-transform:uppercase;color:var(--gold);margin-bottom:5px}\n.slide.contact .ci .cv{font-size:19px;color:#eee;font-weight:300}\n.slide.closing .pad{align-items:center;justify-content:center;text-align:center;gap:32px}\n.slide.closing h2.title{font-size:58px}\n.slide.closing .sub{font-size:14px;color:var(--muted);letter-spacing:4px;font-family:Raleway;text-transform:uppercase}\n.slide.closing .logo{height:130px}\n.slide.chart h2.title{font-size:44px;margin:14px 0 20px}\n.slide .chartwrap{flex:1;display:flex;align-items:center;justify-content:center;min-height:0;width:100%}\n.slide .csvg{width:100%;height:100%;max-height:660px}\n.slide .csvg text{font-family:Raleway,system-ui,sans-serif}\n.slide .csvg .clab{font-size:23px;fill:#eaeaea;font-weight:500}\n.slide .csvg .cval{font-size:22px;fill:#FFB81C;font-weight:700}\n.slide .csvg .cax{font-size:18px;fill:#8a8a8a;font-weight:500}\n.slide .csvg .cgrid{stroke:#2b2b2b;stroke-width:1}\n.slide.chart .note{margin-top:20px}\n\n/* PAISAGEM - opt-in via meta.format = 16x9. Sem a classe .land nada muda. */\n.deck.land .slide,.pdeck.land .slide,.prevbox.land .slide{width:1123px;height:794px}\n.prevbox.land{width:1123px;transform:scale(.32);margin-bottom:-540px}\n.land .slide .pad{padding:54px 68px}\n.land .slide .foot{bottom:26px;left:68px;right:68px;padding-top:11px}\n.land .slide.cover h2.title{font-size:74px}\n.land .slide.cover .rule{margin:20px 0 14px}\n.land .slide.cover .sub{font-size:16px;max-width:620px}\n.land .slide.statement h2.title{font-size:56px;max-width:820px}\n.land .slide.statement .sub{margin-top:22px;max-width:660px}\n.land .slide.section h2.title{font-size:58px;max-width:760px}\n.land .slide.section .ghost{font-size:210px;right:50px;bottom:26px}\n.land .slide.text h2.title{font-size:42px;margin:12px 0 20px;max-width:none}\n.land .slide.text .top-img{height:200px;margin-bottom:22px}\n.land .slide.text .body{column-gap:44px}\n.land .slide.text .body p{max-width:none}\n.land .slide.split .half.txt{padding:54px 52px 54px 68px}\n.land .slide.split h2.title{font-size:38px;margin:12px 0 18px}\n.land .slide.split .body p{font-size:15px;line-height:1.65;margin-bottom:12px}\n.land .slide.trio h2.title{font-size:34px;margin:10px 0 26px}\n.land .slide.trio .cols{gap:24px}\n.land .slide .col img,.land .slide .col .ph{height:190px}\n.land .slide .col h3{font-size:17px;margin:14px 0 8px}\n.land .slide .col p{font-size:12px}\n.land .slide.gallery h2.title{font-size:32px;margin:10px 0 18px}\n.land .slide.data h2.title{font-size:40px;margin:12px 0 24px}\n.land .slide .stat{padding:18px 20px 18px 0}\n.land .slide .stat .big{font-size:46px}\n.land .slide .stat .lab{font-size:13px;margin-top:9px}\n.land .slide .note{margin-top:24px;font-size:14px;max-width:820px}\n.land .slide.data .planta{max-height:230px;margin:20px auto 0;padding-top:18px}\n.land .slide.bigstat .big{font-size:170px}\n.land .slide.bigstat .lab{font-size:21px}\n.land .slide.amenities h2.title{font-size:36px;margin:10px 0 22px}\n.land .slide .amg{grid-template-columns:1fr 1fr 1fr}\n.land .slide .am{padding:18px 18px}\n.land .slide .am h4{font-size:15px}\n.land .slide .am p{font-size:11.5px}\n.land .slide.quote .q{font-size:42px;max-width:860px}\n.land .slide.list h2.title{font-size:38px;margin:10px 0 18px}\n.land .slide .li{padding:12px 0;grid-template-columns:56px 1fr}\n.land .slide .li .n{font-size:26px}\n.land .slide .li .lead{font-size:16px}\n.land .slide .li .desc{font-size:12.5px;margin-top:3px}\n.land .slide.contact h2.title{font-size:44px;margin-bottom:26px}\n.land .slide.contact .crow{display:grid;grid-template-columns:1fr 1fr;gap:20px 40px}\n.land .slide.contact .ci .cv{font-size:17px}\n.land .slide.closing h2.title{font-size:52px}\n.land .slide.closing .logo{height:104px}\n.land .slide.closing .pad{gap:24px}\n.land .slide.chart h2.title{font-size:38px;margin:12px 0 14px}\n.land .slide .csvg{max-height:430px}\n\n/* VIEWER (presentation + print) */\n.viewer{position:absolute;inset:0;background:#161616;overflow:auto;padding:40px 0}\n.viewbar{position:fixed;top:14px;right:18px;z-index:60;display:flex;gap:8px}\n.viewer .deck{display:flex;flex-direction:column;align-items:center;gap:26px}\n.viewer .slide{box-shadow:0 10px 40px #0008}\n@media print{\n  .root.viewing>.top,.root.viewing>.wrap{display:none!important}\n  .viewbar{display:none}\n  .viewer{padding:0;background:#fff;position:static;overflow:visible}\n  .viewer .deck{gap:0}\n  .slide{box-shadow:none;page-break-after:always;break-after:page}\n  @page{size:A4;margin:0}\n}\n`,\n\n  render(d2) {\n    const S = d2.state;\n    if (S.screen === undefined) {\n      let persisted = null;\n      try { persisted = sessionStorage.getItem('deckScreen'); } catch(e){}\n      let authed = false;\n      try { var _a = JSON.parse(localStorage.getItem('tempoAuth')||'null'); authed = !!(_a && _a.user && (Date.now()-(_a.ts||0) < 2592000000) && ((_a.user.role==='admin')||(_a.user.apps && _a.user.apps.indexOf('deck')>=0))); if (authed) S.user = _a.user; } catch(e){}\n      S.screen = (persisted === 'editor' || persisted === 'viewer') ? persisted : 'editor';\n    }\n    try { d2.log('RENDER screen=', S.screen); } catch(e){}\n    const LOGO = 'https://tempobyporsche.com/wp-content/uploads/2026/02/logo_tempo_by_porsche_white_V.svg';\n\n    const GATE_OVERLAY = (S.screen === 'gate') ? `<div class=\"gate\" id=\"gateOverlay\">\n        <img class=\"logo\" src=\"${LOGO}\">\n        <div class=\"brand\">Tempo &middot; Editor de Deck</div>\n        <div class=\"sub\">Acesso restrito</div>\n        <input id=\"eml\" type=\"email\" placeholder=\"e-mail\" autocomplete=\"username\" value=\"${(S.email||'').replace(/\"/g,'&quot;')}\" style=\"margin-bottom:10px\">\n        <input id=\"pw\" type=\"password\" placeholder=\"senha\" autocomplete=\"off\" value=\"${(S.pw||'').replace(/\"/g,'&quot;')}\">\n        <button id=\"unlock\">Entrar</button>\n        <div class=\"err\">${S.gateErr||''}</div>\n      </div>` : '';\n\n    if (S.screen === 'viewer') {\n      const deck = S.deck || {meta:{},slides:[]};\n      DeckRenderFoot(deck.meta && deck.meta.footer);\n      const html = (deck.slides||[]).map((s,i)=>DeckRenderOne(s,i+1,LOGO)).join('');\n      return `<div class=\"root\" data-key=\"screen-viewer\"><div class=\"viewer\">\n        <div class=\"viewbar\">\n          <button class=\"btn g\" id=\"backEdit\">&larr; Editor</button>\n          <button class=\"btn gold\" id=\"doPrint\">Imprimir / PDF</button>\n        </div>\n        <div class=\"deck ${_fmtCls(deck.meta)}\">${html}</div>\n      </div></div>`;\n    }\n\n    // EDITOR\n    const deck = S.deck || {meta:{footer:'TEMPO BY PORSCHE'},slides:[]};\n    if (!Array.isArray(deck.slides)) deck.slides = [];\n    let sel = (S.sel==null)?-1:S.sel;\n    if (sel >= deck.slides.length) sel = deck.slides.length ? 0 : -1;\n    const decks = S.decks || [];\n    const listHtml = (deck.slides||[]).map((s,i)=>`\n      <div class=\"sl ${i===sel?'sel':''}\" data-slide=\"${i}\">\n        <div class=\"ty\">${esc(s.type)}</div><div class=\"tt\">${esc(s.title||s.subtitle||'(sem titulo)')}</div>\n        <div class=\"row\">\n          <button data-move=\"${i}\" data-dir=\"-1\">&uarr;</button>\n          <button data-move=\"${i}\" data-dir=\"1\">&darr;</button>\n          <button data-dup=\"${i}\">&#10697;</button>\n          <button data-del=\"${i}\">&#10005;</button>\n        </div>\n      </div>`).join('') || '<p class=\"hint\">sem slides</p>';\n\n    const options = TYPES.map(([v,l])=>`<option value=\"${v}\">${l}</option>`).join('');\n    let previewHtml = '';\n    try { previewHtml = (sel>=0 && deck.slides[sel]) ? (DeckRenderFoot(deck.meta&&deck.meta.footer), DeckRenderOne(deck.slides[sel],1,LOGO)) : ''; } catch(err){ previewHtml = '<p class=\"hint\">preview indisponivel</p>'; }\n    let formHtml = '<p class=\"hint\">Selecione ou adicione um slide.</p>';\n    try { if (sel>=0 && deck.slides[sel]) formHtml = renderForm(deck.slides[sel]); } catch(err){ formHtml = '<p class=\"hint\">form indisponivel</p>'; }\n\n    return `<div class=\"root\" data-key=\"screen-editor\">\n      ${GATE_OVERLAY}\n      <div class=\"top\">\n        <span class=\"brand\">TEMPO &middot; EDITOR</span>\n        <select id=\"deckSel\">${decks.map(dd=>`<option value=\"${esc(dd.slug)}\" ${dd.slug===S.curDeck?'selected':''}>${esc(dd.nome||dd.slug)}</option>`).join('')}</select>\n        <button class=\"btn\" id=\"newDeck\">+ deck</button>\n        <input class=\"tt\" id=\"metaTitle\" placeholder=\"titulo\" style=\"width:230px\" value=\"${escAttr(deck.meta&&deck.meta.title)}\">\n        <input class=\"tt\" id=\"metaFoot\" placeholder=\"rodape\" style=\"width:170px\" value=\"${escAttr(deck.meta&&deck.meta.footer)}\">\n        <select id=\"metaFmt\" title=\"formato do slide\"><option value=\"a4\" ${_fmtCls(deck.meta)?'':'selected'}>Retrato</option><option value=\"16x9\" ${_fmtCls(deck.meta)?'selected':''}>Paisagem</option></select>\n        <span class=\"sp\"></span>\n        <span class=\"dirty\" id=\"dstate\">${S.dirty?'● nao salvo':(S.savedFlag?'salvo ✓':'')}</span>\n        <button class=\"btn gold\" id=\"saveBtn\">Salvar</button>\n        <button class=\"btn g\" id=\"viewBtn\">Abrir ↗</button>\n        <button class=\"btn g\" id=\"logoutBtn\" title=\"Encerrar sessão\">Sair</button>\n      </div>\n      <div class=\"wrap\">\n        <div class=\"side\">\n          <h3>Slides</h3>\n          <div id=\"list\">${listHtml}</div>\n          <div class=\"addbar\">\n            <select id=\"addType\">${options}</select>\n            <button class=\"btn gold\" id=\"addBtn\">+</button>\n          </div>\n        </div>\n        <div class=\"form\" id=\"form\">${formHtml}</div>\n        <div class=\"prev\"><div class=\"prevbox ${_fmtCls(deck.meta)}\" id=\"prev\">${previewHtml}</div><div class=\"hint\">preview</div></div>\n      </div>\n      <div class=\"galm ${S.galOpen?'on':''}\" id=\"galm\">\n        <div class=\"galbox\">\n          <div class=\"galh\"><span>Galeria do evento &mdash; clique numa foto para inserir</span><button id=\"galClose\">fechar</button></div>\n          <div class=\"gg\" id=\"gg\">${(S.photos||[]).map(p=>{const full=p.full||p,th=p.thumb||full;return `<img loading=\"lazy\" src=\"${escAttr(th)}\" data-full=\"${escAttr(full)}\">`;}).join('')||'<p class=\"hint\">sem fotos</p>'}</div>\n        </div>\n      </div>\n    </div>`;\n  },\n\n  updated(d2, root) {\n    try { if (d2.state._bindGateDirect) d2.state._bindGateDirect(); } catch(e){ d2.log('updated bind err', e); }\n  },\n\n  mounted(d2, root) {\n    const S = d2.state;\n    if (S.screen === undefined) S.screen = 'editor';\n\n    const api = () => d2.rush('deck-api');\n\n    async function loadList() {\n      try {\n        const r = await callApi({ action: 'list' });\n        S.decks = (r && r.decks) || [];\n        paint();\n      } catch (e) { d2.log('list err', e); }\n    }\n    async function loadDeck(slug) {\n      try {\n        const r = await callApi({ action: 'load', slug });\n        const rec = r && r.deck;\n        S.curDeck = slug;\n        if (rec) {\n          S.deck = { meta: safeParse(rec.meta_json, {footer:'TEMPO BY PORSCHE'}), slides: safeParse(rec.slides_json, []) };\n        } else {\n          S.deck = { meta:{footer:'TEMPO BY PORSCHE'}, slides:[] };\n        }\n        S.sel = (S.deck.slides.length>0)?0:-1;\n        S.dirty = false; S.savedFlag = false;\n        paint();\n      } catch (e) { d2.log('load err', e); }\n    }\n    async function loadPhotos() {\n      try {\n        const r = await callApi({ action: 'gallery' });\n        S.photos = (r && r.photos) || [];\n        paint();\n      } catch (e) { d2.log('gallery err', e); }\n    }\n\n    // ---------- IMPERATIVE PAINT ----------\n    // d2.refresh()/morph does NOT re-render in this runtime (proven in the gate bug).\n    // All UI updates are painted imperatively into the existing DOM.\n    const LOGOURL = 'https://tempobyporsche.com/wp-content/uploads/2026/02/logo_tempo_by_porsche_white_V.svg';\n    async function callApi(payload){\n      try {\n        let r = await api().invoke(payload);\n        if (r && r.data !== undefined) r = r.data;           // rush envelope {data:{...}}\n        if (r && r.response && r.response.data !== undefined) r = r.response.data;\n        if (r && (r.ok !== undefined || r.decks !== undefined || r.photos !== undefined || r.deck !== undefined)) return r;\n        d2.log('rush resposta inesperada', r);\n      } catch(e){ d2.log('rush invoke falhou, tentando fetch', e); }\n      const res = await fetch('https://tempo.data2apis.com/rush/deck-api', { method:'POST', headers:{'content-type':'application/json'}, body: JSON.stringify(payload) });\n      const j = await res.json();\n      return (j && j.data !== undefined) ? j.data : j;\n    }\n    function buildListHtml(){\n      const deck = S.deck || {slides:[]};\n      const slides = deck.slides || [];\n      const sel = (S.sel==null)?-1:S.sel;\n      return slides.map((s,i)=>`\n      <div class=\"sl ${i===sel?'sel':''}\" data-slide=\"${i}\">\n        <div class=\"ty\">${esc(s.type)}</div><div class=\"tt\">${esc(s.title||s.subtitle||'(sem titulo)')}</div>\n        <div class=\"row\">\n          <button data-move=\"${i}\" data-dir=\"-1\">&uarr;</button>\n          <button data-move=\"${i}\" data-dir=\"1\">&darr;</button>\n          <button data-dup=\"${i}\">&#10697;</button>\n          <button data-del=\"${i}\">&#10005;</button>\n        </div>\n      </div>`).join('') || '<p class=\"hint\">sem slides</p>';\n    }\n    function paint(){\n      try {\n        const deck = S.deck || {meta:{},slides:[]};\n        const selEl = d2.$('#deckSel');\n        if (selEl) selEl.innerHTML = (S.decks||[]).map(dd=>`<option value=\"${escAttr(dd.slug)}\" ${dd.slug===S.curDeck?'selected':''}>${esc(dd.nome||dd.slug)}</option>`).join('');\n        const mt = d2.$('#metaTitle'); if (mt) mt.value = (deck.meta && deck.meta.title) || '';\n        const mf = d2.$('#metaFoot'); if (mf) mf.value = (deck.meta && deck.meta.footer) || '';\n        const mfmt = d2.$('#metaFmt'); if (mfmt) mfmt.value = _fmtCls(deck.meta) ? '16x9' : 'a4';\n        const pbx = d2.$('#prev'); if (pbx) pbx.classList.toggle('land', !!_fmtCls(deck.meta));\n        const list = d2.$('#list'); if (list) list.innerHTML = buildListHtml();\n        const form = d2.$('#form');\n        if (form) {\n          let fh = '<p class=\"hint\">Selecione ou adicione um slide.</p>';\n          try { if (S.sel>=0 && deck.slides && deck.slides[S.sel]) fh = renderForm(deck.slides[S.sel]); } catch(e){}\n          form.innerHTML = fh;\n        }\n        refreshPreview();\n        const ds = d2.$('#dstate'); if (ds) ds.textContent = S.dirty?'● nao salvo':(S.savedFlag?'salvo ✓':'');\n        const gm = d2.$('#galm'); if (gm) gm.classList.toggle('on', !!S.galOpen);\n        const gg = d2.$('#gg'); if (gg) gg.innerHTML = (S.photos||[]).map(p=>{const full=p.full||p,th=p.thumb||full;return `<img loading=\"lazy\" src=\"${escAttr(th)}\" data-full=\"${escAttr(full)}\">`;}).join('')||'<p class=\"hint\">sem fotos</p>';\n      } catch(e){ d2.log('paint err', e); }\n    }\n    function showViewer(){\n      const rootEl = d2.$('.root'); if(!rootEl) return;\n      const deck = S.deck || {meta:{},slides:[]};\n      DeckRenderFoot(deck.meta && deck.meta.footer);\n      const html = (deck.slides||[]).map((s,i)=>DeckRenderOne(s,i+1,LOGOURL)).join('');\n      const v = document.createElement('div');\n      v.className = 'viewer'; v.id = 'viewerOverlay'; v.style.zIndex = '900';\n      v.innerHTML = `<div class=\"viewbar\"><button class=\"btn g\" id=\"backEdit\">&larr; Editor</button><button class=\"btn gold\" id=\"doPrint\">Imprimir / PDF</button></div><div class=\"deck ${_fmtCls(deck.meta)}\">${html}</div>`;\n      rootEl.appendChild(v);\n      rootEl.classList.add('viewing');\n      const b = v.querySelector('#backEdit'); if (b) b.onclick = () => closeViewer();\n      const p = v.querySelector('#doPrint'); if (p) p.onclick = () => doPrint();\n    }\n    function closeViewer(){\n      const v = d2.$('#viewerOverlay'); if (v) v.remove();\n      const rootEl = d2.$('.root'); if (rootEl) rootEl.classList.remove('viewing');\n    }\n    // Print in a DEDICATED window: escapes the player's clipped layout AND forces\n    // background printing (dark slides would otherwise come out blank).\n    function doPrint(){\n      const deck = S.deck || {meta:{},slides:[]};\n      DeckRenderFoot(deck.meta && deck.meta.footer);\n      const html = (deck.slides||[]).map((s,i)=>DeckRenderOne(s,i+1,LOGOURL)).join('');\n      let css = '';\n      try { const sr = d2.$('.root').getRootNode(); sr.querySelectorAll('style').forEach(st=>{ css += st.textContent; }); } catch(e){}\n      const doc = '<!doctype html><html><head><meta charset=\"utf-8\"><title>' + esc((deck.meta&&deck.meta.title)||'Tempo · Deck') + '</title><style>' + css + `\n        html,body{margin:0;padding:0;background:#fff}\n        /* .root nao existe aqui: redeclara as variaveis da marca no wrapper de print */\n        .pdeck{--gold:#FFB81C;--paper:#0a0a0a;--line:#2b2b2b;--muted:#8a8a8a;--body:#cfcfcf;display:flex;flex-direction:column;align-items:center}\n        .pdeck .slide{page-break-after:always;break-after:page;box-shadow:none;margin:0}\n        /* gradientes rasterizam caro no print: troca por overlay chapado (leve) */\n        .pdeck .slide .scrim{background:rgba(10,10,10,.45)!important}\n        .pdeck .slide.image .scrim{background:rgba(10,10,10,.35)!important}\n        .pdeck .slide .grain{display:none!important}\n        @page{size:A4 ${_fmtCls(deck.meta)?'landscape':''};margin:0}\n        *{-webkit-print-color-adjust:exact!important;print-color-adjust:exact!important}\n      </style></head><body><div class=\"pdeck ${_fmtCls(deck.meta)}\">` + html + '</div><scr' + 'ipt>window.onload=function(){setTimeout(function(){window.print();},800);};</scr' + 'ipt></body></html>';\n      let w = null;\n      try { w = window.open('', '_blank'); } catch(e){}\n      if (w) { w.document.open(); w.document.write(doc); w.document.close(); }\n      else { try { d2.dialog.alert('Habilite pop-ups para exportar o PDF.'); } catch(e){} }\n    }\n    // Native event delegation on the root for DYNAMIC content (list rows, form fields,\n    // gallery buttons) — these nodes don't exist at mount, so d2.on cannot be trusted for them.\n    const hostRoot = d2.$('.root');\n    if (hostRoot && !hostRoot._deleg) {\n      hostRoot._deleg = true;\n      hostRoot.addEventListener('click', (e) => {\n        const t = e.target; if (!t || !t.closest) return;\n        const mv = t.closest('[data-move]'); if (mv) { e.stopPropagation(); move(+mv.dataset.move, +mv.dataset.dir); return; }\n        const dp = t.closest('[data-dup]'); if (dp) { e.stopPropagation(); dup(+dp.dataset.dup); return; }\n        const dl = t.closest('[data-del]'); if (dl) { e.stopPropagation(); (async()=>{ const ok = await d2.dialog.confirm('excluir slide?'); if (ok) del(+dl.dataset.del); })(); return; }\n        const gb = t.closest('.galBtn'); if (gb) { S.pickCtx = gb.dataset.idx!=null ? {k:gb.dataset.k, idx:+gb.dataset.idx, sk:gb.dataset.sk} : {k:gb.dataset.k}; S.galOpen = true; paint(); return; }\n        const ub = t.closest('.upBtn'); if (ub) { S.pickCtx = ub.dataset.idx!=null ? {k:ub.dataset.k, idx:+ub.dataset.idx, sk:ub.dataset.sk} : {k:ub.dataset.k}; doUpload(); return; }\n        const ao = t.closest('.addObjBtn'); if (ao) { addObj(ao.dataset.k); return; }\n        const dob = t.closest('.delObjBtn'); if (dob) { delObj(dob.dataset.k, +dob.dataset.idx); return; }\n        const sl = t.closest('.sl'); if (sl && !t.closest('button')) { selectSlide(+sl.dataset.slide); return; }\n      });\n      hostRoot.addEventListener('input', (e) => {\n        const t = e.target; if (!t || !t.matches) return;\n        if (t.matches('[data-f]')) {\n          const k = t.dataset.f, kind = t.dataset.kind;\n          if (kind === 'bool') return;\n          if (kind === 'strings') setStrings(k, t.value); else setF(k, t.value);\n          return;\n        }\n        if (t.matches('[data-obj]')) setObj(t.dataset.obj, +t.dataset.idx, t.dataset.sk, t.value);\n      });\n      hostRoot.addEventListener('change', (e) => {\n        const t = e.target; if (!t || !t.matches) return;\n        if (t.matches('[data-f]') && t.dataset.kind === 'bool') setF(t.dataset.f, t.checked);\n      });\n    }\n\n    // bootstrap once\n    if (!S._booted) {\n      S._booted = true;\n      loadPhotos();\n      loadList();\n      loadDeck(S.curDeck || 'descritivo');\n    }\n\n    // ---------- GATE ----------\n    d2.on('#eml', 'input', (e, el) => { S.email = el.value; });\n    d2.on('#eml', 'keydown', (e, el) => { if (e.key === 'Enter') { e.preventDefault(); const p=d2.$('#pw'); if(p) p.focus(); } });\n    d2.on('#pw', 'input', (e, el) => { S.pw = el.value; });\n    d2.on('#pw', 'keydown', (e, el) => { if (e.key === 'Enter') { e.preventDefault(); tryUnlock(); } });\n    d2.on('#unlock', 'click', (e) => { if (e && e.preventDefault) e.preventDefault(); tryUnlock(); });\n    function currentPw(){\n      const el = d2.$('#pw');\n      const v = el ? el.value : undefined;\n      return (v != null && v !== '') ? v : (S.pw || '');\n    }\n    async function tryUnlock() {\n      const emEl = d2.$('#eml'); const email = ((emEl && emEl.value)||'').trim();\n      const pw = currentPw();\n      if (!email || !pw) { S.gateErr='informe e-mail e senha'; const e0=d2.$('.err'); if(e0) e0.textContent='informe e-mail e senha'; return; }\n      const eBusy = d2.$('.err'); if (eBusy) eBusy.textContent='entrando…';\n      let ok=false, msg='e-mail ou senha inválidos';\n      try {\n        const r = await d2.rush('auth-login').invoke({ email: email, password: pw });\n        const d = (r && r.data!==undefined) ? r.data : r;\n        ok = !!(d && d.ok); if (d && d.message) msg = d.message; if (ok) { var acc = (d.user.role==='admin')||(d.user.apps && d.user.apps.indexOf('deck')>=0); if (!acc) { ok=false; msg='Sem acesso ao Deck'; } else { S.user = d.user; try { localStorage.setItem('tempoAuth', JSON.stringify({user:d.user, ts:Date.now()})); } catch(e){} } }\n      } catch(e){ d2.log('auth err', e); msg='erro de conexão. tente de novo.'; }\n      if (!ok) {\n        S.gateErr = msg;\n        const errEl = d2.$('.err'); if (errEl) errEl.textContent = msg;\n        return;\n      }\n      S.email = email;\n      // SUCCESS. The CodeHost morph refuses to swap gate->editor via render alone\n      // (render re-runs with screen=editor but the morph keeps the gate subtree).\n      // Escape the framework: flip state, then imperatively remove the stale gate\n      // node so the next render() has nothing to morph against, then force a refresh.\n      S.pw = pw;\n      if (!S.deck) S.deck = { meta:{footer:'TEMPO BY PORSCHE'}, slides:[] };\n      if (S.sel == null) S.sel = -1;\n      S.gateErr = '';\n      S.screen = 'editor';\n      d2.state.screen = 'editor';\n      // The CodeHost morph won't swap gate->editor and d2.refresh() is a no-op here.\n      // Escape the framework: reload the component so it remounts fresh and render()\n      // runs from scratch with screen already 'editor' (persisted below via URL flag).\n      // Escape the morph deterministically: the editor is always in the DOM (behind the\n      // gate overlay); unlocking just removes the overlay node imperatively.\n      try { const g = d2.$('#gateOverlay'); if (g) g.remove(); } catch(e){}\n      paint();\n    }\n    // belt-and-suspenders: bind directly to the shadow-root elements too (in case delegated\n    // click/keydown on the root doesn't reach them). Re-bound each render; guarded against dupes.\n    function bindGateDirect(){\n      if (S.screen !== 'gate') return;\n      const btn = d2.$('#unlock'); const inp = d2.$('#pw');\n      if (btn && !btn._bound){ btn._bound = true; d2.on(btn, 'click', (e)=>{ if(e&&e.preventDefault)e.preventDefault(); tryUnlock(); }); }\n      if (inp && !inp._bound){ inp._bound = true;\n        d2.on(inp, 'input', (e)=>{ S.pw = inp.value; });\n        d2.on(inp, 'keydown', (e)=>{ if (e.key === 'Enter'){ e.preventDefault(); tryUnlock(); } });\n      }\n      const eml = d2.$('#eml');\n      if (eml && !eml._bound){ eml._bound = true;\n        d2.on(eml, 'input', (e)=>{ S.email = eml.value; });\n        d2.on(eml, 'keydown', (e)=>{ if (e.key === 'Enter'){ e.preventDefault(); const p=d2.$('#pw'); if(p) p.focus(); } });\n      }\n    }\n    bindGateDirect();\n    d2.state._bindGateDirect = bindGateDirect;\n\n    // ---------- TOP BAR ----------\n    d2.on('#deckSel', 'change', (e, el) => { loadDeck(el.value); });\n    d2.on('#metaTitle', 'input', (e, el) => { ensureMeta(); S.deck.meta.title = el.value; markDirty(); });\n    d2.on('#metaFoot', 'input', (e, el) => { ensureMeta(); S.deck.meta.footer = el.value; markDirty(); });\n    d2.on('#metaFmt', 'change', (e, el) => { ensureMeta(); S.deck.meta.format = el.value; markDirty(); const pbx = d2.$('#prev'); if (pbx) pbx.classList.toggle('land', el.value !== 'a4'); });\n    d2.on('#newDeck', 'click', async () => {\n      const name = await d2.dialog.prompt('nome do novo deck (sem espacos):', 'novo');\n      if (!name) return;\n      const slug = name.toLowerCase().replace(/[^a-z0-9_-]/g,'-');\n      S.curDeck = slug;\n      S.deck = { meta:{title:name, footer:'TEMPO BY PORSCHE'}, slides:[] };\n      S.sel = -1; markDirty();\n      await save(); await loadList(); paint();\n    });\n    d2.on('#saveBtn', 'click', () => save());\n    d2.on('#viewBtn', 'click', () => { showViewer(); });\n    d2.on('#logoutBtn', 'click', async () => {\n      try {\n        const a = d2.auth('rAMokwNexe8bJoWWveODt');\n        if (a) await a.logout();\n      } catch(e){ d2.log('logout err', e); }\n      try { localStorage.removeItem('tempoAuth'); } catch(e){}\n      try { sessionStorage.removeItem('deckScreen'); } catch(e){}\n      // reload so the Router re-evaluates the route policy and shows the login artboard\n      try { location.reload(); } catch(e){}\n    });\n\n    // ---------- VIEWER ----------\n    d2.on('#backEdit', 'click', () => { closeViewer(); });\n    d2.on('#doPrint', 'click', () => doPrint());\n\n    // ---------- SIDEBAR ----------\n    // sidebar: handled by native delegation on .root (see IMPERATIVE PAINT block)\n    d2.on('#addBtn', 'click', () => {\n      const selEl = d2.$('#addType'); addSlide(selEl ? selEl.value : 'cover');\n    });\n\n    // ---------- FORM (delegated) ----------\n    // form + gallery/upload triggers: handled by native delegation on .root (see IMPERATIVE PAINT block)\n\n    // ---------- GALLERY MODAL ----------\n    d2.on('#galClose', 'click', () => { S.galOpen=false; paint(); });\n    d2.on('#galm', 'click', (e, el) => { if (e.target && e.target.id === 'galm') { S.galOpen=false; paint(); } });\n    d2.on('#gg', 'click', (e) => {\n      const img = e.target && e.target.closest('img[data-full]');\n      if (!img) return;\n      applyPhoto(img.dataset.full);\n    });\n\n    // ---------- helpers ----------\n    function ensureMeta(){ if(!S.deck.meta) S.deck.meta = {footer:'TEMPO BY PORSCHE'}; }\n    function markDirty(){ S.dirty=true; S.savedFlag=false; const d=d2.$('#dstate'); if(d) d.textContent='● nao salvo'; refreshPreview(); }\n    function refreshPreview(){\n      const sel = S.sel; const p = d2.$('#prev');\n      if (!p) return;\n      if (sel==null || sel<0 || !S.deck || !S.deck.slides || !S.deck.slides[sel]) { p.innerHTML=''; return; }\n      DeckRenderFoot(S.deck.meta && S.deck.meta.footer);\n      p.innerHTML = DeckRenderOne(S.deck.slides[sel], 1, 'https://tempobyporsche.com/wp-content/uploads/2026/02/logo_tempo_by_porsche_white_V.svg');\n    }\n    function selectSlide(i){ S.sel=i; paint(); }\n    function setF(k,v){ S.deck.slides[S.sel][k]=v; markDirty(); if(k==='title'||k==='subtitle'){ const li=d2.$$('.sl')[S.sel]; if(li){const tt=li.querySelector('.tt'); if(tt) tt.textContent=(S.deck.slides[S.sel].title||S.deck.slides[S.sel].subtitle||'(sem titulo)');} } }\n    function setStrings(k,v){ S.deck.slides[S.sel][k]=v.split(/\\n\\n+/).map(x=>x.trim()).filter(Boolean); markDirty(); }\n    function setObj(k,idx,sk,v){ if(!S.deck.slides[S.sel][k]) S.deck.slides[S.sel][k]=[]; if(!S.deck.slides[S.sel][k][idx]) S.deck.slides[S.sel][k][idx]={}; S.deck.slides[S.sel][k][idx][sk]=v; markDirty(); }\n    function addObj(k){ const s=S.deck.slides[S.sel]; s[k]=s[k]||[]; s[k].push({}); markDirty(); rerenderForm(); }\n    function delObj(k,idx){ S.deck.slides[S.sel][k].splice(idx,1); markDirty(); rerenderForm(); }\n    function rerenderForm(){ const f=d2.$('#form'); if(f && S.sel>=0) f.innerHTML = renderForm(S.deck.slides[S.sel]); }\n    function addSlide(t){ const tpl=TEMPLATES[t]; if(!tpl) return; const s=JSON.parse(JSON.stringify(tpl)); const at=S.sel>=0?S.sel+1:S.deck.slides.length; S.deck.slides.splice(at,0,s); S.sel=at; markDirty(); paint(); }\n    function dup(i){ S.deck.slides.splice(i+1,0,JSON.parse(JSON.stringify(S.deck.slides[i]))); S.sel=i+1; markDirty(); paint(); }\n    function del(i){ S.deck.slides.splice(i,1); S.sel=Math.min(i,S.deck.slides.length-1); markDirty(); paint(); }\n    function move(i,dir){ const j=i+dir; if(j<0||j>=S.deck.slides.length) return; const a=S.deck.slides; const t=a[i]; a[i]=a[j]; a[j]=t; S.sel=j; markDirty(); paint(); }\n    function applyPhoto(u){ const c=S.pickCtx; if(!c) return; if(c.sk!=null){ if(!S.deck.slides[S.sel][c.k]) S.deck.slides[S.sel][c.k]=[]; if(!S.deck.slides[S.sel][c.k][c.idx]) S.deck.slides[S.sel][c.k][c.idx]={}; S.deck.slides[S.sel][c.k][c.idx][c.sk]=u; } else { S.deck.slides[S.sel][c.k]=u; } S.galOpen=false; markDirty(); paint(); }\n\n    async function doUpload(){\n      const input = document.createElement('input');\n      input.type='file'; input.accept='image/*';\n      input.onchange = async () => {\n        const file = input.files && input.files[0]; if(!file) return;\n        try {\n          const out = await d2.drive('deckmedia').uploadFromFiles([file]);\n          const fileUrl = out && out[0] && (out[0].fileUrl || (out[0].params && out[0].params.fileUrl));\n          if(!fileUrl){ await d2.dialog.alert('falha no upload'); return; }\n          await callApi({ action:'upload', full: fileUrl, thumb: fileUrl });\n          applyPhoto(fileUrl);\n          if (S.photos) S.photos.push({ full: fileUrl, thumb: fileUrl });\n        } catch(e){ d2.log('upload err', e); await d2.dialog.alert('falha no upload: '+e); }\n      };\n      input.click();\n    }\n\n    async function save(){\n      ensureMeta();\n      try {\n        const r = await callApi({\n          action:'save', slug: S.curDeck,\n          nome: (S.deck.meta && S.deck.meta.title) || S.curDeck,\n          meta_json: JSON.stringify(S.deck.meta||{}),\n          slides_json: JSON.stringify(S.deck.slides||[]),\n          updated_at: new Date().toISOString()\n        });\n        if (r && r.ok) { S.dirty=false; S.savedFlag=true; const d=d2.$('#dstate'); if(d) d.textContent='salvo ✓'; }\n        else { await d2.dialog.alert('erro ao salvar'); }\n      } catch(e){ d2.log('save err', e); await d2.dialog.alert('erro ao salvar: '+e); }\n    }\n  }\n};\n\n/* ---------------- module-scope helpers ---------------- */\nfunction esc(v){ return String(v==null?'':v).replace(/</g,'&lt;'); }\nfunction escAttr(v){ return String(v==null?'':v).replace(/\"/g,'&quot;'); }\nfunction safeParse(s, fb){ try { return typeof s==='string' ? JSON.parse(s) : (s||fb); } catch(e){ return fb; } }\n\n\n\n\n\nfunction renderForm(s){\n  const defs = FIELDS[s.type]||[];\n  let h = `<h2>${esc(s.type)}</h2>`;\n  defs.forEach(([k,kind,sub])=>{ h += `<div class=\"f\"><label>${LBL[k]||k}</label>${fieldHTML(s,k,kind,sub)}</div>`; });\n  return h;\n}\nfunction fieldHTML(s,k,kind,sub){\n  if(kind==='text') return `<input type=\"text\" data-f=\"${k}\" data-kind=\"text\" value=\"${escAttr(s[k])}\">`;\n  if(kind==='textarea') return `<textarea data-f=\"${k}\" data-kind=\"textarea\">${esc(s[k])}</textarea>`;\n  if(kind==='bool') return `<label style=\"text-transform:none;color:#ccc\"><input type=\"checkbox\" data-f=\"${k}\" data-kind=\"bool\" ${s[k]?'checked':''}> sim</label>`;\n  if(kind==='image') return imgFieldHTML(k, s[k], null, null);\n  if(kind==='strings'){ const arr=s[k]||[]; return `<textarea style=\"min-height:120px\" data-f=\"${k}\" data-kind=\"strings\">${esc(arr.join('\\n\\n'))}</textarea>`; }\n  if(kind==='objs'){ const arr=s[k]||[]; let h='<div class=\"objs\">';\n    arr.forEach((o,idx)=>{ h+=`<div class=\"obj\"><div class=\"oh\"><b>${idx+1}</b><button class=\"mini delObjBtn\" data-k=\"${k}\" data-idx=\"${idx}\">remover</button></div>`;\n      sub.forEach(([sk,skind])=>{ h+=`<div class=\"f\"><label>${LBL[sk]||sk}</label>${objField(k,idx,sk,skind,o)}</div>`; }); h+='</div>'; });\n    h+=`<button class=\"addmini addObjBtn\" data-k=\"${k}\">+ adicionar</button></div>`; return h; }\n  return '';\n}\nfunction objField(k,idx,sk,kind,o){\n  if(kind==='textarea') return `<textarea data-obj=\"${k}\" data-idx=\"${idx}\" data-sk=\"${sk}\">${esc(o[sk])}</textarea>`;\n  if(kind==='image') return imgFieldHTML(k, o[sk], idx, sk);\n  return `<input type=\"text\" data-obj=\"${k}\" data-idx=\"${idx}\" data-sk=\"${sk}\" value=\"${escAttr(o[sk])}\">`;\n}\nfunction imgFieldHTML(k, val, idx, sk){\n  const objAttrs = (idx!=null) ? `data-obj=\"${k}\" data-idx=\"${idx}\" data-sk=\"${sk}\"` : `data-f=\"${k}\" data-kind=\"text\"`;\n  const ctxAttrs = (idx!=null) ? `data-k=\"${k}\" data-idx=\"${idx}\" data-sk=\"${sk}\"` : `data-k=\"${k}\"`;\n  return `<div class=\"imgf\">\n    <input type=\"text\" ${objAttrs} value=\"${escAttr(val)}\" placeholder=\"url da imagem\">\n    <img src=\"${escAttr(val)}\" onerror=\"this.style.opacity=.2\">\n    <button class=\"mini galBtn\" style=\"color:var(--gold)\" ${ctxAttrs}>galeria</button>\n    <button class=\"mini upBtn\" style=\"color:#9ad\" ${ctxAttrs}>upload</button>\n  </div>`;\n}\n\n/* ---- DeckRender (render.js verbatim logic, logo param'd) ---- */\nfunction DeckRenderFoot(f){ _N = 0; _FOOT = f || 'TEMPO BY PORSCHE'; }\nfunction DeckRenderOne(s, pageNum, LOGO){ _N = (pageNum||1)-1; return _renderSlide(s, LOGO); }\nfunction _renderSlide(s, LOGO){\n  const eS = v => (v==null?'':String(v));\n  const img = (src,cls)=>src?`<img class=\"${cls||''}\" src=\"${eS(src)}\" onerror=\"this.outerHTML='<div class=\\\\'ph ${cls||''}\\\\'>foto: ${eS(src)}</div>'\">`:`<div class=\"ph ${cls||''}\">sem foto</div>`;\n  const foot = ()=>{ _N++; return `<div class=\"foot\"><div class=\"fl\"><img src=\"${LOGO}\">${eS(_FOOT)}</div><div>${String(_N).padStart(2,'0')}</div></div>`; };\n  const kick = (k,num)=>k||num?`<div class=\"kick\">${num?`<span class=\"num\">${eS(num)}</span>`:''}<span class=\"ln\"></span>${eS(k||'')}</div>`:'';\n  const paras = b=>(b||[]).map(p=>`<p>${eS(p)}</p>`).join('');\n  const stats = x=>x.stats||x.kpis||[];\n  const _chartSVG = (s) => {\n    const GOLD='#FFB81C';\n    const enc = v => String(v==null?'':v).replace(/&/g,'&amp;').replace(/</g,'&lt;');\n    const data = (s.data||[]).map(d => ({label:enc(d.label), v:(+d.value||0)}));\n    if(!data.length) return '<div class=\"ph\" style=\"position:relative;height:420px\">grafico sem dados</div>';\n    const ct = s.chartType||'bar';\n    if(ct==='scatter'){\n      const pts=(s.data||[]).map(d=>({label:enc(d.label),x:(+d.x||0),y:(+d.y||0),r:(+d.r||0)}));\n      if(!pts.length) return '<div class=\"ph\" style=\"position:relative;height:420px\">sem dados</div>';\n      const W=1000,H=560,pl=96,pr=56,pt=54,pb=72,iw=W-pl-pr,ih=H-pt-pb;\n      const xmax=Math.max(...pts.map(p=>p.x))*1.10;\n      const yv=pts.map(p=>p.y), ymax=Math.min(100,Math.max(...yv)+6), ymin=Math.max(0,Math.min(...yv)-10);\n      const rmax=Math.max(...pts.map(p=>p.r),1);\n      const fx=v=>pl+v/xmax*iw, fy=v=>pt+ih-(v-ymin)/((ymax-ymin)||1)*ih, fr=v=>9+Math.sqrt(v/rmax)*33;\n      const kfmt=v=>Math.abs(v)>=1000?(v/1000).toLocaleString('pt-BR',{maximumFractionDigits:0})+'k':String(Math.round(v));\n      const med=a=>{const b=a.slice().sort((x,y)=>x-y),m=Math.floor(b.length/2);return b.length%2?b[m]:(b[m-1]+b[m])/2;};\n      const xmid=(s.xmid!=null?+s.xmid:med(pts.map(p=>p.x))), ymid=(s.ymid!=null?+s.ymid:med(pts.map(p=>p.y)));\n      let out='<svg viewBox=\"0 0 '+W+' '+H+'\" class=\"csvg\" preserveAspectRatio=\"xMidYMid meet\">';\n      for(let g=0;g<=4;g++){const yy=ymin+(ymax-ymin)*g/4,py=fy(yy);out+='<line x1=\"'+pl+'\" y1=\"'+py.toFixed(1)+'\" x2=\"'+(W-pr)+'\" y2=\"'+py.toFixed(1)+'\" class=\"cgrid\"/><text x=\"'+(pl-12)+'\" y=\"'+py.toFixed(1)+'\" class=\"cax\" text-anchor=\"end\" dominant-baseline=\"central\">'+Math.round(yy)+(s.suffix||'%')+'</text>';}\n      for(let g=0;g<=4;g++){const xv=xmax*g/4,px=fx(xv);out+='<text x=\"'+px.toFixed(1)+'\" y=\"'+(H-32)+'\" class=\"cax\" text-anchor=\"middle\">'+(s.prefix||'')+kfmt(xv)+'</text>';}\n      out+='<line x1=\"'+fx(xmid).toFixed(1)+'\" y1=\"'+pt+'\" x2=\"'+fx(xmid).toFixed(1)+'\" y2=\"'+(pt+ih)+'\" stroke=\"#3a3a3a\" stroke-width=\"1\" stroke-dasharray=\"5 5\"/>';\n      out+='<line x1=\"'+pl+'\" y1=\"'+fy(ymid).toFixed(1)+'\" x2=\"'+(W-pr)+'\" y2=\"'+fy(ymid).toFixed(1)+'\" stroke=\"#3a3a3a\" stroke-width=\"1\" stroke-dasharray=\"5 5\"/>';\n      const ql=[[fx(xmax)-6,pt+22,'end','ESTRELAS'],[pl+6,pt+22,'start','ENIGMAS'],[fx(xmax)-6,pt+ih-8,'end','CAVALOS DE BATALHA'],[pl+6,pt+ih-8,'start','REVISAR']];\n      ql.forEach(q=>{out+='<text x=\"'+q[0].toFixed(1)+'\" y=\"'+q[1]+'\" text-anchor=\"'+q[2]+'\" style=\"font-size:15px;fill:#5c5c5c;font-weight:700;letter-spacing:1px\">'+q[3]+'</text>';});\n      pts.forEach(p=>{const cx=fx(p.x),cy=fy(p.y),rr=fr(p.r);out+='<circle cx=\"'+cx.toFixed(1)+'\" cy=\"'+cy.toFixed(1)+'\" r=\"'+rr.toFixed(1)+'\" fill=\"#FFB81C\" fill-opacity=\"0.30\" stroke=\"#FFB81C\" stroke-width=\"2\"/><text x=\"'+cx.toFixed(1)+'\" y=\"'+(cy-rr-6).toFixed(1)+'\" text-anchor=\"middle\" style=\"font-size:19px;fill:#eaeaea;font-weight:600\">'+p.label+'</text>';});\n      out+='<text x=\"'+(pl+iw/2).toFixed(1)+'\" y=\"'+(H-8)+'\" text-anchor=\"middle\" style=\"font-size:16px;fill:#9a9a9a\">'+(s.xlabel||'Faturamento')+'  ·  tamanho da bolha = lucro</text>';\n      out+='<text x=\"24\" y=\"'+(pt+ih/2).toFixed(1)+'\" text-anchor=\"middle\" style=\"font-size:16px;fill:#9a9a9a\" transform=\"rotate(-90 24 '+(pt+ih/2).toFixed(1)+')\">'+(s.ylabel||'Margem')+'</text>';\n      return out+'</svg>';\n    }\n    if(ct==='stackbar'){\n      const COLORS=s.colors||['#B8801A','#FFB81C','#FFE08A'];\n      const series=s.series||[];\n      const dd=(s.data||[]).map(d=>({label:enc(d.label),parts:(d.parts||[]).map(Number)}));\n      const totals=dd.map(d=>d.parts.reduce((a,b)=>a+b,0));\n      const mx=Math.max(1,...totals);\n      const fmtS=v=>{let n=Number(v),t; if(s.compact&&Math.abs(n)>=1000)t=(n/1000).toLocaleString('pt-BR',{maximumFractionDigits:0})+'k'; else t=String(Math.round(n)); return (s.prefix||'')+t+(s.suffix||'');};\n      const W=1000,H=560,pl=82,pr=24,pt=88,pb=64,iw=W-pl-pr,ih=H-pt-pb,n=dd.length,slot=iw/n,bw=Math.min(96,slot*0.5);\n      let out='<svg viewBox=\"0 0 '+W+' '+H+'\" class=\"csvg\" preserveAspectRatio=\"xMidYMid meet\">';\n      let lx=pl; series.forEach((nm,i)=>{out+='<rect x=\"'+lx+'\" y=\"18\" width=\"20\" height=\"20\" rx=\"3\" fill=\"'+COLORS[i%COLORS.length]+'\"/><text x=\"'+(lx+27)+'\" y=\"28\" class=\"cax\" text-anchor=\"start\" dominant-baseline=\"central\" style=\"fill:#ccc\">'+enc(nm)+'</text>'; lx+=70+enc(nm).length*11;});\n      for(let g=0;g<=4;g++){const gy=pt+ih-(g/4*ih);out+='<line x1=\"'+pl+'\" y1=\"'+gy.toFixed(1)+'\" x2=\"'+(W-pr)+'\" y2=\"'+gy.toFixed(1)+'\" class=\"cgrid\"/><text x=\"'+(pl-12)+'\" y=\"'+gy.toFixed(1)+'\" class=\"cax\" text-anchor=\"end\" dominant-baseline=\"central\">'+fmtS(mx*g/4)+'</text>';}\n      dd.forEach((d,i)=>{const cx=pl+slot*i+slot/2; let yTop=pt+ih;\n        d.parts.forEach((v,j)=>{const h=v/mx*ih,y=yTop-h; out+='<rect x=\"'+(cx-bw/2).toFixed(1)+'\" y=\"'+y.toFixed(1)+'\" width=\"'+bw.toFixed(1)+'\" height=\"'+h.toFixed(1)+'\" fill=\"'+COLORS[j%COLORS.length]+'\"/>'; yTop=y;});\n        out+='<text x=\"'+cx.toFixed(1)+'\" y=\"'+(yTop-12).toFixed(1)+'\" class=\"cval\" text-anchor=\"middle\">'+fmtS(totals[i])+'</text>';\n        out+='<text x=\"'+cx.toFixed(1)+'\" y=\"'+(H-24)+'\" class=\"cax\" text-anchor=\"middle\">'+d.label+'</text>';});\n      return out+'</svg>';\n    }\n    const max = Math.max(1, ...data.map(d=>d.v));\n    const fmt = v => { let n=Number(v), t;\n      if(s.compact && Math.abs(n)>=1000) t=(n/1000).toLocaleString('pt-BR',{maximumFractionDigits: Math.abs(n)>=10000?0:1})+'k';\n      else t=Math.round(n).toLocaleString('pt-BR');\n      return (s.prefix||'')+t+(s.suffix||''); };\n    const W=1000; let out='';\n    if(ct==='hbar'){\n      const n=data.length, rh=Math.max(46, 520/n), H=n*rh, lw=340, x0=lw+18, bw=W-x0-160;\n      out='<svg viewBox=\"0 0 '+W+' '+H.toFixed(0)+'\" class=\"csvg\" preserveAspectRatio=\"xMidYMid meet\">';\n      for(let i=0;i<n;i++){ const d=data[i], cy=i*rh+rh/2, bh=Math.min(34,rh*0.5), by=cy-bh/2, w=Math.max(2, d.v/max*bw);\n        out+='<text x=\"'+lw+'\" y=\"'+cy.toFixed(1)+'\" class=\"clab\" text-anchor=\"end\" dominant-baseline=\"central\">'+d.label+'</text>';\n        out+='<rect x=\"'+x0+'\" y=\"'+by.toFixed(1)+'\" width=\"'+w.toFixed(1)+'\" height=\"'+bh.toFixed(1)+'\" rx=\"3\" fill=\"'+GOLD+'\"/>';\n        out+='<text x=\"'+(x0+w+12).toFixed(1)+'\" y=\"'+cy.toFixed(1)+'\" class=\"cval\" dominant-baseline=\"central\">'+fmt(d.v)+'</text>'; }\n      return out+'</svg>';\n    }\n    if(ct==='line'){\n      const H=520, pl=82, pr=28, pt=28, pb=52, iw=W-pl-pr, ih=H-pt-pb, n=data.length;\n      const xf=i=> pl + (n<=1? iw/2 : i/(n-1)*iw);\n      const yf=v=> pt + ih - (v/max*ih);\n      out='<svg viewBox=\"0 0 '+W+' '+H+'\" class=\"csvg\" preserveAspectRatio=\"xMidYMid meet\">';\n      for(let g=0;g<=4;g++){ const gy=pt+ih-(g/4*ih); out+='<line x1=\"'+pl+'\" y1=\"'+gy.toFixed(1)+'\" x2=\"'+(W-pr)+'\" y2=\"'+gy.toFixed(1)+'\" class=\"cgrid\"/><text x=\"'+(pl-12)+'\" y=\"'+gy.toFixed(1)+'\" class=\"cax\" text-anchor=\"end\" dominant-baseline=\"central\">'+fmt(max*g/4)+'</text>'; }\n      let area='M'+xf(0).toFixed(1)+' '+(pt+ih).toFixed(1)+' ', line='';\n      for(let i=0;i<n;i++){ const x=xf(i).toFixed(1), y=yf(data[i].v).toFixed(1); line+=(i?'L':'M')+x+' '+y+' '; area+='L'+x+' '+y+' '; }\n      area+='L'+xf(n-1).toFixed(1)+' '+(pt+ih).toFixed(1)+' Z';\n      out+='<path d=\"'+area+'\" fill=\"'+GOLD+'\" fill-opacity=\"0.12\"/><path d=\"'+line+'\" fill=\"none\" stroke=\"'+GOLD+'\" stroke-width=\"3\" stroke-linejoin=\"round\"/>';\n      const step=Math.ceil(n/9);\n      for(let i=0;i<n;i++){ out+='<circle cx=\"'+xf(i).toFixed(1)+'\" cy=\"'+yf(data[i].v).toFixed(1)+'\" r=\"3.2\" fill=\"'+GOLD+'\"/>'; if(i%step===0||i===n-1) out+='<text x=\"'+xf(i).toFixed(1)+'\" y=\"'+(H-14)+'\" class=\"cax\" text-anchor=\"middle\">'+data[i].label+'</text>'; }\n      return out+'</svg>';\n    }\n    const H=520, pl=82, pr=24, pt=40, pb=60, iw=W-pl-pr, ih=H-pt-pb, n=data.length, slot=iw/n, bw=Math.min(74, slot*0.62);\n    out='<svg viewBox=\"0 0 '+W+' '+H+'\" class=\"csvg\" preserveAspectRatio=\"xMidYMid meet\">';\n    for(let g=0;g<=4;g++){ const gy=pt+ih-(g/4*ih); out+='<line x1=\"'+pl+'\" y1=\"'+gy.toFixed(1)+'\" x2=\"'+(W-pr)+'\" y2=\"'+gy.toFixed(1)+'\" class=\"cgrid\"/><text x=\"'+(pl-12)+'\" y=\"'+gy.toFixed(1)+'\" class=\"cax\" text-anchor=\"end\" dominant-baseline=\"central\">'+fmt(max*g/4)+'</text>'; }\n    for(let i=0;i<n;i++){ const d=data[i], cx=pl+slot*i+slot/2, h=Math.max(1,d.v/max*ih), y=pt+ih-h;\n      out+='<rect x=\"'+(cx-bw/2).toFixed(1)+'\" y=\"'+y.toFixed(1)+'\" width=\"'+bw.toFixed(1)+'\" height=\"'+h.toFixed(1)+'\" rx=\"3\" fill=\"'+GOLD+'\"/>';\n      out+='<text x=\"'+cx.toFixed(1)+'\" y=\"'+(y-12).toFixed(1)+'\" class=\"cval\" text-anchor=\"middle\">'+fmt(d.v)+'</text>';\n      out+='<text x=\"'+cx.toFixed(1)+'\" y=\"'+(H-22)+'\" class=\"cax\" text-anchor=\"middle\">'+d.label+'</text>'; }\n    return out+'</svg>';\n  };\n\n  const R = {\n    chart:s=>`<div class=\"slide chart\"><div class=\"pad\">${kick(s.kicker,s.number)}<h2 class=\"title\">${eS(s.title)}</h2><div class=\"chartwrap\">${_chartSVG(s)}</div>${s.note?`<div class=\"note\">${eS(s.note)}</div>`:''}</div>${foot()}</div>`,\n    cover:s=>`<div class=\"slide cover\">${img(s.image,'bg')}<div class=\"scrim\"></div><div class=\"grain\"></div><div class=\"pad\">\n      <div class=\"top\">${s.kicker?kick(s.kicker):'<span></span>'}${s.logo?`<img class=\"logo\" src=\"${LOGO}\">`:''}</div>\n      <div class=\"ttl\"><h2 class=\"title\">${eS(s.title)}</h2><div class=\"rule\"></div>${s.subtitle?`<div class=\"sub\">${eS(s.subtitle)}</div>`:''}</div></div></div>`,\n    statement:s=>`<div class=\"slide statement\">${img(s.image,'bg')}<div class=\"scrim\"></div><div class=\"grain\"></div><div class=\"pad\">\n      ${kick(s.kicker)}<h2 class=\"title\" style=\"margin-top:${s.kicker?'22px':'0'}\">${eS(s.title)}</h2>${s.sub?`<div class=\"sub\">${eS(s.sub)}</div>`:''}</div></div>`,\n    section:s=>`<div class=\"slide section\">${img(s.image,'bg')}<div class=\"scrim\"></div><div class=\"grain\"></div>${s.number?`<div class=\"ghost\">${eS(s.number)}</div>`:''}<div class=\"pad\">${kick(s.kicker,s.number)}<h2 class=\"title\" style=\"margin-top:20px\">${eS(s.title)}</h2></div>${foot()}</div>`,\n    text:s=>`<div class=\"slide text\"><div class=\"pad\">${s.image?img(s.image,'top-img'):''}${kick(s.kicker,s.number)}<h2 class=\"title\">${eS(s.title)}</h2><div class=\"body\">${paras(s.body)}</div></div>${foot()}</div>`,\n    split:s=>`<div class=\"slide split ${s.side==='left'?'rev':''}\"><div class=\"half txt\">${kick(s.kicker,s.number)}<h2 class=\"title\">${eS(s.title)}</h2><div class=\"body\">${paras(s.body)}</div></div><div class=\"half img\">${img(s.image)}</div>${foot()}</div>`,\n    trio:s=>`<div class=\"slide trio\"><div class=\"pad\">${kick(s.kicker,s.number)}<h2 class=\"title\">${eS(s.title)}</h2>\n      <div class=\"cols\">${(s.cards||[]).map(c=>`<div class=\"col\">${img(c.image)}<h3>${eS(c.title)}</h3><p>${eS(c.text)}</p></div>`).join('')}</div></div>${foot()}</div>`,\n    gallery:s=>`<div class=\"slide gallery\"><div class=\"pad\">${s.title?`<h2 class=\"title\">${eS(s.title)}</h2>`:''}\n      <div class=\"grid2\">${(s.items||[]).map(it=>img(it.image||it)).join('')}</div></div>${foot()}</div>`,\n    data:s=>`<div class=\"slide data\"><div class=\"pad\">${kick(s.kicker,s.number)}<h2 class=\"title\">${eS(s.title)}</h2>\n      <div class=\"stats\">${stats(s).map(k=>`<div class=\"stat\"><div class=\"big\">${eS(k.big)}</div><div class=\"lab\">${eS(k.label)}</div>${k.sub?`<div class=\"ksub\">${eS(k.sub)}</div>`:''}</div>`).join('')}</div>\n      ${s.note?`<div class=\"note\">${eS(s.note)}</div>`:''}${s.image?img(s.image,'planta'):''}</div>${foot()}</div>`,\n    bigstat:s=>`<div class=\"slide bigstat\">${img(s.image,'bg')}<div class=\"scrim\"></div><div class=\"pad\">${kick(s.kicker)}<div class=\"big\">${eS(s.big)}</div><div class=\"lab\">${eS(s.label)}</div>${s.sub?`<div class=\"ksub\">${eS(s.sub)}</div>`:''}</div>${foot()}</div>`,\n    amenities:s=>`<div class=\"slide amenities\"><div class=\"pad\">${kick(s.kicker,s.number)}<h2 class=\"title\">${eS(s.title)}</h2>\n      <div class=\"amg\">${(s.items||[]).map(it=>`<div class=\"am\"><h4>${eS(it.title)}</h4><p>${eS(it.desc)}</p></div>`).join('')}</div></div>${foot()}</div>`,\n    quote:s=>`<div class=\"slide quote\">${img(s.image,'bg')}<div class=\"scrim\"></div><div class=\"grain\"></div><div class=\"pad\"><div class=\"q\">${eS(s.text)}</div>${s.author?`<div class=\"au\">${eS(s.author)}</div>`:''}</div></div>`,\n    list:s=>`<div class=\"slide list\"><div class=\"pad\">${kick(s.kicker,s.number)}<h2 class=\"title\">${eS(s.title)}</h2>\n      ${(s.items||[]).map((it,i)=>`<div class=\"li\"><div class=\"n\">${String(i+1).padStart(2,'0')}</div><div><div class=\"lead\">${eS(it.lead)}</div><div class=\"desc\">${eS(it.desc)}</div></div></div>`).join('')}</div>${foot()}</div>`,\n    image:s=>`<div class=\"slide image\">${img(s.image,'bg')}<div class=\"scrim\" style=\"background:linear-gradient(0deg,#0a0a0af0,#0a0a0a00 45%)\"></div>${s.caption?`<div class=\"pad\" style=\"justify-content:flex-end\"><div class=\"sub\" style=\"font-size:15px;color:#ddd\">${eS(s.caption)}</div></div>`:''}${foot()}</div>`,\n    contact:s=>`<div class=\"slide contact\">${s.image?img(s.image,'bg'):''}${s.image?'<div class=\"scrim\"></div>':''}<div class=\"pad\">\n      <h2 class=\"title\">${eS(s.title||'CONTATO')}</h2><div class=\"crow\">\n      ${s.address?`<div class=\"ci\"><div class=\"cl\">Endereco</div><div class=\"cv\">${eS(s.address)}</div></div>`:''}\n      ${s.hours?`<div class=\"ci\"><div class=\"cl\">Horario</div><div class=\"cv\">${eS(s.hours)}</div></div>`:''}\n      ${s.email?`<div class=\"ci\"><div class=\"cl\">Contato</div><div class=\"cv\">${eS(s.email)}</div></div>`:''}\n      ${s.site?`<div class=\"ci\"><div class=\"cl\">Site</div><div class=\"cv\">${eS(s.site)}</div></div>`:''}\n      </div></div>${foot()}</div>`,\n    closing:s=>`<div class=\"slide closing\">${img(s.image,'bg')}${s.image?'<div class=\"scrim\"></div>':''}<div class=\"pad\">${s.logo?`<img class=\"logo\" src=\"${LOGO}\">`:''}<h2 class=\"title\">${eS(s.title)}</h2>${s.subtitle?`<div class=\"sub\">${eS(s.subtitle)}</div>`:''}</div></div>`\n  };\n  return (R[s.type]||(x=>`<div class=\"slide\"><div class=\"pad\"><h2 class=\"title\">tipo: ${eS(x.type)}</h2></div></div>`))(s);\n}"}}}}}}}},{"_id":"6a7b19211cf9f6f7cf9ff2d4","component":"data2-core-types@Component","system":"6a45d210b5865956b508ba84","params":{"extends":"data2-core-primitives@Block","component":"d5RGnzaKPCoSO7CQgjMZS","package":"tempo","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 LOGO_URL = 'https://tempobyporsche.com/wp-content/uploads/2026/02/logo_tempo_by_porsche_white_V.svg';\nconst LOGO_SOCIAL_URL = 'https://tempobyporsche.com/wp-content/uploads/2026/03/logo-tempo-social.webp';\nconst PRESS_EMAIL = 'oi@tempobyporsche.com';\nconst MAILTO = 'mailto:oi@tempobyporsche.com?subject=Contato%20de%20imprensa%20%E2%80%94%20TEMPO%20by%20Porsche';\nconst SITE_URL = 'https://tempobyporsche.com';\nconst INSTAGRAM_URL = 'https://www.instagram.com/tempobyporsche/';\nconst WHATSAPP_URL = 'https://wa.me/5511992784331';\nconst ADONIS_URL = 'https://www.adonisalcici.com';\nconst ADONIS_MANIFESTO_URL = 'https://www.adonisalcici.com/pages/manifesto';\nconst ADONIS_MARKS = ['Porsche AG', 'TAG Heuer', 'Motul', 'Hagerty', 'Art Basel — Miami', 'Icons of Porsche — Dubai'];\n\nconst COPY_TEXTS = {\n  short: 'A TEMPO by Porsche é o primeiro hub cultural permanente da Porsche nas Américas. Localizado em Pinheiros, São Paulo, o espaço integra arte, gastronomia, música e cultura automotiva em um mesmo endereço. Idealizado pelo artista plástico Adonis Alcici em parceria com a Porsche Brasil, o projeto propõe uma nova forma de vivenciar o universo Porsche — para quem vive além da velocidade.',\n  long: 'A TEMPO by Porsche é o primeiro hub cultural permanente da Porsche nas Américas. Um espaço que integra arte, gastronomia, música e cultura automotiva, conectando a marca a novos contextos, públicos e experiências. Localizada em São Paulo, a TEMPO foi concebida como um ponto de encontro entre diferentes linguagens criativas, onde cultura, design e lifestyle se cruzam para criar uma experiência que vai além do universo automotivo.\\n\\nMais do que um lugar, a TEMPO funciona como um ecossistema de encontros, curadoria e conteúdo. Ao reunir diferentes linguagens criativas em um mesmo ambiente, o projeto propõe uma nova forma de vivenciar o universo Porsche — onde cultura, design e lifestyle se encontram para criar experiências que vão além do automóvel.\\n\\nIdealizada pelo artista plástico Adonis Alcici em parceria com a Porsche Brasil, a TEMPO foi pensada como um ponto de convergência entre marca, cidade e comunidade criativa. Um espaço onde performance, design e cultura se conectam para gerar novas narrativas e relações.\\n\\nNa TEMPO, a gastronomia nasce da diversidade e da riqueza da culinária brasileira, reinterpretada com uma abordagem contemporânea. O espaço também recebe eventos privados de marcas e empresas e mantém um programa de membership com acesso mediante curadoria.',\n  grafia: 'Na primeira menção, escreva \"TEMPO by Porsche\". Nas menções seguintes, apenas \"TEMPO\". Evite as grafias \"Tempo By Porsche\", \"TEMPO Porsche\" e \"Tempo\".',\n  credito: 'Foto: Divulgação/TEMPO by Porsche',\n  adonis: 'Adonis Alcici é um artista plástico brasileiro apaixonado por velocidade. Suas obras traduzem, nos traços e nas texturas das pinceladas, a sensação de movimento e as emoções que os carros provocam — com as setas, elemento-assinatura do artista, reforçando a aerodinâmica das formas automotivas. Presente no mercado de luxo global, desenvolveu projetos e ações para marcas como Porsche, TAG Heuer, Motul e Hagerty, com apresentações em São Paulo, na Art Basel em Miami, na Califórnia, em Daytona, Dubai, na França e na Alemanha. Entre os trabalhos com a Porsche estão o Macan Art Car, criado na Style Porsche em Weissach, a performance ao vivo no Icons of Porsche, em Dubai, e a idealização da TEMPO by Porsche — primeiro hub cultural permanente da marca nas Américas — em parceria com a Porsche Brasil.',\n};\n\nconst FACTS = [\n  { k: 'Nome oficial', v: 'TEMPO by Porsche' },\n  { k: 'O que é', v: 'O primeiro hub cultural permanente da Porsche nas Américas' },\n  { k: 'Pilares', v: 'Arte · Gastronomia · Música · Cultura automotiva' },\n  { k: 'Endereço', v: 'Rua Maria Carolina, 624 — Pinheiros, São Paulo/SP, Brasil' },\n  { k: 'Funcionamento', v: 'Segunda, 10h às 18h · Terça a sexta, 10h às 23h · Sábado e domingo, 09h às 23h' },\n  { k: 'Idealização', v: 'Adonis Alcici, artista plástico, em parceria com a Porsche Brasil' },\n  { k: 'Gastronomia', v: 'Culinária brasileira em releitura contemporânea, com carta de vinhos, bar e programa de cafés' },\n  { k: 'Eventos privados', v: 'Espaço adaptável para eventos corporativos, com capacidade para até 200 convidados em diferentes configurações' },\n  { k: 'Membership', v: 'Acesso mediante curadoria, para um grupo limitado' },\n  { k: 'Canais', v: 'tempobyporsche.com · @tempobyporsche' },\n];\n\nconst GUIDELINES = [\n  'As fotos e os textos desta página são material oficial de divulgação e podem ser usados livremente em conteúdo editorial (matérias, notas, colunas e redes sociais de veículos de imprensa).',\n  'Crédito obrigatório nas fotos: \"Foto: Divulgação/TEMPO by Porsche\".',\n  'Cada foto tem dois downloads: HD — versão em alta resolução, pronta para publicação digital — e RAW — arquivo original sem compressão, na resolução máxima, ideal para impressão e grandes formatos.',\n  'Não aplique filtros, sobreposições, distorções ou recortes que alterem o logotipo ou descaracterizem as imagens.',\n  'O uso comercial ou publicitário do material — fora do contexto editorial — requer autorização prévia da TEMPO by Porsche.',\n  'Em caso de dúvida sobre um uso específico, escreva para ' + PRESS_EMAIL + '.',\n];\n\nconst FAQ = [\n  {\n    q: 'O que é a TEMPO by Porsche?',\n    a: 'É o primeiro hub cultural permanente da Porsche nas Américas: um espaço em São Paulo que reúne arte, gastronomia, música e cultura automotiva. Foi idealizado pelo artista plástico Adonis Alcici em parceria com a Porsche Brasil.',\n  },\n  {\n    q: 'Onde fica e quais são os horários?',\n    a: 'Rua Maria Carolina, 624 — Pinheiros, São Paulo/SP. Funciona às segundas, das 10h às 18h; de terça a sexta-feira, das 10h às 23h; e aos sábados e domingos, das 09h às 23h.',\n  },\n  {\n    q: 'Posso publicar as fotos desta página?',\n    a: 'Sim. Todas as fotos são material oficial de divulgação, liberadas para uso editorial com o crédito \"Foto: Divulgação/TEMPO by Porsche\". Em cada foto, o botão HD baixa a versão em alta resolução (pronta para publicação digital) e o botão RAW baixa o arquivo original, sem compressão, na resolução máxima.',\n  },\n  {\n    q: 'Como solicito entrevistas, pautas ou informações adicionais?',\n    a: 'Escreva para ' + PRESS_EMAIL + ' com o veículo, o tema da pauta e o prazo. A equipe da TEMPO direciona ao porta-voz adequado.',\n  },\n  {\n    q: 'Como funciona o credenciamento de imprensa para eventos?',\n    a: 'O credenciamento é feito por e-mail, com antecedência, pelo ' + PRESS_EMAIL + '. Informe veículo, nomes completos da equipe (incluindo fotógrafo/vídeo, se houver) e o evento de interesse.',\n  },\n  {\n    q: 'A TEMPO é aberta ao público?',\n    a: 'A experiência gastronômica e a programação cultural recebem o público nos horários de funcionamento (reservas pelo site ou WhatsApp). Já o TEMPO Membership tem acesso mediante curadoria, para um grupo limitado.',\n  },\n  {\n    q: 'O espaço recebe eventos de outras marcas?',\n    a: 'Sim. A TEMPO recebe eventos privados e corporativos de marcas que se conectam com o universo Porsche, com estrutura completa de catering, som, vídeo, iluminação cênica e estacionamento com manobrista. Cotações pelo site ou pelo ' + PRESS_EMAIL + '.',\n  },\n  {\n    q: 'Preciso de uma foto ou informação que não está aqui. E agora?',\n    a: 'Fale com a gente: ' + PRESS_EMAIL + '. Podemos providenciar imagens específicas, dados atualizados e materiais complementares.',\n  },\n];\n\n// the .wrap scroller is rebuilt on every render — keep its position across setState re-renders\nlet savedScroll = 0;\nfunction bindScroll(root){\n  const w = root.querySelector('.wrap');\n  if (!w || w.__scrollBound) return;\n  w.__scrollBound = true;\n  w.addEventListener('scroll', () => {\n    savedScroll = w.scrollTop;\n    const b = root.querySelector('.top-btn');\n    if (b) b.classList.toggle('show', w.scrollTop > 900);\n  }, { passive: true });\n}\n\nfunction rawUrl(url){\n  const m = /^(.*\\/)([A-Za-z0-9]{1,4})\\/([^/]+)-\\2(\\.\\w+)$/.exec(url || '');\n  return m ? `${m[1]}O/${m[3]}-O${m[4]}` : null;\n}\n\nexport default {\n  css: `\n    .wrap{ font-family:-apple-system,BlinkMacSystemFont,'Helvetica Neue',Arial,sans-serif;\n      background:#0a0a0b; padding:0 0 72px; box-sizing:border-box; color:#eae8e3;\n      -webkit-font-smoothing:antialiased;\n      /* own scroller: the host doesn't re-measure height after the 120 photos load async,\n         so page scroll clamps mid-gallery — pin to viewport and scroll internally */\n      position:fixed; inset:0; overflow-y:auto; overflow-x:hidden; -webkit-overflow-scrolling:touch; }\n    .inner{ max-width:1360px; margin:0 auto; padding:0 28px; box-sizing:border-box; }\n\n    /* ── top nav ── */\n    .nav{ position:sticky; top:0; z-index:500; background:rgba(10,10,11,.86);\n      backdrop-filter:blur(14px); -webkit-backdrop-filter:blur(14px);\n      border-bottom:1px solid rgba(255,255,255,.08); }\n    .nav-in{ max-width:1360px; margin:0 auto; padding:14px 28px; display:flex; align-items:center;\n      justify-content:space-between; gap:18px; }\n    .nav .logo{ height:24px; width:auto; display:block; }\n    .nav-links{ display:flex; align-items:center; gap:22px; flex-wrap:wrap; }\n    .nav-link{ font-size:11.5px; letter-spacing:.14em; text-transform:uppercase; color:#a8a6a1;\n      cursor:pointer; transition:color .2s ease; white-space:nowrap; }\n    .nav-link:hover{ color:#f3f1ec; }\n    .nav-mail{ font-size:11.5px; letter-spacing:.06em; color:#0a0a0b; background:#eae8e3;\n      padding:8px 16px; border-radius:999px; text-decoration:none; white-space:nowrap;\n      transition:background .2s ease; font-weight:600; }\n    .nav-mail:hover{ background:#fff; }\n\n    /* ── hero ── */\n    .hero{ position:relative; border-bottom:1px solid rgba(255,255,255,.08); overflow:hidden; }\n    .hero .inner{ position:relative; z-index:2; padding-top:96px; padding-bottom:72px; }\n    .hero-bg{ position:absolute; inset:0; z-index:0; }\n    .hero-bg img{ width:100%; height:100%; object-fit:cover; opacity:0; transition:opacity 1.4s ease; filter:saturate(.85); }\n    .hero-bg img.loaded{ opacity:.38; }\n    .hero-veil{ position:absolute; inset:0; z-index:1;\n      background:linear-gradient(180deg, rgba(10,10,11,.5) 0%, rgba(10,10,11,.72) 55%, #0a0a0b 100%); }\n    .eyebrow{ font-size:11px; letter-spacing:.28em; text-transform:uppercase; color:#8c8a85; margin-bottom:18px; }\n    .hero h1{ font-size:44px; line-height:1.08; font-weight:600; letter-spacing:.01em; color:#f3f1ec;\n      margin:0 0 14px; max-width:820px; }\n    .hero .tagline{ font-size:16px; color:#a8a6a1; font-style:italic; margin-bottom:22px; }\n    .hero .lede{ font-size:15px; line-height:1.65; color:#c9c7c2; max-width:760px; margin-bottom:34px; }\n    .btn-row{ display:flex; gap:12px; flex-wrap:wrap; }\n    .btn{ display:inline-flex; align-items:center; gap:8px; font-size:12.5px; letter-spacing:.08em;\n      text-transform:uppercase; font-weight:600; padding:13px 26px; border-radius:999px; cursor:pointer;\n      text-decoration:none; transition:background .2s ease, border-color .2s ease, color .2s ease;\n      border:1px solid transparent; }\n    .btn-solid{ background:#eae8e3; color:#0a0a0b; }\n    .btn-solid:hover{ background:#fff; }\n    .btn-ghost{ background:transparent; color:#eae8e3; border-color:rgba(255,255,255,.24); }\n    .btn-ghost:hover{ border-color:rgba(255,255,255,.5); }\n\n    /* ── adonis ── */\n    .ad-grid{ display:grid; grid-template-columns:5fr 7fr; gap:44px; align-items:start; }\n    .ad-quote{ font-size:26px; line-height:1.45; color:#f3f1ec; font-style:italic;\n      font-family:Georgia,'Times New Roman',serif; border-left:2px solid rgba(255,255,255,.25); padding-left:24px; }\n    .ad-quote .qa{ display:block; margin-top:18px; font-size:11px; letter-spacing:.24em; text-transform:uppercase;\n      color:#8c8a85; font-style:normal; font-family:-apple-system,BlinkMacSystemFont,'Helvetica Neue',Arial,sans-serif; }\n    .ad-bio p{ font-size:14px; line-height:1.75; color:#c9c7c2; margin:0 0 14px; }\n    .ad-bio b{ color:#f3f1ec; font-weight:600; }\n    .ad-chips{ display:flex; flex-wrap:wrap; gap:8px; margin-top:12px; }\n    .chip{ font-size:10.5px; letter-spacing:.12em; text-transform:uppercase; color:#a8a6a1;\n      border:1px solid rgba(255,255,255,.14); border-radius:999px; padding:7px 14px; white-space:nowrap; }\n    .ad-manifesto{ margin-top:34px; background:#121214; border:1px solid rgba(255,255,255,.07);\n      border-radius:10px; padding:26px 28px; }\n    .ad-manifesto .amt{ font-size:10.5px; letter-spacing:.24em; text-transform:uppercase; color:#8c8a85; margin-bottom:12px; }\n    .ad-manifesto p{ font-size:14.5px; line-height:1.75; color:#dcdad5; font-style:italic; margin:0;\n      font-family:Georgia,'Times New Roman',serif; }\n    .ad-actions{ display:flex; gap:12px; flex-wrap:wrap; margin-top:22px; }\n\n    /* ── back to top ── */\n    .top-btn{ position:fixed; right:26px; bottom:26px; width:46px; height:46px; border-radius:50%;\n      background:rgba(20,20,22,.85); border:1px solid rgba(255,255,255,.18); display:flex; align-items:center;\n      justify-content:center; cursor:pointer; z-index:800; color:#eae8e3; opacity:0; pointer-events:none;\n      transform:translateY(8px); transition:opacity .25s ease, transform .25s ease, background .2s ease; }\n    .top-btn.show{ opacity:1; pointer-events:auto; transform:translateY(0); }\n    .top-btn:hover{ background:rgba(42,42,46,.95); }\n    .top-btn svg{ width:16px; height:16px; display:block; }\n\n    /* ── sections ── */\n    .section{ padding:60px 0 8px; scroll-margin-top:76px; }\n    .sec-head{ display:flex; align-items:baseline; justify-content:space-between; gap:16px;\n      flex-wrap:wrap; margin-bottom:8px; }\n    .h2{ font-size:22px; font-weight:600; letter-spacing:.02em; color:#f3f1ec; margin:0 0 6px; }\n    .sec-note{ font-size:13px; color:#8c8a85; max-width:760px; line-height:1.6; margin-bottom:26px; }\n\n    /* boilerplate copy boxes */\n    .copy-grid{ display:grid; grid-template-columns:1fr 1fr; gap:16px; }\n    .copybox{ background:#121214; border:1px solid rgba(255,255,255,.07); border-radius:10px;\n      padding:24px; display:flex; flex-direction:column; gap:14px; }\n    .copybox .cb-head{ display:flex; align-items:center; justify-content:space-between; gap:12px; }\n    .copybox .cb-title{ font-size:11px; letter-spacing:.2em; text-transform:uppercase; color:#8c8a85; }\n    .copybtn{ font-size:11px; letter-spacing:.08em; text-transform:uppercase; color:#eae8e3;\n      background:rgba(255,255,255,.06); border:1px solid rgba(255,255,255,.16); border-radius:999px;\n      padding:7px 14px; cursor:pointer; transition:background .2s ease, border-color .2s ease;\n      white-space:nowrap; }\n    .copybtn:hover{ background:rgba(255,255,255,.12); border-color:rgba(255,255,255,.32); }\n    .copybox p{ font-size:13.5px; line-height:1.7; color:#c9c7c2; margin:0 0 10px; }\n    .copybox p:last-child{ margin-bottom:0; }\n\n    /* fact sheet */\n    .facts{ display:grid; grid-template-columns:repeat(auto-fill,minmax(300px,1fr)); gap:14px; }\n    .fact{ background:#121214; border:1px solid rgba(255,255,255,.07); border-radius:10px; padding:20px 22px; }\n    .fact .fk{ font-size:10.5px; letter-spacing:.2em; text-transform:uppercase; color:#8c8a85; margin-bottom:8px; }\n    .fact .fv{ font-size:14px; line-height:1.55; color:#eae8e3; }\n\n    /* logos */\n    .logos-row{ display:grid; grid-template-columns:repeat(auto-fill,minmax(300px,1fr)); gap:16px; }\n    .logo-card{ background:#121214; border:1px solid rgba(255,255,255,.07); border-radius:10px;\n      overflow:hidden; display:flex; flex-direction:column; }\n    .logo-card .lc-preview{ height:170px; display:flex; align-items:center; justify-content:center;\n      background:radial-gradient(120% 120% at 50% 0%, #1a1a1d 0%, #0e0e10 100%); }\n    .logo-card .lc-preview img{ max-height:64px; max-width:70%; object-fit:contain; }\n    .logo-card .lc-meta{ padding:16px 20px; display:flex; align-items:center; justify-content:space-between;\n      gap:12px; border-top:1px solid rgba(255,255,255,.06); }\n    .logo-card .lc-name{ font-size:13px; color:#eae8e3; }\n    .logo-card .lc-sub{ font-size:11.5px; color:#8c8a85; margin-top:3px; }\n    .lc-dl{ font-size:11px; letter-spacing:.08em; text-transform:uppercase; color:#eae8e3;\n      background:rgba(255,255,255,.06); border:1px solid rgba(255,255,255,.16); border-radius:999px;\n      padding:7px 14px; text-decoration:none; white-space:nowrap; transition:background .2s ease; }\n    .lc-dl:hover{ background:rgba(255,255,255,.12); }\n\n    /* guidelines */\n    .rules{ display:flex; flex-direction:column; gap:0; border:1px solid rgba(255,255,255,.07);\n      border-radius:10px; overflow:hidden; }\n    .rule{ display:flex; gap:18px; padding:18px 22px; background:#121214; align-items:baseline; }\n    .rule + .rule{ border-top:1px solid rgba(255,255,255,.06); }\n    .rule .rn{ font-size:11px; color:#8c8a85; letter-spacing:.1em; min-width:22px; }\n    .rule .rt{ font-size:13.5px; line-height:1.65; color:#c9c7c2; }\n    .rule .rt b{ color:#eae8e3; font-weight:600; }\n    .credit-line{ display:flex; align-items:center; gap:14px; margin-top:14px; flex-wrap:wrap; }\n    .credit-chip{ font-size:13px; color:#eae8e3; background:#121214; border:1px dashed rgba(255,255,255,.22);\n      border-radius:8px; padding:10px 16px; font-family:ui-monospace,SFMono-Regular,Menlo,monospace; }\n\n    /* gallery (existing) */\n    .grid{ display:grid; grid-template-columns:repeat(auto-fill,minmax(240px,1fr)); gap:16px; }\n    .cell{ position:relative; aspect-ratio:4/3; border-radius:8px; overflow:hidden;\n      background:#141416; cursor:pointer; }\n    .cell img{ position:absolute; inset:0; width:100%; height:100%; object-fit:cover;\n      transition:transform .5s cubic-bezier(.2,.7,.3,1), opacity .5s ease; opacity:0; }\n    .cell img.loaded{ opacity:1; }\n    .cell:hover img{ transform:scale(1.045); }\n    .veil{ position:absolute; inset:0; background:linear-gradient(180deg, rgba(0,0,0,0) 55%, rgba(0,0,0,.75) 100%);\n      opacity:0; transition:opacity .25s ease; }\n    .cell:hover .veil{ opacity:1; }\n    .cellbar{ position:absolute; right:10px; bottom:10px; display:flex; gap:8px;\n      opacity:0; transform:translateY(6px); transition:opacity .25s ease, transform .25s ease; }\n    .cell:hover .cellbar{ opacity:1; transform:translateY(0); }\n    .pill{ display:inline-flex; align-items:center; gap:7px; padding:8px 13px; border-radius:999px;\n      background:rgba(10,10,11,.78); border:1px solid rgba(255,255,255,.22); color:#eae8e3;\n      font-size:10.5px; letter-spacing:.12em; font-weight:600; text-decoration:none; cursor:pointer;\n      transition:background .2s ease, border-color .2s ease; white-space:nowrap; }\n    .pill svg{ width:13px; height:13px; display:block; }\n    .pill:hover{ background:rgba(32,32,34,.95); border-color:rgba(255,255,255,.4); }\n    .empty{ margin:80px auto; text-align:center; color:#6f6d68; font-size:13px; letter-spacing:.03em; }\n    .skeleton{ position:absolute; inset:0; background:linear-gradient(100deg,#141416 30%,#1d1d20 50%,#141416 70%);\n      background-size:200% 100%; animation:shimmer 1.4s infinite; border-radius:8px; }\n    @keyframes shimmer{ 0%{background-position:200% 0} 100%{background-position:-200% 0} }\n    .lightbox{ position:fixed; inset:0; background:rgba(6,6,7,.95); display:flex; align-items:center;\n      justify-content:center; z-index:9999; opacity:0; pointer-events:none; transition:opacity .25s ease;\n      padding:56px; box-sizing:border-box; }\n    .lightbox.open{ opacity:1; pointer-events:auto; }\n    .lightbox img{ max-width:100%; max-height:100%; object-fit:contain; border-radius:4px;\n      box-shadow:0 30px 90px rgba(0,0,0,.65); }\n    .lb-btn{ position:absolute; display:flex; align-items:center; justify-content:center;\n      background:rgba(20,20,22,.72); border:1px solid rgba(255,255,255,.16); border-radius:50%;\n      color:#eae8e3; cursor:pointer; transition:background .2s ease, border-color .2s ease; text-decoration:none; }\n    .lb-btn:hover{ background:rgba(42,42,46,.88); border-color:rgba(255,255,255,.34); }\n    .lb-close{ top:26px; right:26px; width:42px; height:42px; }\n    .lb-close svg{ width:16px; height:16px; }\n    .lb-bar{ position:absolute; top:26px; right:84px; display:flex; gap:10px; }\n    .lb-bar .pill{ padding:11px 16px; font-size:11px; }\n    .lb-prev, .lb-next{ width:48px; height:48px; top:50%; transform:translateY(-50%); }\n    .lb-prev{ left:26px; } .lb-prev svg{ width:18px; height:18px; }\n    .lb-next{ right:26px; } .lb-next svg{ width:18px; height:18px; }\n    .lb-count{ position:absolute; bottom:26px; left:50%; transform:translateX(-50%);\n      font-size:12px; letter-spacing:.06em; color:#a8a6a1; }\n\n    /* faq */\n    .faq{ border:1px solid rgba(255,255,255,.07); border-radius:10px; overflow:hidden; }\n    .faq-item{ background:#121214; }\n    .faq-item + .faq-item{ border-top:1px solid rgba(255,255,255,.06); }\n    .faq-q{ display:flex; align-items:center; justify-content:space-between; gap:16px;\n      padding:20px 22px; cursor:pointer; transition:background .2s ease; }\n    .faq-q:hover{ background:#17171a; }\n    .faq-q .qt{ font-size:14.5px; color:#eae8e3; font-weight:500; line-height:1.5; }\n    .faq-q .qi{ font-size:18px; color:#8c8a85; line-height:1; flex-shrink:0; width:18px; text-align:center; }\n    .faq-a{ padding:0 22px 22px; font-size:13.5px; line-height:1.7; color:#c9c7c2; max-width:900px; }\n\n    /* contact */\n    .contact-card{ background:linear-gradient(160deg,#17171a 0%, #101012 100%);\n      border:1px solid rgba(255,255,255,.09); border-radius:14px; padding:44px 40px;\n      display:flex; flex-direction:column; gap:10px; }\n    .contact-card .cc-eyebrow{ font-size:11px; letter-spacing:.28em; text-transform:uppercase; color:#8c8a85; }\n    .contact-card .cc-mail{ font-size:30px; font-weight:600; color:#f3f1ec; text-decoration:none;\n      letter-spacing:.01em; word-break:break-all; }\n    .contact-card .cc-mail:hover{ text-decoration:underline; }\n    .contact-card .cc-note{ font-size:13.5px; color:#a8a6a1; line-height:1.65; max-width:680px; }\n    .cc-links{ display:flex; gap:12px; flex-wrap:wrap; margin-top:16px; }\n\n    /* footer */\n    .footer{ margin-top:64px; padding-top:26px; border-top:1px solid rgba(255,255,255,.08);\n      display:flex; align-items:center; justify-content:space-between; gap:14px; flex-wrap:wrap; }\n    .footer .f-left{ display:flex; align-items:center; gap:14px; }\n    .footer .f-logo{ height:18px; width:auto; opacity:.85; }\n    .footer span, .footer a{ font-size:11.5px; color:#8c8a85; text-decoration:none; letter-spacing:.03em; }\n    .footer a:hover{ color:#eae8e3; }\n\n    /* touch devices: no hover, so keep the download affordance visible */\n    @media (hover: none){\n      .cellbar{ opacity:1; transform:translateY(0); }\n    }\n\n    /* tablet */\n    @media (max-width: 900px){\n      .inner{ padding:0 16px; }\n      .nav-in{ padding:12px 16px; }\n      .nav-links{ gap:14px; }\n      .nav-link{ display:none; }\n      .nav-link.nl-keep{ display:block; }\n      .hero .inner{ padding-top:60px; padding-bottom:48px; }\n      .hero h1{ font-size:32px; }\n      .ad-grid{ grid-template-columns:1fr; gap:26px; }\n      .ad-quote{ font-size:21px; }\n      .top-btn{ right:14px; bottom:14px; width:42px; height:42px; }\n      .section{ padding:44px 0 8px; scroll-margin-top:64px; }\n      .copy-grid{ grid-template-columns:1fr; }\n      .contact-card{ padding:32px 24px; }\n      .contact-card .cc-mail{ font-size:22px; }\n      .grid{ grid-template-columns:repeat(auto-fill,minmax(160px,1fr)); gap:10px; }\n      .cellbar{ opacity:1; transform:translateY(0); }\n      .lightbox{ padding:18px; }\n      .lb-close{ width:38px; height:38px; top:12px; right:12px; }\n      .lb-close svg{ width:15px; height:15px; }\n      .lb-bar{ top:12px; right:58px; gap:8px; }\n      .lb-bar .pill{ padding:9px 13px; font-size:10.5px; }\n      .lb-prev, .lb-next{ width:40px; height:40px; }\n      .lb-prev{ left:8px; } .lb-next{ right:8px; }\n      .lb-count{ bottom:10px; font-size:11px; }\n    }\n\n    /* mobile */\n    @media (max-width: 480px){\n      .nav .logo{ height:19px; }\n      .nav-mail{ padding:7px 12px; font-size:10.5px; }\n      .hero .inner{ padding-top:48px; padding-bottom:40px; }\n      .hero h1{ font-size:26px; }\n      .ad-quote{ font-size:19px; padding-left:16px; }\n      .ad-manifesto{ padding:20px 18px; }\n      .btn{ padding:11px 20px; font-size:11.5px; }\n      .grid{ grid-template-columns:repeat(auto-fill,minmax(130px,1fr)); gap:8px; }\n      .cell{ border-radius:6px; }\n      .facts, .logos-row{ grid-template-columns:1fr; }\n      .pill{ padding:6px 10px; font-size:9.5px; gap:5px; }\n      .lightbox{ padding:6px; }\n      .lb-close{ width:34px; height:34px; top:8px; right:8px; }\n      .lb-bar{ top:8px; right:48px; gap:6px; }\n      .lb-bar .pill{ padding:7px 11px; font-size:9.5px; }\n      .lb-prev, .lb-next{ width:36px; height:36px; }\n      .lb-prev{ left:4px; } .lb-next{ right:4px; }\n      .lb-prev svg, .lb-next svg{ width:15px; height:15px; }\n      .lb-count{ bottom:8px; font-size:10.5px; }\n    }\n  `,\n  render(d2){\n    const ready = d2.state.ready;\n    const rows = d2.state.rows || [];\n    const openFaq = d2.state.openFaq;\n    const ICON_DOWNLOAD = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 3v12\"/><path d=\"M6.5 10.5 12 16l5.5-5.5\"/><path d=\"M5 20h14\"/></svg>`;\n    const ICON_CLOSE = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"><path d=\"M5 5l14 14\"/><path d=\"M19 5 5 19\"/></svg>`;\n    const ICON_PREV = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 5l-7 7 7 7\"/></svg>`;\n    const ICON_NEXT = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 5l7 7-7 7\"/></svg>`;\n\n    let galleryBody;\n    if (!ready) {\n      galleryBody = `<div class=\"grid\">${Array.from({length:10}).map(()=>`<div class=\"cell\"><div class=\"skeleton\"></div></div>`).join('')}</div>`;\n    } else if (!rows.length) {\n      galleryBody = `<div class=\"empty\">Nenhuma foto disponível no momento. Escreva para ${PRESS_EMAIL}.</div>`;\n    } else {\n      const cells = rows.map((r,i) => {\n        const raw = rawUrl(r.full);\n        return `\n        <div class=\"cell\" data-idx=\"${i}\" data-key=\"${r._id}\">\n          <img class=\"ph\" data-src=\"${r.thumb}\" alt=\"\" />\n          <div class=\"veil\"></div>\n          <div class=\"cellbar\">\n            ${raw ? `<a class=\"pill\" href=\"${raw}\" download target=\"_blank\" rel=\"noopener\" title=\"Arquivo original sem compressão — resolução máxima, ideal para impressão\" data-stop=\"1\">${ICON_DOWNLOAD}<span>RAW</span></a>` : ''}\n            <a class=\"pill\" href=\"${r.full}\" download target=\"_blank\" rel=\"noopener\" title=\"Alta resolução — pronta para publicação digital\" data-stop=\"1\">${ICON_DOWNLOAD}<span>HD</span></a>\n          </div>\n        </div>`;\n      }).join('');\n      galleryBody = `<div class=\"grid\">${cells}</div>`;\n    }\n\n    const lb = d2.state.lbIndex;\n    const lbOpen = lb !== null && lb !== undefined;\n    const cur = lbOpen ? rows[lb] : null;\n    const curRaw = cur ? rawUrl(cur.full) : null;\n\n    const factsHtml = FACTS.map(f => `<div class=\"fact\"><div class=\"fk\">${f.k}</div><div class=\"fv\">${f.v}</div></div>`).join('');\n\n    const rulesHtml = GUIDELINES.map((g,i) => `<div class=\"rule\"><div class=\"rn\">0${i+1}</div><div class=\"rt\">${g}</div></div>`).join('');\n\n    const faqHtml = FAQ.map((f,i) => `\n      <div class=\"faq-item\">\n        <div class=\"faq-q\" data-i=\"${i}\">\n          <div class=\"qt\">${f.q}</div>\n          <div class=\"qi\">${openFaq === i ? '−' : '+'}</div>\n        </div>\n        ${openFaq === i ? `<div class=\"faq-a\">${f.a}</div>` : ''}\n      </div>`).join('');\n\n    const photoCount = ready && rows.length ? `${rows.length} fotos em alta resolução` : 'Fotos em alta resolução';\n    const heroBg = ready && rows.length ? rows[0].full : null;\n    const ICON_TOP = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 19V5\"/><path d=\"M5.5 11.5 12 5l6.5 6.5\"/></svg>`;\n\n    return `<div class=\"wrap\">\n\n      <div class=\"nav\">\n        <div class=\"nav-in\">\n          <img class=\"logo\" src=\"${LOGO_URL}\" alt=\"TEMPO by Porsche\" />\n          <div class=\"nav-links\">\n            <div class=\"nav-link\" data-goto=\"sobre\">Sobre</div>\n            <div class=\"nav-link\" data-goto=\"adonis\">Adonis</div>\n            <div class=\"nav-link\" data-goto=\"factsheet\">Fact sheet</div>\n            <div class=\"nav-link nl-keep\" data-goto=\"fotos\">Fotos</div>\n            <div class=\"nav-link\" data-goto=\"marca\">Marca</div>\n            <div class=\"nav-link\" data-goto=\"diretrizes\">Uso</div>\n            <div class=\"nav-link nl-keep\" data-goto=\"faq\">FAQ</div>\n            <a class=\"nav-mail\" href=\"${MAILTO}\">${PRESS_EMAIL}</a>\n          </div>\n        </div>\n      </div>\n\n      <div class=\"hero\">\n        <div class=\"hero-bg\">${heroBg ? `<img class=\"ph\" data-src=\"${heroBg}\" alt=\"\" />` : ''}</div>\n        <div class=\"hero-veil\"></div>\n        <div class=\"inner\">\n          <div class=\"eyebrow\">Sala de Imprensa · Press Kit</div>\n          <h1>TEMPO by Porsche</h1>\n          <div class=\"tagline\">Para quem vive além da velocidade.</div>\n          <div class=\"lede\">Material oficial para jornalistas, veículos e criadores de conteúdo: textos prontos para publicação,\n            fact sheet, fotos em alta resolução e diretrizes de uso da marca. Tudo nesta página é liberado para uso editorial\n            com o devido crédito. Dúvidas, entrevistas e credenciamento: <a href=\"${MAILTO}\" style=\"color:#eae8e3;\">${PRESS_EMAIL}</a>.</div>\n          <div class=\"btn-row\">\n            <div class=\"btn btn-solid\" data-goto=\"fotos\">Ver fotos${ready && rows.length ? ` (${rows.length})` : ''}</div>\n            <a class=\"btn btn-ghost\" href=\"${MAILTO}\">Falar com a equipe</a>\n          </div>\n        </div>\n      </div>\n\n      <div class=\"inner\">\n\n        <div class=\"section\" data-sec=\"sobre\">\n          <div class=\"sec-head\"><h2 class=\"h2\">Sobre a TEMPO</h2></div>\n          <div class=\"sec-note\">Textos oficiais, prontos para citação ou reprodução. Use o botão para copiar.</div>\n          <div class=\"copy-grid\">\n            <div class=\"copybox\">\n              <div class=\"cb-head\"><div class=\"cb-title\">Boilerplate · versão curta</div><button class=\"copybtn\" data-copy=\"short\">Copiar texto</button></div>\n              <div><p>${COPY_TEXTS.short}</p></div>\n            </div>\n            <div class=\"copybox\">\n              <div class=\"cb-head\"><div class=\"cb-title\">Texto institucional · versão completa</div><button class=\"copybtn\" data-copy=\"long\">Copiar texto</button></div>\n              <div>${COPY_TEXTS.long.split('\\n\\n').map(p=>`<p>${p}</p>`).join('')}</div>\n            </div>\n          </div>\n        </div>\n\n        <div class=\"section\" data-sec=\"adonis\">\n          <div class=\"sec-head\">\n            <h2 class=\"h2\">O idealizador — Adonis Alcici</h2>\n            <button class=\"copybtn\" data-copy=\"adonis\">Copiar bio</button>\n          </div>\n          <div class=\"sec-note\">Bio oficial do artista, pronta para publicação. Mais em adonisalcici.com.</div>\n          <div class=\"ad-grid\">\n            <div class=\"ad-quote\">“Sou apaixonado por velocidade e por adrenalina e represento isso na minha arte. É isso o que me move.”<span class=\"qa\">Adonis Alcici</span></div>\n            <div class=\"ad-bio\">\n              <p>Artista plástico brasileiro, Adonis Alcici retrata em suas obras o universo da velocidade. Os traços e as texturas das pinceladas expressam a sensação de movimento e as emoções que os carros provocam; as setas, elemento-assinatura do artista, reforçam a sensação de velocidade e a aerodinâmica das formas automotivas. Através da arte, ele reconstrói a visão sólida do produto, multiplica os sentimentos e ressalta o design.</p>\n              <p>Presente no mercado de luxo global, desenvolve projetos e ações para marcas como Porsche, TAG Heuer, Motul e Hagerty, com apresentações em São Paulo, na Art Basel em Miami, na Califórnia, em Daytona, Dubai, na França e na Alemanha.</p>\n              <p>Entre os trabalhos com a Porsche estão o <b>Macan Art Car</b>, criado na Style Porsche em Weissach, a performance ao vivo no <b>Icons of Porsche</b>, em Dubai — e a <b>TEMPO by Porsche</b>, primeiro hub cultural permanente da marca nas Américas, idealizada por ele em parceria com a Porsche Brasil.</p>\n              <div class=\"ad-chips\">${ADONIS_MARKS.map(m => `<span class=\"chip\">${m}</span>`).join('')}</div>\n            </div>\n          </div>\n          <div class=\"ad-manifesto\">\n            <div class=\"amt\">Do manifesto do artista</div>\n            <p>“Velocidade não é apenas movimento. É um estado de espírito. […] Não é apenas sobre chegar. É sobre estar. Sobre viver o momento em que tempo e espaço se fundem, onde o futuro é criado a cada curva.”</p>\n          </div>\n          <div class=\"ad-actions\">\n            <a class=\"btn btn-ghost\" href=\"${ADONIS_URL}\" target=\"_blank\" rel=\"noopener\">adonisalcici.com</a>\n            <a class=\"btn btn-ghost\" href=\"${ADONIS_MANIFESTO_URL}\" target=\"_blank\" rel=\"noopener\">Manifesto completo</a>\n          </div>\n        </div>\n\n        <div class=\"section\" data-sec=\"factsheet\">\n          <div class=\"sec-head\"><h2 class=\"h2\">Fact sheet</h2></div>\n          <div class=\"sec-note\">Os fatos essenciais, conferidos pela equipe da TEMPO.</div>\n          <div class=\"facts\">${factsHtml}</div>\n        </div>\n\n        <div class=\"section\" data-sec=\"fotos\">\n          <div class=\"sec-head\">\n            <h2 class=\"h2\">Fotos oficiais</h2>\n            <div class=\"sec-note\" style=\"margin-bottom:0;\">${photoCount}</div>\n          </div>\n          <div class=\"sec-note\">Clique em uma foto para ampliar. <b style=\"color:#eae8e3;\">HD</b> baixa a versão em alta\n            resolução, pronta para publicação digital; <b style=\"color:#eae8e3;\">RAW</b> baixa o arquivo original, sem\n            compressão, na resolução máxima — ideal para impressão. Crédito: <b style=\"color:#eae8e3;\">Foto: Divulgação/TEMPO by Porsche</b>.</div>\n          ${galleryBody}\n        </div>\n\n        <div class=\"section\" data-sec=\"marca\">\n          <div class=\"sec-head\"><h2 class=\"h2\">Logotipo e grafia</h2></div>\n          <div class=\"sec-note\">Aplicações oficiais da marca para uso em matérias e créditos visuais.</div>\n          <div class=\"logos-row\">\n            <div class=\"logo-card\">\n              <div class=\"lc-preview\"><img src=\"${LOGO_URL}\" alt=\"Logo TEMPO by Porsche\" /></div>\n              <div class=\"lc-meta\">\n                <div><div class=\"lc-name\">Logotipo principal — branco</div><div class=\"lc-sub\">SVG · vetor, fundo escuro</div></div>\n                <a class=\"lc-dl\" href=\"${LOGO_URL}\" download target=\"_blank\" rel=\"noopener\">Baixar</a>\n              </div>\n            </div>\n            <div class=\"logo-card\">\n              <div class=\"lc-preview\"><img src=\"${LOGO_SOCIAL_URL}\" alt=\"Logo social TEMPO by Porsche\" style=\"max-height:110px;\" /></div>\n              <div class=\"lc-meta\">\n                <div><div class=\"lc-name\">Logo para redes sociais</div><div class=\"lc-sub\">WebP · 1024×1024</div></div>\n                <a class=\"lc-dl\" href=\"${LOGO_SOCIAL_URL}\" download target=\"_blank\" rel=\"noopener\">Baixar</a>\n              </div>\n            </div>\n            <div class=\"logo-card\">\n              <div class=\"lc-preview\" style=\"padding:0 28px; text-align:center;\">\n                <div style=\"font-size:14px; line-height:1.7; color:#c9c7c2;\">Primeira menção: <b style=\"color:#f3f1ec;\">TEMPO by Porsche</b><br/>Menções seguintes: <b style=\"color:#f3f1ec;\">TEMPO</b></div>\n              </div>\n              <div class=\"lc-meta\">\n                <div><div class=\"lc-name\">Grafia do nome</div><div class=\"lc-sub\">Evite \"Tempo By Porsche\" e \"TEMPO Porsche\"</div></div>\n                <button class=\"lc-dl copybtn-grafia\" data-copy=\"grafia\" style=\"background:rgba(255,255,255,.06); border:1px solid rgba(255,255,255,.16); cursor:pointer;\">Copiar</button>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <div class=\"section\" data-sec=\"diretrizes\">\n          <div class=\"sec-head\"><h2 class=\"h2\">Diretrizes de uso</h2></div>\n          <div class=\"sec-note\">O que você precisa saber antes de publicar.</div>\n          <div class=\"rules\">${rulesHtml}</div>\n          <div class=\"credit-line\">\n            <div class=\"credit-chip\">${COPY_TEXTS.credito}</div>\n            <button class=\"copybtn\" data-copy=\"credito\">Copiar crédito</button>\n          </div>\n        </div>\n\n        <div class=\"section\" data-sec=\"faq\">\n          <div class=\"sec-head\"><h2 class=\"h2\">Perguntas frequentes</h2></div>\n          <div class=\"sec-note\">Respostas rápidas para as dúvidas mais comuns da imprensa.</div>\n          <div class=\"faq\">${faqHtml}</div>\n        </div>\n\n        <div class=\"section\" data-sec=\"contato\">\n          <div class=\"contact-card\">\n            <div class=\"cc-eyebrow\">Contato de imprensa</div>\n            <a class=\"cc-mail\" href=\"${MAILTO}\">${PRESS_EMAIL}</a>\n            <div class=\"cc-note\">Entrevistas, pautas, credenciamento para eventos, imagens adicionais e qualquer dúvida sobre\n              o uso deste material. Informe o veículo, o tema e o prazo da pauta — a equipe direciona ao porta-voz adequado.</div>\n            <div class=\"cc-links\">\n              <a class=\"btn btn-ghost\" href=\"${SITE_URL}\" target=\"_blank\" rel=\"noopener\">tempobyporsche.com</a>\n              <a class=\"btn btn-ghost\" href=\"${INSTAGRAM_URL}\" target=\"_blank\" rel=\"noopener\">Instagram</a>\n              <a class=\"btn btn-ghost\" href=\"${WHATSAPP_URL}\" target=\"_blank\" rel=\"noopener\">WhatsApp · Reservas</a>\n            </div>\n          </div>\n        </div>\n\n        <div class=\"footer\">\n          <div class=\"f-left\">\n            <img class=\"f-logo\" src=\"${LOGO_URL}\" alt=\"TEMPO by Porsche\" />\n            <span>Rua Maria Carolina, 624 — Pinheiros, São Paulo/SP</span>\n          </div>\n          <div>\n            <a href=\"${MAILTO}\">${PRESS_EMAIL}</a>\n            <span> · </span>\n            <a href=\"${SITE_URL}\" target=\"_blank\" rel=\"noopener\">tempobyporsche.com</a>\n          </div>\n        </div>\n\n      </div>\n\n      <div class=\"top-btn\" title=\"Voltar ao topo\">${ICON_TOP}</div>\n\n      <div class=\"lightbox ${lbOpen ? 'open' : ''}\">\n        ${cur ? `\n          <img src=\"${cur.full}\" alt=\"\" />\n          <div class=\"lb-btn lb-close\" data-act=\"close\">${ICON_CLOSE}</div>\n          <div class=\"lb-bar\">\n            ${curRaw ? `<a class=\"pill\" href=\"${curRaw}\" download target=\"_blank\" rel=\"noopener\" title=\"Arquivo original sem compressão — resolução máxima, ideal para impressão\">${ICON_DOWNLOAD}<span>Baixar RAW</span></a>` : ''}\n            <a class=\"pill\" href=\"${cur.full}\" download target=\"_blank\" rel=\"noopener\" title=\"Alta resolução — pronta para publicação digital\">${ICON_DOWNLOAD}<span>Baixar HD</span></a>\n          </div>\n          <div class=\"lb-btn lb-prev\" data-act=\"prev\">${ICON_PREV}</div>\n          <div class=\"lb-btn lb-next\" data-act=\"next\">${ICON_NEXT}</div>\n          <div class=\"lb-count\">${lb+1} / ${rows.length}</div>\n        ` : ''}\n      </div>\n    </div>`;\n  },\n  mounted(d2, root){\n    d2.state.ready = false;\n    d2.state.rows = [];\n    d2.state.lbIndex = null;\n    d2.state.openFaq = null;\n    savedScroll = 0;\n    bindScroll(root);\n\n    const ds = d2.data();\n    ds.refresh().then(() => ds.loadAll()).then((all) => {\n      const sorted = [...all].sort((a,b) => (a.ordem ?? 0) - (b.ordem ?? 0));\n      d2.setState({ rows: sorted, ready: true });\n    });\n\n    // smooth-scroll nav (anchors don't cross the shadow boundary)\n    d2.on('[data-goto]', 'click', (e, el) => {\n      const t = root.querySelector(`[data-sec=\"${el.dataset.goto}\"]`);\n      if (t) t.scrollIntoView({ behavior:'smooth', block:'start' });\n    });\n\n    // copy-to-clipboard with visual feedback (no setState — avoid re-render wiping the label swap)\n    d2.on('[data-copy]', 'click', (e, el) => {\n      const txt = COPY_TEXTS[el.dataset.copy];\n      if (!txt) return;\n      const done = () => {\n        const orig = el.textContent;\n        el.textContent = 'Copiado ✓';\n        setTimeout(() => { el.textContent = orig; }, 1600);\n      };\n      if (navigator.clipboard && navigator.clipboard.writeText) {\n        navigator.clipboard.writeText(txt).then(done).catch(() => {\n          const ta = document.createElement('textarea');\n          ta.value = txt; document.body.appendChild(ta); ta.select();\n          document.execCommand('copy'); document.body.removeChild(ta); done();\n        });\n      } else {\n        const ta = document.createElement('textarea');\n        ta.value = txt; document.body.appendChild(ta); ta.select();\n        document.execCommand('copy'); document.body.removeChild(ta); done();\n      }\n    });\n\n    d2.on('.top-btn', 'click', () => {\n      const w = root.querySelector('.wrap');\n      if (w) w.scrollTo({ top: 0, behavior: 'smooth' });\n    });\n\n    d2.on('.faq-q', 'click', (e, el) => {\n      const i = Number(el.dataset.i);\n      d2.setState({ openFaq: d2.state.openFaq === i ? null : i });\n    });\n\n    d2.on('.cell', 'click', (e, el) => {\n      if (e.target && e.target.closest && e.target.closest('a')) return; // download pills shouldn't open the lightbox\n      d2.setState({ lbIndex: Number(el.dataset.idx) });\n    });\n    d2.on('.lb-close', 'click', () => d2.setState({ lbIndex: null }));\n    d2.on('.lightbox', 'click', (e) => {\n      if (e.target.classList.contains('lightbox')) d2.setState({ lbIndex: null });\n    });\n    d2.on('.lb-prev', 'click', () => {\n      const rows = d2.state.rows;\n      d2.setState({ lbIndex: (d2.state.lbIndex - 1 + rows.length) % rows.length });\n    });\n    d2.on('.lb-next', 'click', () => {\n      const rows = d2.state.rows;\n      d2.setState({ lbIndex: (d2.state.lbIndex + 1) % rows.length });\n    });\n    d2.on(window, 'keydown', (e) => {\n      if (d2.state.lbIndex === null || d2.state.lbIndex === undefined) return;\n      const rows = d2.state.rows;\n      if (e.key === 'Escape') d2.setState({ lbIndex: null });\n      if (e.key === 'ArrowLeft') d2.setState({ lbIndex: (d2.state.lbIndex - 1 + rows.length) % rows.length });\n      if (e.key === 'ArrowRight') d2.setState({ lbIndex: (d2.state.lbIndex + 1) % rows.length });\n    });\n  },\n  updated(d2, root){\n    const w = root.querySelector('.wrap');\n    if (w) {\n      if (w.scrollTop === 0 && savedScroll > 0) w.scrollTop = savedScroll;\n      const b = root.querySelector('.top-btn');\n      if (b) b.classList.toggle('show', w.scrollTop > 900);\n      bindScroll(root);\n    }\n    root.querySelectorAll('.ph').forEach(img => {\n      if (img.getAttribute('src')) return;\n      const src = img.getAttribute('data-src');\n      if (!src) return;\n      const real = new Image();\n      real.onload = () => { img.setAttribute('src', src); img.classList.add('loaded'); };\n      real.src = src;\n    });\n  },\n}\n"}},"dataset":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"dataset"}}}}}}}}}},{"_id":"6a7f3125bb08723b2b6537d7","component":"data2-core-types@Component","system":"6a45d210b5865956b508ba84","params":{"extends":"data2-core-primitives@Block","component":"reserva-form","package":"tempo","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 LOGO = 'https://tempobyporsche.com/wp-content/uploads/2026/02/logo_tempo_by_porsche_white_V.svg';\nconst MAIL = 'oi@tempobyporsche.com';\nconst ENDERECO = 'Rua Maria Carolina, 624 — Pinheiros, São Paulo';\nconst INSTAGRAM = 'https://www.instagram.com/tempobyporsche/';\nconst CAP_MAX = 200;\n\nconst TIPOS = [\n  { v: 'festa', t: 'Festa' },\n  { v: 'jantar', t: 'Jantar' },\n  { v: 'almoco', t: 'Almoço' },\n  { v: 'cafe', t: 'Café da manhã' },\n  { v: 'corporativo', t: 'Corporativo / Talks' },\n];\nconst FORMATOS = [\n  { v: 'coquetel', t: 'Coquetel em pé' },\n  { v: 'sentado', t: 'Sentado' },\n  { v: 'auditorio', t: 'Auditório' },\n  { v: 'misto', t: 'Misto' },\n];\nconst EXCLUSIVIDADE = [\n  { v: 'privativo', t: 'Espaço totalmente privativo' },\n  { v: 'reservada', t: 'Área reservada' },\n  { v: 'indiferente', t: 'Sem preferência' },\n];\nconst INFRA = [\n  { v: 'telao', t: 'Telão / painel de LED' },\n  { v: 'microfone', t: 'Microfone' },\n  { v: 'som', t: 'Sistema de som' },\n  { v: 'luz', t: 'Iluminação cênica' },\n  { v: 'palco', t: 'Palco' },\n  { v: 'transmissao', t: 'Transmissão ao vivo' },\n  { v: 'wifi', t: 'Wi-Fi dedicado' },\n];\nconst MUSICA = [\n  { v: 'ambiente', t: 'Música ambiente' },\n  { v: 'dj', t: 'DJ' },\n  { v: 'aovivo', t: 'Música ao vivo' },\n  { v: 'outros', t: 'Outros' },\n];\nconst CATERING = [\n  { v: 'coquetel', t: 'Coquetel' },\n  { v: 'jantar', t: 'Jantar servido' },\n  { v: 'buffet', t: 'Buffet' },\n  { v: 'bebidas', t: 'Apenas bebidas' },\n  { v: 'nenhum', t: 'Sem gastronomia' },\n];\nconst BEBIDAS = [\n  { v: 'cerveja', t: 'Cerveja' },\n  { v: 'chopp', t: 'Chopp' },\n  { v: 'vinho', t: 'Vinho' },\n  { v: 'espumante', t: 'Espumante' },\n  { v: 'drinks', t: 'Drinks' },\n];\nconst REFERRAL = [\n  { v: 'indicacao', t: 'Indicação' },\n  { v: 'membro', t: 'Sou membro TEMPO' },\n  { v: 'instagram', t: 'Instagram' },\n  { v: 'google', t: 'Busca no Google' },\n  { v: 'imprensa', t: 'Imprensa' },\n  { v: 'evento', t: 'Estive em um evento' },\n  { v: 'porsche', t: 'Porsche / concessionária' },\n  { v: 'outro', t: 'Outro' },\n];\nconst REF_LABEL = {\n  indicacao: 'Quem indicou você?',\n  membro: 'Seu nome ou número do card',\n  outro: 'Conte pra gente',\n};\nconst SIMNAO = [{ v: 'sim', t: 'Sim' }, { v: 'nao', t: 'Não' }];\n\nconst MEDIA = 'https://tempo.data2.media/file/';\nconst HERO = MEDIA + 'Z-X-H5NBvuAtJ5kS4Idm_';\nconst FOTOS = [\n  { u: MEDIA + 'Hft0WFM66p1ednqcVAVXu', t: 'Áreas de eventos' },\n  { u: MEDIA + 'Z-X-H5NBvuAtJ5kS4Idm_', t: 'Área 1' },\n  { u: MEDIA + 'hESMcQKdtyZwCpZcnEC2o', t: 'Área 1' },\n  { u: MEDIA + 'bQV71Gn2mDGCB9Ro6iAXD', t: 'Área 2' },\n  { u: MEDIA + 'WTt5kjJp4V8gwyQZtDLNJ', t: 'Área 2' },\n  { u: MEDIA + 'EOobpdMgnG5fWkooNhPdc', t: 'Área 2' },\n  { u: MEDIA + 'b1Ww-W1YpEXjXp5ReWQww', t: 'Área 3' },\n  { u: MEDIA + 'pLea3qeJsjQ9ux6CRdP0X', t: 'Área 3' },\n  { u: MEDIA + 'MgSnOcryBZ6ys9o5UloHF', t: 'Lounge' },\n];\n\nconst form = {\n  nome: '', email: '', telefone: '', empresa: '', cargo: '',\n  data: '', hora_inicio: '', duracao_horas: '', pessoas: '',\n  transmissao_desc: '', restricoes: '', cardapio_desc: '', bebidas_obs: '',\n  ambientacao_desc: '', musica_desc: '', observacoes: '', referral_detalhe: '',\n};\n\nconst esc = (s) => String(s == null ? '' : s)\n  .replace(/[&<>\"]/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;' }[c]));\n\nexport default {\n  css: `\n    .wrap{ position:fixed; inset:0; overflow-y:auto; overflow-x:hidden;\n      background:#0a0a0b; color:#eae8e3; box-sizing:border-box;\n      font-family:-apple-system,BlinkMacSystemFont,'Helvetica Neue',Arial,sans-serif;\n      -webkit-font-smoothing:antialiased; -webkit-overflow-scrolling:touch; }\n    .inner{ max-width:780px; margin:0 auto; padding:0 28px; box-sizing:border-box; }\n\n    .nav{ position:sticky; top:0; z-index:500; background:rgba(10,10,11,.9);\n      backdrop-filter:blur(14px); -webkit-backdrop-filter:blur(14px);\n      border-bottom:1px solid rgba(255,255,255,.08); }\n    .nav-in{ max-width:780px; margin:0 auto; padding:15px 28px; display:flex; align-items:center;\n      justify-content:space-between; gap:14px; box-sizing:border-box; }\n    .nav .logo{ height:22px; width:auto; display:block; flex:none; }\n    .nav-mail{ font-size:11px; letter-spacing:.12em; text-transform:uppercase; color:#8c8a85;\n      text-decoration:none; transition:color .2s ease; overflow:hidden; text-overflow:ellipsis;\n      white-space:nowrap; }\n    .nav-mail:hover{ color:#f3f1ec; }\n\n    .prog{ position:sticky; top:52px; z-index:490; height:2px; background:rgba(255,255,255,.07); }\n    .prog i{ display:block; height:100%; background:#eae8e3; width:0;\n      transition:width .45s cubic-bezier(.2,.7,.3,1); }\n\n    .hero{ position:relative; overflow:hidden; border-bottom:1px solid rgba(255,255,255,.08); }\n    .hero-bg{ position:absolute; inset:0; z-index:0; }\n    .hero-bg img{ width:100%; height:100%; object-fit:cover; opacity:.34;\n      filter:saturate(.8) contrast(1.05); transform:scale(1.03); }\n    .hero-veil{ position:absolute; inset:0; z-index:1;\n      background:linear-gradient(180deg, rgba(10,10,11,.55) 0%, rgba(10,10,11,.22) 38%, rgba(10,10,11,.96) 100%); }\n    .hero .inner{ position:relative; z-index:2; padding-top:104px; padding-bottom:78px; }\n    .eyebrow{ font-size:10.5px; letter-spacing:.24em; text-transform:uppercase; color:#a8a6a1;\n      display:flex; align-items:center; gap:12px; }\n    .eyebrow::after{ content:''; height:1px; flex:1; background:rgba(255,255,255,.14); }\n    h1{ font-size:clamp(36px,6.4vw,62px); line-height:1.02; font-weight:500; margin:22px 0 0;\n      letter-spacing:-.028em; }\n    h1 em{ font-family:Georgia,'Times New Roman',serif; font-style:italic; font-weight:400;\n      letter-spacing:-.01em; }\n    .sub{ color:#c9c7c2; font-size:16.5px; line-height:1.68; margin-top:22px; max-width:50ch; }\n    .facts{ display:flex; flex-wrap:wrap; margin-top:38px; border-top:1px solid rgba(255,255,255,.1); }\n    .fact{ flex:1 1 150px; padding:18px 20px 16px 0; }\n    .fact .fk{ font-size:10px; letter-spacing:.2em; text-transform:uppercase; color:#77756f; }\n    .fact .fv{ font-size:15px; margin-top:7px; color:#eae8e3; line-height:1.4; }\n\n    .sec{ margin-top:26px; background:#121214; border:1px solid rgba(255,255,255,.07);\n      border-radius:14px; padding:30px 32px 34px; }\n    .sec:first-of-type{ margin-top:44px; }\n    .sec-h{ display:flex; align-items:baseline; gap:14px; margin-bottom:26px;\n      padding-bottom:18px; border-bottom:1px solid rgba(255,255,255,.07); }\n    .sec-n{ font-family:Georgia,'Times New Roman',serif; font-style:italic; font-size:26px;\n      color:#5f5d58; line-height:1; flex:none; }\n    .sec-t{ font-size:19px; font-weight:600; letter-spacing:.01em; color:#f3f1ec; }\n    .sec-note{ font-size:12.5px; color:#77756f; margin-left:auto; text-align:right; letter-spacing:.02em; }\n\n    .fld{ margin-bottom:24px; }\n    .fld:last-child{ margin-bottom:0; }\n    .fld > label{ display:flex; align-items:baseline; flex-wrap:wrap; gap:0 8px;\n      font-size:10.5px; letter-spacing:.18em; text-transform:uppercase;\n      color:#a8a6a1; margin-bottom:11px; line-height:1.5; }\n    .fld .opt{ letter-spacing:.04em; text-transform:none; color:#5f5d58; font-size:11px; }\n\n    /* sistema de campos: altura fixa garante alinhamento entre colunas,\n       independente de o rótulo ocupar uma ou duas linhas */\n    input.f, textarea.f{ width:100%; box-sizing:border-box; display:block; min-width:0;\n      background:rgba(255,255,255,.035);\n      border:1px solid rgba(255,255,255,.10); border-radius:10px; color:#eae8e3;\n      font-family:inherit; font-size:15.5px; line-height:1.35;\n      outline:none; color-scheme:dark;\n      -webkit-appearance:none; appearance:none; text-align:left;\n      transition:border-color .2s ease, background .2s ease, box-shadow .2s ease; }\n    input.f{ height:52px; padding:0 16px; }\n    textarea.f{ min-height:118px; padding:15px 16px; line-height:1.6; resize:vertical; }\n    input.f::placeholder, textarea.f::placeholder{ color:#4e4c48; }\n    input.f:focus, textarea.f:focus{ border-color:rgba(234,232,227,.55); background:rgba(255,255,255,.06);\n      box-shadow:0 0 0 3px rgba(234,232,227,.07); }\n    input.f.bad, textarea.f.bad{ border-color:#8c5b4a; box-shadow:0 0 0 3px rgba(140,91,74,.14); }\n\n    /* normaliza date/time no iOS: sem isso o valor sai centralizado,\n       com altura própria e estourando a coluna */\n    /* o input vira flex container: é o que centraliza verticalmente o shadow DOM\n       do date/time no iOS, que ignora padding e line-height */\n    input.f[type=\"date\"], input.f[type=\"time\"]{\n      display:flex; -webkit-align-items:center; align-items:center; text-align:left; }\n    input.f::-webkit-date-and-time-value{ text-align:left; margin:0; line-height:normal; }\n    input.f::-webkit-datetime-edit{ padding:0; line-height:normal; }\n    input.f::-webkit-datetime-edit-fields-wrapper{ padding:0; }\n    input.f::-webkit-calendar-picker-indicator{ filter:invert(.75); opacity:.45; cursor:pointer; }\n    input.f[type=\"number\"]::-webkit-outer-spin-button,\n    input.f[type=\"number\"]::-webkit-inner-spin-button{ -webkit-appearance:none; margin:0; }\n    input.f[type=\"number\"]{ -moz-appearance:textfield; }\n\n    .row{ display:flex; gap:14px; flex-wrap:wrap; align-items:flex-end; }\n    .row > .fld{ flex:1 1 150px; min-width:0; margin-bottom:0; }\n    .row + .row{ margin-top:24px; }\n\n    .chips{ display:flex; flex-wrap:wrap; gap:9px; }\n    .chip{ background:rgba(255,255,255,.04); border:1px solid rgba(255,255,255,.14); color:#c9c7c2;\n      padding:11px 19px; border-radius:999px; font-size:13.5px; font-family:inherit; cursor:pointer;\n      white-space:nowrap; line-height:1.2; min-height:42px;\n      transition:background .18s ease, border-color .18s ease, color .18s ease; }\n    .chip:hover{ border-color:rgba(234,232,227,.55); color:#f3f1ec; }\n    .chip.on{ background:#eae8e3; border-color:#eae8e3; color:#0a0a0b; font-weight:600; }\n    .chips.bad{ outline:1px solid #8c5b4a; outline-offset:8px; border-radius:6px; }\n\n    /* campo que só existe por causa de uma resposta anterior */\n    .cond{ margin:16px 0 28px; padding:6px 0 8px 18px;\n      border-left:2px solid rgba(234,232,227,.2); }\n    .cond .fld{ margin-bottom:20px; }\n    .cond .fld:last-child{ margin-bottom:0; }\n    .fld + .cond{ margin-top:14px; }\n\n    /* lightbox das fotos */\n    .scell{ cursor:zoom-in; }\n    .lb{ position:fixed; inset:0; z-index:900; display:flex; align-items:center;\n      justify-content:center; padding:44px 60px; box-sizing:border-box; }\n    .lbbg{ position:absolute; inset:0; background:rgba(6,6,7,.95);\n      backdrop-filter:blur(6px); -webkit-backdrop-filter:blur(6px); cursor:zoom-out; }\n    .lb img{ position:relative; z-index:2; max-width:100%; max-height:100%;\n      object-fit:contain; border-radius:8px; box-shadow:0 30px 90px rgba(0,0,0,.7); }\n    .lbx{ position:absolute; top:20px; right:22px; z-index:3; width:42px; height:42px;\n      border-radius:50%; background:rgba(20,20,22,.9); border:1px solid rgba(255,255,255,.18);\n      color:#eae8e3; font-size:20px; line-height:1; cursor:pointer; font-family:inherit; }\n    .lbx:hover{ background:rgba(42,42,46,.95); }\n    .lbnav{ position:absolute; top:50%; transform:translateY(-50%); z-index:3;\n      width:44px; height:44px; border-radius:50%; background:rgba(20,20,22,.85);\n      border:1px solid rgba(255,255,255,.18); color:#eae8e3; font-size:21px; line-height:1;\n      cursor:pointer; font-family:inherit; }\n    .lbnav:hover{ background:rgba(42,42,46,.95); }\n    .lbprev{ left:16px; }\n    .lbnext{ right:16px; }\n    .lbcount{ position:absolute; bottom:20px; left:50%; transform:translateX(-50%); z-index:3;\n      font-size:11px; letter-spacing:.16em; color:#8c8a85; }\n\n    .info{ margin-top:20px; padding:14px 17px; background:rgba(255,255,255,.025);\n      border:1px solid rgba(255,255,255,.07); border-radius:10px;\n      font-size:13px; line-height:1.55; color:#8c8a85; }\n    .info b{ color:#c9c7c2; font-weight:600; }\n\n    .note{ font-size:12.5px; color:#77756f; margin-top:12px; line-height:1.55; }\n    .note.warn{ color:#c8a37a; border-left:2px solid #7a6a45; padding-left:12px; }\n\n    .quote{ margin-top:26px; background:#121214; border:1px solid rgba(255,255,255,.07);\n      border-radius:14px; padding:30px 34px; }\n    .quote .qk{ font-size:10px; letter-spacing:.24em; text-transform:uppercase; color:#77756f;\n      margin-bottom:14px; }\n    .quote p{ font-family:Georgia,'Times New Roman',serif; font-style:italic; font-size:16.5px;\n      line-height:1.75; color:#dcdad5; margin:0; }\n\n    .strip{ margin-top:26px; }\n    .strip .sk{ font-size:10px; letter-spacing:.24em; text-transform:uppercase; color:#77756f;\n      margin-bottom:14px; }\n    .sgrid{ display:grid; grid-template-columns:repeat(3,1fr); gap:10px; }\n    .scell{ position:relative; aspect-ratio:4/3; border-radius:10px; overflow:hidden; background:#141416; }\n    .scell img{ position:absolute; inset:0; width:100%; height:100%; object-fit:cover; opacity:.92;\n      transition:transform .5s cubic-bezier(.2,.7,.3,1), opacity .3s ease; }\n    .scell:hover img{ transform:scale(1.05); opacity:1; }\n\n    .foot{ margin-top:34px; background:#121214; border:1px solid rgba(255,255,255,.07);\n      border-radius:14px; padding:30px 32px; display:flex; align-items:center; gap:22px; flex-wrap:wrap; }\n    .pill{ background:#eae8e3; color:#0a0a0b; border:0; border-radius:999px; padding:16px 38px;\n      font-size:13px; letter-spacing:.09em; font-weight:700; text-transform:uppercase; cursor:pointer;\n      font-family:inherit; min-height:52px;\n      transition:background .2s ease, box-shadow .2s ease;\n      box-shadow:0 8px 26px rgba(234,232,227,.10); }\n    .pill:hover{ background:#fff; box-shadow:0 12px 34px rgba(234,232,227,.18); }\n    .pill[disabled]{ opacity:.45; cursor:default; box-shadow:none; }\n    .err{ color:#d69a86; font-size:13.5px; }\n    .foot .hint{ font-size:12.5px; color:#5f5d58; line-height:1.55; flex:1; min-width:180px; }\n\n    .end{ margin-top:34px; padding:34px 0 24px; border-top:1px solid rgba(255,255,255,.08);\n      display:flex; justify-content:space-between; gap:16px; flex-wrap:wrap; }\n    .end a{ color:#a8a6a1; text-decoration:none; font-size:11.5px; letter-spacing:.12em;\n      text-transform:uppercase; transition:color .2s ease; }\n    .end a:hover{ color:#f3f1ec; }\n    .end .addr{ font-size:11.5px; color:#5f5d58; letter-spacing:.06em; }\n\n    .top-btn{ position:fixed; right:22px; bottom:22px; width:46px; height:46px; border-radius:50%;\n      background:rgba(20,20,22,.9); border:1px solid rgba(255,255,255,.18); cursor:pointer;\n      z-index:800; color:#eae8e3; font-size:17px; line-height:1; display:none; }\n    .top-btn.show{ display:block; }\n    .top-btn:hover{ background:rgba(42,42,46,.95); }\n\n    .done{ position:relative; z-index:2; padding:120px 28px 90px; }\n    .done .mark{ width:44px; height:44px; border-radius:50%; border:1px solid rgba(234,232,227,.4);\n      display:flex; align-items:center; justify-content:center; font-size:19px; margin-bottom:30px; }\n    .done h1{ margin-top:16px; }\n    .done p{ color:#a8a6a1; font-size:15.5px; line-height:1.7; margin:22px 0 36px; max-width:50ch; }\n    .done a{ color:#eae8e3; }\n    .recap{ border:1px solid rgba(255,255,255,.08); border-radius:14px; background:#121214;\n      padding:26px 30px; margin:30px 0 34px; display:flex; flex-wrap:wrap; gap:22px 46px; }\n    .recap div{ min-width:92px; }\n    .recap dt{ font-size:10px; letter-spacing:.2em; text-transform:uppercase; color:#77756f; }\n    .recap dd{ margin:8px 0 0; font-size:16px; }\n\n    @media (max-width:820px){\n      .inner{ padding:0 24px; }\n      .nav-in{ padding:14px 24px; }\n      .hero .inner{ padding-top:80px; padding-bottom:58px; }\n      .sec{ padding:26px 24px 28px; }\n      .quote,.foot{ padding:26px 24px; }\n      .sgrid{ grid-template-columns:repeat(2,1fr); }\n    }\n\n    @media (max-width:600px){\n      .inner{ padding:0 18px; }\n      .nav-in{ padding:12px 18px; }\n      .nav .logo{ height:19px; }\n      .nav-mail{ font-size:9.5px; letter-spacing:.08em; max-width:52%; }\n      .prog{ top:45px; }\n\n      .hero .inner{ padding-top:56px; padding-bottom:44px; }\n      .eyebrow{ font-size:9.5px; letter-spacing:.2em; }\n      h1{ font-size:clamp(32px,10.5vw,44px); margin-top:18px; }\n      .sub{ font-size:15px; margin-top:18px; line-height:1.6; }\n      .facts{ margin-top:28px; }\n      .fact{ flex:1 1 100%; padding:14px 0; border-bottom:1px solid rgba(255,255,255,.07); }\n      .fact:last-child{ border-bottom:0; padding-bottom:0; }\n      .fact .fv{ font-size:14.5px; }\n\n      .sec{ margin-top:16px; padding:24px 18px 26px; border-radius:12px; }\n      .sec:first-of-type{ margin-top:30px; }\n      .sec-h{ margin-bottom:22px; padding-bottom:14px; gap:11px; }\n      .sec-n{ font-size:22px; }\n      .sec-t{ font-size:17px; }\n      .sec-note{ display:none; }\n\n      .fld > label{ font-size:10px; letter-spacing:.13em; margin-bottom:9px; }\n      /* 16px evita o zoom automático do iOS ao focar */\n      input.f, textarea.f{ font-size:16px; }\n      input.f{ height:54px; padding:0 15px; }\n      textarea.f{ padding:15px; min-height:120px; }\n      .row{ gap:10px; }\n      .row > .fld{ flex:1 1 calc(50% - 5px); min-width:0; }\n      /* contato respira melhor em coluna única no celular */\n      .row.stack > .fld{ flex:1 1 100%; }\n      .row + .row{ margin-top:16px; }\n      .fld{ margin-bottom:20px; }\n      .cond{ margin:14px 0 24px; padding:4px 0 6px 14px; }\n\n      .chips{ gap:8px; }\n      .chip{ padding:11px 16px; font-size:13px; min-height:44px; }\n      .lb{ padding:56px 14px; }\n      .lbnav{ width:40px; height:40px; }\n      .lbprev{ left:8px; }\n      .lbnext{ right:8px; }\n\n      .quote{ margin-top:16px; padding:24px 18px; }\n      .quote p{ font-size:15.5px; line-height:1.7; }\n      .strip{ margin-top:16px; }\n      .sgrid{ grid-template-columns:repeat(2,1fr); gap:8px; }\n\n      .foot{ margin-top:20px; padding:22px 18px; gap:16px; }\n      .pill{ width:100%; padding:17px 20px; }\n      .foot .hint{ flex:1 1 100%; font-size:12px; }\n      .end{ margin-top:24px; padding:24px 0 20px; flex-direction:column; gap:10px; }\n\n      .top-btn{ right:16px; bottom:16px; width:42px; height:42px; }\n      .done{ padding:70px 18px 70px; }\n      .recap{ padding:22px 20px; gap:18px 30px; }\n      .recap dd{ font-size:15px; }\n    }\n\n    @media (max-width:380px){\n      .row > .fld{ flex:1 1 100%; }\n    }\n  `,\n\n  render(d2) {\n    const st = d2.state;\n    const bad = (k) => ((st.errs || []).indexOf(k) >= 0 ? ' bad' : '');\n    const lbl = (arr, v) => (arr.find((o) => o.v === v) || {}).t || '—';\n    if (st.sent) {\n      const nome = (st.sentNome || '').split(' ')[0];\n      return `<div class=\"wrap\">\n        <div class=\"hero\">\n          <div class=\"hero-bg\"><img src=\"${HERO}\" alt=\"\"></div>\n          <div class=\"hero-veil\"></div>\n          <div class=\"inner done\">\n            <img class=\"logo\" src=\"${LOGO}\" alt=\"TEMPO by Porsche\" style=\"height:24px;margin-bottom:36px\">\n            <div class=\"mark\">✓</div>\n            <div class=\"eyebrow\">Pedido recebido</div>\n            <h1>Obrigado${nome ? ',<br><em>' + esc(nome) + '</em>' : ''}.</h1>\n            <div class=\"recap\">\n              <div><dt>Evento</dt><dd>${esc(lbl(TIPOS, st.sentTipo))}</dd></div>\n              <div><dt>Data</dt><dd>${esc(st.sentData || '—')}</dd></div>\n              <div><dt>Horário</dt><dd>${esc(st.sentHora || '—')}</dd></div>\n              <div><dt>Pessoas</dt><dd>${esc(st.sentPessoas || '—')}</dd></div>\n            </div>\n            <p>Nossa equipe responde em até 2 dias úteis com disponibilidade, formatos possíveis\n            e o orçamento. Se quiser adiantar alguma informação, escreva para\n            <a href=\"mailto:${MAIL}\">${MAIL}</a>.</p>\n            <button class=\"pill again\">Enviar outro pedido</button>\n          </div>\n        </div>\n      </div>`;\n    }\n\n    const chips = (group, opts, multi) => {\n      const cur = multi ? (st[group] || []) : (st[group] || '');\n      return opts.map((o) => {\n        const on = multi ? cur.indexOf(o.v) >= 0 : cur === o.v;\n        return `<button type=\"button\" class=\"chip${on ? ' on' : ''}\" data-g=\"${group}\" data-v=\"${o.v}\">${esc(o.t)}</button>`;\n      }).join('');\n    };\n\n    const pessoas = parseInt(form.pessoas, 10) || 0;\n    const overCap = pessoas > CAP_MAX;\n    const refExtra = REF_LABEL[st.referral];\n    const temTransmissao = (st.infra || []).indexOf('transmissao') >= 0;\n\n    const req = [\n      !!st.tipo, !!form.data, !!form.hora_inicio, pessoas > 0,\n      !!String(form.nome).trim(), !!String(form.email).trim(),\n      String(form.telefone).replace(/\\D/g, '').length >= 10, !!st.referral,\n    ];\n    const pct = Math.round((req.filter(Boolean).length / req.length) * 100);\n\n    const strip = `<div class=\"strip\"><div class=\"sk\">O espaço</div><div class=\"sgrid\">${FOTOS.map((p, i) => `<div class=\"scell\" data-i=\"${i}\"><img src=\"${p.u}\" alt=\"${esc(p.t)}\" loading=\"lazy\"></div>`).join('')}</div></div>`;\n\n    const lbi = st.lb;\n    const lightbox = (lbi != null && FOTOS[lbi])\n      ? `<div class=\"lb\">\n          <div class=\"lbbg\"></div>\n          <img src=\"${FOTOS[lbi].u}\" alt=\"${esc(FOTOS[lbi].t)}\">\n          <button class=\"lbx\">×</button>\n          <button class=\"lbnav lbprev\">‹</button><button class=\"lbnav lbnext\">›</button>\n          <div class=\"lbcount\">${esc(FOTOS[lbi].t)} · ${lbi + 1}/${FOTOS.length}</div>\n        </div>`\n      : '';\n\n    return `<div class=\"wrap\">\n      <div class=\"nav\"><div class=\"nav-in\">\n        <img class=\"logo\" src=\"${LOGO}\" alt=\"TEMPO by Porsche\">\n        <a class=\"nav-mail\" href=\"mailto:${MAIL}\">${MAIL}</a>\n      </div></div>\n      <div class=\"prog\"><i style=\"width:${pct}%\"></i></div>\n\n      <div class=\"hero\">\n        <div class=\"hero-bg\"><img src=\"${HERO}\" alt=\"\"></div>\n        <div class=\"hero-veil\"></div>\n        <div class=\"inner\">\n          <div class=\"eyebrow\">Eventos privados</div>\n          <h1>Reserve<br><em>o espaço</em></h1>\n          <div class=\"sub\">Conte o que você tem em mente, do formato à gastronomia, e voltamos\n          com a proposta. Arte, som, luz e cozinha no mesmo endereço.</div>\n          <div class=\"facts\">\n            <div class=\"fact\"><div class=\"fk\">Capacidade</div><div class=\"fv\">Até ${CAP_MAX} convidados</div></div>\n            <div class=\"fact\"><div class=\"fk\">Formatos</div><div class=\"fv\">Coquetel · Sentado · Auditório</div></div>\n            <div class=\"fact\"><div class=\"fk\">Resposta</div><div class=\"fv\">Em até 2 dias úteis</div></div>\n          </div>\n        </div>\n      </div>\n\n      <div class=\"inner\">\n\n        <div class=\"sec\">\n          <div class=\"sec-h\"><span class=\"sec-n\">01</span><span class=\"sec-t\">O evento</span>\n            <span class=\"sec-note\">obrigatório</span></div>\n\n          <div class=\"fld\">\n            <label>Tipo de evento</label>\n            <div class=\"chips${bad('tipo')}\">${chips('tipo', TIPOS, false)}</div>\n          </div>\n\n          <div class=\"row\">\n            <div class=\"fld\"><label>Data</label>\n              <input type=\"date\" class=\"f${bad('data')}\" data-k=\"data\" value=\"${esc(form.data)}\"></div>\n            <div class=\"fld\"><label>Início</label>\n              <input type=\"time\" class=\"f${bad('hora_inicio')}\" data-k=\"hora_inicio\" value=\"${esc(form.hora_inicio)}\"></div>\n            <div class=\"fld\"><label>Duração <span class=\"opt\">horas</span></label>\n              <input type=\"number\" min=\"1\" step=\"1\" inputmode=\"numeric\" pattern=\"[0-9]*\" class=\"f\" data-k=\"duracao_horas\" value=\"${esc(form.duracao_horas)}\" placeholder=\"4\"></div>\n            <div class=\"fld\"><label>Pessoas</label>\n              <input type=\"number\" min=\"1\" inputmode=\"numeric\" pattern=\"[0-9]*\" class=\"f${bad('pessoas')}\" data-k=\"pessoas\" value=\"${esc(form.pessoas)}\" placeholder=\"80\"></div>\n          </div>\n\n          <div class=\"fld\" style=\"margin-top:20px\">\n            <div class=\"chips\">${chips('flex', [{ v: 'sim', t: 'Minha data é flexível' }], false)}</div>\n            <div class=\"note\">Marque se podemos sugerir outras datas próximas. Costuma abrir mais opções de estrutura.</div>\n          </div>\n\n          ${overCap ? `<div class=\"note warn\">Acima de ${CAP_MAX} convidados avaliamos caso a caso. Envie assim mesmo e retornamos com as opções.</div>` : ''}\n\n          <div class=\"fld\" style=\"margin-top:24px\">\n            <label>Formato da sala <span class=\"opt\">opcional</span></label>\n            <div class=\"chips\">${chips('formato', FORMATOS, false)}</div>\n          </div>\n        </div>\n\n        <div class=\"sec\">\n          <div class=\"sec-h\"><span class=\"sec-n\">02</span><span class=\"sec-t\">O espaço</span>\n            <span class=\"sec-note\">como você imagina a casa</span></div>\n          <div class=\"fld\">\n            <label>Exclusividade <span class=\"opt\">opcional</span></label>\n            <div class=\"chips\">${chips('exclusividade', EXCLUSIVIDADE, false)}</div>\n            <div class=\"note\">Em “área reservada”, o restante da casa segue em operação normal.</div>\n          </div>\n          <div class=\"info\">O prédio tem estacionamento com serviço de manobrista, cobrado à parte.</div>\n        </div>\n\n        <div class=\"sec\">\n          <div class=\"sec-h\"><span class=\"sec-n\">03</span><span class=\"sec-t\">Estrutura e ambientação</span>\n            <span class=\"sec-note\">o que precisa estar montado</span></div>\n\n          <div class=\"fld\">\n            <label>Infra audiovisual <span class=\"opt\">selecione quantos precisar</span></label>\n            <div class=\"chips\">${chips('infra', INFRA, true)}</div>\n          </div>\n\n          ${temTransmissao ? `<div class=\"cond\"><div class=\"fld\">\n            <label>Que transmissão você precisa?</label>\n            <input type=\"text\" class=\"f\" data-k=\"transmissao_desc\" value=\"${esc(form.transmissao_desc)}\"\n              placeholder=\"Ex.: live no YouTube, captação para redes, telão com apresentação…\">\n          </div></div>` : ''}\n\n          <div class=\"fld\" style=\"margin-top:24px\">\n            <label>Música <span class=\"opt\">opcional</span></label>\n            <div class=\"chips\">${chips('musica', MUSICA, false)}</div>\n          </div>\n          ${st.musica === 'outros' ? `<div class=\"cond\"><div class=\"fld\">\n            <label>Que tipo de música?</label>\n            <input type=\"text\" class=\"f\" data-k=\"musica_desc\" value=\"${esc(form.musica_desc)}\"\n              placeholder=\"Ex.: banda, pocket show acústico, playlist própria…\">\n          </div></div>` : ''}\n\n          <div class=\"fld\">\n            <label>Quer cenografia ou personalização de marca?</label>\n            <div class=\"chips\">${chips('ambient', SIMNAO, false)}</div>\n          </div>\n          ${st.ambient === 'sim' ? `<div class=\"cond\"><div class=\"fld\">\n            <label>O que você tem em mente?</label>\n            <textarea class=\"f\" data-k=\"ambientacao_desc\"\n              placeholder=\"Decoração, backdrop, totem, identidade visual da marca…\">${esc(form.ambientacao_desc)}</textarea>\n          </div></div>` : ''}\n        </div>\n\n        <div class=\"sec\">\n          <div class=\"sec-h\"><span class=\"sec-n\">04</span><span class=\"sec-t\">Gastronomia e bebidas</span>\n            <span class=\"sec-note\">o que vamos servir</span></div>\n\n          <div class=\"fld\">\n            <label>Formato do serviço <span class=\"opt\">opcional</span></label>\n            <div class=\"chips\">${chips('catering', CATERING, false)}</div>\n          </div>\n\n          <div class=\"fld\">\n            <label>Restrições alimentares <span class=\"opt\">opcional</span></label>\n            <input type=\"text\" class=\"f\" data-k=\"restricoes\" value=\"${esc(form.restricoes)}\"\n              placeholder=\"Ex.: 2 veganos, 1 sem glúten, alergia a frutos do mar…\">\n          </div>\n\n          <div class=\"fld\">\n            <label>Interesse em cardápio temático ou personalizado?</label>\n            <div class=\"chips\">${chips('cardapio', SIMNAO, false)}</div>\n          </div>\n          ${st.cardapio === 'sim' ? `<div class=\"cond\"><div class=\"fld\">\n            <label>Conte a ideia</label>\n            <input type=\"text\" class=\"f\" data-k=\"cardapio_desc\" value=\"${esc(form.cardapio_desc)}\"\n              placeholder=\"Tema, referência, prato que não pode faltar…\">\n          </div></div>` : ''}\n\n          <div class=\"fld\">\n            <label>Vai ter bebida alcoólica?</label>\n            <div class=\"chips\">${chips('alcool', SIMNAO, false)}</div>\n          </div>\n          ${st.alcool === 'sim' ? `<div class=\"cond\">\n            <div class=\"fld\">\n              <label>Preferências <span class=\"opt\">selecione quantas quiser</span></label>\n              <div class=\"chips\">${chips('bebidas', BEBIDAS, true)}</div>\n            </div>\n            <div class=\"fld\">\n              <label>Algum comentário sobre as bebidas? <span class=\"opt\">opcional</span></label>\n              <input type=\"text\" class=\"f\" data-k=\"bebidas_obs\" value=\"${esc(form.bebidas_obs)}\"\n                placeholder=\"Ex.: preferência por tintos, drink de assinatura, rótulo específico…\">\n            </div>\n          </div>` : ''}\n        </div>\n\n        <div class=\"quote\">\n          <div class=\"qk\">Sobre a casa</div>\n          <p>“Um ecossistema de encontros, curadoria e conteúdo, onde cultura, design\n          e lifestyle se cruzam para criar experiências que vão além do automóvel.”</p>\n        </div>\n\n        ${strip}\n\n        <div class=\"sec\">\n          <div class=\"sec-h\"><span class=\"sec-n\">05</span><span class=\"sec-t\">Contato</span>\n            <span class=\"sec-note\">para retornarmos</span></div>\n          <div class=\"row stack\">\n            <div class=\"fld\"><label>Nome completo</label>\n              <input type=\"text\" class=\"f${bad('nome')}\" data-k=\"nome\" value=\"${esc(form.nome)}\"></div>\n            <div class=\"fld\"><label>Cargo / função <span class=\"opt\">opcional</span></label>\n              <input type=\"text\" class=\"f\" data-k=\"cargo\" value=\"${esc(form.cargo)}\"></div>\n          </div>\n          <div class=\"row stack\" style=\"margin-top:24px\">\n            <div class=\"fld\"><label>Empresa / marca <span class=\"opt\">opcional</span></label>\n              <input type=\"text\" class=\"f\" data-k=\"empresa\" value=\"${esc(form.empresa)}\"></div>\n            <div class=\"fld\"><label>E-mail</label>\n              <input type=\"email\" class=\"f${bad('email')}\" data-k=\"email\" value=\"${esc(form.email)}\"></div>\n          </div>\n          <div class=\"row stack\" style=\"margin-top:24px\">\n            <div class=\"fld\"><label>Telefone / WhatsApp</label>\n              <input type=\"tel\" class=\"f${bad('telefone')}\" data-k=\"telefone\" value=\"${esc(form.telefone)}\" placeholder=\"+55 11 9…\"></div>\n          </div>\n        </div>\n\n        <div class=\"sec\">\n          <div class=\"sec-h\"><span class=\"sec-n\">06</span><span class=\"sec-t\">Últimos detalhes</span>\n            <span class=\"sec-note\">ajuda a acelerar a proposta</span></div>\n          <div class=\"fld\">\n            <label>Como você chegou até a TEMPO?</label>\n            <div class=\"chips${bad('referral')}\">${chips('referral', REFERRAL, false)}</div>\n          </div>\n          ${refExtra ? `<div class=\"cond\"><div class=\"fld\"><label>${esc(refExtra)}</label>\n            <input type=\"text\" class=\"f\" data-k=\"referral_detalhe\" value=\"${esc(form.referral_detalhe)}\"></div></div>` : ''}\n          <div class=\"fld\" style=\"margin-top:24px\">\n            <label>Mais alguma coisa? <span class=\"opt\">opcional</span></label>\n            <textarea class=\"f\" data-k=\"observacoes\" placeholder=\"Referências, pedidos especiais, convidados VIP, horário de acesso para fornecedores…\">${esc(form.observacoes)}</textarea>\n          </div>\n        </div>\n\n        <div class=\"foot\">\n          <button class=\"pill submit\"${st.sending ? ' disabled' : ''}>${st.sending ? 'Enviando…' : 'Enviar pedido'}</button>\n          ${st.err ? `<span class=\"err\">${esc(st.err)}</span>`\n            : `<span class=\"hint\">Ao enviar, você concorda que a equipe da TEMPO entre em contato sobre este pedido.</span>`}\n        </div>\n\n        <div class=\"end\">\n          <span class=\"addr\">${esc(ENDERECO)}</span>\n          <span><a href=\"mailto:${MAIL}\">${MAIL}</a> &nbsp;·&nbsp; <a href=\"${INSTAGRAM}\" target=\"_blank\" rel=\"noopener\">Instagram</a></span>\n        </div>\n      </div>\n\n      <button class=\"top-btn${st.scrolled ? ' show' : ''}\">↑</button>\n      ${lightbox}\n    </div>`;\n  },\n\n  mounted(d2) {\n    const API = d2.param('api') || 'reserva-espaco-api';\n\n    const w = d2.$('.wrap');\n    if (w) {\n      d2.on(w, 'scroll', () => {\n        const past = w.scrollTop > 700;\n        if (past !== !!d2.state.scrolled) d2.state.scrolled = past;\n      }, { passive: true });\n    }\n    d2.on('.top-btn', 'click', () => { const el = d2.$('.wrap'); if (el) el.scrollTo({ top: 0, behavior: 'smooth' }); });\n\n    const totalFotos = () => FOTOS.length;\n    d2.on('.scell', 'click', (e, el) => { d2.state.lb = parseInt(el.dataset.i, 10); });\n    d2.on('.lbbg', 'click', () => { d2.state.lb = null; });\n    d2.on('.lbx', 'click', () => { d2.state.lb = null; });\n    d2.on('.lbprev', 'click', () => {\n      const n = totalFotos();\n      if (n) d2.state.lb = ((d2.state.lb || 0) - 1 + n) % n;\n    });\n    d2.on('.lbnext', 'click', () => {\n      const n = totalFotos();\n      if (n) d2.state.lb = ((d2.state.lb || 0) + 1) % n;\n    });\n    d2.on(window, 'keydown', (e) => {\n      if (d2.state.lb == null) return;\n      const n = totalFotos();\n      if (e.key === 'Escape') d2.state.lb = null;\n      else if (e.key === 'ArrowLeft' && n) d2.state.lb = ((d2.state.lb || 0) - 1 + n) % n;\n      else if (e.key === 'ArrowRight' && n) d2.state.lb = ((d2.state.lb || 0) + 1) % n;\n    });\n\n    const pctNow = () => {\n      const p = parseInt(form.pessoas, 10) || 0;\n      const req = [!!d2.state.tipo, !!form.data, !!form.hora_inicio, p > 0,\n        !!String(form.nome).trim(), !!String(form.email).trim(),\n        String(form.telefone).replace(/\\D/g, '').length >= 10, !!d2.state.referral];\n      return Math.round((req.filter(Boolean).length / req.length) * 100);\n    };\n\n    d2.on('.f', 'input', (e, el) => {\n      form[el.dataset.k] = el.value;\n      const bar = d2.$('.prog i');\n      if (bar) bar.style.width = pctNow() + '%';\n    });\n\n    d2.on('.chip', 'click', (e, el) => {\n      const g = el.dataset.g;\n      const v = el.dataset.v;\n      if (g === 'infra' || g === 'bebidas') {\n        const cur = (d2.state[g] || []).slice();\n        const i = cur.indexOf(v);\n        if (i >= 0) { cur.splice(i, 1); } else { cur.push(v); }\n        d2.state[g] = cur;\n      } else {\n        d2.state[g] = d2.state[g] === v ? '' : v;\n      }\n    });\n\n    d2.on('.again', 'click', () => {\n      Object.keys(form).forEach((k) => { form[k] = ''; });\n      d2.setState({\n        sent: false, tipo: '', formato: '', flex: '', exclusividade: '',\n        infra: [], musica: '', ambient: '', catering: '', cardapio: '',\n        alcool: '', bebidas: [], referral: '', errs: [], err: '', lb: null,\n      });\n    });\n\n    d2.on('.submit', 'click', async () => {\n      const st = d2.state;\n      const miss = [];\n      if (!String(form.nome).trim()) miss.push('nome');\n      if (!/^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$/.test(String(form.email).trim())) miss.push('email');\n      if (String(form.telefone).replace(/\\D/g, '').length < 10) miss.push('telefone');\n      if (!form.data) miss.push('data');\n      if (!form.hora_inicio) miss.push('hora_inicio');\n      if (!(parseInt(form.pessoas, 10) > 0)) miss.push('pessoas');\n      if (!st.tipo) miss.push('tipo');\n      if (!st.referral) miss.push('referral');\n\n      if (miss.length) {\n        d2.setState({ errs: miss, err: 'Confira os campos destacados.' });\n        const first = d2.$('.bad');\n        if (first && first.scrollIntoView) first.scrollIntoView({ behavior: 'smooth', block: 'center' });\n        return;\n      }\n\n      d2.setState({ errs: [], err: '', sending: true });\n      try {\n        const temTransmissao = (st.infra || []).indexOf('transmissao') >= 0;\n        const res = await d2.rush(API).invoke({\n          action: 'submit',\n          nome: String(form.nome).trim(),\n          email: String(form.email).trim(),\n          telefone: String(form.telefone).trim(),\n          empresa: String(form.empresa).trim(),\n          cargo: String(form.cargo).trim(),\n          tipo_evento: st.tipo,\n          data: form.data,\n          data_flexivel: st.flex === 'sim',\n          hora_inicio: form.hora_inicio,\n          duracao_horas: parseFloat(form.duracao_horas) || null,\n          pessoas: parseInt(form.pessoas, 10),\n          formato: st.formato || '',\n          exclusividade: st.exclusividade || '',\n          infraestrutura: st.infra || [],\n          transmissao_desc: temTransmissao ? String(form.transmissao_desc).trim() : '',\n          musica: st.musica || '',\n          musica_desc: st.musica === 'outros' ? String(form.musica_desc).trim() : '',\n          ambientacao: st.ambient === 'sim',\n          ambientacao_desc: st.ambient === 'sim' ? String(form.ambientacao_desc).trim() : '',\n          catering: st.catering || '',\n          restricoes: String(form.restricoes).trim(),\n          cardapio_personalizado: st.cardapio === 'sim',\n          cardapio_desc: st.cardapio === 'sim' ? String(form.cardapio_desc).trim() : '',\n          bebidas_alcoolicas: st.alcool === 'sim',\n          bebidas: st.alcool === 'sim' ? (st.bebidas || []) : [],\n          bebidas_obs: st.alcool === 'sim' ? String(form.bebidas_obs).trim() : '',\n          referral: st.referral,\n          referral_detalhe: String(form.referral_detalhe).trim(),\n          observacoes: String(form.observacoes).trim(),\n        });\n        const out = res && res.data !== undefined ? res.data : res;\n        if (out && out.ok) {\n          const el = d2.$('.wrap');\n          if (el) el.scrollTo({ top: 0 });\n          d2.setState({\n            sent: true,\n            sentNome: form.nome,\n            sentTipo: st.tipo,\n            sentData: form.data,\n            sentHora: form.hora_inicio,\n            sentPessoas: form.pessoas,\n          });\n        } else {\n          d2.state.err = 'Não conseguimos registrar agora. Tente de novo ou escreva para ' + MAIL + '.';\n        }\n      } catch (e) {\n        d2.log('submit err', e);\n        d2.state.err = 'Erro de conexão. Tente de novo em instantes.';\n      } finally {\n        d2.state.sending = false;\n      }\n    });\n  },\n};"}},"api":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"api"}}}},"gallery":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"gallery"}}}}}}}}}},{"_id":"6a7f31776eae65effb23d863","component":"data2-core-types@Component","system":"6a45d210b5865956b508ba84","params":{"extends":"data2-core-primitives@Block","component":"reserva-painel","package":"tempo","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 LOGO = 'https://tempobyporsche.com/wp-content/uploads/2026/02/logo_tempo_by_porsche_white_V.svg';\n\nconst TIPOS = { festa: 'Festa', jantar: 'Jantar', almoco: 'Almoço', cafe: 'Café da manhã', corporativo: 'Corporativo / Talks' };\nconst FORMATOS = { coquetel: 'Coquetel em pé', sentado: 'Sentado', auditorio: 'Auditório', misto: 'Misto' };\nconst INFRA = { telao: 'Telão / painel de LED', microfone: 'Microfone', som: 'Sistema de som', dj: 'DJ / pista', luz: 'Iluminação cênica', palco: 'Palco', transmissao: 'Transmissão ao vivo', wifi: 'Wi-Fi dedicado' };\nconst EXCLUSIVIDADE = { privativo: 'Espaço totalmente privativo', reservada: 'Área reservada', indiferente: 'Sem preferência' };\nconst MUSICA = { ambiente: 'Música ambiente', dj: 'DJ', aovivo: 'Música ao vivo', outros: 'Outros' };\nconst BEBIDAS = { cerveja: 'Cerveja', chopp: 'Chopp', vinho: 'Vinho', espumante: 'Espumante', drinks: 'Drinks' };\nconst CATERING = { coquetel: 'Coquetel', jantar: 'Jantar servido', buffet: 'Buffet', bebidas: 'Apenas bebidas', nenhum: 'Sem gastronomia' };\nconst REFERRAL = { indicacao: 'Indicação', membro: 'Membro TEMPO', instagram: 'Instagram', google: 'Google', imprensa: 'Imprensa', evento: 'Esteve em evento', porsche: 'Porsche', outro: 'Outro' };\n\nconst STATUS = [\n  { v: 'novo', t: 'Novo' },\n  { v: 'em_contato', t: 'Em contato' },\n  { v: 'proposta', t: 'Proposta enviada' },\n  { v: 'confirmado', t: 'Confirmado' },\n  { v: 'perdido', t: 'Perdido' },\n];\nconst ST_LABEL = STATUS.reduce((a, s) => { a[s.v] = s.t; return a; }, {});\n\nconst esc = (s) => String(s == null ? '' : s)\n  .replace(/[&<>\"]/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;' }[c]));\n\nconst DIACRITICOS = new RegExp('[\\\\u0300-\\\\u036f]', 'g');\nconst norm = (s) => String(s == null ? '' : s).toLowerCase().normalize('NFD').replace(DIACRITICOS, '');\n\nconst MES = ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'];\nconst parts = (iso) => {\n  if (!iso || !/^\\d{4}-\\d{2}-\\d{2}/.test(iso)) return null;\n  const p = iso.slice(0, 10).split('-').map(Number);\n  return { d: p[2], m: p[1], y: p[0], js: new Date(p[0], p[1] - 1, p[2]) };\n};\nconst diaNum = (iso) => { const p = parts(iso); return p ? String(p.d).padStart(2, '0') : '—'; };\nconst mesTxt = (iso) => { const p = parts(iso); return p ? MES[p.m - 1] : ''; };\nconst diaSemana = (iso) => { const p = parts(iso); return p ? ['dom', 'seg', 'ter', 'qua', 'qui', 'sex', 'sáb'][p.js.getDay()] : ''; };\nconst dataLonga = (iso) => { const p = parts(iso); return p ? `${String(p.d).padStart(2, '0')} ${MES[p.m - 1]} ${p.y} · ${diaSemana(iso)}` : '—'; };\nconst desde = (iso) => {\n  if (!iso) return '';\n  const min = Math.floor((Date.now() - new Date(iso).getTime()) / 60000);\n  if (min < 1) return 'agora';\n  if (min < 60) return min + 'min';\n  const h = Math.floor(min / 60);\n  if (h < 24) return h + 'h';\n  return Math.floor(h / 24) + 'd';\n};\n\nconst dataHora = (iso) => {\n  if (!iso) return '—';\n  const d = new Date(iso);\n  if (isNaN(d.getTime())) return '—';\n  const p = (n) => String(n).padStart(2, '0');\n  return `${p(d.getDate())}/${p(d.getMonth() + 1)}/${d.getFullYear()} às ${p(d.getHours())}:${p(d.getMinutes())}`;\n};\nconst dataCurta = (iso) => {\n  if (!iso) return '';\n  const d = new Date(iso);\n  if (isNaN(d.getTime())) return '';\n  const p = (n) => String(n).padStart(2, '0');\n  return `${p(d.getDate())}/${p(d.getMonth() + 1)}`;\n};\n\nconst pedidoTexto = (r) => {\n  const L = [];\n  const put = (k, v) => { if (v !== undefined && v !== null && v !== '') L.push(k + ': ' + v); };\n  const lista = (arr, map) => (arr || []).map((v) => map[v] || v).join(', ');\n  L.push('PEDIDO DE ORÇAMENTO · TEMPO BY PORSCHE');\n  put('Recebido em', dataHora(r.criado_em || r.createdAt));\n  L.push('');\n  L.push('CONTATO');\n  put('Nome', r.nome);\n  put('Cargo', r.cargo);\n  put('Empresa', r.empresa);\n  put('E-mail', r.email);\n  put('Telefone', r.telefone);\n  L.push('');\n  L.push('EVENTO');\n  put('Tipo', TIPOS[r.tipo_evento]);\n  put('Data', dataLonga(r.data) + (r.data_flexivel ? ' (data flexível)' : ''));\n  put('Início', r.hora_inicio);\n  put('Duração', r.duracao_horas ? r.duracao_horas + 'h' : '');\n  put('Convidados', r.pessoas);\n  put('Formato da sala', FORMATOS[r.formato]);\n  put('Exclusividade', EXCLUSIVIDADE[r.exclusividade]);\n  L.push('');\n  L.push('ESTRUTURA E AMBIENTAÇÃO');\n  put('Infra audiovisual', lista(r.infraestrutura, INFRA) || 'nenhuma');\n  put('Transmissão', r.transmissao_desc);\n  put('Música', MUSICA[r.musica] ? (MUSICA[r.musica] + (r.musica_desc ? ', ' + r.musica_desc : '')) : '');\n  put('Cenografia', r.ambientacao ? ('sim, ' + (r.ambientacao_desc || 'sem detalhe')) : 'não');\n  L.push('');\n  L.push('GASTRONOMIA E BEBIDAS');\n  put('Serviço', CATERING[r.catering]);\n  put('Restrições alimentares', r.restricoes);\n  put('Cardápio personalizado', r.cardapio_personalizado ? ('sim, ' + (r.cardapio_desc || 'sem detalhe')) : 'não');\n  put('Bebida alcoólica', r.bebidas_alcoolicas ? ('sim, ' + (lista(r.bebidas, BEBIDAS) || 'sem preferência')) : 'não');\n  put('Obs. bebidas', r.bebidas_obs);\n  L.push('');\n  L.push('ORIGEM');\n  put('Como conheceu', REFERRAL[r.referral]);\n  put('Detalhe', r.referral_detalhe);\n  if (r.observacoes) { L.push(''); L.push('OBSERVAÇÕES'); L.push(r.observacoes); }\n  return L.join('\\n');\n};\n\nexport default {\n  css: `\n    .wrap{ position:fixed; inset:0; overflow:hidden; display:flex; flex-direction:column;\n      background:#0a0a0b; color:#eae8e3; box-sizing:border-box;\n      font-family:-apple-system,BlinkMacSystemFont,'Helvetica Neue',Arial,sans-serif;\n      -webkit-font-smoothing:antialiased; }\n\n    .nav{ background:rgba(10,10,11,.9); backdrop-filter:blur(14px);\n      border-bottom:1px solid rgba(255,255,255,.08); flex:none; }\n    .nav-in{ max-width:1440px; margin:0 auto; padding:15px 30px; display:flex; align-items:center;\n      justify-content:space-between; gap:18px; box-sizing:border-box; }\n    .nav .lhs{ display:flex; align-items:center; gap:22px; }\n    .nav .logo{ height:22px; width:auto; display:block; }\n    .nav .ttl{ font-size:10.5px; letter-spacing:.24em; text-transform:uppercase; color:#a8a6a1;\n      padding-left:22px; border-left:1px solid rgba(255,255,255,.12); }\n    .nav .right{ display:flex; align-items:center; gap:16px; }\n    .ghost{ background:rgba(255,255,255,.05); border:1px solid rgba(255,255,255,.16); color:#eae8e3;\n      padding:8px 16px; border-radius:999px; font-size:10.5px; letter-spacing:.12em;\n      text-transform:uppercase; cursor:pointer; font-family:inherit; text-decoration:none;\n      display:inline-block; transition:all .2s ease; }\n    .ghost:hover{ background:rgba(255,255,255,.12); border-color:rgba(255,255,255,.34); }\n    .stamp{ font-size:10.5px; color:#5f5d58; letter-spacing:.1em; text-transform:uppercase; }\n\n    .body{ flex:1; overflow:hidden; display:flex; max-width:1440px; width:100%; margin:0 auto;\n      box-sizing:border-box; }\n    .col-list{ flex:1; min-width:0; overflow-y:auto; padding:0 30px 70px; box-sizing:border-box; }\n    .col-det{ width:430px; flex:none; border-left:1px solid rgba(255,255,255,.08);\n      overflow-y:auto; padding:28px 30px 70px; box-sizing:border-box;\n      background:linear-gradient(180deg,#121214 0%,#0d0d0f 100%); }\n\n    .kpis{ display:grid; grid-template-columns:repeat(auto-fit,minmax(150px,1fr)); gap:12px;\n      padding:26px 0 22px; }\n    .kpi{ border:1px solid rgba(255,255,255,.07); border-radius:12px; padding:20px 22px;\n      background:radial-gradient(130% 130% at 50% 0%, #1a1a1d 0%, #0e0e10 100%);\n      transition:border-color .25s ease; }\n    .kpi:hover{ border-color:rgba(255,255,255,.16); }\n    .kpi .n{ font-size:34px; font-weight:500; letter-spacing:-.03em; line-height:1; }\n    .kpi.hi .n{ color:#f3f1ec; }\n    .kpi .l{ font-size:9.5px; letter-spacing:.2em; text-transform:uppercase; color:#77756f; margin-top:10px; }\n\n    .filters{ display:flex; align-items:center; gap:9px; flex-wrap:wrap;\n      padding-bottom:20px; border-bottom:1px solid rgba(255,255,255,.08); }\n    .fchips{ display:flex; align-items:center; gap:9px; flex-wrap:wrap; }\n    .chip{ background:rgba(255,255,255,.04); border:1px solid rgba(255,255,255,.14); color:#a8a6a1;\n      padding:9px 16px; border-radius:999px; font-size:12.5px; font-family:inherit; cursor:pointer;\n      transition:all .2s cubic-bezier(.2,.7,.3,1); white-space:nowrap; }\n    .chip:hover{ border-color:rgba(234,232,227,.5); color:#f3f1ec; transform:translateY(-1px); }\n    .chip.on{ background:#eae8e3; border-color:#eae8e3; color:#0a0a0b; font-weight:600;\n      box-shadow:0 6px 18px rgba(234,232,227,.12); }\n    .chip .c{ opacity:.5; margin-left:7px; font-variant-numeric:tabular-nums; }\n    .search{ margin-left:auto; background:rgba(255,255,255,.04); border:1px solid rgba(255,255,255,.10);\n      border-radius:999px; color:#eae8e3; padding:10px 18px; font-size:13px; outline:none;\n      font-family:inherit; min-width:240px; transition:border-color .2s ease, background .2s ease; }\n    .search::placeholder{ color:#4e4c48; }\n    .search:focus{ border-color:rgba(234,232,227,.45); background:rgba(255,255,255,.06); }\n\n    .rows{ display:flex; flex-direction:column; padding-top:6px; }\n    .r{ display:flex; align-items:center; gap:20px; padding:16px 16px 16px 14px; cursor:pointer;\n      border-bottom:1px solid rgba(255,255,255,.055); border-radius:10px;\n      border-left:2px solid transparent;\n      transition:background .18s ease, border-left-color .18s ease, transform .18s cubic-bezier(.2,.7,.3,1); }\n    .r:hover{ background:rgba(255,255,255,.035); transform:translateX(2px); }\n    .r.sel{ background:rgba(255,255,255,.06); border-left-color:#eae8e3; }\n    .r .when{ width:58px; flex:none; text-align:center; }\n    .r .when .d{ font-size:23px; font-weight:500; letter-spacing:-.02em; line-height:1;\n      font-variant-numeric:tabular-nums; }\n    .r .when .w{ font-size:9.5px; letter-spacing:.16em; text-transform:uppercase; color:#77756f; margin-top:5px; }\n    .r .who{ flex:1; min-width:0; }\n    .r .who .n{ font-size:15.5px; font-weight:500; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }\n    .r .who .m{ font-size:12.5px; color:#77756f; margin-top:5px; overflow:hidden;\n      text-overflow:ellipsis; white-space:nowrap; }\n    .r .pax{ font-size:14px; color:#c9c7c2; white-space:nowrap; font-variant-numeric:tabular-nums; }\n    .r .pax b{ font-weight:500; }\n    .r .pax span{ color:#5f5d58; font-size:11px; letter-spacing:.1em; text-transform:uppercase; margin-left:4px; }\n    .r .ago{ font-size:10.5px; color:#4e4c48; width:48px; text-align:right; flex:none;\n      letter-spacing:.04em; font-variant-numeric:tabular-nums; }\n    .copyrow{ display:flex; gap:9px; margin-top:16px; }\n    .copybtn{ flex:1; background:rgba(255,255,255,.05); border:1px solid rgba(255,255,255,.16);\n      color:#eae8e3; padding:12px 18px; border-radius:999px; font-size:11px; letter-spacing:.12em;\n      text-transform:uppercase; cursor:pointer; font-family:inherit; transition:all .2s ease; }\n    .copybtn:hover{ background:rgba(255,255,255,.12); border-color:rgba(255,255,255,.34); }\n    .copybtn.done{ background:#eae8e3; border-color:#eae8e3; color:#0a0a0b; font-weight:700; }\n    .tag{ font-size:9.5px; letter-spacing:.16em; text-transform:uppercase; padding:6px 12px;\n      border-radius:999px; white-space:nowrap; border:1px solid transparent; font-weight:600; }\n    .tag.novo{ background:#eae8e3; color:#0a0a0b; }\n    .tag.em_contato{ border-color:rgba(234,232,227,.38); color:#eae8e3; }\n    .tag.proposta{ border-color:#7a6a45; color:#c8a37a; background:rgba(122,106,69,.1); }\n    .tag.confirmado{ border-color:#4c6a52; color:#8fc39b; background:rgba(76,106,82,.12); }\n    .tag.perdido{ border-color:rgba(255,255,255,.09); color:#4e4c48; }\n\n    .empty{ padding:90px 12px; text-align:center; }\n    .empty .eg{ font-family:Georgia,'Times New Roman',serif; font-style:italic; font-size:19px;\n      color:#5f5d58; }\n    .empty .es{ font-size:12.5px; color:#4e4c48; margin-top:12px; letter-spacing:.04em; }\n\n    .det-h h2{ font-size:25px; font-weight:500; margin:0; letter-spacing:-.02em; line-height:1.2; }\n    .det-h{ display:flex; align-items:flex-start; justify-content:space-between; gap:14px; }\n    .det-h .x{ background:transparent; border:0; color:#5f5d58; font-size:23px; cursor:pointer;\n      line-height:1; padding:0; font-family:inherit; transition:color .2s ease; }\n    .det-h .x:hover{ color:#eae8e3; }\n    .det-sub{ font-size:12.5px; color:#77756f; margin-top:8px; letter-spacing:.02em; }\n    .det-hero{ margin-top:20px; border:1px solid rgba(255,255,255,.08); border-radius:12px;\n      padding:20px 22px; background:radial-gradient(130% 130% at 50% 0%, #1a1a1d 0%, #0e0e10 100%); }\n    .det-hero .dl{ font-size:9.5px; letter-spacing:.2em; text-transform:uppercase; color:#77756f; }\n    .det-hero .dv{ font-size:19px; margin-top:8px; letter-spacing:-.01em; }\n    .det-hero .dx{ font-size:13px; color:#a8a6a1; margin-top:6px; }\n    .flexf{ font-size:9.5px; letter-spacing:.14em; text-transform:uppercase; color:#c8a37a;\n      border:1px solid #7a6a45; border-radius:999px; padding:3px 9px; margin-left:9px;\n      vertical-align:middle; font-weight:600; }\n    .yn{ font-size:9.5px; letter-spacing:.14em; text-transform:uppercase; font-weight:600;\n      border-radius:999px; padding:4px 10px; border:1px solid rgba(255,255,255,.14); color:#77756f; }\n    .yn.on{ border-color:rgba(234,232,227,.42); color:#eae8e3; }\n    .det-sec{ margin-top:26px; padding-top:20px; border-top:1px solid rgba(255,255,255,.08); }\n    .det-sec > .k{ font-size:9.5px; letter-spacing:.2em; text-transform:uppercase;\n      color:#77756f; margin-bottom:14px; }\n    .kv{ display:flex; gap:14px; padding:8px 0; font-size:13.5px; margin:0; }\n    .kv dt{ color:#77756f; width:112px; flex:none; }\n    .kv dd{ margin:0; flex:1; color:#eae8e3; }\n    .pills{ display:flex; flex-wrap:wrap; gap:7px; }\n    .pills span{ border:1px solid rgba(255,255,255,.14); color:#c9c7c2; font-size:12px;\n      padding:6px 13px; border-radius:999px; background:rgba(255,255,255,.03); }\n    .obs{ font-family:Georgia,'Times New Roman',serif; font-style:italic; font-size:14.5px;\n      line-height:1.75; color:#dcdad5; white-space:pre-wrap; }\n    .acts{ display:flex; gap:9px; flex-wrap:wrap; margin-top:16px; }\n    .stbtns{ display:flex; flex-wrap:wrap; gap:7px; }\n    .stbtn{ background:rgba(255,255,255,.04); border:1px solid rgba(255,255,255,.14); color:#a8a6a1;\n      padding:9px 15px; border-radius:999px; font-size:12px; cursor:pointer; font-family:inherit;\n      transition:all .2s cubic-bezier(.2,.7,.3,1); }\n    .stbtn:hover{ border-color:rgba(234,232,227,.5); color:#f3f1ec; transform:translateY(-1px); }\n    .stbtn.on{ background:#eae8e3; border-color:#eae8e3; color:#0a0a0b; font-weight:600;\n      box-shadow:0 6px 18px rgba(234,232,227,.12); }\n    .stbtn[disabled]{ opacity:.4; cursor:default; transform:none; }\n\n    .backbar{ display:none; background:rgba(255,255,255,.05);\n      border:1px solid rgba(255,255,255,.16); color:#eae8e3; font-family:inherit;\n      font-size:11px; letter-spacing:.12em; text-transform:uppercase; padding:11px 18px;\n      border-radius:999px; cursor:pointer; margin-bottom:22px; }\n\n    /* ── tablet ── */\n    @media (max-width:1100px){\n      .col-det{ width:370px; padding:24px 22px 60px; }\n      .col-list{ padding:0 22px 60px; }\n      .nav-in{ padding:14px 22px; }\n      .r{ gap:14px; }\n      .r .ago{ display:none; }\n    }\n\n    /* ── mobile ── */\n    @media (max-width:820px){\n      .nav-in{ padding:12px 18px; }\n      .nav .logo{ height:19px; }\n      .nav .ttl{ display:none; }\n      .stamp{ display:none; }\n\n      .col-list{ padding:0 18px 70px; }\n      .kpis{ grid-template-columns:repeat(2,1fr); gap:9px; padding:20px 0 18px; }\n      .kpi{ padding:15px 16px; border-radius:11px; }\n      .kpi .n{ font-size:26px; }\n      .kpi .l{ font-size:9px; letter-spacing:.16em; margin-top:7px; }\n      .kpi:last-child{ grid-column:1 / -1; }\n\n      .filters{ display:block; padding-bottom:16px; }\n      .fchips{ display:flex; gap:8px; overflow-x:auto; padding-bottom:10px;\n        -webkit-overflow-scrolling:touch; scrollbar-width:none; }\n      .fchips::-webkit-scrollbar{ display:none; }\n      .chip{ flex:none; padding:9px 15px; font-size:12.5px; }\n      .search{ margin:10px 0 0; width:100%; min-width:0; box-sizing:border-box; font-size:16px; }\n\n      .r{ gap:13px; padding:14px 10px; align-items:flex-start; flex-wrap:wrap; }\n      .r .when{ width:46px; }\n      .r .when .d{ font-size:20px; }\n      .r .when .w{ font-size:9px; letter-spacing:.12em; }\n      .r .who{ flex:1 1 auto; }\n      .r .who .n{ font-size:15px; white-space:normal; }\n      .r .who .m{ white-space:normal; line-height:1.45; }\n      .r .pax{ font-size:13px; }\n      .r .tag{ order:5; margin-left:59px; }\n\n      .col-det{ display:none; }\n      .col-det.open{ display:block; position:fixed; inset:0; width:auto; z-index:80;\n        border-left:0; padding:20px 18px 70px; overflow-y:auto;\n        background:linear-gradient(180deg,#121214 0%,#0a0a0b 100%); }\n      .backbar{ display:inline-block; }\n      .det-h .x{ display:none; }\n      .det-h h2{ font-size:22px; }\n      .det-hero{ padding:18px 18px; }\n      .det-hero .dv{ font-size:17px; }\n      .kv{ font-size:13px; }\n      .kv dt{ width:96px; }\n      .stbtn{ padding:10px 15px; }\n      .acts .ghost{ flex:1; text-align:center; }\n    }\n  `,\n\n  render(d2) {\n    const st = d2.state;\n    const all = st.rows || [];\n    const f = st.filtro || 'todos';\n    const q = norm(st.q || '');\n\n    const count = (v) => all.filter((r) => (r.status || 'novo') === v).length;\n\n    let list = all;\n    if (f !== 'todos') list = list.filter((r) => (r.status || 'novo') === f);\n    if (q) {\n      list = list.filter((r) => norm([r.nome, r.empresa, r.email, r.telefone, TIPOS[r.tipo_evento], REFERRAL[r.referral], r.referral_detalhe].join(' ')).indexOf(q) >= 0);\n    }\n\n    const abertos = all.filter((r) => ['novo', 'em_contato', 'proposta'].indexOf(r.status || 'novo') >= 0);\n    const confirmados = all.filter((r) => r.status === 'confirmado');\n    const paxConf = confirmados.reduce((a, r) => a + (Number(r.pessoas) || 0), 0);\n\n    const kpis = `<div class=\"kpis\">\n      <div class=\"kpi hi\"><div class=\"n\">${all.length}</div><div class=\"l\">Pedidos</div></div>\n      <div class=\"kpi\"><div class=\"n\">${count('novo')}</div><div class=\"l\">Novos</div></div>\n      <div class=\"kpi\"><div class=\"n\">${abertos.length}</div><div class=\"l\">Em aberto</div></div>\n      <div class=\"kpi\"><div class=\"n\">${confirmados.length}</div><div class=\"l\">Confirmados</div></div>\n      <div class=\"kpi\"><div class=\"n\">${paxConf}</div><div class=\"l\">Convidados confirmados</div></div>\n    </div>`;\n\n    const fchip = (v, t, n) => `<button class=\"chip${f === v ? ' on' : ''}\" data-f=\"${v}\">${esc(t)}${n != null ? `<span class=\"c\">${n}</span>` : ''}</button>`;\n    const filtros = `<div class=\"filters\">\n      <div class=\"fchips\">\n        ${fchip('todos', 'Todos', all.length)}\n        ${STATUS.map((s) => fchip(s.v, s.t, count(s.v))).join('')}\n      </div>\n      <input class=\"search q\" placeholder=\"Buscar nome, empresa, e-mail…\" value=\"${esc(st.q || '')}\">\n    </div>`;\n\n    let rows;\n    if (st.loading) {\n      rows = `<div class=\"empty\"><div class=\"eg\">Carregando pedidos…</div></div>`;\n    } else if (st.err) {\n      rows = `<div class=\"empty\"><div class=\"eg\">${esc(st.err)}</div>\n        <div class=\"es\"><button class=\"ghost reload\" style=\"margin-top:16px\">Tentar de novo</button></div></div>`;\n    } else if (!list.length) {\n      rows = `<div class=\"empty\"><div class=\"eg\">${all.length ? 'Nada por aqui.' : 'Ainda não chegou nenhum pedido.'}</div>\n        <div class=\"es\">${all.length ? 'Ajuste o filtro ou limpe a busca.' : 'Assim que o formulário for enviado, ele aparece nesta lista.'}</div></div>`;\n    } else {\n      rows = `<div class=\"rows\">` + list.map((r) => {\n        const stt = r.status || 'novo';\n        const meta = [r.empresa, TIPOS[r.tipo_evento], r.hora_inicio, REFERRAL[r.referral]].filter(Boolean).join(' · ');\n        return `<div class=\"r${st.sel === r._id ? ' sel' : ''}\" data-id=\"${esc(r._id)}\" data-key=\"${esc(r._id)}\">\n          <div class=\"when\"><div class=\"d\">${diaNum(r.data)}</div><div class=\"w\">${mesTxt(r.data)} · ${diaSemana(r.data)}</div></div>\n          <div class=\"who\"><div class=\"n\">${esc(r.nome || '—')}</div><div class=\"m\">${esc(meta)}</div></div>\n          <div class=\"pax\"><b>${r.pessoas || '—'}</b><span>pessoas</span></div>\n          <span class=\"tag ${stt}\">${esc(ST_LABEL[stt] || stt)}</span>\n          <div class=\"ago\" title=\"Recebido em ${esc(dataHora(r.criado_em || r.createdAt))}\">${dataCurta(r.criado_em || r.createdAt)}</div>\n        </div>`;\n      }).join('') + `</div>`;\n    }\n\n    const sel = all.find((r) => r._id === st.sel);\n    let det = '';\n    if (sel) {\n      const stt = sel.status || 'novo';\n      const infra = (sel.infraestrutura || []).map((v) => `<span>${esc(INFRA[v] || v)}</span>`).join('');\n      const kv = (k, v) => `<dl class=\"kv\"><dt>${k}</dt><dd>${esc(v || '—')}</dd></dl>`;\n      const tel = String(sel.telefone || '').replace(/\\D/g, '');\n      det = `<div class=\"col-det open\">\n        <button class=\"backbar close\">← Voltar para a lista</button>\n        <div class=\"det-h\">\n          <div><h2>${esc(sel.nome || '—')}</h2>\n            <div class=\"det-sub\">${esc(sel.empresa || 'Sem empresa')}${sel.cargo ? ' · ' + esc(sel.cargo) : ''}</div>\n            <div class=\"det-sub\">Recebido em ${esc(dataHora(sel.criado_em || sel.createdAt))} · há ${desde(sel.criado_em || sel.createdAt)}</div></div>\n          <button class=\"x close\">×</button>\n        </div>\n\n        <div class=\"det-hero\">\n          <div class=\"dl\">${esc(TIPOS[sel.tipo_evento] || 'Evento')}</div>\n          <div class=\"dv\">${esc(dataLonga(sel.data))}${sel.data_flexivel ? ' <span class=\"flexf\">flexível</span>' : ''}</div>\n          <div class=\"dx\">${esc(sel.hora_inicio || '—')}${sel.duracao_horas ? ' · ' + sel.duracao_horas + 'h' : ''} · ${sel.pessoas || '—'} convidados${sel.formato ? ' · ' + esc(FORMATOS[sel.formato] || sel.formato) : ''}</div>\n        </div>\n\n        <div class=\"copyrow\">\n          <button class=\"copybtn${st.copied === sel._id ? ' done' : ''}\">${st.copied === sel._id ? '✓ Copiado' : (st.copied === 'erro' ? 'Não consegui copiar' : 'Copiar pedido em texto')}</button>\n        </div>\n\n        <div class=\"det-sec\"><div class=\"k\">Status</div>\n          <div class=\"stbtns\">${STATUS.map((s) => `<button class=\"stbtn${stt === s.v ? ' on' : ''}\" data-st=\"${s.v}\"${st.saving ? ' disabled' : ''}>${esc(s.t)}</button>`).join('')}</div>\n        </div>\n\n        <div class=\"det-sec\"><div class=\"k\">Espaço</div>\n          ${kv('Exclusividade', EXCLUSIVIDADE[sel.exclusividade])}\n        </div>\n\n        <div class=\"det-sec\"><div class=\"k\">Estrutura e ambientação</div>\n          ${infra ? `<div class=\"pills\">${infra}</div>` : `<div class=\"det-sub\" style=\"margin:0\">Nenhuma infra selecionada</div>`}\n          ${sel.transmissao_desc ? `<div style=\"margin-top:14px\">${kv('Transmissão', sel.transmissao_desc)}</div>` : ''}\n          <div style=\"margin-top:14px\">${kv('Música', MUSICA[sel.musica])}</div>\n          ${sel.musica_desc ? `<div class=\"obs\" style=\"margin-top:10px\">“${esc(sel.musica_desc)}”</div>` : ''}\n          <dl class=\"kv\"><dt>Cenografia</dt><dd><span class=\"yn${sel.ambientacao ? ' on' : ''}\">${sel.ambientacao ? 'Sim' : 'Não'}</span></dd></dl>\n          ${sel.ambientacao_desc ? `<div class=\"obs\" style=\"margin-top:10px\">“${esc(sel.ambientacao_desc)}”</div>` : ''}\n        </div>\n\n        <div class=\"det-sec\"><div class=\"k\">Gastronomia e bebidas</div>\n          ${kv('Serviço', CATERING[sel.catering])}\n          ${sel.restricoes ? kv('Restrições', sel.restricoes) : ''}\n          <dl class=\"kv\"><dt>Cardápio</dt><dd><span class=\"yn${sel.cardapio_personalizado ? ' on' : ''}\">${sel.cardapio_personalizado ? 'Personalizado' : 'Padrão'}</span></dd></dl>\n          ${sel.cardapio_desc ? `<div class=\"obs\" style=\"margin-top:10px\">“${esc(sel.cardapio_desc)}”</div>` : ''}\n          <dl class=\"kv\"><dt>Álcool</dt><dd><span class=\"yn${sel.bebidas_alcoolicas ? ' on' : ''}\">${sel.bebidas_alcoolicas ? 'Sim' : 'Não'}</span></dd></dl>\n          ${(sel.bebidas || []).length ? `<div class=\"pills\" style=\"margin-top:10px\">${(sel.bebidas || []).map((v) => `<span>${esc(BEBIDAS[v] || v)}</span>`).join('')}</div>` : ''}\n          ${sel.bebidas_obs ? `<div class=\"obs\" style=\"margin-top:10px\">“${esc(sel.bebidas_obs)}”</div>` : ''}\n        </div>\n\n        <div class=\"det-sec\"><div class=\"k\">Origem</div>\n          ${kv('Como conheceu', REFERRAL[sel.referral])}\n          ${kv('Detalhe', sel.referral_detalhe)}\n        </div>\n\n        <div class=\"det-sec\"><div class=\"k\">Contato</div>\n          ${sel.cargo ? kv('Cargo', sel.cargo) : ''}\n          ${kv('E-mail', sel.email)}\n          ${kv('Telefone', sel.telefone)}\n          <div class=\"acts\">\n            <a class=\"ghost\" href=\"mailto:${esc(sel.email)}?subject=${encodeURIComponent('TEMPO by Porsche — seu pedido de reserva')}\">E-mail</a>\n            ${tel.length >= 10 ? `<a class=\"ghost\" href=\"https://wa.me/${tel.length > 11 ? tel : '55' + tel}\" target=\"_blank\" rel=\"noopener\">WhatsApp</a>` : ''}\n          </div>\n        </div>\n\n        ${sel.observacoes ? `<div class=\"det-sec\"><div class=\"k\">Observações</div><div class=\"obs\">“${esc(sel.observacoes)}”</div></div>` : ''}\n      </div>`;\n    }\n\n    return `<div class=\"wrap\">\n      <div class=\"nav\"><div class=\"nav-in\">\n        <div class=\"lhs\">\n          <img class=\"logo\" src=\"${LOGO}\" alt=\"TEMPO by Porsche\">\n          <span class=\"ttl\">Reservas de espaço</span>\n        </div>\n        <div class=\"right\">\n          <span class=\"stamp\">${st.stamp ? 'atualizado há ' + desde(st.stamp) : ''}</span>\n          <button class=\"ghost reload\">Atualizar</button>\n        </div>\n      </div></div>\n      <div class=\"body\">\n        <div class=\"col-list\">${kpis}${filtros}${rows}</div>\n        ${det}\n      </div>\n    </div>`;\n  },\n\n  mounted(d2) {\n    const API = d2.param('api') || 'reserva-espaco-api';\n\n    const load = async () => {\n      d2.state.loading = !(d2.state.rows || []).length;\n      d2.state.err = '';\n      try {\n        const res = await d2.rush(API).invoke({ action: 'list' });\n        const out = res && res.data !== undefined ? res.data : res;\n        if (out && out.ok) {\n          d2.setState({ rows: out.reservas || [], stamp: new Date().toISOString() });\n        } else {\n          d2.state.err = 'Não foi possível carregar os pedidos.';\n        }\n      } catch (e) {\n        d2.log('list err', e);\n        d2.state.err = 'Erro de conexão ao carregar.';\n      } finally {\n        d2.state.loading = false;\n      }\n    };\n    load();\n\n    const t = setInterval(load, 60000);\n    d2.onUnmount(() => clearInterval(t));\n\n    d2.on('.reload', 'click', () => load());\n    d2.on('.chip', 'click', (e, el) => { d2.state.filtro = el.dataset.f; });\n    d2.on('.q', 'input', (e, el) => { d2.state.q = el.value; });\n    d2.on('.r', 'click', (e, el) => { d2.state.sel = el.dataset.id; });\n    d2.on('.close', 'click', () => { d2.setState({ sel: null, copied: '' }); });\n\n    d2.on('.copybtn', 'click', async () => {\n      const sel = (d2.state.rows || []).find((r) => r._id === d2.state.sel);\n      if (!sel) return;\n      const txt = pedidoTexto(sel);\n      let ok = false;\n      try {\n        if (navigator.clipboard && navigator.clipboard.writeText) {\n          await navigator.clipboard.writeText(txt);\n          ok = true;\n        }\n      } catch (e) { ok = false; }\n      if (!ok) {\n        try {\n          const ta = document.createElement('textarea');\n          ta.value = txt;\n          ta.style.position = 'fixed';\n          ta.style.top = '-1000px';\n          ta.style.opacity = '0';\n          (d2.root || document.body).appendChild(ta);\n          ta.focus();\n          ta.select();\n          ok = document.execCommand('copy');\n          ta.parentNode.removeChild(ta);\n        } catch (e2) { ok = false; }\n      }\n      d2.state.copied = ok ? sel._id : 'erro';\n      setTimeout(() => { d2.state.copied = ''; }, 2400);\n    });\n\n    d2.on('.stbtn', 'click', async (e, el) => {\n      const id = d2.state.sel;\n      const novo = el.dataset.st;\n      if (!id || d2.state.saving) return;\n      d2.state.saving = true;\n      try {\n        const res = await d2.rush(API).invoke({ action: 'status', id, status: novo });\n        const out = res && res.data !== undefined ? res.data : res;\n        if (out && out.ok) {\n          d2.state.rows = (d2.state.rows || []).map((r) => (r._id === id ? Object.assign({}, r, { status: novo }) : r));\n        }\n      } catch (err) {\n        d2.log('status err', err);\n      } finally {\n        d2.state.saving = false;\n      }\n    });\n  },\n};"}},"api":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"api"}}}}}}}}}},{"_id":"5ed9bed7b9e0891ce913e884","component":"data2-core-types@Component","params":{"package":"data2-core","component":"DataSource","renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1366,"exactWidth":false,"exactHeight":false,"height":768}}}}},{"_id":"5f472ae463c680de4ff296e9","component":"data2-core-types@Component","params":{"package":"data2-core","component":"Data2TableDataSource","extends":"data2-core@DataSource","renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1366,"exactWidth":false,"exactHeight":false,"height":768}}}}},{"_id":"5ecd05ded68ce41360f74b43","component":"data2-core-types@Component","params":{"extendable":{"placeholder":"children"},"component":"Block","package":"data2-core-primitives"}},{"_id":"5f494791a575399a45020f87","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@input","params":{"style":{"width":"100%","height":"100%","boxSizing":"border-box","background":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":"checkbox"}}],"then":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"comparisonSubject":true}}],"then":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"checkboxFill"}}}},"rgba(0,118,255,1)"]},"component":"data2-core-logical-operators@Or"},"else":{"params":{"content":"none"},"component":"data2-core-primitives@String"}}},"else":{"params":{"content":"none"},"component":"data2-core-primitives@String"}}},"color":{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"},"border":"none","outline":"none","appearance":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"orient","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":"vertical"}}],"then":"slider-vertical","else":"none"}},"cursor":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"super.cursor"}}}},{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"disabled","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":{"component":"data2-core-primitives@String","params":{"content":"not-allowed"}},"else":{"component":"data2-core-primitives@String","params":{"content":"auto"}}}}]},"component":"data2-core-logical-operators@Or"},"fontWeight":{"component":"data2-core-primitives@String","params":{"content":"inherit"}},"paddingLeft":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"comparisonSubject":{"params":{},"component":"data2-core-primitives@Undefined"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.left"}}}}},"component":"data2-core-comparison-operators@Different"}],"then":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.left"}}}},{"component":"data2-core-primitives@String","params":{"content":"px"}}]},"component":"data2-core-functions@StringConcat"}}},"paddingRight":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"comparisonSubject":{"params":{},"component":"data2-core-primitives@Undefined"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.right"}}}}},"component":"data2-core-comparison-operators@Different"}],"then":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.right"}}}},{"component":"data2-core-primitives@String","params":{"content":"px"}}]},"component":"data2-core-functions@StringConcat"}}},"caretColor":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"caretColor"}}}},"textAlign":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"super.textFormat.textAlign"}}},"component":"data2-core-types@Reference"}},"tabIndex":{"component":"data2-core-types@Reference","params":{"reference":"tabIndex","source":"VIRTUAL_COMPONENT_PARAMS"}},"step":{"component":"data2-core-types@Reference","params":{"reference":"step","source":"VIRTUAL_COMPONENT_PARAMS"}},"min":{"component":"data2-core-types@Reference","params":{"reference":"min","source":"VIRTUAL_COMPONENT_PARAMS"}},"max":{"component":"data2-core-types@Reference","params":{"reference":"max","source":"VIRTUAL_COMPONENT_PARAMS"}},"maxLength":{"params":{"then":{"params":{},"component":"data2-core-primitives@Undefined"},"compare":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"maxLength","source":"VIRTUAL_COMPONENT_PARAMS"}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":""}}},"component":"data2-core-comparison-operators@Equal"}],"else":{"component":"data2-core-types@Reference","params":{"reference":"maxLength","source":"VIRTUAL_COMPONENT_PARAMS"}}},"component":"data2-core-flow@If"},"orient":{"component":"data2-core-types@Reference","params":{"reference":"orient","source":"VIRTUAL_COMPONENT_PARAMS"}},"type":{"component":"data2-core-types@Reference","params":{"reference":"type","source":"VIRTUAL_COMPONENT_PARAMS"}},"placeholder":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"placeholder","source":"VIRTUAL_COMPONENT_PARAMS"}},{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}}]}},"value":{"params":{"expression":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"defaultCase":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}},"mask":{"component":"data2-core-types@Reference","params":{"reference":"mask","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":"date"}},"value":{"component":"data2-core-functions@DateFormat","params":{"date":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"format":"YYYY-MM-DD"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"month"}}}},"value":{"component":"data2-core-functions@DateFormat","params":{"date":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"format":{"component":"data2-core-primitives@String","params":{"content":"YYYY-MM"}}}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"datetime-local"}}}},"value":{"component":"data2-core-functions@DateFormat","params":{"date":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"format":{"component":"data2-core-primitives@String","params":{"content":"YYYY-MM-DDTHH:mm"}}}}}}]},"component":"data2-core-flow@Switch"},"onChange":{"component":"data2-core-types@DataLinkSetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}},"recordUpsert":{"component":"data2-core-types@Reference","params":{"reference":"recordUpsert","source":"VIRTUAL_COMPONENT_PARAMS"}},"onChange":{"component":"data2-core-types@Reference","params":{"reference":"onChange","source":"VIRTUAL_COMPONENT_PARAMS"}},"mask":{"component":"data2-core-types@Reference","params":{"reference":"mask","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"defaultChecked":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":"checkbox"}}],"then":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"else":""}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"opacity":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"reference":"disabled","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"}],"then":0.38,"else":1}},"disabled":{"params":{"reference":"disabled","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"autoComplete":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Equal","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"builder"}},"comparisonSubject":true}}],"then":"new-password","else":{"params":{"compare":{"params":{"comparisonSubject":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"autoComplete"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-comparison-operators@Identical"},"else":{"params":{"components":[{"params":{"reference":"autoComplete","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@String","params":{"content":"off"}}]},"component":"data2-core-logical-operators@Or"}},"component":"data2-core-flow@If"}}},"data-lpignore":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"reference":"autoComplete","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"}],"then":"","else":"true"}},"onFocus":{"component":"data2-core-types@Reference","params":{"reference":"onFocus","source":"VIRTUAL_COMPONENT_PARAMS"}},"onBlur":{"component":"data2-core-types@Reference","params":{"reference":"onBlur","source":"VIRTUAL_COMPONENT_PARAMS"}},"onKeyPress":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onKeyPress"}}}},"autoCapitalize":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"autoCapitalize"}}}},"spellCheck":{"params":{"expression":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"spellCheck"}}},"component":"data2-core-types@Reference"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"value":{"component":"data2-core-primitives@String","params":{"content":"true"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"value":{"component":"data2-core-primitives@String","params":{"content":"false"}}}}]},"component":"data2-core-flow@Switch"}}}}},"component":"DataFieldBlock","package":"data2-blocks","extends":"data2-core-primitives@Block"}}]}},{"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":{"component":"data2-core-flow@If","displayName":"management exception never picks the system","params":{"compare":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"is_data2_user"}}}},{"component":"data2-core-logical-operators@Not","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"is_data2_app_exception"}}}}}}]}},"then":{"system":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}},"else":{"d2_app":"management"}}},"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-10-19T16:23:02.013Z","updateMetadata":{"updatedBy":{"user":"5f1609be1ca96def427e1559"}}},{"_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"},{"component":"data2-core@DataSet","reference":"SessionsDataSet","params":{"requiresConfirmation":false,"pk":"key","datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"data2sessionsdatasource"}}}},{"component":"data2-core@ServerSessionsDataSource","reference":"data2sessionsdatasource","params":{}},{"reference":"UsersTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"_id":"5f1600b70528b92601890f75","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ServiceComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ServiceComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:20.208Z","createdAt":"2020-07-20T20:38:15.436Z"},{"_id":"5f1602190528b92601890f7d","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":40000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentInstancesTableDataSource"}},"sort":{"_id":1},"pk":"_id","autoEdit":true,"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:07.089Z","createdAt":"2020-07-20T20:44:09.350Z"},{"_id":"5f16017f0528b92601890f7a","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"clientApplicationDomain"}}},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"reference":"FileComponentInstancesDataSet","updatedAt":"2023-08-03T16:08:18.193Z","createdAt":"2020-07-20T20:41:35.797Z"},{"_id":"5f1601990528b92601890f7b","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ApplicationsTableDataSource"}},"pk":"_id","autoEdit":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"params":{"column":"_id"},"component":"data2-core-types@DataSetColumnReference"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"reference":"ApplicationsDataSet","updatedAt":"2022-12-13T21:51:13.995Z","createdAt":"2020-07-20T20:42:01.657Z"},{"_id":"5f16172a0528b92601890f85","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":10000}}},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"DataComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"DataComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:12.831Z","createdAt":"2020-07-20T22:14:02.097Z"},{"_id":"60ddc1bbda3861ca65407c5a","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"clientApplicationDomain"}}},"pagination":{"size":1},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"}},"reference":"OneFileComponentInstancesDataSet","updatedAt":"2022-02-09T19:44:38.036Z","createdAt":"2020-07-20T20:41:35.797Z"},{"_id":"63ee3d38b8c9838c62fb05fb","displayName":"DriveFileComponentInstancesDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"filter":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core@Drive"}}},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"reference":"DriveFileComponentInstancesDataSet","updatedAt":"2025-12-04T21:58:32.367Z","createdAt":"2023-02-16T14:27:07.797Z"},{"reference":"ServiceComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a45d871022f39b95631189d","component":"data2-rush@HTTPListener","reference":"deck-api","system":"6a45d210b5865956b508ba84","params":{}}]}},{"reference":"ComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a7dc9573aabf15c02c5d347","component":"data2-core-primitives@Router","system":"6a45d210b5865956b508ba84","displayName":"Deck Router","params":{"routes":[{"component":"data2-core-primitives@Route","params":{"path":{"component":"data2-core-primitives@String","params":{"content":"/"}},"policies":[{"component":"data2-core-auth@Policy","params":{"authenticationStrategy":{"params":{"reference":"rAMokwNexe8bJoWWveODt"},"component":"data2-core-types@InteractiveModuleReference"}}}],"content":{"params":{"reference":"t2mUvQ8yn40-sXaj4LGC1"},"component":"data2-core-types@ArtboardReference"}}}],"login":{"params":{"reference":"aXMg8LSnqXUojJphn5mdO"},"component":"data2-core-types@ArtboardReference"}},"reference":"17oYu6q2Px8FYnWuQ8BNY"},{"_id":"6a7dca0b537bb58c0466c171","component":"data2-core-primitives@Artboard","system":"6a45d210b5865956b508ba84","displayName":"Tempo Login Screen","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(10,10,10,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"aXMg8LSnqXUojJphn5mdO"},{"_id":"6a45da578c5c69fa78ec75f7","component":"data2-core-primitives@Artboard","system":"6a45d210b5865956b508ba84","displayName":"Deck Editor","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Deck Editor"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}},"position":{"component":"data2-core-types@Position","params":{"x":2164,"y":241,"exactX":2163.93,"exactY":240.64}}},"reference":"t2mUvQ8yn40-sXaj4LGC1"},{"_id":"6a7dca16537bb58c0466c172","parent":"6a7dca0b537bb58c0466c171","component":"data2-core-primitives@Block","system":"6a45d210b5865956b508ba84","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":451,"height":366}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":458,"y":203,"exactX":458,"exactY":203.33}}}},{"_id":"cc0365cf4c4bb17db0533bfc","parent":"6a45da578c5c69fa78ec75f7","component":"tempo@deck-editor","system":"6a45d210b5865956b508ba84","displayName":"deck-editor","params":{"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}}}},"reference":"lJh4FUQQu1YJ1ZmhkJn-E"},{"_id":"6a7dca1c537bb58c0466c173","parent":"6a7dca16537bb58c0466c172","component":"data2-core-primitives@Block","system":"6a45d210b5865956b508ba84","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"},"disabled":true},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"component":"data2-core-types@FileComponentUrlReference","params":{"reference":"J73-Yp9CD6EhMzq7WTyMt"}},"positionX":"center","positionY":"center","size":"contain","repeat":"no-repeat"},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":228,"height":100,"exactWidth":228,"exactHeight":100.06}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":109,"y":0,"exactX":false,"exactY":false}}}},{"_id":"6a7dca66537bb58c0466c174","parent":"6a7dca16537bb58c0466c172","component":"data2-blocks@DataFieldBlock","system":"6a45d210b5865956b508ba84","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"rgba(36,36,36,1)","radius":{"leftTop":5,"rightTop":5,"leftBottom":5,"rightBottom":5},"width":{"left":1,"top":1,"right":1,"bottom":1},"type":"solid"}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(22,22,22,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":226,"height":44,"exactWidth":225.69,"exactHeight":44}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":113,"y":122,"exactX":113,"exactY":122}},"textColor":{"params":{"rgba":"rgba(255,255,255,1)"},"component":"data2-core-types@Color"}},"dataset":{"params":{"reference":"rAMokwNexe8bJoWWveODt"},"component":"data2-core-types@InteractiveModuleReference"},"field":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"credentials.email"}},"padding":{"left":{"component":"data2-core-primitives@Number","params":{"content":10}},"right":{"component":"data2-core-primitives@Number","params":{"content":10}}},"placeholder":{"component":"data2-core-primitives@String","params":{"content":"E-mail"}}}},{"_id":"6a7dca70537bb58c0466c175","parent":"6a7dca16537bb58c0466c172","component":"data2-blocks@DataFieldBlock","system":"6a45d210b5865956b508ba84","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"rgba(36,36,36,1)","radius":{"leftTop":5,"rightTop":5,"leftBottom":5,"rightBottom":5},"width":{"left":1,"top":1,"right":1,"bottom":1},"type":"solid"}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(22,22,22,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":226,"height":44,"exactWidth":225.69,"exactHeight":44}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":113,"y":196,"exactX":false,"exactY":false}},"textColor":{"params":{"rgba":"rgba(255,255,255,1)"},"component":"data2-core-types@Color"}},"dataset":{"params":{"reference":"rAMokwNexe8bJoWWveODt"},"component":"data2-core-types@InteractiveModuleReference"},"field":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"credentials.password"}},"padding":{"left":{"component":"data2-core-primitives@Number","params":{"content":10}},"right":{"component":"data2-core-primitives@Number","params":{"content":10}}},"placeholder":{"component":"data2-core-primitives@String","params":{"content":"password"}},"type":"password"}},{"_id":"6a7dca75537bb58c0466c176","parent":"6a7dca16537bb58c0466c172","component":"data2-core-primitives@Block","system":"6a45d210b5865956b508ba84","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,184,29,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":110,"height":44,"exactWidth":109.64,"exactHeight":44}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":171,"y":278,"exactX":false,"exactY":false}},"onClick":{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"rAMokwNexe8bJoWWveODt"}},"prop":"login"},"component":"data2-core-types@Interaction"},"text":"Login","textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}}}}]}},{"_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":"6a7dc95c3aabf15c02c5d348","displayName":"Deck","reference":"67hdQcnqP-kBbMLdZf9p2","params":{"entryPoint":{"disabled":false,"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Router","reference":"17oYu6q2Px8FYnWuQ8BNY"}},"domain":{"component":"data2-core-primitives@String","params":{"content":"deck"}}},"system":"6a45d210b5865956b508ba84","component":"data2-core-primitives@Application"}]}},{"reference":"DataComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a7dc94b3aabf15c02c5d346","component":"data2-core@AuthenticationStrategy","system":"6a45d210b5865956b508ba84","params":{"resetPassword":{"resetEmail":{"artboard":{"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"}},"resetSuccessEmail":{"artboard":{"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"}}},"verifier":{"params":{"reference":"4l0LFU2dVfqFYBWOh5gaz"},"component":"data2-core-types@DataSetReference"},"credentials":[{"component":"data2-core-types@FieldReference","params":{"key":"email"}},{"component":"data2-core-types@FieldReference","params":{"key":"password"}}]},"reference":"rAMokwNexe8bJoWWveODt"},{"_id":"6a7dc97a3aabf15c02c5d349","component":"data2-core@DataSet","system":"6a45d210b5865956b508ba84","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"aogrfbWALZcTEvpRgCRSe"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":20}},"reference":"4l0LFU2dVfqFYBWOh5gaz"},{"_id":"6a7dc9433aabf15c02c5d345","component":"data2-core@Data2TableDataSource","system":"6a45d210b5865956b508ba84","params":{"table":"aogrfbWALZcTEvpRgCRSe","multi":["create"],"schema":[{"component":"data2-core-types@Field","params":{"title":"email","key":"email","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"password","key":"password","component":"data2-core-types@Password"}}]},"reference":"aogrfbWALZcTEvpRgCRSe"}]}},{"reference":"BundlesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}}],"processesParams":{}}}}