HTML |
---|
<div class="imgcapa"> <img src="http://danielypaz.com.br/wp-content/uploads/2023/02/capaartigo3-1final.png" style="width:100%"> </div> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"> <div class="content"> <div class="article"> <br> <h2> <img src="httpshttp://tdn.totvs.com/download/attachments/741313263/Ativo%[email protected]?version=2&modificationDate=1676431647473&api=v2projeto.cloud/wp-content/uploads/2023/03/[email protected]" alt="some text" width=40>   WEBHOOKS  WEBHOOKS NO WORKFLOW DO TOTVS CRM</h2> <div class="table-wrap" style="margin-left: 30px;"> <table class="relative-table wrapped confluenceTable" style="width: 367.06px;" resolved=""> <thead> <tr> <th style="text-align: left;" colspan="1" class="confluenceTh">Produto:</th> <td style="text-align: left;" colspan="1" class="confluenceTd"> TCRM - Gestão de Clientes</td> <div class="content-wrapper"> </div> </td> </tr> </thead> <colgroup> <col style="width: 162.912px;"> <col style="width: 203.153px;"> </colgroup> <tbody> <tr> <th style="text-align: left;" class="confluenceTh">Linha de Produto:</th> <td style="text-align: left;" class="confluenceTd">TOTVS CRM</td> <div class="content-wrapper"> </div> </td> </tr> <tr> <th style="text-align: left;" class="confluenceTh">Segmento:</th> <td style="text-align: left;" class="confluenceTd">Cross Segmentos</td> <div class="content-wrapper"> </div> </td> </tr> <tr> <th style="text-align: left;" class="confluenceTh">Módulo:</th> <td style="text-align: left;" class="confluenceTd">Workflow</td> </tr> <tr> <th style="text-align: left;" colspan="1" class="confluenceTh">Aplicação</th> <td style="text-align: left;" colspan="1" class="confluenceTd">Web/app móvel</td> </tr> <tr> <th style="text-align: left;" colspan="1" class="confluenceTh">Identificador:</th> <td style="text-align: left;" colspan="1" class="confluenceTd"><span style="color: rgb(23,43,77);">ME261020221452</span></td> </tr> <tr> <th style="text-align: left;" colspan="1" class="confluenceTh">Stakeholder:</th> <td style="text-align: left;" colspan="1" class="confluenceTd">TOTVS Connector</td> </tr> <tr> <th style="text-align: left;" colspan="1" class="confluenceTh">Ticket:</th> <td style="text-align: left;" colspan="1" class="confluenceTd"><br></td> </tr> <tr> <th style="text-align: left;" colspan="1" class="confluenceTh"><span style="color: rgb(0,0,0);">Requisito/S</span><span style="color: rgb(0,0,0);">tory/Issue (informe o requisito relacionado)</span><span style="color: rgb(47,57,65);"> :</span></th> <td style="text-align: left;" colspan="1" class="confluenceTd"> <div class="content-wrapper"> <span class="jira-issue" data-jira-key="DTCRMSC-2480"> <a href="https://jiraproducao.totvs.com.br/browse/DTCRMSC-2480" class="jira-issue-key"><img class="icon" src="https://jiraproducao.totvs.com.br/images/icons/ico_epic.png">DTCRMSC-2480</a> - <span class="summary">ME261020221452 - Suporte a webhooks via Workflow</span> <span class="aui-lozenge aui-lozenge-subtle aui-lozenge-current jira-macro-single-issue-export-pdf">Em Execução</span> </span> </div> </td> </tr> </tbody> </table> </div> |
HTML |
---|
<br> <p> Muitas empresas enfrentam o desafio de manter seus registros atualizados em diversos sistemas quando uma ação é executada no TOTVS CRM. Esse processo manual é demorado e pode levar a erros, impactando negativamente a eficiência e produtividade da equipe. Para superar essa dificuldade, o TOTVS CRM lançou recentemente um novo recurso de ação chamado Webhook, disponível no módulo de workflow. Com a utilização de Webhooks, os clientes agora podem automatizar esses processos e integrar facilmente diferentes sistemas e aplicativos. Quando um gatilho de criação ou atualização é acionado no TOTVS CRM, a ação de Webhook é executada, permitindo que as informações sejam atualizadas em tempo real em outros sistemas conectados. Esse processo resulta em atualizações rápidas e precisas, economizando tempo e eliminando erros manuais que antes eram muito comuns. Em outras palavras, a ação de Webhook permite que os clientes conectem seus sistemas e automatizem a atualização de registros, o que simplifica o processo e melhora significativamente a eficiência operacional da empresa. <br> <br> <div> </div> |
HTML |
---|
<div class="pause" id="secao-5">   <b> TIPO DE INTEGRAÇÃO</b> </div> <p> <strong>Saída:</strong> esta integração envia dados do TCRM - Gestão de Clientes para uma ferramenta destino, especificada na configuração. </p> <br> <br> |
HTML |
---|
<div class="pause" id="secao-5">   <b> O QUE ESTA INTEGRAÇÃO FAZ?</b> </div> <p> Esta configuração permite enviar dados do TOTVS CRM para outras ferramentas que disponham de uma URL de entrada de dados. Essa URL precisa conseguir ler e consumir dados enviados em formato JSON. </p> <br> <br> |
HTML |
---|
<div class="pause" id="secao-5">   <b> OBSERVAÇÕES E REQUISITOS</b> </div> <p> É importante ter um desenvolvedor ou contato com o suporte do seu outro sistema para checar a compatibilidade com a leitura do pacote de dados que o TOTVS CRM envia. </p> <br> <br> |
HTML |
---|
<div class="pause" id="secao-5">   <b> PASSOPASSO A PASSO PARA REALIZAR A INTEGRAÇÃO </b> </div> <br> <ol> <li>Com o TOTVS CRM Gestão de Clientes aberto em seu navegador, acesse o Workflow por meio do menu principal;</li> <br> <li>Para adicionar uma automação, clique no botão "Adicionar" localizado no canto superior direito da tela;</li><br> <li>No campo de nome, insira uma breve descrição do Webhook, facilitando a identificação do cadastro em acessos futuros. Se necessário, adicione informações complementares no campo de observações;</li><br> <li>Depois de nomear seu Workflow, selecione o gatilho do seu workflow clicando no botão SELECIONAR"Selecionar GATILHOGatilho" disponível em tela. Em seguida, selecione o gatilho que iniciará sua automação clicando no botão "Selecionar Gatilho". O gatilho será o evento que desencadeará a chamada do Webhook, como uma atividade concluída ou uma oportunidade ganha, entre outros;</li><br> <li>Se desejar, você pode adicionar condições (filtros) para limitar quando a automação será executada, clicando em "Adicionar Condições";</li><br> <li>Por fim, selecione a ação "Webhook" em "Selecionar Ação" e informe a URL pública do sistema que receberá a notificação do evento. Se necessário, adicione cabeçalhos adicionais para questões técnicas, como autenticação;</li><br> <li>Salve seu Workflow com o status de ativo e ele passará a ser executado para os próximos eventos;</li><br> <li>Vale destacar que Webhooks no TOTVS CRM são regidos por algumas características técnicas importantes. Consulte a próxima seção deste documento para maiores informações a respeito, permitindo que sua integração aconteça com sucesso e de forma eficiente.</li><br> </ol> <img src="https://tdn.totvs.com/download/attachments/745140752/gifwehook.gif?version=1&modificationDate=1678548639423&api=v2"> |
HTML |
---|
<div class="pause" id="secao-5">   <b> INFORMAÇÕES TÉCNICAS</b> </div>
<p> Quando o TOTVS CRM Gestão de Clientes realiza uma chamada para sistemas externos via Webhooks, ele transmite metadados sobre o evento que permitem identificar o que aconteceu e reagir adequadamente. Esses metadados são enviados por meio de uma chamada HTTP utilizando o método POST, com o conteúdo (payload/body) formatado em JSON.
<br> <br>
Aqui está um exemplo desse formato JSON e as informações incluídas nele para referência: </p>
<br> <br> |
HTML |
---|
<style>
.code-box {
background-color: #282c34;
color: #abb2bf;
padding: 20px;
margin: 20px;
border-radius: 5px;
position: relative;
}
.code-title {
position: absolute;
top: 0;
left: 0;
right: 0;
background-color: #343541;
color: #282c34;
padding: 10px;
border-top-left-radius: 5px;
border-top-right-radius: 5px;
font-weight: bold;
}
.code-btn {
position: absolute;
top: 5px;
right: 5px;
background-color: #343541;
color: #fff;
border: none;
border-radius: 5px;
padding: 5px 10px;
font-weight: bold;
cursor: pointer;
}
.code-box pre {
margin: 0;
}
.code-string {
color: #98c379;
}
.code-number {
color: #d19a66;
}
.code-boolean {
color: #56b6c2;
}
.code-null {
color: #e06c75;
}
</style>
<div class="code-box">
<div class="code-title">
<img src="http://projeto.cloud/wp-content/uploads/2023/03/json-file.png" alt="JSON logo" width="20" height="20" style="margin-right: 5px;">
</div>
<button class="code-btn" onclick="copyToClipboard()">Copiar</button>
<pre><code id="myCode" class="language-json">
{
"eventId": <span class="code-string">"00000000-0000-0000-0000-000000000000"</span>,
"timestamp": <span class="code-string">"2022-05-06T15:28:36.110-03:00"</span>,
"workflow": {
"id": <span class="code-string">"00000000-0000-0000-0000-000000000000"</span>,
"description": <span class="code-string">"Lorem ipsum dolor sit amet"</span>
},
"trigger": {
"id": <span class="code-string">"00000000-0000-0000-0000-000000000000"</span>,
"description": <span class="code-string">"Opportunity won"</span>
},
"source": {
"object": {
"id": <span class="code-string">"00000000-0000-0000-0000-000000000000"</span>,
"description": <span class="code-string">"Opportunity"</span>,
"contextUrl": <span class="code-string">"/api/v11/opportunity/opportunities"</span>
},
"row": {
"id": <span class="code-string">"00000000-0000-0000-0000-000000000000"</span>,
"externalId": <span class="code-string">"00000000-0000-0000-0000-000000000000"</span>
}
}
}
</code></pre>
</div>
<script>
function copyToClipboard() {
const codeToCopy = document.getElementById("myCode").textContent;
const el = document.createElement('textarea');
el.value = codeToCopy;
document.body.appendChild(el);
el.select();
document.execCommand('copy');
document.body.removeChild(el);
alert("Código copiado para a área de transferência.");
}
</script> <br> <br> |
HTML |
---|
<p> A tabela abaixo contém informações detalhadas sobre os atributos presentes no formato JSON. Esses atributos são listados juntamente com seus respectivos formatos e intenções. Essas informações podem ser úteis para entender melhor a estrutura do JSON e como usá-lo. </p> <br>
<p>
<style>
table {
}
</style>
<table class="wrapped confluenceTable tablesorter tablesorter-default" role="grid" resolved="">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead>
<tr role="row" class="tablesorter-headerRow">
<th class="confluenceTh tablesorter-header sortableHeader tablesorter-headerUnSorted" data-column="0" tabindex="0" scope="col" role="columnheader" aria-disabled="false" unselectable="on" aria-sort="none" aria-label="Atributo: No sort applied, activate to apply an ascending sort" style="user-select: none;">
<div class="tablesorter-header-inner">Atributo</div>
</th>
<th class="confluenceTh tablesorter-header sortableHeader tablesorter-headerUnSorted" data-column="1" tabindex="0" scope="col" role="columnheader" aria-disabled="false" unselectable="on" aria-sort="none" aria-label="Tipo de dados: No sort applied, activate to apply an ascending sort" style="user-select: none;">
<div class="tablesorter-header-inner">Tipo de dados</div>
</th>
<th class="confluenceTh tablesorter-header sortableHeader tablesorter-headerUnSorted" data-column="2" tabindex="0" scope="col" role="columnheader" aria-disabled="false" unselectable="on" aria-sort="none" aria-label="Descrição: No sort applied, activate to apply an ascending sort" style="user-select: none;">
<div class="tablesorter-header-inner">Descrição</div>
</th>
</tr>
</thead>
<tbody aria-live="polite" aria-relevant="all">
<tr role="row">
<td class="confluenceTd">eventId</td>
<td class="confluenceTd">String</td>
<td class="confluenceTd">Identificador único do evento</td>
</tr>
<tr role="row">
<td class="confluenceTd">timestamp</td>
<td class="confluenceTd">Data e hora formatados como String (ISO 8601)</td>
<td class="confluenceTd">Data e hora em que o Workflow foi executado</td>
</tr>
<tr role="row">
<td class="confluenceTd">workflow.id</td>
<td class="confluenceTd">UUID formatado como String</td>
<td class="confluenceTd">Identificador único do workflow que emitiu o evento</td>
</tr>
<tr role="row">
<td class="confluenceTd">workflow.description</td>
<td class="confluenceTd">String</td>
<td class="confluenceTd">Nome do workflow que emitiu o evento, como definido no momento que a chamada foi disparada </td>
</tr>
<tr role="row">
<td class="confluenceTd">trigger.id</td>
<td class="confluenceTd">UUID formatado como String</td>
<td class="confluenceTd">Identificador único global do gatilho definido no Workflow no momento que o evento foi disparado</td>
</tr>
<tr role="row">
<td class="confluenceTd">trigger.description</td>
<td class="confluenceTd">String</td>
<td class="confluenceTd">Nome do gatilho definido no Workflow no momento que o evento foi disparado</td>
</tr>
<tr role="row">
<td class="confluenceTd">source.object.id</td>
<td class="confluenceTd">UUID formatado como String</td>
<td class="confluenceTd">Identificador único do objeto de origem do evento (oportunidades, leads, atividades, etc)</td>
</tr>
<tr role="row">
<td class="confluenceTd">source.object.description</td>
<td class="confluenceTd">String</td>
<td class="confluenceTd">Descrição do objeto de origem do evento</td>
</tr>
<tr role="row">
<td class="confluenceTd">source.object.contextUrl</td>
<td class="confluenceTd">URL formata como String</td>
<td class="confluenceTd">URL base da API do objeto de origem no TOTVS CRM Gestão de Clientes</td>
</tr>
<tr role="row">
<td class="confluenceTd">source.row.id</td>
<td class="confluenceTd">UUID formatado como String</td>
<td class="confluenceTd">Identificador único do registro de origem do evento (ID da oportunidade, lead, atividade, etc)</td>
</tr>
<tr role="row">
<td colspan="1" class="confluenceTd">source.row.externalId</td>
<td colspan="1" class="confluenceTd">String</td>
<td colspan="1" class="confluenceTd">Identificador externo do registro de origem do evento, se houver um e o atributo estiver visível no Workflow</td>
</tr>
</tbody>
</table> </p> |
HTML |
---|
<div class="pause" id="secao-5">   <b> ESTRATÉGIA DA EXECUÇÃO DAS CHAMADAS</b> </div>
<p> O TOTVS CRM Gestão de Clientes faz a execução das chamadas de forma assíncrona e baseada em consistência eventual, o que pode resultar em eventos entregues fora de ordem e com atrasos de alguns minutos. Em caso de falhas de comunicação, os eventos são retornados para a fila e uma nova tentativa é feita após pelo menos 5 minutos, podendo ocorrer entregas de novos eventos durante esse período. É importante que o sistema terceiro que recebe os eventos esteja preparado para lidar com possíveis cenários de eventos entregues fora de ordem, mais de uma vez e/ou com atrasos, identificáveis pelos atributos eventId e timestamp.</p>
<br> |
HTML |
---|
<div class="pause" id="secao-5">   <b> CENÁRIOS DE FALHA</b> </div>
<p> Quando o TOTVS CRM Gestão de Clientes chama o sistema terceiro para informar um evento, ele verifica se a resposta HTTP recebida é da família 2xx para entender se a entrega foi bem-sucedida. Se sim, o evento é considerado entregue com sucesso. Caso contrário, o evento é encaminhado para uma fila de novas tentativas de entrega, com um intervalo de pelo menos 5 minutos entre cada tentativa. Se após 10 tentativas o evento não for entregue com sucesso, ele será descartado. O TOTVS CRM também estabelece um tempo limite de 5 segundos para a conexão com o serviço remoto e 60 segundos para receber uma resposta. Se esses limites forem ultrapassados, o evento será encaminhado para a fila de novas tentativas, independentemente de o sistema terceiro ter recebido a mensagem depois desses limites.</p>
<br> <br> <br> <br> <br> <br> <br> <br> |
HTML |
---|
<style> #title-text { display: none !important;} @import "compass/css3"; @import "compass/css3"; * { box-sizing: border-box; font-family: lato, sans-serif; } * { font-family: lato, sans-serif; } blockquote { margin: 3%; border-left: 10px solid #363636; padding: 2%; color: #222; background: #fff; font-style: italic; line-height: 130%; } .top { width: 100%; background: #363636; } .img { image-resolution: 5px 5px 9px; image-rendering: auto; image-orientation:0deg } .header { max-width: 1200px; width: 98%; height: 7em; margin: 0px auto; overflow: hidden; h1 { text-align: center; font-weight: bold; color: #fff; padding: 20px; font-size: 22px; div { margin: 0; font-weight: normal; font-size: 1.8em; } } .author { font-size: 0.8em; font-weight: normal; border-top: 1px dashed #555; border-bottom: 1px dashed #555; max-width: 160px; text-align: center; margin: -1em auto 0 auto; padding: 0.3em; text-transform: uppercase; color: #ccc; } } .content { max-width: auto; float: right; margin: auto; padding: 0; } .date { float: left; width: 10%; color: #444; text-align: center; div { margin: 0; line-height: 50%; }} .day { float: left; margin-top: 0.1em; width: 100%; color: #FEAC0E; font-size: 200%; } } .date-line { display: none; } .article { width: 100%; padding: 0 7em 0 7em; background: rgb(247, 247, 252); } h2 { font-weight: normal; font-size: 22px; font-weight: bold; color: #555555; margin: 0; } h3 { font-weight: normal; font-size: 16px; color: #888; font-style: italic; margin: 0 0 1em 0; } p { margin: 0; padding-top: 8px; color: #555; text-align: justify; font-size: 16px; line-height: 150%; } li{ font-size: 16px; color: #555555; } div{ font-style: 16px; color: #555; } .firstpara { text-indent: 0; font-size: 16px; } .pause { margin: 2em auto 2em auto; color: #555555; width: 60%; padding: 10px; text-align: center; font-size: 20px; border-top: 1px solid #ccc; border-bottom: 1px solid #ccc; } .firstcharacter { float: left; font-size: 16px; font-weight: bold; color: #555; line-height: 0.6em; padding-top: 0.12em; padding-right: 0.1em; padding-left: 0; } } .footer { max-width: 1200px; width: 98%; height: 50px; margin: 0px auto; overflow: hidden; border-top: 1px solid #ccc;} .copy { float: right; font-style: italic; color: #888; padding: 1% 1% 0 0; } } .prev a, .next a { position: fixed; top: 9.6em; padding: 1em; background: #f1f1f1; border: 1px solid #ccc; border-radius: 5px; } .prev a:hover, .next a:hover { background: #fff; } .prev a { left: 0.7em; } .next a { right: 0.7em; } @media only screen and (max-width: 450px) { .content { margin-top: 2em; } .social { display: none; } .date { display: none; } .date-line { display: inline; } .article { width: 100%; margin: 0 auto 2em auto; border-left: none; padding-bottom: 2em; border-bottom: 1px solid #ccc; p { font-size: 1.2em; } } .header { height: auto; position: fixed; top: 0; padding: 0; margin: 0; background: rgb(34, 16, 171) h1 { text-align: center; width: 100%; margin: 0; color: #f1f1f1; span { font-size: 80%; } } .author { display: none; } } .footer { text-align: center; padding: 3%; height: 40px; .copy { float: none; } } .prev a, .next a { position: relative; margin-bottom: 2em; text-align: center; top: 0; } .prev a { float: left; width: 40%; } .next a { float: right; width: 40%; }s .table { font-family: lato; background-color: #fff; } #wrapper { display: flex; flex-direction: column; gap: 2px; position: absolute; inset: 0; justify-content: center; align-items: center; }} .flexWrap { display: flex; gap: 2px; width: 110px; } #disclaimer { font-family: sans-serif; color: #333333; position: fixed; top: 5%; right: 5%; width: 5%; } .badge-primary { color: #8686FF; background-color: #F3F3FF; border-radius: 10px; padding: 6px 7px; font-size: 9px; font-weight: bold } .badge-secondary{ color: #ebeef0; background-color: #2abe74; border-radius: 10px; padding: 6px 7px; font-size: 9px; font-weight: bold } .badge-novo { color: #fff; background-color: #20d691; border-radius: 10px; padding: 6px 7px; font-size: 9px; font-weight: bold } .badge-danger{ color: #FFFFFF; background-color: #FF4057; border-radius: 10px; padding: 6px 7px; font-size: 9px; font-weight: bold } .badge-manutencao { color: #FFF; background-color: #efc307; border-radius: 10px; padding: 6px 7px; font-size: 9px; font-weight: bold; } .badge-melhoria { color: #FFF; background-color: #6f60f6; border-radius: 10px; padding: 6px 7px; font-size: 9px; font-weight: bold; } .badge-light { color: #8686FF; background-color: #F3F3FF border-radius: 10px; padding: 6px 7px; font-size: 9px; font-weight: bold; } .badge-dark { color: #ebeef0; background-color: #064118; border-radius: 10px; padding: 6px 7px; font-size: 9px; font-weight: bold } body { font-family: lato; } } caption { font-size: 1.5rem; text-align: left; padding-bottom: 1rem; } } tbody tr:nth-child(odd), tfoot tr:nth-child(even) { background-color: #fff; } tfoot tr td:first-child { border: none; background-color: white; } tfoot { border-top: 5px solid #fff; } .img2 { width:50%; height:auto; padding:2%; margin-bottom:4%; align-content: center; display: block; margin-left: auto; margin-right: auto } #f7f7fc; } } container{ width: 50%; } .borderbox{ border: 1px dashed #ebebeb; width:45%; margin: 50px auto; border-radius: 8px; border-width:2px; } .box{ position:relative; width:auto; height:auto; margin: 30px auto; padding: 15px; box-shadow: 0px 1px 6px 1px #ebebeb; border-radius: 8px; } .sucess-box{ border-left: solid 5px #3FC43C; background-color: #fff; } .info-box{ border-left: solid 5px #585EC2; background-color: #fff; } .warning-box{ border-left: solid 5px #EFA162; background-color: #fff; } .error-box{ border-left: solid 5px #F32D70; background-color: #fff; } .fa{ padding-right:10px; } .fa-check-circle{ color: #3FC43C; } .fa fa-info-circle { color: #585EC2; } .warning-box .fa-exclamation-triangle{ color: #EFA162; } .info-box .fa-info-circle{ color: #585EC2; } .error-box .fa-exclamation-triangle{ color: #E63470; } p{ padding:0px 28px; } .time{ color:#9b9b9b; } .fa-close{ color:#BCC4CD; } .close{ position:absolute; top: 20px; right:20px; } .link1, .link2, .link3, .link4{ opacity:0; margin-left:20px; text-decoration:none; } .link1{ color:#3FC43C; } .link2{ color:#585EC2; } .link3{ color:#EFA162; } .link4{ color:#E63470; } .box:hover a{ opacity:1; } .topic-cluster-index { list-style: none; padding: 0; } .topic-cluster-index li { display: inline-block; list-style: none; min-height: 30px; width: 98%; background-color: #fff; border-radius: 2px; padding: 24px; margin: 5px 0; border: 1px solid #e4e8ec; line-height: 16px !important; font-weight: bold; color: #363636; font-family: lato; font-weight: 600; } .topic-cluster-index li a { list-style: none; font-weight: 400; color: #363636 !important; list-style: none; font-size: 15px; margin: 0; padding: 0; font-family: lato; font-weight: bold; text-decoration: none !important; } .topic-cluster-index li:hover { list-style: none; background-color: #F7F7FC; font-family: lato; font-weight: 700; cursor: pointer; } .topic-cluster-index li:hover a { list-style: none; color: #feac0e !important; font-family: lato; font-weight: 700; text-decoration: none !important; } .index-title { width: 100%; height: 30px; background: #feac0e; font-family: lato; font-size: 20px; border-radius: 2px; color: #fff; font-weight: 700; padding: 6px 10px 6px 25px; } .imgcapa { width: 100%; margin-top: 0px;} </style> |
HTML |
---|
<style> .main-presupuestoMensual { min-width: 320px; max-width: 100%; padding: 50px; margin: 0 auto; background: #F7F7FC; } .containter-tab1 { display: none; padding: 20px 0 0; border-top: 1px solid #ddd; } .input-tabPresupuestoMensual { display: none; } .label-tabPresupuestoMensual { display: inline-block; margin: 0 0 -1px; padding: 15px 25px; font-weight: 600; text-align: center; color: #bbb; border: 1px solid transparent; } .label-tabPresupuestoMensual:before { font-family: fontawesome; font-weight: normal; margin-right: 10px; } /* .label-tabPresupuestoMensual[for*='1']:before { content: '\f1cb'; } .label-tabPresupuestoMensual[for*='2']:before { content: '\f17d'; } .label-tabPresupuestoMensual[for*='3']:before { content: '\f16b'; } .label-tabPresupuestoMensual[for*='4']:before { content: '\f1a9'; } */ .label-tabPresupuestoMensual:hover { color: #888; cursor: pointer; } .input-tabPresupuestoMensual:checked + .label-tabPresupuestoMensual { color: #555; border: 1px solid #ddd; border-top: 2px solid orange; border-bottom: 1px solid #fff; } #tab1:checked ~ #content1, #tab2:checked ~ #content2, #tab3:checked ~ #content3, #tab4:checked ~ #content4 { display: flex; } @media screen and (max-width: 650px) { .label-tabPresupuestoMensual { font-size: 0; } .label-tabPresupuestoMensual:before { margin: 0; font-size: 18px; } } @media screen and (max-width: 400px) { .label-tabPresupuestoMensual { padding: 15px; } } /**/ body { background: #ececec; } .loader:before, .loader:after { position: absolute; top: 50%; left: 50%; border-radius: 50%; border-style: solid; border-top-color: #ecd078; border-right-color: #c02942; border-bottom-color: #542437; border-left-color: #53777a; content: ""; transform: translate(-50%, -50%); animation: rotate 1.5s infinite ease-in-out; } .loader:before { border-width: 10vh; } .loader:after { width: 30vh; height: 30vh; border-width: 2.5vh; animation-direction: reverse; } @keyframes rotate { 0% { transform: translate(-50%, -50%) rotate(0); } 100% { transform: translate(-50%, -50%) rotate(360deg); } } </style> |
HTML |
---|
<style> #title-text { display: none !important;} body { font-size: 100%; font-family: "lato", serif; color: #363636; background-color: #ffffff; } a { color: #acb7c0; text-decoration: none; font-family: "lato"; font-family: lato, sans-serif!important; font-size: 16px; } img { max-width: 100%; } p { text-align:justify; font-family: "Lato", sans-serif; } h2 h5 { font-family: "lato", sans-serif; font-size: 90px ; font-weight: bold; } /* -------------------------------- Modules - reusable parts of our design -------------------------------- */ .cd-container { /* this class is used to give a max-width to the element it is applied to, and center it horizontally when it reaches that max-width */ width: 100%; max-width: 1170px; margin: 0 auto; } .cd-container::after { /* clearfix */ content: ""; display: table; clear: both; } /* -------------------------------- xnugget info -------------------------------- */ .cd-nugget-info { text-align: center; position: absolute; width: 100%; height: 50px; line-height: 50px; top: 0; left: 0; } .cd-nugget-info a { position: relative; font-size: 14px; color: #718ca1; -webkit-transition: all 0.2s; -moz-transition: all 0.2s; transition: all 0.2s; } .no-touch .cd-nugget-info a:hover { opacity: 0.8; } .cd-nugget-info span { vertical-align: middle; display: inline-block; } .cd-nugget-info span svg { display: block; } .cd-nugget-info .cd-nugget-info-arrow { fill: #718ca1; } /* -------------------------------- Main components -------------------------------- */ #cd-timeline { position: relative; padding: 2em 0; margin-top: 2em; margin-bottom: 2em; } #cd-timeline::before { /* this is the vertical line */ content: ""; position: absolute; top: 0; left: 18px; height: 100%; width: 4px; background: #d7e4ed; } @media only screen and (min-width: 1170px) { #cd-timeline { margin-top: 3em; margin-bottom: 3em; } #cd-timeline::before { left: 50%; margin-left: -2px; } } .cd-timeline-block { position: relative; margin: 2em 0; } .cd-timeline-block:after { content: ""; display: table; clear: both; } .cd-timeline-block:first-child { margin-top: 0; } .cd-timeline-block:last-child { margin-bottom: 0; } @media only screen and (min-width: 1170px) { .cd-timeline-block { margin: 4em 0; } .cd-timeline-block:first-child { margin-top: 0; } .cd-timeline-block:last-child { margin-bottom: 0; } } .cd-timeline-img { position: absolute; top: 0; left: 0; width: 40px; height: 40px; border-radius: 50%; box-shadow: 0 0 0 4px white, inset 0 2px 0 rgba(0, 0, 0, 0.08), 0 3px 0 4px rgba(0, 0, 0, 0.05); } .cd-timeline-img img { display: block; width: 32px; height: 32px; position: relative; left: 50%; top: 50%; margin-left: -16px; margin-top: -16px; } .cd-timeline-img.cd-novo { background: #363636; } .cd-timeline-img.cd-melhoria { background: #363636; } .cd-timeline-img.cd-manutencao { background: #363636; } @media only screen and (min-width: 1170px) { .cd-timeline-img { width: 60px; height: 60px; left: 50%; margin-left: -30px; } .cssanimations .cd-timeline-img.is-hidden { visibility: hidden; } .cssanimations .cd-timeline-img.bounce-in { visibility: visible; -webkit-animation: cd-bounce-1 0.6s; -moz-animation: cd-bounce-1 0.6s; animation: cd-bounce-1 0.6s; } } @-webkit-keyframes cd-bounce-1 { 0% { opacity: 0; -webkit-transform: scale(0.5); } 60% { opacity: 1; -webkit-transform: scale(1.2); } 100% { -webkit-transform: scale(1); } } @-moz-keyframes cd-bounce-1 { 0% { opacity: 0; -moz-transform: scale(0.5); } 60% { opacity: 1; -moz-transform: scale(1.2); } 100% { -moz-transform: scale(1); } } @keyframes cd-bounce-1 { 0% { opacity: 0; -webkit-transform: scale(0.5); -moz-transform: scale(0.5); -ms-transform: scale(0.5); -o-transform: scale(0.5); transform: scale(0.5); } 60% { opacity: 1; -webkit-transform: scale(1.2); -moz-transform: scale(1.2); -ms-transform: scale(1.2); -o-transform: scale(1.2); transform: scale(1.2); } 100% { -webkit-transform: scale(1); -moz-transform: scale(1); -ms-transform: scale(1); -o-transform: scale(1); transform: scale(1); } } .cd-timeline-content { position: relative; margin-left: 50px; background: #f5f5fa; border-radius: 0.25em; max-width: 400px; padding: 1em; box-shadow: 0 3px 0 #363636; } .cd-timeline-content:after { content: ""; display: table; clear: both; } .cd-timeline-content h2 { color: #363636; font-weight: bold; } .cd-timeline-content p, .cd-timeline-content .cd-date { font-size: 13px; font-size: 0.8125rem; } .cd-timeline-content .cd-date { display: inline-block; } .cd-timeline-content p { margin: 1em 0; line-height: 1.6; } .cd-timeline-content .cd-read-more { float: right; padding: 0.8em 1em; background: #5596e6; color: white; border-radius: 0.25em; text-decoration: none; } .no-touch .cd-timeline-content .cd-read-more:hover { background-color: #ffffff; } .cd-timeline-content .cd-date { float: left; padding: 0.8em 0; opacity: 0.7; } .cd-timeline-content::before { content: ""; position: absolute; top: 16px; right: 100%; height: 0; width: 0; border: 7px solid transparent; border-right: 7px solid #bfcdd6; } @media only screen and (min-width: 768px) { .cd-timeline-content h2 { font-size: 20px; font-size: 1.25rem; font-weight: bold ; } .cd-timeline-content p { font-size: 16px; font-size: 1rem; } .cd-timeline-content .cd-read-more, .cd-timeline-content .cd-date { font-size: 14px; font-size: 0.875rem; } } @media only screen and (min-width: 1170px) { .cd-timeline-content { margin-left: 0; padding: 1.6em; width: 45%; } .cd-timeline-content::before { top: 24px; left: 100%; border-color: transparent; border-left-color: #d7e4ed; } .cd-timeline-content .cd-read-more { float: left; } .cd-timeline-content .cd-date { position: absolute; width: 100%; left: 122%; top: 6px; font-size: 16px; font-size: 1rem; } .cd-timeline-block:nth-child(even) .cd-timeline-content { float: right; } .cd-timeline-block:nth-child(even) .cd-timeline-content::before { top: 24px; left: auto; right: 100%; border-color: transparent; border-right-color: #d7e4ed; } .cd-timeline-block:nth-child(even) .cd-timeline-content .cd-read-more { float: right; } .cd-timeline-block:nth-child(even) .cd-timeline-content .cd-date { left: auto; right: 122%; text-align: right; } .button-2 { padding: 8px 9px; font-size: 12px; color: #fff; background-color: #FDAB0E; border: none; border-radius: 4px; cursor: pointer; } .button-2:hover { background-color: #0897E9; } .button-2:active { background-color: #FDAB0E; } #wrapper { display: flex; flex-direction: column; gap: 20px; position: absolute; inset: 0; justify-content: center; align-items: center; margin: 0; } .flexWrap { display: flex; gap: 2px; width: 50px; } #disclaimer { font-family: Tahoma; color: #333333; position: fixed; top: 5%; right: 5%; width: 5%; } .button-2 { padding: 8px 9px; font-size: 12px; color: #fff; background-color: #363636; border: none; border-radius: 6px; cursor: pointer; } .button-2:hover { background-color: #feac0e; } .button-2:active { background-color: #feac0e; } #wrapper { display: flex; flex-direction: column; gap: 2px; position: absolute; inset: 0; justify-content: center; align-items: center; } .flexWrap { display: flex; gap: 2px; width: 110px; } #disclaimer { font-family: sans-serif; color: #333333; position: fixed; top: 5%; right: 5%; width: 5%; } .badge-primary { color: #8686FF; background-color: #F3F3FF; border-radius: 10px; padding: 6px 7px; font-size: 9px; font-weight: bold } .badge-secondary{ color: #ebeef0; background-color: #2abe74; border-radius: 10px; padding: 6px 7px; font-size: 9px; font-weight: bold } .badge-novo { color: #fff; background-color: #20d691; border-radius: 10px; padding: 6px 7px; font-size: 9px; font-weight: bold } .badge-danger{ color: #FFFFFF; background-color: #FF4057 border-radius: 10px; padding: 6px 7px; font-size: 9px; font-weight: bold } .badge-manutencao { color: #FFF; background-color: #FEAC0E; border-radius: 10px; padding: 6px 7px; font-size: 9px; font-weight: bold; } .badge-melhoria { color: #FFF; background-color: #6f60f6; border-radius: 10px; padding: 6px 7px; font-size: 9px; font-weight: bold; } .badge-light { color: #8686FF; background-color: #F3F3FF border-radius: 10px; padding: 6px 7px; font-size: 9px; font-weight: bold; } .badge-dark { color: #ebeef0; background-color: #064118; border-radius: 10px; padding: 6px 7px; font-size: 9px; font-weight: bold } </style> |
HTML |
---|
<style> @import url(https://fonts.googleapis.com/css?family=Raleway:300); .my-custom-class { /* Estilos para o body */ margin: 0; padding: 15px; background: #f7f7fc; text-align: center; } .personne { display: inline-block; position: relative; width: 80px; margin: 0 20px; cursor: pointer; vertical-align: top; } .personne > div { width: 100%; height: 80px; border-radius: 50%; border: 4px solid transparent; box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.18); text-align: center; overflow: hidden; box-sizing: border-box; } .personne img { height: 100%; margin: 0 -50%; transition: all 0.5s ease; } .personne:hover img { height: 105%; } .personne:hover > div { border: 4px solid #feac0e; } .personne h4 { font-family: lato, sans-serif!important; text-align: center; margin-top: 5px; color: #363636; font-size: 13px; padding-left: 1px; } /* Estilos para o tooltip */ .tooltip { position: absolute; top: -30px; left: 50%; transform: translateX(-50%); color: #fff; font-size: 12px; padding: 4px 8px; border-radius: 4px; white-space: nowrap; } /* Mostrar o tooltip quando o elemento pai é hover */ .personne:hover .tooltip { display: block; } .titulo-destaque { font-size: 18px; font-family: lato, sans-serif!important; font-weight: bold; margin: 0; text-align: center; padding-bottom: 5px; color: #363636; } .subtitulo-destaque { font-family: lato; margin-left: 22%; margin-right: 22%; padding-top: 8px; color: #555; text-align: center; font-size: 16px; line-height: 150%; text-align: justify; } .tooltip { position: relative; } .tooltip:before { content: ""; display: none; position: absolute; top: 100%; left: 50%; transform: translateX(-50%); padding: 5px; border-radius: 5px; background-color: #333; color: #fff; font-size: 12px; line-height: 1.2; white-space: nowrap; } .tooltip:hover:before { display: block; } .titulo-destaque.tooltip:before { content: attr(data-tooltip); } .tooltip:before { content: ""; display: none; position: absolute; top: 100%; left: 50%; transform: translateX(-50%); padding: 5px; border-radius: 5px; background-color: #333; color: #fff; font-size: 12px; line-height: 1.2; white-space: nowrap; max-width: 80px; /* Define a largura máxima do tooltip */ word-wrap: break-word; /* Faz o tooltip quebrar a linha quando necessário */ } </style> |
HTML |
---|
<style> #conteudo { background-color: #f7f7fc; } .caixas { display: flex; justify-content: space-between; flex-wrap: wrap; gap: 10px; } .caixa { width: calc(50% - 10px); background-color: #fff; border: 1px solid #ccc; border-radius: 5px; text-align: center; transition: transform 0.3s ease; display: flex; flex-direction: column; } .caixa:hover { background-color: #F7F7FC;; } .caixa .conteudo { flex-grow: 1; display: flex; flex-direction: column; align-items: center; justify-content: flex-start; } .caixa .imagem { height: 100px; width: 100px; display: flex; justify-content: center; align-items: center; margin-bottom: 10px; } .caixa img { max-width: 100%; max-height: 100%; border-radius: 50%; } .caixa .texto { height: 0%; flex-grow: 1; display: flex; flex-direction: column; align-items: center; justify-content: flex-start; font-family: 'Lato', sans-serif; max-width: 100%; font-size: 14px; color: #363636; } .caixa h3 { margin-top: 10px; font-size: 1.2em; font-family: 'Lato', sans-serif; color: #363636; } .caixa p { margin: 15 10px; font-family: 'Lato', sans-serif; font-size: 14px; color: #363636; </style> |
HTML |
---|
<style> body { margin: 0; // 1 font-family: lato; font-size: 16px; font-weight: $font-weight-base; line-height: $line-height-base; color: #555555 text-align: left; // 3 background-color: $body-bg; // 2 } .speech-bubble { max-width: 300px; font-family: lato; color: #555555; font-size: 16px; margin: 1rem; padding: 1rem; position: relative; border: 2px solid #FEAC0E; background: #fff; border-radius: 0.4em; } .speech-row { display: flex; justify-content: center; } img { overflow-clip-margin: content-box; overflow: clip; } .speech-img img { border-radius: 50%; } img { vertical-align: middle; border-style: none; } .speech-img { align-self: center; max-width: 100%; height: auto; } *, ::after, ::before { box-sizing: border-box; } img { overflow-clip-margin: content-box; overflow: clip; } .speech-bubble:before, .speech-bubble:after { content: ""; position: absolute; left: 0; top: 50%; width: 0; height: 0; border: 20px solid transparent; border-right-color: #FEAC0E; border-left: 0; margin-top: -20px; margin-left: -20px; } .speech-bubble:after { border-right-color: #fff; margin-left: -18px; z-index: 1; } </style> |
HTML |
---|
<style> .alert-box { color:#555; border-radius:5px; font-family:Tahoma,Geneva,Arial,sans-serif;font-size:11px; padding:10px 25px 10px 25px; margin: 5px 25px 5px 25px; max-width: 100%; } .alert-box span { font-weight:bold; text-transform:uppercase; } .error { background:#ffecec url('images/error.png') no-repeat 10px 50%; border:1px solid #f5aca6; } .success { background:#e9ffd9 url('images/success.png') no-repeat 10px 50%; border:1px solid #a6ca8a; } .warning { background:#fff8c4 url('images/warning.png') no-repeat 10px 50%; border:1px solid #f2c779; } .notice { background:#e3f7fc url('images/notice.png') no-repeat 10px 50%; border:1px solid #8ed9f6; } </style> |